From: Nick Clifton Date: Mon, 30 Dec 2002 19:25:13 +0000 (+0000) Subject: Add support for msp430. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2469cfa28442dfd5e08b681dbcfd1ff098c6d420;p=binutils-gdb.git Add support for msp430. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1d0a15c2d73..b2a283a9f2b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,18 @@ +2002-12-30 Dmitry Diky + + * Makefile.am: Add msp430 target. + * configure.in: Likewise. + * Makefile.in: Regenerate. + * configure: Regenerate. + * archures.c: Add msp430 architecture vector. + * config.bfd: Likewise. + * reloc.c: Add msp430 relocs. + * targets.c: Add msp320 target. + * cpu-msp430.c: New file: msp430 cpu detection. + * elf32-msp430.c: New file: msp430 reloc processing. + * bfd-in2.h: Regenerate. + * libbfd.h: Regenerate. + 2002-12-28 Jakub Jelinek * elf.c (elf_sort_sections): Don't reorder .tbss. diff --git a/bfd/Makefile.am b/bfd/Makefile.am index 73739fdc57d..70de9e52f99 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -80,6 +80,7 @@ ALL_MACHINES = \ cpu-mcore.lo \ cpu-mips.lo \ cpu-mmix.lo \ + cpu-msp430.c \ cpu-or32.lo \ cpu-ns32k.lo \ cpu-openrisc.lo \ @@ -132,6 +133,7 @@ ALL_MACHINES_CFILES = \ cpu-mcore.c \ cpu-mips.c \ cpu-mmix.c \ + cpu-msp430.c \ cpu-or32.c \ cpu-ns32k.c \ cpu-openrisc.c \ @@ -231,6 +233,7 @@ BFD32_BACKENDS = \ elf32-mcore.lo \ elfxx-mips.lo \ elf32-mips.lo \ + elf32-msp430.c \ elf32-openrisc.lo \ elf32-or32.lo \ elf32-pj.lo \ @@ -388,6 +391,7 @@ BFD32_BACKENDS_CFILES = \ elf32-mcore.c \ elfxx-mips.c \ elf32-mips.c \ + elf32-msp430.c \ elf32-openrisc.c \ elf32-or32.c \ elf32-pj.c \ @@ -927,6 +931,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-mmix.lo: cpu-mmix.c $(INCDIR)/filenames.h +cpu-msp430.lo: cpu-msp430.c $(INCDIR)/filenames.h cpu-or32.lo: cpu-or32.c $(INCDIR)/filenames.h cpu-ns32k.lo: cpu-ns32k.c $(INCDIR)/filenames.h ns32k.h cpu-openrisc.lo: cpu-openrisc.c $(INCDIR)/filenames.h @@ -1212,6 +1217,10 @@ elf32-mips.lo: elf32-mips.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \ $(INCDIR)/elf/reloc-macros.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h \ $(INCDIR)/coff/internal.h $(INCDIR)/coff/ecoff.h $(INCDIR)/coff/mips.h \ $(INCDIR)/coff/external.h ecoffswap.h elf32-target.h +elf32-msp430.lo: elf32-msp430.c $(INCDIR)/filenames.h elf-bfd.h \ + $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ + $(INCDIR)/bfdlink.h $(INCDIR)/elf/msp430.h $(INCDIR)/elf/reloc-macros.h \ + elf32-target.h elf32-openrisc.lo: elf32-openrisc.c $(INCDIR)/filenames.h \ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/openrisc.h \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 2bd807c04eb..efcbd818644 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -205,6 +205,7 @@ ALL_MACHINES = \ cpu-mcore.lo \ cpu-mips.lo \ cpu-mmix.lo \ + cpu-msp430.c \ cpu-or32.lo \ cpu-ns32k.lo \ cpu-openrisc.lo \ @@ -258,6 +259,7 @@ ALL_MACHINES_CFILES = \ cpu-mcore.c \ cpu-mips.c \ cpu-mmix.c \ + cpu-msp430.c \ cpu-or32.c \ cpu-ns32k.c \ cpu-openrisc.c \ @@ -358,6 +360,7 @@ BFD32_BACKENDS = \ elf32-mcore.lo \ elfxx-mips.lo \ elf32-mips.lo \ + elf32-msp430.c \ elf32-openrisc.lo \ elf32-or32.lo \ elf32-pj.lo \ @@ -516,6 +519,7 @@ BFD32_BACKENDS_CFILES = \ elf32-mcore.c \ elfxx-mips.c \ elf32-mips.c \ + elf32-msp430.c \ elf32-openrisc.c \ elf32-or32.c \ elf32-pj.c \ @@ -1460,6 +1464,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-mmix.lo: cpu-mmix.c $(INCDIR)/filenames.h +cpu-msp430.lo: cpu-msp430.c $(INCDIR)/filenames.h cpu-or32.lo: cpu-or32.c $(INCDIR)/filenames.h cpu-ns32k.lo: cpu-ns32k.c $(INCDIR)/filenames.h ns32k.h cpu-openrisc.lo: cpu-openrisc.c $(INCDIR)/filenames.h @@ -1745,6 +1750,10 @@ elf32-mips.lo: elf32-mips.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \ $(INCDIR)/elf/reloc-macros.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h \ $(INCDIR)/coff/internal.h $(INCDIR)/coff/ecoff.h $(INCDIR)/coff/mips.h \ $(INCDIR)/coff/external.h ecoffswap.h elf32-target.h +elf32-msp430.lo: elf32-msp430.c $(INCDIR)/filenames.h elf-bfd.h \ + $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ + $(INCDIR)/bfdlink.h $(INCDIR)/elf/msp430.h $(INCDIR)/elf/reloc-macros.h \ + elf32-target.h elf32-openrisc.lo: elf32-openrisc.c $(INCDIR)/filenames.h \ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/openrisc.h \ diff --git a/bfd/archures.c b/bfd/archures.c index b73766f775f..2ad7267b353 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -286,6 +286,20 @@ DESCRIPTION . bfd_arch_mmix, {* Donald Knuth's educational processor. *} . bfd_arch_xstormy16, .#define bfd_mach_xstormy16 1 +. bfd_arch_msp430, {* Texas Instruments MSP430 architecture. *} +.#define bfd_mach_msp110 110 +.#define bfd_mach_msp11 11 +.#define bfd_mach_msp12 12 +.#define bfd_mach_msp13 13 +.#define bfd_mach_msp14 14 +.#define bfd_mach_msp41 41 +.#define bfd_mach_msp31 31 +.#define bfd_mach_msp32 32 +.#define bfd_mach_msp33 33 +.#define bfd_mach_msp43 43 +.#define bfd_mach_msp44 44 +.#define bfd_mach_msp15 15 +.#define bfd_mach_msp16 16 . bfd_arch_last . }; */ @@ -355,6 +369,7 @@ extern const bfd_arch_info_type bfd_mips_arch; extern const bfd_arch_info_type bfd_mmix_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_msp430_arch; extern const bfd_arch_info_type bfd_ns32k_arch; extern const bfd_arch_info_type bfd_openrisc_arch; extern const bfd_arch_info_type bfd_or32_arch; @@ -412,6 +427,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] = &bfd_mmix_arch, &bfd_mn10200_arch, &bfd_mn10300_arch, + &bfd_msp430_arch, &bfd_ns32k_arch, &bfd_openrisc_arch, &bfd_or32_arch, diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 362cc8f04f4..c72767982ee 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1713,6 +1713,20 @@ enum bfd_architecture bfd_arch_mmix, /* Donald Knuth's educational processor. */ bfd_arch_xstormy16, #define bfd_mach_xstormy16 1 + bfd_arch_msp430, /* Texas Instruments MSP430 architecture. */ +#define bfd_mach_msp110 110 +#define bfd_mach_msp11 11 +#define bfd_mach_msp12 12 +#define bfd_mach_msp13 13 +#define bfd_mach_msp14 14 +#define bfd_mach_msp41 41 +#define bfd_mach_msp31 31 +#define bfd_mach_msp32 32 +#define bfd_mach_msp33 33 +#define bfd_mach_msp43 43 +#define bfd_mach_msp44 44 +#define bfd_mach_msp15 15 +#define bfd_mach_msp16 16 bfd_arch_last }; @@ -3246,6 +3260,13 @@ to follow the 16K memory bank of 68HC12 (seen as mapped in the window). */ BFD_RELOC_VAX_GLOB_DAT, BFD_RELOC_VAX_JMP_SLOT, BFD_RELOC_VAX_RELATIVE, + +/* msp430 specific relocation codes */ + BFD_RELOC_MSP430_10_PCREL, + BFD_RELOC_MSP430_16_PCREL, + BFD_RELOC_MSP430_16, + BFD_RELOC_MSP430_16_PCREL_BYTE, + BFD_RELOC_MSP430_16_BYTE, BFD_RELOC_UNUSED }; typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; reloc_howto_type * diff --git a/bfd/config.bfd b/bfd/config.bfd index 9270d7e9e85..4379b6f547b 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -807,6 +807,10 @@ case "${targ}" in targ_defvec=bfd_elf32_mn10300_vec ;; + msp430-*-*) + targ_defvec=bfd_elf32_msp430_vec + ;; + ns32k-pc532-mach* | ns32k-pc532-ux*) targ_defvec=pc532machaout_vec targ_underscore=yes diff --git a/bfd/configure b/bfd/configure index 74fe037d5e0..6d68944b2e0 100755 --- a/bfd/configure +++ b/bfd/configure @@ -6108,6 +6108,7 @@ do bfd_elf32_mcore_little_vec) tb="$tb elf32-mcore.lo elf32.lo $elf" ;; bfd_elf32_mn10200_vec) tb="$tb elf-m10200.lo elf32.lo $elf" ;; bfd_elf32_mn10300_vec) tb="$tb elf-m10300.lo elf32.lo $elf" ;; + bfd_elf32_msp430_vec) tb="$tb elf32-msp430.lo elf32.lo $elf" ;; bfd_elf32_nbigmips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf32_nlittlemips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf32_ntradbigmips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; @@ -6358,10 +6359,10 @@ case ${host64}-${target64}-${want64} in if test -n "$GCC" ; then bad_64bit_gcc=no; echo $ac_n "checking for gcc version with buggy 64-bit support""... $ac_c" 1>&6 -echo "configure:6362: checking for gcc version with buggy 64-bit support" >&5 +echo "configure:6363: checking for gcc version with buggy 64-bit support" >&5 # Add more tests for gcc versions with non-working 64-bit support here. cat > conftest.$ac_ext <&6 -echo "configure:6411: checking for $ac_hdr" >&5 +echo "configure:6412: 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:6421: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:6422: \"$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* @@ -6446,12 +6447,12 @@ done for ac_func in getpagesize do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:6450: checking for $ac_func" >&5 +echo "configure:6451: 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:6479: \"$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 @@ -6499,7 +6500,7 @@ fi done echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -echo "configure:6503: checking for working mmap" >&5 +echo "configure:6504: 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 @@ -6507,7 +6508,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:6665: \"$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 @@ -6685,12 +6686,12 @@ fi for ac_func in madvise mprotect do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:6689: checking for $ac_func" >&5 +echo "configure:6690: 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:6718: \"$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 aa34e7da4b1..e641e7361a7 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -604,6 +604,7 @@ do bfd_elf32_mcore_little_vec) tb="$tb elf32-mcore.lo elf32.lo $elf" ;; bfd_elf32_mn10200_vec) tb="$tb elf-m10200.lo elf32.lo $elf" ;; bfd_elf32_mn10300_vec) tb="$tb elf-m10300.lo elf32.lo $elf" ;; + bfd_elf32_msp430_vec) tb="$tb elf32-msp430.lo elf32.lo $elf" ;; bfd_elf32_nbigmips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf32_nlittlemips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; bfd_elf32_ntradbigmips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;; diff --git a/bfd/cpu-msp430.c b/bfd/cpu-msp430.c new file mode 100644 index 00000000000..c7d283b63bb --- /dev/null +++ b/bfd/cpu-msp430.c @@ -0,0 +1,107 @@ +/* BFD library support routines for the MSP architecture. + Copyright (C) 2002 Free Software Foundation, Inc. + Contributed by Dmitry Diky + + 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" + +static const bfd_arch_info_type *compatible + PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *)); + +#define N(addr_bits, machine, print, default, next) \ +{ \ + 16, /* 16 bits in a word. */ \ + addr_bits, /* Bits in an address. */ \ + 8, /* 8 bits in a byte. */ \ + bfd_arch_msp430, \ + machine, /* Machine number. */ \ + "msp430", /* Architecture name. */ \ + print, /* Printable name. */ \ + 1, /* Section align power. */ \ + default, /* The default machine. */ \ + compatible, \ + bfd_default_scan, \ + next \ +} + +static const bfd_arch_info_type arch_info_struct[] = +{ + /* msp430x11x. */ + N (16, bfd_mach_msp11, "msp:11", FALSE, & arch_info_struct[1]), + + /* msp430x12x. */ + N (16, bfd_mach_msp12, "msp:12", FALSE, & arch_info_struct[2]), + + /* msp430x13x. */ + N (16, bfd_mach_msp13, "msp:13", FALSE, & arch_info_struct[3]), + + /* msp430x14x. */ + N (16, bfd_mach_msp14, "msp:14", FALSE, & arch_info_struct[4]), + + /* msp430x31x. */ + N (16, bfd_mach_msp31, "msp:31", FALSE, & arch_info_struct[5]), + + /* msp430x32x. */ + N (16, bfd_mach_msp32, "msp:32", FALSE, & arch_info_struct[6]), + + /* msp430x33x. */ + N (16, bfd_mach_msp33, "msp:33", FALSE, & arch_info_struct[7]), + + /* msp430x41x. */ + N (16, bfd_mach_msp41, "msp:41", FALSE, & arch_info_struct[8]), + + /* msp430x43x. */ + N (16, bfd_mach_msp43, "msp:43", FALSE, & arch_info_struct[9]), + + /* msp430x44x. */ + N (16, bfd_mach_msp43, "msp:44", FALSE, & arch_info_struct[10]), + + /* msp430x15x. */ + N (16, bfd_mach_msp15, "msp:15", FALSE, & arch_info_struct[11]), + + /* msp430x16x. */ + N (16, bfd_mach_msp16, "msp:16", FALSE, & arch_info_struct[12]), + + /* msp430x11x1. */ + N (16, bfd_mach_msp110, "msp:110", FALSE, NULL) + +}; + +const bfd_arch_info_type bfd_msp430_arch = + N (16, bfd_mach_msp14, "msp:14", TRUE, & arch_info_struct[0]); + +/* This routine is provided two arch_infos and works out which MSP + machine which would be compatible with both and returns a pointer + to its info structure. */ + +static const bfd_arch_info_type * +compatible (a,b) + const bfd_arch_info_type * a; + const bfd_arch_info_type * b; +{ + /* If a & b are for different architectures we can do nothing. */ + if (a->arch != b->arch) + return NULL; + + if (a->mach <= b->mach) + return b; + + return a; +} diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c new file mode 100644 index 00000000000..694a30f1198 --- /dev/null +++ b/bfd/elf32-msp430.c @@ -0,0 +1,720 @@ +/* MSP430-specific support for 32-bit ELF + Copyright (C) 2002 Free Software Foundation, Inc. + Contributed by Dmitry Diky + + 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 "libiberty.h" +#include "libbfd.h" +#include "elf-bfd.h" +#include "elf/msp430.h" + +static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup + PARAMS ((bfd *, bfd_reloc_code_real_type)); + +static void msp430_info_to_howto_rela + PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); + +static asection *elf32_msp430_gc_mark_hook + PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *, + struct elf_link_hash_entry *, Elf_Internal_Sym *)); + +static bfd_boolean elf32_msp430_gc_sweep_hook + PARAMS ((bfd *, struct bfd_link_info *, asection *, + const Elf_Internal_Rela *)); + +static bfd_boolean elf32_msp430_check_relocs + PARAMS ((bfd *, struct bfd_link_info *, asection *, + const Elf_Internal_Rela *)); + +static bfd_reloc_status_type msp430_final_link_relocate + PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, + Elf_Internal_Rela *, bfd_vma)); + +static bfd_boolean elf32_msp430_relocate_section + PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, + Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); + +static void bfd_elf_msp430_final_write_processing + PARAMS ((bfd *, bfd_boolean)); + +static bfd_boolean elf32_msp430_object_p + PARAMS ((bfd *)); + +static void elf32_msp430_post_process_headers + PARAMS ((bfd *, struct bfd_link_info *)); + +/* Use RELA instead of REL. */ +#undef USE_REL + +static reloc_howto_type elf_msp430_howto_table[] = +{ + HOWTO (R_MSP430_NONE, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_MSP430_NONE", /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (R_MSP430_32, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_MSP430_32", /* name */ + FALSE, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + + /* A 13 bit PC relative relocation. */ + HOWTO (R_MSP430_10_PCREL, /* type */ + 1, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 10, /* bitsize */ + TRUE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_MSP430_13_PCREL", /* name */ + FALSE, /* partial_inplace */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + TRUE), /* pcrel_offset */ + + /* A 16 bit absolute relocation. */ + HOWTO (R_MSP430_16, /* type */ + 0, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_MSP430_16", /* name */ + FALSE, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + + /* A 16 bit absolute relocation for command address. */ + HOWTO (R_MSP430_16_PCREL, /* type */ + 1, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + TRUE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_MSP430_16_PCREL", /* name */ + FALSE, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + TRUE), /* pcrel_offset */ + + /* A 16 bit absolute relocation, byte operations. */ + HOWTO (R_MSP430_16_BYTE, /* type */ + 0, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_MSP430_16_BYTE", /* name */ + FALSE, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + + /* A 16 bit absolute relocation for command address. */ + HOWTO (R_MSP430_16_PCREL_BYTE,/* type */ + 1, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + TRUE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_MSP430_16_PCREL_BYTE", /* name */ + FALSE, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + TRUE) /* pcrel_offset */ +}; + +/* Map BFD reloc types to MSP430 ELF reloc types. */ + +struct msp430_reloc_map +{ + bfd_reloc_code_real_type bfd_reloc_val; + unsigned int elf_reloc_val; +}; + +static const struct msp430_reloc_map msp430_reloc_map[] = + { + {BFD_RELOC_NONE, R_MSP430_NONE}, + {BFD_RELOC_32, R_MSP430_32}, + {BFD_RELOC_MSP430_10_PCREL, R_MSP430_10_PCREL}, + {BFD_RELOC_16, R_MSP430_16_BYTE}, + {BFD_RELOC_MSP430_16_PCREL, R_MSP430_16_PCREL}, + {BFD_RELOC_MSP430_16, R_MSP430_16}, + {BFD_RELOC_MSP430_16_PCREL_BYTE, R_MSP430_16_PCREL_BYTE}, + {BFD_RELOC_MSP430_16_BYTE, R_MSP430_16_BYTE} + }; + +static reloc_howto_type * +bfd_elf32_bfd_reloc_type_lookup (abfd, code) + bfd *abfd ATTRIBUTE_UNUSED; + bfd_reloc_code_real_type code; +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE (msp430_reloc_map); i++) + if (msp430_reloc_map[i].bfd_reloc_val == code) + return &elf_msp430_howto_table[msp430_reloc_map[i].elf_reloc_val]; + + return NULL; +} + +/* Set the howto pointer for an MSP430 ELF reloc. */ + +static void +msp430_info_to_howto_rela (abfd, cache_ptr, dst) + bfd *abfd ATTRIBUTE_UNUSED; + arelent *cache_ptr; + Elf_Internal_Rela *dst; +{ + unsigned int r_type; + + r_type = ELF32_R_TYPE (dst->r_info); + BFD_ASSERT (r_type < (unsigned int) R_MSP430_max); + cache_ptr->howto = &elf_msp430_howto_table[r_type]; +} + +static asection * +elf32_msp430_gc_mark_hook (sec, info, rel, h, sym) + asection *sec; + struct bfd_link_info *info ATTRIBUTE_UNUSED; + Elf_Internal_Rela *rel; + struct elf_link_hash_entry *h; + Elf_Internal_Sym *sym; +{ + if (h != NULL) + { + switch (ELF32_R_TYPE (rel->r_info)) + { + default: + switch (h->root.type) + { + case bfd_link_hash_defined: + case bfd_link_hash_defweak: + return h->root.u.def.section; + + case bfd_link_hash_common: + return h->root.u.c.p->section; + + default: + break; + } + } + } + else + return bfd_section_from_elf_index (sec->owner, sym->st_shndx); + + return NULL; +} + +static bfd_boolean +elf32_msp430_gc_sweep_hook (abfd, info, sec, relocs) + bfd *abfd ATTRIBUTE_UNUSED; + struct bfd_link_info *info ATTRIBUTE_UNUSED; + asection *sec ATTRIBUTE_UNUSED; + const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED; +{ + /* We don't use got and plt entries for msp430. */ + return TRUE; +} + +/* Look through the relocs for a section during the first phase. + Since we don't do .gots or .plts, we just need to consider the + virtual table relocs for gc. */ + +static bfd_boolean +elf32_msp430_check_relocs (abfd, info, sec, relocs) + bfd *abfd; + struct bfd_link_info *info; + asection *sec; + const Elf_Internal_Rela *relocs; +{ + Elf_Internal_Shdr *symtab_hdr; + struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; + const Elf_Internal_Rela *rel; + const Elf_Internal_Rela *rel_end; + + if (info->relocateable) + return TRUE; + + symtab_hdr = &elf_tdata (abfd)->symtab_hdr; + sym_hashes = elf_sym_hashes (abfd); + sym_hashes_end = + sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym); + if (!elf_bad_symtab (abfd)) + sym_hashes_end -= symtab_hdr->sh_info; + + rel_end = relocs + sec->reloc_count; + for (rel = relocs; rel < rel_end; rel++) + { + struct elf_link_hash_entry *h; + unsigned long r_symndx; + + r_symndx = ELF32_R_SYM (rel->r_info); + if (r_symndx < symtab_hdr->sh_info) + h = NULL; + else + h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + } + + return TRUE; +} + +/* Perform a single relocation. By default we use the standard BFD + routines, but a few relocs, we have to do them ourselves. */ + +static bfd_reloc_status_type +msp430_final_link_relocate (howto, input_bfd, input_section, + contents, rel, relocation) + reloc_howto_type *howto; + bfd *input_bfd; + asection *input_section; + bfd_byte *contents; + Elf_Internal_Rela *rel; + bfd_vma relocation; +{ + bfd_reloc_status_type r = bfd_reloc_ok; + bfd_vma x; + bfd_signed_vma srel; + + switch (howto->type) + { + case R_MSP430_10_PCREL: + contents += rel->r_offset; + srel = (bfd_signed_vma) relocation; + srel += rel->r_addend; + srel -= rel->r_offset; + srel -= 2; /* Branch instructions add 2 to the PC... */ + srel -= (input_section->output_section->vma + + input_section->output_offset); + + if (srel & 1) + return bfd_reloc_outofrange; + + /* MSP430 addresses commands as words. */ + srel >>= 1; + + /* Check for an overflow. */ + if (srel < -512 || srel > 511) + return bfd_reloc_overflow; + + x = bfd_get_16 (input_bfd, contents); + x = (x & 0xfc00) | (srel & 0x3ff); + bfd_put_16 (input_bfd, x, contents); + break; + + case R_MSP430_16_PCREL: + contents += rel->r_offset; + srel = (bfd_signed_vma) relocation; + srel += rel->r_addend; + srel -= rel->r_offset; + /* Only branch instructions add 2 to the PC... */ + srel -= (input_section->output_section->vma + + input_section->output_offset); + + if (srel & 1) + return bfd_reloc_outofrange; + + bfd_put_16 (input_bfd, srel & 0xffff, contents); + break; + + case R_MSP430_16_PCREL_BYTE: + contents += rel->r_offset; + srel = (bfd_signed_vma) relocation; + srel += rel->r_addend; + srel -= rel->r_offset; + /* Only branch instructions add 2 to the PC... */ + srel -= (input_section->output_section->vma + + input_section->output_offset); + + bfd_put_16 (input_bfd, srel & 0xffff, contents); + break; + + case R_MSP430_16_BYTE: + contents += rel->r_offset; + srel = (bfd_signed_vma) relocation; + srel += rel->r_addend; + bfd_put_16 (input_bfd, srel & 0xffff, contents); + break; + + case R_MSP430_16: + contents += rel->r_offset; + srel = (bfd_signed_vma) relocation; + srel += rel->r_addend; + + if (srel & 1) + return bfd_reloc_notsupported; + + bfd_put_16 (input_bfd, srel & 0xffff, contents); + break; + + default: + r = _bfd_final_link_relocate (howto, input_bfd, input_section, + contents, rel->r_offset, + relocation, rel->r_addend); + } + + return r; +} + +/* Relocate an MSP430 ELF section. */ + +static bfd_boolean +elf32_msp430_relocate_section (output_bfd, info, input_bfd, input_section, + contents, relocs, local_syms, local_sections) + bfd *output_bfd ATTRIBUTE_UNUSED; + struct bfd_link_info *info; + bfd *input_bfd; + asection *input_section; + bfd_byte *contents; + Elf_Internal_Rela *relocs; + Elf_Internal_Sym *local_syms; + asection **local_sections; +{ + Elf_Internal_Shdr *symtab_hdr; + struct elf_link_hash_entry **sym_hashes; + Elf_Internal_Rela *rel; + Elf_Internal_Rela *relend; + + symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; + sym_hashes = elf_sym_hashes (input_bfd); + relend = relocs + input_section->reloc_count; + + for (rel = relocs; rel < relend; rel++) + { + reloc_howto_type *howto; + unsigned long r_symndx; + Elf_Internal_Sym *sym; + asection *sec; + struct elf_link_hash_entry *h; + bfd_vma relocation; + bfd_reloc_status_type r; + const char *name = NULL; + int r_type; + + /* This is a final link. */ + + r_type = ELF32_R_TYPE (rel->r_info); + r_symndx = ELF32_R_SYM (rel->r_info); + howto = elf_msp430_howto_table + ELF32_R_TYPE (rel->r_info); + h = NULL; + sym = NULL; + sec = NULL; + + if (r_symndx < symtab_hdr->sh_info) + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; + relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); + name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name; + } + else + { + h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + + while (h->root.type == bfd_link_hash_indirect + || h->root.type == bfd_link_hash_warning) + h = (struct elf_link_hash_entry *) h->root.u.i.link; + + name = h->root.root.string; + + if (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak) + { + sec = h->root.u.def.section; + relocation = (h->root.u.def.value + + sec->output_section->vma + sec->output_offset); + } + else if (h->root.type == bfd_link_hash_undefweak) + { + relocation = 0; + } + else + { + if (!((*info->callbacks->undefined_symbol) + (info, h->root.root.string, input_bfd, + input_section, rel->r_offset, TRUE))) + return FALSE; + relocation = 0; + } + } + + r = msp430_final_link_relocate (howto, input_bfd, input_section, + contents, rel, relocation); + + if (r != bfd_reloc_ok) + { + const char *msg = (const char *) NULL; + + switch (r) + { + case bfd_reloc_overflow: + r = info->callbacks->reloc_overflow + (info, name, howto->name, (bfd_vma) 0, + input_bfd, input_section, rel->r_offset); + break; + + case bfd_reloc_undefined: + r = info->callbacks->undefined_symbol + (info, name, input_bfd, input_section, rel->r_offset, TRUE); + break; + + case bfd_reloc_outofrange: + msg = _("internal error: out of range error"); + break; + + case bfd_reloc_notsupported: + msg = _("internal error: unsupported relocation error"); + break; + + case bfd_reloc_dangerous: + msg = _("internal error: dangerous relocation"); + break; + + default: + msg = _("internal error: unknown error"); + break; + } + + if (msg) + r = info->callbacks->warning + (info, msg, name, input_bfd, input_section, rel->r_offset); + + if (!r) + return FALSE; + } + + } + + return TRUE; +} + +/* The final processing done just before writing out a MSP430 ELF object + file. This gets the MSP430 architecture right based on the machine + number. */ + +static void +bfd_elf_msp430_final_write_processing (abfd, linker) + bfd *abfd; + bfd_boolean linker ATTRIBUTE_UNUSED; +{ + unsigned long val; + + switch (bfd_get_mach (abfd)) + { + default: + case bfd_mach_msp12: + val = E_MSP430_MACH_MSP430x12; + break; + + case bfd_mach_msp110: + val = E_MSP430_MACH_MSP430x11x1; + break; + + case bfd_mach_msp11: + val = E_MSP430_MACH_MSP430x11; + break; + + case bfd_mach_msp13: + val = E_MSP430_MACH_MSP430x13; + break; + + case bfd_mach_msp14: + val = E_MSP430_MACH_MSP430x14; + break; + + case bfd_mach_msp41: + val = E_MSP430_MACH_MSP430x41; + break; + + case bfd_mach_msp43: + val = E_MSP430_MACH_MSP430x43; + break; + + case bfd_mach_msp44: + val = E_MSP430_MACH_MSP430x44; + break; + + case bfd_mach_msp31: + val = E_MSP430_MACH_MSP430x31; + break; + + case bfd_mach_msp32: + val = E_MSP430_MACH_MSP430x32; + break; + + case bfd_mach_msp33: + val = E_MSP430_MACH_MSP430x33; + break; + + case bfd_mach_msp15: + val = E_MSP430_MACH_MSP430x15; + break; + + case bfd_mach_msp16: + val = E_MSP430_MACH_MSP430x16; + break; + } + + elf_elfheader (abfd)->e_machine = EM_MSP430; + elf_elfheader (abfd)->e_flags &= ~EF_MSP430_MACH; + elf_elfheader (abfd)->e_flags |= val; +} + +/* Set the right machine number. */ + +static bfd_boolean +elf32_msp430_object_p (abfd) + bfd *abfd; +{ + int e_set = bfd_mach_msp14; + + if (elf_elfheader (abfd)->e_machine == EM_MSP430 + || elf_elfheader (abfd)->e_machine == EM_MSP430_OLD) + { + int e_mach = elf_elfheader (abfd)->e_flags & EF_MSP430_MACH; + + switch (e_mach) + { + default: + case E_MSP430_MACH_MSP430x12: + e_set = bfd_mach_msp12; + break; + + case E_MSP430_MACH_MSP430x11: + e_set = bfd_mach_msp11; + break; + + case E_MSP430_MACH_MSP430x11x1: + e_set = bfd_mach_msp110; + break; + + case E_MSP430_MACH_MSP430x13: + e_set = bfd_mach_msp13; + break; + + case E_MSP430_MACH_MSP430x14: + e_set = bfd_mach_msp14; + break; + + case E_MSP430_MACH_MSP430x41: + e_set = bfd_mach_msp41; + break; + + case E_MSP430_MACH_MSP430x31: + e_set = bfd_mach_msp31; + break; + + case E_MSP430_MACH_MSP430x32: + e_set = bfd_mach_msp32; + break; + + case E_MSP430_MACH_MSP430x33: + e_set = bfd_mach_msp33; + break; + + case E_MSP430_MACH_MSP430x43: + e_set = bfd_mach_msp43; + break; + + case E_MSP430_MACH_MSP430x44: + e_set = bfd_mach_msp44; + break; + + case E_MSP430_MACH_MSP430x15: + e_set = bfd_mach_msp15; + break; + + case E_MSP430_MACH_MSP430x16: + e_set = bfd_mach_msp16; + break; + } + } + + return bfd_default_set_arch_mach (abfd, bfd_arch_msp430, e_set); +} + +static void +elf32_msp430_post_process_headers (abfd, link_info) + bfd *abfd; + struct bfd_link_info *link_info ATTRIBUTE_UNUSED; +{ + Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */ + + i_ehdrp = elf_elfheader (abfd); + +#ifndef ELFOSABI_STANDALONE +#define ELFOSABI_STANDALONE 255 +#endif + + i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_STANDALONE; +} + + +#define ELF_ARCH bfd_arch_msp430 +#define ELF_MACHINE_CODE EM_MSP430 +#define ELF_MACHINE_ALT1 EM_MSP430_OLD +#define ELF_MAXPAGESIZE 1 + +#define TARGET_LITTLE_SYM bfd_elf32_msp430_vec +#define TARGET_LITTLE_NAME "elf32-msp430" + +#define elf_info_to_howto msp430_info_to_howto_rela +#define elf_info_to_howto_rel NULL +#define elf_backend_relocate_section elf32_msp430_relocate_section +#define elf_backend_gc_mark_hook elf32_msp430_gc_mark_hook +#define elf_backend_gc_sweep_hook elf32_msp430_gc_sweep_hook +#define elf_backend_check_relocs elf32_msp430_check_relocs +#define elf_backend_can_gc_sections 1 +#define elf_backend_final_write_processing bfd_elf_msp430_final_write_processing +#define elf_backend_object_p elf32_msp430_object_p +#define elf_backend_post_process_headers elf32_msp430_post_process_headers + +#include "elf32-target.h" diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 8f3cf58b61d..3a3a8a03c50 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -1373,6 +1373,11 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_VAX_GLOB_DAT", "BFD_RELOC_VAX_JMP_SLOT", "BFD_RELOC_VAX_RELATIVE", + "BFD_RELOC_MSP430_10_PCREL", + "BFD_RELOC_MSP430_16_PCREL", + "BFD_RELOC_MSP430_16", + "BFD_RELOC_MSP430_16_PCREL_BYTE", + "BFD_RELOC_MSP430_16_BYTE", "@@overflow: BFD_RELOC_UNUSED@@", }; #endif diff --git a/bfd/reloc.c b/bfd/reloc.c index 23224f3b3ab..ebf59aae9f5 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -3613,6 +3613,19 @@ ENUMX BFD_RELOC_VAX_RELATIVE ENUMDOC Relocations used by VAX ELF. + +ENUM + BFD_RELOC_MSP430_10_PCREL +ENUMX + BFD_RELOC_MSP430_16_PCREL +ENUMX + BFD_RELOC_MSP430_16 +ENUMX + BFD_RELOC_MSP430_16_PCREL_BYTE +ENUMX + BFD_RELOC_MSP430_16_BYTE +ENUMDOC + msp430 specific relocation codes ENDSENUM BFD_RELOC_UNUSED diff --git a/bfd/targets.c b/bfd/targets.c index 998327de1d0..bebd6a0a1b9 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -547,6 +547,7 @@ extern const bfd_target bfd_elf32_mcore_big_vec; extern const bfd_target bfd_elf32_mcore_little_vec; extern const bfd_target bfd_elf32_mn10200_vec; extern const bfd_target bfd_elf32_mn10300_vec; +extern const bfd_target bfd_elf32_msp430_vec; extern const bfd_target bfd_elf32_nbigmips_vec; extern const bfd_target bfd_elf32_nlittlemips_vec; extern const bfd_target bfd_elf32_ntradbigmips_vec; @@ -833,6 +834,7 @@ static const bfd_target * const _bfd_target_vector[] = { &bfd_elf32_mcore_little_vec, &bfd_elf32_mn10200_vec, &bfd_elf32_mn10300_vec, + &bfd_elf32_msp430_vec, #ifdef BFD64 &bfd_elf32_nbigmips_vec, &bfd_elf32_nlittlemips_vec, diff --git a/binutils/ChangeLog b/binutils/ChangeLog index f06f1f10b90..c5dbf952902 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2002-12-30 Dmitry Diky + + * Makefile.am: Add msp430 target. + * Makefile.in: Regenerate. + * readelf.c: Add support for msp430 target. + 2002-12-27 Chris Demetriou * doc/binutils.texi (objdump): Document MIPS -M options. diff --git a/binutils/Makefile.am b/binutils/Makefile.am index cca1e18f322..41348fd250d 100644 --- a/binutils/Makefile.am +++ b/binutils/Makefile.am @@ -470,12 +470,12 @@ readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/elf/i960.h $(INCDIR)/elf/ia64.h $(INCDIR)/elf/ip2k.h \ $(INCDIR)/elf/m32r.h $(INCDIR)/elf/m68k.h $(INCDIR)/elf/m68hc11.h \ $(INCDIR)/elf/mcore.h $(INCDIR)/elf/mips.h $(INCDIR)/elf/mmix.h \ - $(INCDIR)/elf/mn10200.h $(INCDIR)/elf/mn10300.h $(INCDIR)/elf/or32.h \ - $(INCDIR)/elf/pj.h $(INCDIR)/elf/ppc.h $(INCDIR)/elf/s390.h \ - $(INCDIR)/elf/sh.h $(INCDIR)/elf/sparc.h $(INCDIR)/elf/v850.h \ - $(INCDIR)/elf/vax.h $(INCDIR)/elf/x86-64.h $(INCDIR)/elf/xstormy16.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - unwind-ia64.h + $(INCDIR)/elf/mn10200.h $(INCDIR)/elf/mn10300.h $(INCDIR)/elf/msp430.h \ + $(INCDIR)/elf/or32.h $(INCDIR)/elf/pj.h $(INCDIR)/elf/ppc.h \ + $(INCDIR)/elf/s390.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/sparc.h \ + $(INCDIR)/elf/v850.h $(INCDIR)/elf/vax.h $(INCDIR)/elf/x86-64.h \ + $(INCDIR)/elf/xstormy16.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ + $(INCDIR)/fopen-same.h unwind-ia64.h rename.o: rename.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ $(INCDIR)/fopen-same.h diff --git a/binutils/Makefile.in b/binutils/Makefile.in index 954f0f979ee..252afbe05cb 100644 --- a/binutils/Makefile.in +++ b/binutils/Makefile.in @@ -1198,12 +1198,12 @@ readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/elf/i960.h $(INCDIR)/elf/ia64.h $(INCDIR)/elf/ip2k.h \ $(INCDIR)/elf/m32r.h $(INCDIR)/elf/m68k.h $(INCDIR)/elf/m68hc11.h \ $(INCDIR)/elf/mcore.h $(INCDIR)/elf/mips.h $(INCDIR)/elf/mmix.h \ - $(INCDIR)/elf/mn10200.h $(INCDIR)/elf/mn10300.h $(INCDIR)/elf/or32.h \ - $(INCDIR)/elf/pj.h $(INCDIR)/elf/ppc.h $(INCDIR)/elf/s390.h \ - $(INCDIR)/elf/sh.h $(INCDIR)/elf/sparc.h $(INCDIR)/elf/v850.h \ - $(INCDIR)/elf/vax.h $(INCDIR)/elf/x86-64.h $(INCDIR)/elf/xstormy16.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - unwind-ia64.h + $(INCDIR)/elf/mn10200.h $(INCDIR)/elf/mn10300.h $(INCDIR)/elf/msp430.h \ + $(INCDIR)/elf/or32.h $(INCDIR)/elf/pj.h $(INCDIR)/elf/ppc.h \ + $(INCDIR)/elf/s390.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/sparc.h \ + $(INCDIR)/elf/v850.h $(INCDIR)/elf/vax.h $(INCDIR)/elf/x86-64.h \ + $(INCDIR)/elf/xstormy16.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ + $(INCDIR)/fopen-same.h unwind-ia64.h rename.o: rename.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ $(INCDIR)/fopen-same.h diff --git a/binutils/readelf.c b/binutils/readelf.c index c3a39da9fab..d5ddb4b44c5 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -75,6 +75,7 @@ #include "elf/mmix.h" #include "elf/mn10200.h" #include "elf/mn10300.h" +#include "elf/msp430.h" #include "elf/or32.h" #include "elf/pj.h" #include "elf/ppc.h" @@ -756,6 +757,8 @@ guess_is_rela (e_machine) case EM_S390: case EM_S390_OLD: case EM_MMIX: + case EM_MSP430: + case EM_MSP430_OLD: case EM_XSTORMY16: case EM_VAX: case EM_IP2K: @@ -1154,6 +1157,11 @@ dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela) rtype = elf_mmix_reloc_type (type); break; + case EM_MSP430: + case EM_MSP430_OLD: + rtype = elf_msp430_reloc_type (type); + break; + case EM_PPC: case EM_PPC64: rtype = elf_ppc_reloc_type (type); diff --git a/gas/ChangeLog b/gas/ChangeLog index 927d2fec30c..b24dcfe651d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2002-12-30 Dmitry Diky + + * configure.in: Add msp430 target. + * configure: Regenerate. + * Makefile.am: Add msp430 target. + * Makefile.in: Regenerate. + * config/tc-msp430.c: New file: msp430 assembler. + * config/tc-msp430.h: New file: target macros for msp430. + * doc/Makefile.am: Add msp430 target. + * doc/Makefile.in: Regenerate. + * doc/as.texinfo: Include msp430 documenation. + * doc/all.texi: Enable msp430 documentation. + * doc/c-msp430.texi: New file: document msp430 specific features + of the assembler. + 2002-12-25 Alexandre Oliva * dwarf2dbg.c (DWARF2_ADDR_SIZE): New macro. diff --git a/gas/Makefile.am b/gas/Makefile.am index 7ef02183bfb..6156608ce63 100644 --- a/gas/Makefile.am +++ b/gas/Makefile.am @@ -66,6 +66,7 @@ CPU_TYPES = \ mmix \ mn10200 \ mn10300 \ + msp430 \ ns32k \ openrisc \ or32 \ @@ -258,6 +259,7 @@ TARGET_CPU_CFILES = \ config/tc-mmix.c \ config/tc-mn10200.c \ config/tc-mn10300.c \ + config/tc-msp430.c \ config/tc-ns32k.c \ config/tc-openrisc.c \ config/tc-or32.c \ @@ -308,6 +310,7 @@ TARGET_CPU_HFILES = \ config/tc-mmix.h \ config/tc-mn10200.h \ config/tc-mn10300.h \ + config/tc-msp430.h \ config/tc-ns32k.h \ config/tc-openrisc.h \ config/tc-or32.h \ @@ -1298,6 +1301,13 @@ DEPTC_mn10300_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h \ $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \ $(INCDIR)/opcode/mn10300.h dwarf2dbg.h +DEPTC_msp430_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-msp430.h \ + $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ + subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/msp430.h +DEPTC_msp430_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-msp430.h subsegs.h \ + $(INCDIR)/obstack.h $(INCDIR)/opcode/msp430.h DEPTC_ns32k_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \ $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ $(INCDIR)/opcode/ns32k.h $(INCDIR)/obstack.h @@ -1802,6 +1812,13 @@ DEPOBJ_mn10300_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h \ $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \ struc-symbol.h $(INCDIR)/aout/aout64.h +DEPOBJ_msp430_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-msp430.h \ + $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ + $(INCDIR)/obstack.h subsegs.h +DEPOBJ_msp430_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-msp430.h subsegs.h \ + $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h DEPOBJ_ns32k_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \ $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h @@ -2190,6 +2207,11 @@ DEP_mn10300_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mn10300.h \ DEP_mn10300_elf = $(srcdir)/config/obj-elf.h $(INCDIR)/symcat.h \ $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h +DEP_msp430_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-msp430.h \ + $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h +DEP_msp430_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-msp430.h DEP_ns32k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-ns32k.h \ $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h DEP_ns32k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-ns32k.h \ diff --git a/gas/Makefile.in b/gas/Makefile.in index 99ca3c4cc49..0e6853ec578 100644 --- a/gas/Makefile.in +++ b/gas/Makefile.in @@ -177,6 +177,7 @@ CPU_TYPES = \ mmix \ mn10200 \ mn10300 \ + msp430 \ ns32k \ openrisc \ or32 \ @@ -375,6 +376,7 @@ TARGET_CPU_CFILES = \ config/tc-mmix.c \ config/tc-mn10200.c \ config/tc-mn10300.c \ + config/tc-msp430.c \ config/tc-ns32k.c \ config/tc-openrisc.c \ config/tc-or32.c \ @@ -426,6 +428,7 @@ TARGET_CPU_HFILES = \ config/tc-mmix.h \ config/tc-mn10200.h \ config/tc-mn10300.h \ + config/tc-msp430.h \ config/tc-ns32k.h \ config/tc-openrisc.h \ config/tc-or32.h \ @@ -1068,6 +1071,15 @@ DEPTC_mn10300_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \ $(INCDIR)/opcode/mn10300.h dwarf2dbg.h +DEPTC_msp430_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-msp430.h \ + $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ + subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/msp430.h + +DEPTC_msp430_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-msp430.h subsegs.h \ + $(INCDIR)/obstack.h $(INCDIR)/opcode/msp430.h + DEPTC_ns32k_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \ $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ $(INCDIR)/opcode/ns32k.h $(INCDIR)/obstack.h @@ -1685,6 +1697,15 @@ DEPOBJ_mn10300_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \ struc-symbol.h $(INCDIR)/aout/aout64.h +DEPOBJ_msp430_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-msp430.h \ + $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ + $(INCDIR)/obstack.h subsegs.h + +DEPOBJ_msp430_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-msp430.h subsegs.h \ + $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h + DEPOBJ_ns32k_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \ $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h @@ -2184,6 +2205,13 @@ DEP_mn10300_elf = $(srcdir)/config/obj-elf.h $(INCDIR)/symcat.h \ $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h +DEP_msp430_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-msp430.h \ + $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h + +DEP_msp430_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-msp430.h + DEP_ns32k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-ns32k.h \ $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c index e546dcf5858..abbc96b194c 100644 --- a/gas/config/tc-alpha.c +++ b/gas/config/tc-alpha.c @@ -1519,6 +1519,7 @@ alpha_fix_adjustable (f) we're preventing this in the other assemblers. Follow for now. */ return 0; +#ifdef OBJ_ELF case BFD_RELOC_ALPHA_BRSGP: /* If we have a BRSGP reloc to a local symbol, adjust it to BRADDR and let it get resolved at assembly time. */ @@ -1551,6 +1552,7 @@ alpha_fix_adjustable (f) f->fx_offset += offset; return 1; } +#endif default: return 1; diff --git a/gas/config/tc-msp430.c b/gas/config/tc-msp430.c new file mode 100644 index 00000000000..a07f13ff7c8 --- /dev/null +++ b/gas/config/tc-msp430.c @@ -0,0 +1,1552 @@ +/* tc-msp430.c -- Assembler code for the Texas Instruments MSP430 + + Copyright (C) 2002 Free Software Foundation, Inc. + Contributed by Dmitry Diky + + 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. */ + +#include +#include +#include +#include + +#define PUSH_1X_WORKAROUND +#include "as.h" +#include "subsegs.h" +#include "opcode/msp430.h" +#include "safe-ctype.h" + +const char comment_chars[] = ";"; +const char line_comment_chars[] = "#"; +const char line_separator_chars[] = ""; +const char EXP_CHARS[] = "eE"; +const char FLT_CHARS[] = "dD"; + +/* Handle long expressions. */ +extern LITTLENUM_TYPE generic_bignum[]; + +static struct hash_control *msp430_hash; + +static unsigned int msp430_operands + PARAMS ((struct msp430_opcode_s *, char *)); +static int msp430_srcoperand + PARAMS ((struct msp430_operand_s *, char *, int, int *)); +static int msp430_dstoperand + PARAMS ((struct msp430_operand_s *, char *, int)); +static char *parse_exp + PARAMS ((char *, expressionS *)); +static inline char *skip_space + PARAMS ((char *)); +static int check_reg + PARAMS ((char *)); +static void msp430_set_arch + PARAMS ((int)); +static void show_mcu_list + PARAMS ((FILE *)); +static void del_spaces + PARAMS ((char *)); + +#define MAX_OP_LEN 64 + +struct mcu_type_s +{ + char *name; + int isa; + int mach; +}; + +#define MSP430_ISA_11 11 +#define MSP430_ISA_12 12 +#define MSP430_ISA_13 13 +#define MSP430_ISA_14 14 +#define MSP430_ISA_41 41 +#define MSP430_ISA_31 31 +#define MSP430_ISA_32 32 +#define MSP430_ISA_33 33 +#define MSP430_ISA_110 110 +#define MSP430_ISA_43 43 +#define MSP430_ISA_44 44 +#define MSP430_ISA_15 15 +#define MSP430_ISA_16 16 + +#define CHECK_RELOC_MSP430 ((imm_op || byte_op)?BFD_RELOC_MSP430_16_BYTE:BFD_RELOC_MSP430_16) +#define CHECK_RELOC_MSP430_PCREL ((imm_op || byte_op)?BFD_RELOC_MSP430_16_PCREL_BYTE:BFD_RELOC_MSP430_16_PCREL) + +static struct mcu_type_s mcu_types[] = +{ + {"msp1", MSP430_ISA_11, bfd_mach_msp11}, + {"msp2", MSP430_ISA_14, bfd_mach_msp14}, + {"msp430x110", MSP430_ISA_11, bfd_mach_msp11}, + {"msp430x112", MSP430_ISA_11, bfd_mach_msp11}, + {"msp430x122", MSP430_ISA_12, bfd_mach_msp12}, + {"msp430x122", MSP430_ISA_12, bfd_mach_msp12}, + {"msp430x1222",MSP430_ISA_12, bfd_mach_msp12}, + {"msp430x123", MSP430_ISA_12, bfd_mach_msp12}, + {"msp430x1232",MSP430_ISA_12, bfd_mach_msp12}, + {"msp430x133", MSP430_ISA_13, bfd_mach_msp13}, + {"msp430x135", MSP430_ISA_13, bfd_mach_msp13}, + {"msp430x147", MSP430_ISA_14, bfd_mach_msp14}, + {"msp430x148", MSP430_ISA_14, bfd_mach_msp14}, + {"msp430x149", MSP430_ISA_14, bfd_mach_msp14}, + {"msp430x412", MSP430_ISA_41, bfd_mach_msp41}, + {"msp430x413", MSP430_ISA_41, bfd_mach_msp41}, + {"msp430x311", MSP430_ISA_31, bfd_mach_msp31}, + {"msp430x312", MSP430_ISA_31, bfd_mach_msp31}, + {"msp430x313", MSP430_ISA_31, bfd_mach_msp31}, + {"msp430x314", MSP430_ISA_31, bfd_mach_msp31}, + {"msp430x315", MSP430_ISA_31, bfd_mach_msp31}, + {"msp430x323", MSP430_ISA_32, bfd_mach_msp32}, + {"msp430x325", MSP430_ISA_32, bfd_mach_msp32}, + {"msp430x336", MSP430_ISA_33, bfd_mach_msp33}, + {"msp430x337", MSP430_ISA_33, bfd_mach_msp33}, + {"msp430x1101",MSP430_ISA_110, bfd_mach_msp110}, + {"msp430x1111",MSP430_ISA_110, bfd_mach_msp110}, + {"msp430x1121",MSP430_ISA_110, bfd_mach_msp110}, + {"msp430x1331",MSP430_ISA_13, bfd_mach_msp13}, + {"msp430x1351",MSP430_ISA_13, bfd_mach_msp13}, + {"msp430x435", MSP430_ISA_43, bfd_mach_msp43}, + {"msp430x436", MSP430_ISA_43, bfd_mach_msp43}, + {"msp430x447", MSP430_ISA_44, bfd_mach_msp44}, + {"msp430x448", MSP430_ISA_44, bfd_mach_msp44}, + {"msp430x449", MSP430_ISA_44, bfd_mach_msp44}, + {"msp430x167", MSP430_ISA_16, bfd_mach_msp16}, + {"msp430x168", MSP430_ISA_16, bfd_mach_msp16}, + {"msp430x169", MSP430_ISA_16, bfd_mach_msp16}, + {"msp430x155", MSP430_ISA_15, bfd_mach_msp15}, + {"msp430x156", MSP430_ISA_15, bfd_mach_msp15}, + {"msp430x157", MSP430_ISA_15, bfd_mach_msp15}, + + {NULL, 0, 0} +}; + + +static struct mcu_type_s default_mcu = + { "msp430x11", MSP430_ISA_11, bfd_mach_msp11 }; + +static struct mcu_type_s *msp430_mcu = &default_mcu; + +const pseudo_typeS md_pseudo_table[] = +{ + {"arch", msp430_set_arch, 0}, + {NULL, NULL, 0} +}; + +#define OPTION_MMCU 'm' + +const char *md_shortopts = "m:"; + +struct option md_longopts[] = +{ + {"mmcu", required_argument, NULL, OPTION_MMCU}, + {NULL, no_argument, NULL, 0} +}; + +size_t md_longopts_size = sizeof (md_longopts); + +static void +show_mcu_list (stream) + FILE *stream; +{ + int i; + + fprintf (stream, _("Known MCU names:\n")); + + for (i = 0; mcu_types[i].name; i++) + fprintf (stream, _("\t %s\n"), mcu_types[i].name); + + fprintf (stream, "\n"); +} + +void +md_show_usage (stream) + FILE *stream; +{ + fprintf (stream, + _("MSP430 options:\n" + " -mmcu=[msp430-name] select microcontroller type\n" + " msp430x1101 msp430x1111 msp430x1121\n" + " msp430x1331 msp430x1351\n" + " msp430x1222 msp430x1232\n" + " msp430x311 msp430x312 msp430x313 msp430x314 msp430x315\n" + " msp430x323 msp430x325\n" + " msp430x336 msp430x337\n" + " msp430x412 msp430x413\n" + " msp430x110 msp430x112\n" + " msp430x122 msp430x123\n" + " msp430x133 msp430x135\n" + " msp430x147 msp430x148 msp430x149\n" + " msp430x167 msp430x168 msp430x169\n" + " msp430x155 msp430x156 msp430x157\n" + " msp430x447 msp430x448 msp430x449\n" + " msp430x435 msp430x436\n")); + + show_mcu_list (stream); +} + +static char * +extract_word (char *from, char *to, int limit) +{ + char *op_start; + char *op_end; + int size = 0; + + /* Drop leading whitespace. */ + from = skip_space (from); + *to = 0; + + /* Find the op code end. */ + for (op_start = op_end = from; *op_end != 0 && is_part_of_name (*op_end);) + { + to[size++] = *op_end++; + if (size + 1 >= limit) + break; + } + + to[size] = 0; + return op_end; +} + +static void +msp430_set_arch (dummy) + int dummy ATTRIBUTE_UNUSED; +{ + char *str = (char *) alloca (32); /* 32 for good measure. */ + + input_line_pointer = extract_word (input_line_pointer, str, 32); + + md_parse_option (OPTION_MMCU, str); + bfd_set_arch_mach (stdoutput, TARGET_ARCH, msp430_mcu->mach); +} + +int +md_parse_option (c, arg) + int c; + char *arg; +{ + int i; + + switch (c) + { + case OPTION_MMCU: + for (i = 0; mcu_types[i].name; ++i) + if (strcmp (mcu_types[i].name, arg) == 0) + break; + + if (!mcu_types[i].name) + { + show_mcu_list (stderr); + as_fatal (_("unknown MCU: %s\n"), arg); + } + + if (msp430_mcu == &default_mcu || msp430_mcu->mach == mcu_types[i].mach) + msp430_mcu = &mcu_types[i]; + else + as_fatal (_("redefinition of mcu type %s' to %s'"), + msp430_mcu->name, mcu_types[i].name); + return 1; + } + + return 0; +} + +symbolS * +md_undefined_symbol (name) + char *name ATTRIBUTE_UNUSED; +{ + return 0; +} + +static inline char * +skip_space (s) + char *s; +{ + while (ISSPACE (*s)) + ++s; + return s; +} + +/* Delete spaces from s: X ( r 1 2) => X(r12). */ + +static void +del_spaces (s) + char *s; +{ + while (*s) + { + if (ISSPACE (*s)) + { + char *m = s + 1; + + while (ISSPACE (*m) && *m) + m++; + memmove (s, m, strlen (m) + 1); + } + else + s++; + } +} + +/* Extract one word from FROM and copy it to TO. Delimeters are ",;\n" */ + +static char * +extract_operand (char *from, char *to, int limit) +{ + int size = 0; + + /* Drop leading whitespace. */ + from = skip_space (from); + + while (size < limit && *from) + { + *(to + size) = *from; + if (*from == ',' || *from == ';' || *from == '\n') + break; + from++; + size++; + } + + *(to + size) = 0; + del_spaces (to); + + from++; + + return from; +} + +static char * +extract_cmd (char *from, char *to, int limit) +{ + int size = 0; + + while (*from && ! ISSPACE (*from) && *from != '.' && limit > size) + { + *(to + size) = *from; + from++; + size++; + } + + *(to + size) = 0; + + return from; +} + +/* Turn a string in input_line_pointer into a floating point constant + of type TYPE, and store the appropriate bytes in *LITP. The number + of LITTLENUMS emitted is stored in *SIZEP. An error message is + returned, or NULL on OK. */ + +char * +md_atof (type, litP, sizeP) + int type; + char *litP; + int *sizeP; +{ + int prec; + LITTLENUM_TYPE words[4]; + LITTLENUM_TYPE *wordP; + char *t; + + switch (type) + { + case 'f': + prec = 2; + break; + case 'd': + prec = 4; + break; + default: + *sizeP = 0; + return _("bad call to md_atof"); + } + + t = atof_ieee (input_line_pointer, type, words); + if (t) + input_line_pointer = t; + + *sizeP = prec * sizeof (LITTLENUM_TYPE); + + /* This loop outputs the LITTLENUMs in REVERSE order. */ + for (wordP = words + prec - 1; prec--;) + { + md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE)); + litP += sizeof (LITTLENUM_TYPE); + } + + return NULL; +} + +void +md_convert_frag (abfd, sec, fragP) + bfd *abfd ATTRIBUTE_UNUSED; + asection *sec ATTRIBUTE_UNUSED; + fragS *fragP ATTRIBUTE_UNUSED; +{ + abort (); +} + +void +md_begin () +{ + struct msp430_opcode_s *opcode; + msp430_hash = hash_new (); + + for (opcode = msp430_opcodes; opcode->name; opcode++) + hash_insert (msp430_hash, opcode->name, (char *) opcode); + + bfd_set_arch_mach (stdoutput, TARGET_ARCH, msp430_mcu->mach); +} + +void +md_assemble (str) + char *str; +{ + struct msp430_opcode_s *opcode; + char cmd[32]; + unsigned int i = 0; + + str = skip_space (str); /* Skip leading spaces. */ + str = extract_cmd (str, cmd, sizeof (cmd)); + + while (cmd[i] && i < sizeof (cmd)) + { + char a = tolower (cmd[i]); + cmd[i] = a; + i++; + } + + if (!cmd[0]) + { + as_bad (_("can't find opcode ")); + return; + } + + opcode = (struct msp430_opcode_s *) hash_find (msp430_hash, cmd); + + if (opcode == NULL) + { + as_bad (_("unknown opcode `%s'"), cmd); + return; + } + + { + char *__t = input_line_pointer; + msp430_operands (opcode, str); + input_line_pointer = __t; + } +} + +/* Parse instruction operands. + Return binary opcode. */ + +static unsigned int +msp430_operands (opcode, line) + struct msp430_opcode_s *opcode; + char *line; +{ + int bin = opcode->bin_opcode; /* opcode mask. */ + int __is; + char l1[MAX_OP_LEN], l2[MAX_OP_LEN]; + char *frag; + int where; + struct msp430_operand_s op1, op2; + int res = 0; + static short ZEROS = 0; + int byte_op, imm_op; + + /* opcode is the one from opcodes table + line contains something like + [.w] @r2+, 5(R1) + or + .b @r2+, 5(R1). */ + + /* Check if byte or word operation. */ + if (*line == '.' && tolower (*(line + 1)) == 'b') + { + bin |= BYTE_OPERATION; + byte_op = 1; + } + else + byte_op = 0; + + /* skip .[bwBW]. */ + while (! ISSPACE (*line) && *line) + line++; + + if (opcode->insn_opnumb && (!*line || *line == '\n')) + { + as_bad (_("instruction %s requires %d operand(s)"), + opcode->name, opcode->insn_opnumb); + return 0; + } + + memset (l1, 0, sizeof (l1)); + memset (l2, 0, sizeof (l2)); + memset (&op1, 0, sizeof (op1)); + memset (&op2, 0, sizeof (op2)); + + imm_op = 0; + + switch (opcode->fmt) + { + case 0: /* Emulated. */ + switch (opcode->insn_opnumb) + { + case 0: + /* Set/clear bits instructions. */ + __is = 2; + frag = frag_more (__is); + bfd_putl16 ((bfd_vma) bin, frag); + break; + case 1: + /* Something which works with destination operand. */ + line = extract_operand (line, l1, sizeof (l1)); + res = msp430_dstoperand (&op1, l1, opcode->bin_opcode); + if (res) + break; + + bin |= (op1.reg | (op1.am << 7)); + __is = 1 + op1.ol; + frag = frag_more (2 * __is); + where = frag - frag_now->fr_literal; + bfd_putl16 ((bfd_vma) bin, frag); + + if (op1.mode == OP_EXP) + { + where += 2; + bfd_putl16 ((bfd_vma) ZEROS, frag + 2); + + if (op1.reg) + fix_new_exp (frag_now, where, 2, + &(op1.exp), FALSE, CHECK_RELOC_MSP430); + else + fix_new_exp (frag_now, where, 2, + &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); + } + break; + + case 2: + { + char l2[16]; + + /* Shift instruction. */ + line = extract_operand (line, l1, sizeof (l1)); + strncpy (l2, l1, 16); + res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op); + res += msp430_dstoperand (&op2, l2, opcode->bin_opcode); + + if (res) + break; /* An error occured. All warnings were done before. */ + + bin |= (op2.reg | (op1.reg << 8) | (op1.am << 4) | (op2.am << 7)); + + __is = 1 + op1.ol + op2.ol; /* insn size in words. */ + frag = frag_more (2 * __is); + where = frag - frag_now->fr_literal; + bfd_putl16 ((bfd_vma) bin, frag); + + if (op1.mode == OP_EXP) + { + where += 2; /* Advance 'where' as we do not know _where_. */ + bfd_putl16 ((bfd_vma) ZEROS, frag + 2); + + if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ + fix_new_exp (frag_now, where, 2, + &(op1.exp), FALSE, CHECK_RELOC_MSP430); + else + fix_new_exp (frag_now, where, 2, + &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); + } + + if (op2.mode == OP_EXP) + { + imm_op = 0; + bfd_putl16 ((bfd_vma) ZEROS, frag + 2 + ((__is == 3) ? 2 : 0)); + + if (op2.reg) /* Not PC relative. */ + fix_new_exp (frag_now, where + 2, 2, + &(op2.exp), FALSE, CHECK_RELOC_MSP430); + else + fix_new_exp (frag_now, where + 2, 2, + &(op2.exp), TRUE, CHECK_RELOC_MSP430_PCREL); + } + break; + } + case 3: + /* Branch instruction => mov dst, r0. */ + line = extract_operand (line, l1, sizeof (l1)); + + res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op); + if (res) + break; + + byte_op = 0; + imm_op = 0; + + bin |= ((op1.reg << 8) | (op1.am << 4)); + __is = 1 + op1.ol; + frag = frag_more (2 * __is); + where = frag - frag_now->fr_literal; + bfd_putl16 ((bfd_vma) bin, frag); + + if (op1.mode == OP_EXP) + { + where += 2; + bfd_putl16 ((bfd_vma) ZEROS, frag + 2); + + if (op1.reg || (op1.reg == 0 && op1.am == 3)) + fix_new_exp (frag_now, where, 2, + &(op1.exp), FALSE, CHECK_RELOC_MSP430); + else + fix_new_exp (frag_now, where, 2, + &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); + } + break; + } + break; + + case 1: /* Format 1, double operand. */ + line = extract_operand (line, l1, sizeof (l1)); + line = extract_operand (line, l2, sizeof (l2)); + res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op); + res += msp430_dstoperand (&op2, l2, opcode->bin_opcode); + + if (res) + break; /* Error occured. All warnings were done before. */ + + bin |= (op2.reg | (op1.reg << 8) | (op1.am << 4) | (op2.am << 7)); + + __is = 1 + op1.ol + op2.ol; /* insn size in words. */ + frag = frag_more (2 * __is); + where = frag - frag_now->fr_literal; + bfd_putl16 ((bfd_vma) bin, frag); + + if (op1.mode == OP_EXP) + { + where += 2; /* Advance where as we do not know _where_. */ + bfd_putl16 ((bfd_vma) ZEROS, frag + 2); + + if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ + fix_new_exp (frag_now, where, 2, + &(op1.exp), FALSE, CHECK_RELOC_MSP430); + else + fix_new_exp (frag_now, where, 2, + &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); + } + + if (op2.mode == OP_EXP) + { + imm_op = 0; + bfd_putl16 ((bfd_vma) ZEROS, frag + 2 + ((__is == 3) ? 2 : 0)); + + if (op2.reg) /* Not PC relative. */ + fix_new_exp (frag_now, where + 2, 2, + &(op2.exp), FALSE, CHECK_RELOC_MSP430); + else + fix_new_exp (frag_now, where + 2, 2, + &(op2.exp), TRUE, CHECK_RELOC_MSP430_PCREL); + } + break; + + case 2: /* Single-operand mostly instr. */ + if (opcode->insn_opnumb == 0) + { + /* reti instruction. */ + frag = frag_more (2); + bfd_putl16 ((bfd_vma) bin, frag); + break; + } + + line = extract_operand (line, l1, sizeof (l1)); + res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op); + if (res) + break; /* Error in operand. */ + + bin |= op1.reg | (op1.am << 4); + __is = 1 + op1.ol; + frag = frag_more (2 * __is); + where = frag - frag_now->fr_literal; + bfd_putl16 ((bfd_vma) bin, frag); + + if (op1.mode == OP_EXP) + { + bfd_putl16 ((bfd_vma) ZEROS, frag + 2); + + if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ + fix_new_exp (frag_now, where + 2, 2, + &(op1.exp), FALSE, CHECK_RELOC_MSP430); + else + fix_new_exp (frag_now, where + 2, 2, + &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); + } + break; + + case 3: /* Conditional jumps instructions. */ + line = extract_operand (line, l1, sizeof (l1)); + /* l1 is a label. */ + if (l1[0]) + { + char *m = l1; + expressionS exp; + + if (*m == '$') + m++; + + parse_exp (m, &exp); + frag = frag_more (2); /* Instr size is 1 word. */ + + /* In order to handle something like: + + and #0x8000, r5 + tst r5 + jz 4 ; skip next 4 bytes + inv r5 + inc r5 + nop ; will jump here if r5 positive or zero + + jCOND -n ;assumes jump n bytes backward: + + mov r5,r6 + jmp -2 + + is equial to: + lab: + mov r5,r6 + jmp lab + + jCOND $n ; jump from PC in either direction. */ + + if (exp.X_op == O_constant) + { + int x = exp.X_add_number; + + if (x & 1) + { + as_warn (_("Even number required. Rounded to %d"), x + 1); + x++; + } + + if ((*l1 == '$' && x > 0) || x < 0) + x -= 2; + + x >>= 1; + + if (x > 512 || x < -511) + { + as_bad (_("Wrong displacement %d"), x << 1); + break; + } + + bin |= x & 0x3ff; + bfd_putl16 ((bfd_vma) bin, frag); + } + else if (exp.X_op == O_symbol && *l1 != '$') + { + where = frag - frag_now->fr_literal; + fix_new_exp (frag_now, where, 2, + &exp, TRUE, BFD_RELOC_MSP430_10_PCREL); + + bfd_putl16 ((bfd_vma) bin, frag); + } + else if (*l1 == '$') + { + as_bad (_("instruction requires label sans '$'")); + break; + } + else + { + as_bad (_ + ("instruction requires label or value in range -511:512")); + break; + } + } + else + { + as_bad (_("instruction requires label")); + break; + } + break; + + default: + as_bad (_("Ilegal instruction or not implmented opcode.")); + } + + input_line_pointer = line; + return 0; +} + +static int +msp430_dstoperand (op, l, bin) + struct msp430_operand_s *op; + char *l; + int bin; +{ + int dummy; + int ret = msp430_srcoperand (op, l, bin, &dummy); + if (ret) + return ret; + + if (op->am == 2) + { + char *__tl = "0"; + + op->mode = OP_EXP; + op->am = 1; + op->ol = 1; + parse_exp (__tl, &(op->exp)); + if (op->exp.X_op != O_constant || op->exp.X_add_number != 0) + { + as_bad (_("Internal bug. Try to use 0(r%d) instead of @r%d"), + op->reg, op->reg); + return 1; + } + return 0; + } + + if (op->am > 1) + { + as_bad (_ + ("this addressing mode is not applicable for destination operand")); + return 1; + } + return 0; +} + + +static int +check_reg (t) + char *t; +{ + /* If this is a reg numb, str 't' must be a number from 0 - 15. */ + + if (strlen (t) > 2 && *(t + 2) != '+') + return 1; + + while (*t) + { + if ((*t < '0' || *t > '9') && *t != '+') + break; + t++; + } + + if (*t) + return 1; + + return 0; +} + + +static int +msp430_srcoperand (op, l, bin, imm_op) + struct msp430_operand_s *op; + char *l; + int bin; + int *imm_op; +{ + char *__tl = l; + + /* Check if an immediate #VALUE. The hash sign should be only at the beginning! */ + if (*l == '#') + { + char *h = l; + int vshift = -1; + int rval = 0; + + /* Check if there is: + llo(x) - least significant 16 bits, x &= 0xffff + lhi(x) - x = (x >> 16) & 0xffff, + hlo(x) - x = (x >> 32) & 0xffff, + hhi(x) - x = (x >> 48) & 0xffff + The value _MUST_ be constant expression: #hlo(1231231231). */ + + *imm_op = 1; + + if (strncasecmp (h, "#llo(", 5) == 0) + { + vshift = 0; + rval = 3; + } + else if (strncasecmp (h, "#lhi(", 5) == 0) + { + vshift = 1; + rval = 3; + } + else if (strncasecmp (h, "#hlo(", 5) == 0) + { + vshift = 2; + rval = 3; + } + else if (strncasecmp (h, "#hhi(", 5) == 0) + { + vshift = 3; + rval = 3; + } + else if (strncasecmp (h, "#lo(", 4) == 0) + { + vshift = 0; + rval = 2; + } + else if (strncasecmp (h, "#hi(", 4) == 0) + { + vshift = 1; + rval = 2; + } + + op->reg = 0; /* Reg PC. */ + op->am = 3; + op->ol = 1; /* Immediate will follow an instruction. */ + __tl = h + 1 + rval; + op->mode = OP_EXP; + parse_exp (__tl, &(op->exp)); + if (op->exp.X_op == O_constant) + { + int x = op->exp.X_add_number; + + if (vshift == 0) + { + x = x & 0xffff; + op->exp.X_add_number = x; + } + else if (vshift == 1) + { + x = (x >> 16) & 0xffff; + op->exp.X_add_number = x; + } + else if (vshift > 1) + { + if (x < 0) + op->exp.X_add_number = -1; + else + op->exp.X_add_number = 0; /* Nothing left. */ + x = op->exp.X_add_number; + } + + if (op->exp.X_add_number > 65535 || op->exp.X_add_number < -32768) + { + as_bad (_("value %ld out of range. Use #lo() or #hi()"), x); + return 1; + } + + /* Now check constants. */ + /* Substitude register mode with a constant generator if applicable. */ + + x = (short) x; /* Extend sign. */ + + if (x == 0) + { + op->reg = 3; + op->am = 0; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == 1) + { + op->reg = 3; + op->am = 1; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == 2) + { + op->reg = 3; + op->am = 2; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == -1) + { + op->reg = 3; + op->am = 3; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == 4) + { +#ifdef PUSH_1X_WORKAROUND + if (bin == 0x1200 + && (msp430_mcu->isa == MSP430_ISA_11 + || msp430_mcu->isa == MSP430_ISA_12 + || msp430_mcu->isa == MSP430_ISA_13 + || msp430_mcu->isa == MSP430_ISA_14)) + { + /* Remove warning as confusing. + as_warn(_("Hardware push bug workaround")); */ + } + else +#endif + { + op->reg = 2; + op->am = 2; + op->ol = 0; + op->mode = OP_REG; + } + } + else if (x == 8) + { +#ifdef PUSH_1X_WORKAROUND + if (bin == 0x1200 + && (msp430_mcu->isa == MSP430_ISA_11 + || msp430_mcu->isa == MSP430_ISA_12 + || msp430_mcu->isa == MSP430_ISA_13 + || msp430_mcu->isa == MSP430_ISA_14)) + { + /* Remove warning as confusing. + as_warn(_("Hardware push bug workaround")); */ + } + else +#endif + { + op->reg = 2; + op->am = 3; + op->ol = 0; + op->mode = OP_REG; + } + } + } + else if (op->exp.X_op == O_symbol) + { + op->mode = OP_EXP; + } + else if (op->exp.X_op == O_big) + { + short x; + if (vshift != -1) + { + op->exp.X_op = O_constant; + op->exp.X_add_number = 0xffff & generic_bignum[vshift]; + x = op->exp.X_add_number; + } + else + { + as_bad (_ + ("unknown expression in operand %s. use #llo() #lhi() #hlo() #hhi() "), + l); + return 1; + } + + if (x == 0) + { + op->reg = 3; + op->am = 0; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == 1) + { + op->reg = 3; + op->am = 1; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == 2) + { + op->reg = 3; + op->am = 2; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == -1) + { + op->reg = 3; + op->am = 3; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == 4) + { + op->reg = 2; + op->am = 2; + op->ol = 0; + op->mode = OP_REG; + } + else if (x == 8) + { + op->reg = 2; + op->am = 3; + op->ol = 0; + op->mode = OP_REG; + } + } + else + { + as_bad (_("unknown operand %s"), l); + } + return 0; + } + + /* Check if absolute &VALUE (assume that we can construct something like ((a&b)<<7 + 25). */ + if (*l == '&') + { + char *h = l; + + op->reg = 2; /* reg 2 in absolute addr mode. */ + op->am = 1; /* mode As == 01 bin. */ + op->ol = 1; /* Immediate value followed by instruction. */ + __tl = h + 1; + parse_exp (__tl, &(op->exp)); + op->mode = OP_EXP; + if (op->exp.X_op == O_constant) + { + int x = op->exp.X_add_number; + if (x > 65535 || x < -32768) + { + as_bad (_("value out of range: %d"), x); + return 1; + } + } + else if (op->exp.X_op == O_symbol) + { + } + else + { + as_bad (_("unknown expression in operand %s"), l); + return 1; + } + return 0; + } + + /* Check if inderect register mode @Rn / postincrement @Rn+. */ + if (*l == '@') + { + char *t = l; + char *m = strchr (l, '+'); + + if (t != l) + { + as_bad (_("unknown addressing mode %s"), l); + return 1; + } + + t++; + if (*t != 'r' && *t != 'R') + { + as_bad (_("unknown addressing mode %s"), l); + return 1; + } + + t++; /* Points to the reg value. */ + + if (check_reg (t)) + { + as_bad (_("Bad register name r%s"), t); + return 1; + } + + op->mode = OP_REG; + op->am = m ? 3 : 2; + op->ol = 0; + if (m) + *m = 0; /* strip '+' */ + op->reg = atoi (t); + if (op->reg < 0 || op->reg > 15) + { + as_bad (_("MSP430 does not have %d registers"), op->reg); + return 1; + } + + return 0; + } + + /* Check if register indexed X(Rn). */ + do + { + char *h = strrchr (l, '('); + char *m = strrchr (l, ')'); + char *t; + + *imm_op = 1; + + if (!h) + break; + if (!m) + { + as_bad (_("')' required")); + return 1; + } + + t = h; + op->am = 1; + op->ol = 1; + /* Extract a register. */ + t++; /* Advance pointer. */ + + if (*t != 'r' && *t != 'R') + { + as_bad (_ + ("unknown operator %s. Did you mean X(Rn) or #[hl][hl][oi](CONST) ?"), + l); + return 1; + } + t++; + + op->reg = *t - '0'; + if (op->reg > 9 || op->reg < 0) + { + as_bad (_("unknown operator (r%s substituded as a register name"), + t); + return 1; + } + t++; + if (*t != ')') + { + op->reg = op->reg * 10; + op->reg += *t - '0'; + + if (op->reg > 15) + { + as_bad (_("unknown operator %s"), l); + return 1; + } + if (op->reg == 2) + { + as_bad (_("r2 should not be used in indexed addressing mode")); + return 1; + } + + if (*(t + 1) != ')') + { + as_bad (_("unknown operator %s"), l); + return 1; + } + } + + /* Extract constant. */ + __tl = l; + *h = 0; + op->mode = OP_EXP; + parse_exp (__tl, &(op->exp)); + if (op->exp.X_op == O_constant) + { + int x = op->exp.X_add_number; + + if (x > 65535 || x < -32768) + { + as_bad (_("value out of range: %d"), x); + return 1; + } + + if (x == 0) + { + op->mode = OP_REG; + op->am = 2; + op->ol = 0; + return 0; + } + } + else if (op->exp.X_op == O_symbol) + { + } + else + { + as_bad (_("unknown expression in operand %s"), l); + return 1; + } + + return 0; + } + while (0); + + /* Register mode 'mov r1,r2'. */ + do + { + char *t = l; + + /* Operand should be a register. */ + if (*t == 'r' || *t == 'R') + { + int x = atoi (t + 1); + + if (check_reg (t + 1)) + break; + + if (x < 0 || x > 15) + break; /* Symbolic mode. */ + + op->mode = OP_REG; + op->am = 0; + op->ol = 0; + op->reg = x; + return 0; + } + } + while (0); + + /* Symbolic mode 'mov a, b' == 'mov x(pc), y(pc)'. */ + do + { + char *t = l; + + __tl = l; + + while (*t) + { + /* alpha/number underline dot for labels. */ + if (! ISALNUM (*t) && *t != '_' && *t != '.') + { + as_bad (_("unknown operand %s"), l); + return 1; + } + t++; + } + + op->mode = OP_EXP; + op->reg = 0; /* PC relative... be careful. */ + op->am = 1; + op->ol = 1; + __tl = l; + parse_exp (__tl, &(op->exp)); + return 0; + } + while (0); + + /* Unreachable. */ + as_bad (_("unknown addressing mode for operand %s"), l); + return 1; +} + + +/* GAS will call this function for each section at the end of the assembly, + to permit the CPU backend to adjust the alignment of a section. */ + +valueT +md_section_align (seg, addr) + asection *seg; + valueT addr; +{ + int align = bfd_get_section_alignment (stdoutput, seg); + + return ((addr + (1 << align) - 1) & (-1 << align)); +} + +/* If you define this macro, it should return the offset between the + address of a PC relative fixup and the position from which the PC + relative adjustment should be made. On many processors, the base + of a PC relative instruction is the next instruction, so this + macro would return the length of an instruction. */ + +long +md_pcrel_from_section (fixp, sec) + fixS *fixp; + segT sec; +{ + if (fixp->fx_addsy != (symbolS *) NULL + && (!S_IS_DEFINED (fixp->fx_addsy) + || (S_GET_SEGMENT (fixp->fx_addsy) != sec))) + return 0; + + return fixp->fx_frag->fr_address + fixp->fx_where; +} + +/* GAS will call this for each fixup. It should store the correct + value in the object file. */ + +void +md_apply_fix3 (fixp, valuep, seg) + fixS *fixp; + valueT *valuep; + segT seg; +{ + unsigned char *where; + unsigned long insn; + long value; + + if (fixp->fx_addsy == (symbolS *) NULL) + { + value = *valuep; + fixp->fx_done = 1; + } + else if (fixp->fx_pcrel) + { + segT s = S_GET_SEGMENT (fixp->fx_addsy); + + if (fixp->fx_addsy && (s == seg || s == absolute_section)) + { + value = S_GET_VALUE (fixp->fx_addsy) + *valuep; + fixp->fx_done = 1; + } + else + value = *valuep; + } + else + { + value = fixp->fx_offset; + + if (fixp->fx_subsy != (symbolS *) NULL) + { + if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) + { + value -= S_GET_VALUE (fixp->fx_subsy); + fixp->fx_done = 1; + } + else + { + /* We don't actually support subtracting a symbol. */ + as_bad_where (fixp->fx_file, fixp->fx_line, + _("expression too complex")); + } + } + } + + switch (fixp->fx_r_type) + { + default: + fixp->fx_no_overflow = 1; + break; + case BFD_RELOC_MSP430_10_PCREL: + break; + } + + if (fixp->fx_done) + { + /* Fetch the instruction, insert the fully resolved operand + value, and stuff the instruction back again. */ + + where = fixp->fx_frag->fr_literal + fixp->fx_where; + + insn = bfd_getl16 (where); + + switch (fixp->fx_r_type) + { + case BFD_RELOC_MSP430_10_PCREL: + if (value & 1) + as_bad_where (fixp->fx_file, fixp->fx_line, + _("odd address operand: %ld"), value); + + /* Jumps are in words. */ + value >>= 1; + --value; /* Correct PC. */ + + if (value < -512 || value > 511) + as_bad_where (fixp->fx_file, fixp->fx_line, + _("operand out of range: %ld"), value); + + value &= 0x3ff; /* get rid of extended sign */ + bfd_putl16 ((bfd_vma) (value | insn), where); + break; + + case BFD_RELOC_MSP430_16_PCREL: + if (value & 1) + as_bad_where (fixp->fx_file, fixp->fx_line, + _("odd address operand: %ld"), value); + + /* Nothing to be corrected here. */ + if (value < -32768 || value > 65536) + as_bad_where (fixp->fx_file, fixp->fx_line, + _("operand out of range: %ld"), value); + + value &= 0xffff; /* Get rid of extended sign. */ + bfd_putl16 ((bfd_vma) value, where); + break; + + case BFD_RELOC_MSP430_16_PCREL_BYTE: + /* Nothing to be corrected here. */ + if (value < -32768 || value > 65536) + as_bad_where (fixp->fx_file, fixp->fx_line, + _("operand out of range: %ld"), value); + + value &= 0xffff; /* Get rid of extended sign. */ + bfd_putl16 ((bfd_vma) value, where); + break; + + case BFD_RELOC_32: + bfd_putl16 ((bfd_vma) value, where); + break; + + case BFD_RELOC_MSP430_16: + case BFD_RELOC_16: + case BFD_RELOC_MSP430_16_BYTE: + value &= 0xffff; + bfd_putl16 ((bfd_vma) value, where); + break; + + default: + as_fatal (_("line %d: unknown relocation type: 0x%x"), + fixp->fx_line, fixp->fx_r_type); + break; + } + } + else + { + fixp->fx_addnumber = value; + } + return; +} + +/* A `BFD_ASSEMBLER' GAS will call this to generate a reloc. GAS + will pass the resulting reloc to `bfd_install_relocation'. This + currently works poorly, as `bfd_install_relocation' often does the + wrong thing, and instances of `tc_gen_reloc' have been written to + work around the problems, which in turns makes it difficult to fix + `bfd_install_relocation'. */ + +/* If while processing a fixup, a reloc really needs to be created + then it is done here. */ + +arelent * +tc_gen_reloc (seg, fixp) + asection *seg ATTRIBUTE_UNUSED; + fixS *fixp; +{ + arelent *reloc; + + 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; + reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); + if (reloc->howto == (reloc_howto_type *) NULL) + { + as_bad_where (fixp->fx_file, fixp->fx_line, + _("reloc %d not supported by object file format"), + (int) fixp->fx_r_type); + return NULL; + } + + if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT + || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) + reloc->address = fixp->fx_offset; + + reloc->addend = fixp->fx_offset; + + return reloc; +} + +/* Parse ordinary expression. */ + +static char * +parse_exp (s, op) + char *s; + expressionS *op; +{ + input_line_pointer = s; + expression (op); + if (op->X_op == O_absent) + as_bad (_("missing operand")); + return input_line_pointer; +} + + +int +md_estimate_size_before_relax (fragp, seg) + fragS *fragp ATTRIBUTE_UNUSED; + asection *seg ATTRIBUTE_UNUSED; +{ + abort (); + return 0; +} diff --git a/gas/config/tc-msp430.h b/gas/config/tc-msp430.h new file mode 100644 index 00000000000..e540124bc82 --- /dev/null +++ b/gas/config/tc-msp430.h @@ -0,0 +1,114 @@ +/* This file is tc-msp430.h + Copyright (C) 2002 Free Software Foundation, Inc. + + Contributed by Dmitry Diky + + 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. */ + +#ifndef BFD_ASSEMBLER + #error MSP430 support requires BFD_ASSEMBLER +#endif + +#define TC_MSP430 +/* By convention, you should define this macro in the `.h' file. For + example, `tc-m68k.h' defines `TC_M68K'. You might have to use this + if it is necessary to add CPU specific code to the object format + file. */ + +#define TARGET_FORMAT "elf32-msp430" +/* This macro is the BFD target name to use when creating the output + file. This will normally depend upon the `OBJ_FMT' macro. */ + +#define TARGET_ARCH bfd_arch_msp430 +/* This macro is the BFD architecture to pass to `bfd_set_arch_mach'. */ + +#define TARGET_MACH 0 +/* This macro is the BFD machine number to pass to + `bfd_set_arch_mach'. If it is not defined, GAS will use 0. */ + +#define TARGET_BYTES_BIG_ENDIAN 0 +/* You should define this macro to be non-zero if the target is big + endian, and zero if the target is little endian. */ + +#define ONLY_STANDARD_ESCAPES +/* If you define this macro, GAS will warn about the use of + nonstandard escape sequences in a string. */ + +#define md_operand(x) +/* GAS will call this function for any expression that can not be + recognized. When the function is called, `input_line_pointer' + will point to the start of the expression. */ + +#define md_number_to_chars number_to_chars_littleendian +/* This should just call either `number_to_chars_bigendian' or + `number_to_chars_littleendian', whichever is appropriate. On + targets like the MIPS which support options to change the + endianness, which function to call is a runtime decision. On + other targets, `md_number_to_chars' can be a simple macro. */ + +#define WORKING_DOT_WORD +/* +`md_short_jump_size' +`md_long_jump_size' +`md_create_short_jump' +`md_create_long_jump' + If `WORKING_DOT_WORD' is defined, GAS will not do broken word + processing (*note Broken words::.). Otherwise, you should set + `md_short_jump_size' to the size of a short jump (a jump that is + just long enough to jump around a long jmp) and + `md_long_jump_size' to the size of a long jump (a jump that can go + anywhere in the function), You should define + `md_create_short_jump' to create a short jump around a long jump, + and define `md_create_long_jump' to create a long jump. */ + +#define MD_APPLY_FIX3 + +#define TC_HANDLES_FX_DONE + +#undef RELOC_EXPANSION_POSSIBLE +/* If you define this macro, it means that `tc_gen_reloc' may return + multiple relocation entries for a single fixup. In this case, the + return value of `tc_gen_reloc' is a pointer to a null terminated + array. */ + +#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section(FIXP, SEC) +/* If you define this macro, it should return the offset between the + address of a PC relative fixup and the position from which the PC + relative adjustment should be made. On many processors, the base + of a PC relative instruction is the next instruction, so this + macro would return the length of an instruction. */ + +extern long md_pcrel_from_section PARAMS ((struct fix *, segT)); + +#define LISTING_WORD_SIZE 2 +/* The number of bytes to put into a word in a listing. This affects + the way the bytes are clumped together in the listing. For + example, a value of 2 might print `1234 5678' where a value of 1 + would print `12 34 56 78'. The default value is 4. */ + +#define LEX_DOLLAR 0 +/* MSP430 port does not use `$' as a logical line separator */ + +#define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) (P2VAR) = 0 +/* An `.lcomm' directive with no explicit alignment parameter will + use this macro to set P2VAR to the alignment that a request for + SIZE bytes will have. The alignment is expressed as a power of + two. If no alignment should take place, the macro definition + should do nothing. Some targets define a `.bss' directive that is + also affected by this macro. The default definition will set + P2VAR to the truncated power of two of sizes up to eight bytes. */ diff --git a/gas/configure b/gas/configure index a3cbf4c956e..85ce557a98e 100755 --- a/gas/configure +++ b/gas/configure @@ -1647,7 +1647,7 @@ else if { (eval echo configure:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in - *.$ac_ext | *.c | *.o | *.obj) ;; + *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done @@ -2527,6 +2527,7 @@ EOF mmix-*-*) fmt=elf ;; mn10200-*-*) fmt=elf ;; mn10300-*-*) fmt=elf ;; + msp430-*-*) fmt=elf ;; openrisc-*-*) fmt=elf ;; or32-*-rtems*) fmt=coff ;; or32-*-coff) fmt=coff ;; @@ -3173,7 +3174,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:3177: checking for $ac_word" >&5 +echo "configure:3178: 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 @@ -3203,7 +3204,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:3207: checking for $ac_word" >&5 +echo "configure:3208: 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 @@ -3254,7 +3255,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:3258: checking for $ac_word" >&5 +echo "configure:3259: 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 @@ -3286,7 +3287,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:3290: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:3291: 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. @@ -3297,12 +3298,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 3301 "configure" +#line 3302 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:3306: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3307: \"$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 @@ -3328,12 +3329,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:3332: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:3333: 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:3337: checking whether we are using GNU C" >&5 +echo "configure:3338: 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 @@ -3342,7 +3343,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:3346: \"$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:3347: \"$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 @@ -3361,7 +3362,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:3365: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:3366: 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 @@ -3398,7 +3399,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:3402: checking for $ac_word" >&5 +echo "configure:3403: 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 @@ -3429,7 +3430,7 @@ done test -n "$YACC" || YACC="yacc" echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:3433: checking how to run the C preprocessor" >&5 +echo "configure:3434: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -3444,13 +3445,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:3454: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3455: \"$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 : @@ -3461,13 +3462,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:3471: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3472: \"$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 : @@ -3478,13 +3479,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:3488: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3489: \"$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 : @@ -3514,7 +3515,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:3518: checking for $ac_word" >&5 +echo "configure:3519: 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 @@ -3547,7 +3548,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:3551: checking for $ac_word" >&5 +echo "configure:3552: 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 @@ -3581,7 +3582,7 @@ then *) ac_lib=l ;; esac echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:3585: checking for yywrap in -l$ac_lib" >&5 +echo "configure:3586: 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 @@ -3589,7 +3590,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:3605: \"$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 @@ -3623,7 +3624,7 @@ fi fi echo $ac_n "checking lex output file root""... $ac_c" 1>&6 -echo "configure:3627: checking lex output file root" >&5 +echo "configure:3628: 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 @@ -3644,7 +3645,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:3648: checking whether yytext is a pointer" >&5 +echo "configure:3649: 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 @@ -3656,14 +3657,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:3668: \"$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 @@ -3689,7 +3690,7 @@ ALL_LINGUAS="fr tr es" # 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:3693: checking for $ac_word" >&5 +echo "configure:3694: 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 @@ -3717,12 +3718,12 @@ else fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:3721: checking for ANSI C header files" >&5 +echo "configure:3722: 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 @@ -3730,7 +3731,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3734: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3735: \"$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* @@ -3747,7 +3748,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 @@ -3765,7 +3766,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 @@ -3786,7 +3787,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -3797,7 +3798,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:3801: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3802: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -3821,12 +3822,12 @@ EOF fi echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:3825: checking for working const" >&5 +echo "configure:3826: 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:3880: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -3896,21 +3897,21 @@ EOF fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:3900: checking for inline" >&5 +echo "configure:3901: 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:3915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -3936,12 +3937,12 @@ EOF esac echo $ac_n "checking for off_t""... $ac_c" 1>&6 -echo "configure:3940: checking for off_t" >&5 +echo "configure:3941: 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 @@ -3969,12 +3970,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:3973: checking for size_t" >&5 +echo "configure:3974: 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 @@ -4004,19 +4005,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:4008: checking for working alloca.h" >&5 +echo "configure:4009: 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:4020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4021: \"$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 @@ -4037,12 +4038,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:4041: checking for alloca" >&5 +echo "configure:4042: 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:4075: \"$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 @@ -4102,12 +4103,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:4106: checking whether alloca needs Cray hooks" >&5 +echo "configure:4107: 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:4136: checking for $ac_func" >&5 +echo "configure:4137: 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:4165: \"$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 @@ -4187,7 +4188,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:4191: checking stack direction for C alloca" >&5 +echo "configure:4192: 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 @@ -4195,7 +4196,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:4219: \"$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 @@ -4235,21 +4236,21 @@ EOF fi -for ac_hdr in unistd.h +for ac_hdr in stdlib.h unistd.h sys/stat.h sys/types.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:4243: checking for $ac_hdr" >&5 +echo "configure:4244: 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:4253: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4254: \"$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* @@ -4278,12 +4279,12 @@ done for ac_func in getpagesize do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4282: checking for $ac_func" >&5 +echo "configure:4283: 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:4311: \"$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 @@ -4331,7 +4332,7 @@ fi done echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -echo "configure:4335: checking for working mmap" >&5 +echo "configure:4336: 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 @@ -4339,7 +4340,7 @@ else ac_cv_func_mmap_fixed_mapped=no else cat > conftest.$ac_ext < #include +#if HAVE_SYS_TYPES_H +# include +#endif + +#if HAVE_STDLIB_H +# include +#endif + +#if HAVE_SYS_STAT_H +# include +#endif + +#if HAVE_UNISTD_H +# include +#endif + /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE -# ifdef HAVE_UNISTD_H -# include -# endif /* Assume that all systems that can run configure have sys/param.h. */ # ifndef HAVE_SYS_PARAM_H @@ -4479,7 +4493,7 @@ main() } EOF -if { (eval echo configure:4483: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4497: \"$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 @@ -4507,17 +4521,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:4511: checking for $ac_hdr" >&5 +echo "configure:4525: 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:4521: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4535: \"$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* @@ -4547,12 +4561,12 @@ done __argz_count __argz_stringify __argz_next do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4551: checking for $ac_func" >&5 +echo "configure:4565: 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:4593: \"$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 @@ -4604,12 +4618,12 @@ done for ac_func in stpcpy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4608: checking for $ac_func" >&5 +echo "configure:4622: 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:4650: \"$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 @@ -4666,19 +4680,19 @@ EOF if test $ac_cv_header_locale_h = yes; then echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 -echo "configure:4670: checking for LC_MESSAGES" >&5 +echo "configure:4684: 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:4682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4696: \"$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 @@ -4699,7 +4713,7 @@ EOF fi fi echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 -echo "configure:4703: checking whether NLS is requested" >&5 +echo "configure:4717: 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" @@ -4719,7 +4733,7 @@ fi EOF echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 -echo "configure:4723: checking whether included gettext is requested" >&5 +echo "configure:4737: 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" @@ -4738,17 +4752,17 @@ fi ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 -echo "configure:4742: checking for libintl.h" >&5 +echo "configure:4756: 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:4752: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4766: \"$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* @@ -4765,19 +4779,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:4769: checking for gettext in libc" >&5 +echo "configure:4783: 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:4781: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4795: \"$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 @@ -4793,7 +4807,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:4797: checking for bindtextdomain in -lintl" >&5 +echo "configure:4811: 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 @@ -4801,7 +4815,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:4830: \"$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 @@ -4828,19 +4842,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:4832: checking for gettext in libintl" >&5 +echo "configure:4846: 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:4858: \"$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 @@ -4868,7 +4882,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:4872: checking for $ac_word" >&5 +echo "configure:4886: 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 @@ -4902,12 +4916,12 @@ fi for ac_func in dcgettext do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4906: checking for $ac_func" >&5 +echo "configure:4920: 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:4948: \"$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 @@ -4957,7 +4971,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:4961: checking for $ac_word" >&5 +echo "configure:4975: 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 @@ -4993,7 +5007,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:4997: checking for $ac_word" >&5 +echo "configure:5011: 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 @@ -5025,7 +5039,7 @@ else fi cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5051: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* CATOBJEXT=.gmo DATADIRNAME=share @@ -5065,7 +5079,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:5069: checking for $ac_word" >&5 +echo "configure:5083: 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 @@ -5099,7 +5113,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:5103: checking for $ac_word" >&5 +echo "configure:5117: 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 @@ -5135,7 +5149,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:5139: checking for $ac_word" >&5 +echo "configure:5153: 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 @@ -5225,7 +5239,7 @@ fi LINGUAS= else echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 -echo "configure:5229: checking for catalogs to be installed" >&5 +echo "configure:5243: checking for catalogs to be installed" >&5 NEW_LINGUAS= for lang in ${LINGUAS=$ALL_LINGUAS}; do case "$ALL_LINGUAS" in @@ -5253,17 +5267,17 @@ echo "configure:5229: 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:5257: checking for linux/version.h" >&5 +echo "configure:5271: 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:5267: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5281: \"$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* @@ -5326,7 +5340,7 @@ fi echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:5330: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo "configure:5344: 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" @@ -5351,7 +5365,7 @@ fi echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:5355: checking for executable suffix" >&5 +echo "configure:5369: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5361,10 +5375,10 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:5365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:5379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in - *.$ac_ext | *.c | *.o | *.obj) ;; + *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done @@ -5386,17 +5400,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:5390: checking for $ac_hdr" >&5 +echo "configure:5404: 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:5400: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5414: \"$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* @@ -5426,7 +5440,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:5430: checking whether compiling a cross-assembler" >&5 +echo "configure:5444: checking whether compiling a cross-assembler" >&5 if test "${host}" = "${target}"; then cross_gas=no else @@ -5441,19 +5455,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:5445: checking for working alloca.h" >&5 +echo "configure:5459: 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:5457: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5471: \"$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 @@ -5474,12 +5488,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:5478: checking for alloca" >&5 +echo "configure:5492: 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:5525: \"$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 @@ -5539,12 +5553,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:5543: checking whether alloca needs Cray hooks" >&5 +echo "configure:5557: 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:5573: checking for $ac_func" >&5 +echo "configure:5587: 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:5615: \"$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 @@ -5624,7 +5638,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:5628: checking stack direction for C alloca" >&5 +echo "configure:5642: 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 @@ -5632,7 +5646,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:5669: \"$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 @@ -5673,21 +5687,21 @@ EOF fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:5677: checking for inline" >&5 +echo "configure:5691: 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:5705: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -5717,12 +5731,12 @@ esac for ac_func in unlink remove do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:5721: checking for $ac_func" >&5 +echo "configure:5735: 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:5763: \"$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 @@ -5774,12 +5788,12 @@ done for ac_func in sbrk do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:5778: checking for $ac_func" >&5 +echo "configure:5792: 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:5820: \"$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 @@ -5837,7 +5851,7 @@ case $host in ;; *-ncr-sysv4.3*) echo $ac_n "checking for _mwvalidcheckl in -lmw""... $ac_c" 1>&6 -echo "configure:5841: checking for _mwvalidcheckl in -lmw" >&5 +echo "configure:5855: 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 @@ -5845,7 +5859,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:5874: \"$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 @@ -5877,7 +5891,7 @@ else fi echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 -echo "configure:5881: checking for main in -lm" >&5 +echo "configure:5895: 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 @@ -5885,14 +5899,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:5910: \"$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 @@ -5915,7 +5929,7 @@ fi ;; *) echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 -echo "configure:5919: checking for main in -lm" >&5 +echo "configure:5933: 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 @@ -5923,14 +5937,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:5948: \"$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 @@ -5961,12 +5975,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:5965: checking for working assert macro" >&5 +echo "configure:5979: 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 @@ -5982,7 +5996,7 @@ assert (a == b ; return 0; } EOF -if { (eval echo configure:5986: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:6000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* gas_cv_assert_ok=yes else @@ -6023,12 +6037,12 @@ gas_test_headers=" " echo $ac_n "checking whether declaration is required for strstr""... $ac_c" 1>&6 -echo "configure:6027: checking whether declaration is required for strstr" >&5 +echo "configure:6041: 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:6057: \"$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 @@ -6060,12 +6074,12 @@ fi echo $ac_n "checking whether declaration is required for malloc""... $ac_c" 1>&6 -echo "configure:6064: checking whether declaration is required for malloc" >&5 +echo "configure:6078: 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:6094: \"$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 @@ -6097,12 +6111,12 @@ fi echo $ac_n "checking whether declaration is required for free""... $ac_c" 1>&6 -echo "configure:6101: checking whether declaration is required for free" >&5 +echo "configure:6115: 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:6131: \"$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 @@ -6134,12 +6148,12 @@ fi echo $ac_n "checking whether declaration is required for sbrk""... $ac_c" 1>&6 -echo "configure:6138: checking whether declaration is required for sbrk" >&5 +echo "configure:6152: 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:6168: \"$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 @@ -6171,12 +6185,12 @@ fi echo $ac_n "checking whether declaration is required for environ""... $ac_c" 1>&6 -echo "configure:6175: checking whether declaration is required for environ" >&5 +echo "configure:6189: 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:6205: \"$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 @@ -6211,12 +6225,12 @@ fi # for it? echo $ac_n "checking whether declaration is required for errno""... $ac_c" 1>&6 -echo "configure:6215: checking whether declaration is required for errno" >&5 +echo "configure:6229: 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:6249: \"$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 232d1d051c5..ebffca6b9d8 100644 --- a/gas/configure.in +++ b/gas/configure.in @@ -373,6 +373,7 @@ changequote([,])dnl mmix-*-*) fmt=elf ;; mn10200-*-*) fmt=elf ;; mn10300-*-*) fmt=elf ;; + msp430-*-*) fmt=elf ;; openrisc-*-*) fmt=elf ;; or32-*-rtems*) fmt=coff ;; or32-*-coff) fmt=coff ;; diff --git a/gas/doc/Makefile.am b/gas/doc/Makefile.am index 63aa1790d84..2ff312ffb6f 100644 --- a/gas/doc/Makefile.am +++ b/gas/doc/Makefile.am @@ -44,6 +44,7 @@ CPU_DOCS = \ c-m88k.texi \ c-mips.texi \ c-mmix.texi \ + c-msp430.texi \ c-ns32k.texi \ c-pdp11.texi \ c-pj.texi \ diff --git a/gas/doc/Makefile.in b/gas/doc/Makefile.in index 7a9fcab8439..55eb4b1a145 100644 --- a/gas/doc/Makefile.in +++ b/gas/doc/Makefile.in @@ -156,6 +156,7 @@ CPU_DOCS = \ c-m88k.texi \ c-mips.texi \ c-mmix.texi \ + c-msp430.texi \ c-ns32k.texi \ c-pdp11.texi \ c-pj.texi \ diff --git a/gas/doc/all.texi b/gas/doc/all.texi index 50117d6025b..b9754de4486 100644 --- a/gas/doc/all.texi +++ b/gas/doc/all.texi @@ -48,6 +48,7 @@ @set MCORE @set MIPS @set MMIX +@set MSP430 @set PDP11 @set PJ @set PPC diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 671619985fc..e654c240d0b 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -5758,6 +5758,9 @@ subject, see the hardware manufacturer's manual. @ifset MMIX * MMIX-Dependent:: MMIX Dependent Features @end ifset +@ifset MSP430 +* MSP430-Dependent:: MSP430 Dependent Features +@end ifset @ifset SH * SH-Dependent:: Hitachi SH Dependent Features * SH64-Dependent:: Hitachi SH64 Dependent Features @@ -5906,6 +5909,10 @@ family. @include c-mmix.texi @end ifset +@ifset MSP430 +@include c-msp430.texi +@end ifset + @ifset NS32K @include c-ns32k.texi @end ifset diff --git a/gas/doc/c-msp430.texi b/gas/doc/c-msp430.texi new file mode 100644 index 00000000000..00503598538 --- /dev/null +++ b/gas/doc/c-msp430.texi @@ -0,0 +1,164 @@ +@c Copyright 2002 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 MSP430-Dependent +@chapter MSP 430 Dependent Features +@end ifset +@ifclear GENERIC +@node Machine Dependencies +@chapter MSP 430 Dependent Features +@end ifclear + +@cindex MSP 430 support +@cindex 430 support +@menu +* MSP430 Options:: Options +* MSP430 Syntax:: Syntax +* MSP430 Floating Point:: Floating Point +* MSP430 Directives:: MSP 430 Machine Directives +* MSP430 Opcodes:: Opcodes +@end menu + +@node MSP430 Options +@section Options +@cindex MSP 430 options (none) +@cindex options for MSP430 (none) +@code{@value{AS}} has only -m flag which selects the mpu arch. Currently has +no effect. + +@node MSP430 Syntax +@section Syntax +@menu +* MSP430-Macros:: Macros +* MSP430-Chars:: Special Characters +* MSP430-Regs:: Register Names +* MSP430-Ext:: Assembler Extensions +@end menu + +@node MSP430-Macros +@subsection Macros + +@cindex Macros, MSP 430 +@cindex MSP 430 macros +The macro syntax used on the MSP 430 is like that described in the MSP +430 Family Assembler Specification. Normal @code{@value{AS}} +macros should still work. + +Additional built-in macros are: + +@table @code + +@item llo(exp) +Extracts least significant word from 32-bit expression 'exp'. + +@item lhi(exp) +Extracts most significant word from 32-bit expression 'exp'. + +@item hlo(exp) +Extracts 3rd word from 64-bit expression 'exp'. + +@item hhi(exp) +Extracts 4rd word from 64-bit expression 'exp'. + +@end table + +They normally being used as an immediate source operand. +@smallexample + mov #llo(1), r10 ; == mov #1, r10 + mov #lhi(1), r10 ; == mov #0, r10 +@end smallexample + +@node MSP430-Chars +@subsection Special Characters + +@cindex line comment character, MSP 430 +@cindex MSP 430 line comment character +@samp{;} is the line comment character. + +@cindex identifiers, MSP 430 +@cindex MSP 430 identifiers +The character @samp{$} in jump instructions indicates current location and +implemented only for TI syntax compatibility. + +@node MSP430-Regs +@subsection Register Names + +@cindex MSP 430 register names +@cindex register names, MSP 430 +General-purpose registers are represented by predefined symbols of the +form @samp{r@var{N}} (for global registers), where @var{N} represents +a number between @code{0} and @code{15}. The leading +letters may be in either upper or lower case; for example, @samp{r13} +and @samp{R7} are both valid register names. + +@cindex special purpose registers, MSP 430 +Register names @samp{PC}, @samp{SP} and @samp{SR} cannot be used as register names +and will be treated as variables. Use @samp{r0}, @samp{r1}, and @samp{r2} instead. + + +@node MSP430-Ext +@subsection Assembler Extensions +@cindex MSP430 Assembler Extensions + +@table @code + +@item @@rN +As destination operand being treated as @samp{0(rn)} + +@item 0(rN) +As source operand being treated as @samp{@@rn} + +@item jCOND +N +Skips next N bytes followed by jump instruction and equivalent to +@samp{jCOND $+N+2} + +@end table + + +@node MSP430 Floating Point +@section Floating Point + +@cindex floating point, MSP 430 (@sc{ieee}) +@cindex MSP 430 floating point (@sc{ieee}) +The MSP 430 family uses @sc{ieee} 32-bit floating-point numbers. + +@node MSP430 Directives +@section MSP 430 Machine Directives + +@cindex machine directives, MSP 430 +@cindex MSP 430 machine directives +@table @code +@cindex @code{file} directive, MSP 430 +@item .file +This directive is ignored; it is accepted for compatibility with other +MSP 430 assemblers. + +@quotation +@emph{Warning:} in other versions of the @sc{gnu} assembler, @code{.file} is +used for the directive called @code{.app-file} in the MSP 430 support. +@end quotation + +@cindex @code{line} directive, MSP 430 +@item .line +This directive is ignored; it is accepted for compatibility with other +MSP 430 assemblers. + +@cindex @code{sect} directive, MSP 430 +@item .arch +Currently this directive is ignored; it is accepted for compatibility with other +MSP 430 assemblers. + +@end table + +@node MSP430 Opcodes +@section Opcodes + +@cindex MSP 430 opcodes +@cindex opcodes for MSP 430 +@code{@value{AS}} implements all the standard MSP 430 opcodes. No +additional pseudo-instructions are needed on this family. + +For information on the 430 machine instruction set, see @cite{MSP430 +User's Manual, document slau049b}, Texas Instrument, Inc. diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 77d94c58ab1..b4c687c6311 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2002-12-24 Dmitry Diky + + * gas/msp430: New directory. + * gas/msp430/msp430.exp: Test msp430 assembler. + * gas/msp430/opcode.s: Test source file. + * gas/msp430/opcode.s: Expected disassembly. + 2002-12-27 Chris Demetriou * gas/mips/mips.exp: Define the notion of an "architecture data diff --git a/include/ChangeLog b/include/ChangeLog index 60b54242736..5cde93615fb 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2002-12-24 Dmitry Diky + + * dis-asm.h: Add msp430 disassembler prototype. + 2002-12-27 Chris Demetriou * dis-asm.h (print_mips_disassembler_options): Prototype. diff --git a/include/dis-asm.h b/include/dis-asm.h index 04a7f5dab38..2e1b1961655 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -217,6 +217,7 @@ extern int print_insn_mcore PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_mmix 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_msp430 PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_ns32k PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_openrisc PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_big_or32 PARAMS ((bfd_vma, disassemble_info*)); diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index de95f20c5a8..87e8a3bac1f 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,8 @@ +2002-12-24 Dmitry Diky + + * common.h: Define msp430 machine numbers. + * msp430.h: New file. Define msp430 relocs. + 2002-12-20 DJ Delorie * xstormy16.h: Add XSTORMY16_12. diff --git a/include/elf/common.h b/include/elf/common.h index 0cef267e952..629c6146ff9 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -251,6 +251,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Ubicom IP2xxx; no ABI */ #define EM_IP2K_OLD 0x8217 +/* MSP430 magic number + Written in the absense everything. */ +#define EM_MSP430_OLD 0x1059 + +/* TI msp430 micro controller. */ +#define EM_MSP430 0x430 + /* See the above comment before you add a new EM_* value here. */ /* Values for e_version. */ diff --git a/include/elf/msp430.h b/include/elf/msp430.h new file mode 100644 index 00000000000..cb3f241dea1 --- /dev/null +++ b/include/elf/msp430.h @@ -0,0 +1,55 @@ +/* MSP430 ELF support for BFD. + Copyright (C) 2002 Free Software Foundation, Inc. + Contributed by Dmitry Diky + + 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. */ + +#ifndef _ELF_MSP430_H +#define _ELF_MSP430_H + +#include "elf/reloc-macros.h" + +/* Processor specific flags for the ELF header e_flags field. */ +#define EF_MSP430_MACH 0xff + +#define E_MSP430_MACH_MSP430x11x1 110 +#define E_MSP430_MACH_MSP430x11 11 +#define E_MSP430_MACH_MSP430x12 12 +#define E_MSP430_MACH_MSP430x13 13 +#define E_MSP430_MACH_MSP430x14 14 +#define E_MSP430_MACH_MSP430x31 31 +#define E_MSP430_MACH_MSP430x32 32 +#define E_MSP430_MACH_MSP430x33 33 +#define E_MSP430_MACH_MSP430x41 41 +#define E_MSP430_MACH_MSP430x43 43 +#define E_MSP430_MACH_MSP430x44 44 +#define E_MSP430_MACH_MSP430x15 15 +#define E_MSP430_MACH_MSP430x16 16 + +/* Relocations. */ +START_RELOC_NUMBERS (elf_msp430_reloc_type) + RELOC_NUMBER (R_MSP430_NONE, 0) + RELOC_NUMBER (R_MSP430_32, 1) + RELOC_NUMBER (R_MSP430_10_PCREL, 2) + RELOC_NUMBER (R_MSP430_16, 3) + RELOC_NUMBER (R_MSP430_16_PCREL, 4) + RELOC_NUMBER (R_MSP430_16_BYTE, 5) + RELOC_NUMBER (R_MSP430_16_PCREL_BYTE, 6) + +END_RELOC_NUMBERS (R_MSP430_max) + +#endif /* _ELF_MSP430_H */ diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog index a0d7b5ba2ed..10fbb98f040 100644 --- a/include/opcode/ChangeLog +++ b/include/opcode/ChangeLog @@ -1,3 +1,7 @@ +2002-12-24 Dmitry Diky + + * msp430.h: New file. Defines msp430 opcodes. + 2002-12-30 D.Venkatasubramanian * h8300.h: Added some more pseudo opcodes for system call diff --git a/include/opcode/msp430.h b/include/opcode/msp430.h new file mode 100644 index 00000000000..19702254eef --- /dev/null +++ b/include/opcode/msp430.h @@ -0,0 +1,111 @@ +/* Opcode table for the TI MSP430 microcontrollers + + Copyright 2002 Free Software Foundation, Inc. + Contributed by Dmitry Diky + + 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, 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. */ + +#ifndef __MSP430_H_ +#define __MSP430_H_ + +struct msp430_operand_s +{ + int ol; /* Operand length words. */ + int am; /* Addr mode. */ + int reg; /* Register. */ + int mode; /* Pperand mode. */ +#define OP_REG 0 +#define OP_EXP 1 +#ifndef DASM_SECTION + expressionS exp; +#endif +}; + +#define BYTE_OPERATION (1 << 6) /* Byte operation flag for all instructions. */ + +struct msp430_opcode_s +{ + char *name; + int fmt; + int insn_opnumb; + int bin_opcode; + int bin_mask; +}; + +#define MSP_INSN(name, size, numb, bin, mask) { #name, size, numb, bin, mask } + +static struct msp430_opcode_s msp430_opcodes[] = +{ + MSP_INSN (and, 1, 2, 0xf000, 0xf000), + MSP_INSN (inv, 0, 1, 0xe330, 0xfff0), + MSP_INSN (xor, 1, 2, 0xe000, 0xf000), + MSP_INSN (setz, 0, 0, 0xd322, 0xffff), + MSP_INSN (setc, 0, 0, 0xd312, 0xffff), + MSP_INSN (eint, 0, 0, 0xd232, 0xffff), + MSP_INSN (setn, 0, 0, 0xd222, 0xffff), + MSP_INSN (bis, 1, 2, 0xd000, 0xf000), + MSP_INSN (clrz, 0, 0, 0xc322, 0xffff), + MSP_INSN (clrc, 0, 0, 0xc312, 0xffff), + MSP_INSN (dint, 0, 0, 0xc232, 0xffff), + MSP_INSN (clrn, 0, 0, 0xc222, 0xffff), + MSP_INSN (bic, 1, 2, 0xc000, 0xf000), + MSP_INSN (bit, 1, 2, 0xb000, 0xf000), + MSP_INSN (dadc, 0, 1, 0xa300, 0xff30), + MSP_INSN (dadd, 1, 2, 0xa000, 0xf000), + MSP_INSN (tst, 0, 1, 0x9300, 0xff30), + MSP_INSN (cmp, 1, 2, 0x9000, 0xf000), + MSP_INSN (decd, 0, 1, 0x8320, 0xff30), + MSP_INSN (dec, 0, 1, 0x8310, 0xff30), + MSP_INSN (sub, 1, 2, 0x8000, 0xf000), + MSP_INSN (sbc, 0, 1, 0x7300, 0xff30), + MSP_INSN (subc, 1, 2, 0x7000, 0xf000), + MSP_INSN (adc, 0, 1, 0x6300, 0xff30), + MSP_INSN (rlc, 0, 2, 0x6000, 0xf000), + MSP_INSN (addc, 1, 2, 0x6000, 0xf000), + MSP_INSN (incd, 0, 1, 0x5320, 0xff30), + MSP_INSN (inc, 0, 1, 0x5310, 0xff30), + MSP_INSN (rla, 0, 2, 0x5000, 0xf000), + MSP_INSN (add, 1, 2, 0x5000, 0xf000), + MSP_INSN (nop, 0, 0, 0x4303, 0xffff), + MSP_INSN (clr, 0, 1, 0x4300, 0xff30), + MSP_INSN (ret, 0, 0, 0x4130, 0xff30), + MSP_INSN (pop, 0, 1, 0x4130, 0xff30), + MSP_INSN (br, 0, 3, 0x4000, 0xf000), + MSP_INSN (mov, 1, 2, 0x4000, 0xf000), + MSP_INSN (jmp, 3, 1, 0x3c00, 0xfc00), + MSP_INSN (jl, 3, 1, 0x3800, 0xfc00), + MSP_INSN (jge, 3, 1, 0x3400, 0xfc00), + MSP_INSN (jn, 3, 1, 0x3000, 0xfc00), + MSP_INSN (jc, 3, 1, 0x2c00, 0xfc00), + MSP_INSN (jhs, 3, 1, 0x2c00, 0xfc00), + MSP_INSN (jnc, 3, 1, 0x2800, 0xfc00), + MSP_INSN (jlo, 3, 1, 0x2800, 0xfc00), + MSP_INSN (jz, 3, 1, 0x2400, 0xfc00), + MSP_INSN (jeq, 3, 1, 0x2400, 0xfc00), + MSP_INSN (jnz, 3, 1, 0x2000, 0xfc00), + MSP_INSN (jne, 3, 1, 0x2000, 0xfc00), + MSP_INSN (reti, 2, 0, 0x1300, 0xffc0), + MSP_INSN (call, 2, 1, 0x1280, 0xffc0), + MSP_INSN (push, 2, 1, 0x1200, 0xff80), + MSP_INSN (sxt, 2, 1, 0x1180, 0xffc0), + MSP_INSN (rra, 2, 1, 0x1100, 0xff80), + MSP_INSN (swpb, 2, 1, 0x1080, 0xffc0), + MSP_INSN (rrc, 2, 1, 0x1000, 0xff80), + + /* End of instruction set. */ + { NULL, 0, 0, 0, 0 } +}; + +#endif diff --git a/ld/ChangeLog b/ld/ChangeLog index 2bfdd1c6077..f9b3d7e0b70 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,15 @@ +2002-12-24 Dmitry Diky + + * Makefile.am: Add msp430 target. + * configure.tgt: Likewise. + * Makefile.in: Regenerate. + * emulparams/msp430x???.sh: New files. Linker script parameters + for various msp430 configurations. + * gen-doc.texi: Enable msp430 documenation. + * ld.texinfo: Document msp430 sections. + * scripttempl/elf32msp430.sc: New file. Linker script for msp430. + * scripttempl/elf32msp430_3.sc: New file. Linker script for msp430. + 2002-12-30 Ralf Habacker Charles Wilson diff --git a/ld/Makefile.am b/ld/Makefile.am index 210f16aa72c..15bb1a22da2 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -245,6 +245,44 @@ ALL_EMULATIONS = \ emipslit.o \ emipslnews.o \ emipspe.o \ + emsp430x1101.o \ + emsp430x1111.o \ + emsp430x1121.o \ + emsp430x1331.o \ + emsp430x1351.o \ + emsp430x149.o \ + emsp430x148.o \ + emsp430x147.o \ + emsp430x135.o \ + emsp430x133.o \ + emsp430x110.o \ + emsp430x112.o \ + emsp430x122.o \ + emsp430x1222.o \ + emsp430x123.o \ + emsp430x1232.o \ + emsp430x412.o \ + emsp430x413.o \ + emsp430x311.o \ + emsp430x312.o \ + emsp430x313.o \ + emsp430x314.o \ + emsp430x315.o \ + emsp430x323.o \ + emsp430x325.o \ + emsp430x336.o \ + emsp430x337.o \ + emsp430x435.o \ + emsp430x436.o \ + emsp430x447.o \ + emsp430x448.o \ + emsp430x449.o \ + emsp430x169.o \ + emsp430x168.o \ + emsp430x167.o \ + emsp430x155.o \ + emsp430x156.o \ + emsp430x157.o \ enews.o \ ens32knbsd.o \ eor32.o \ @@ -939,6 +977,162 @@ emn10300.c: $(srcdir)/emulparams/mn10300.sh \ emn10200.c: $(srcdir)/emulparams/mn10200.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} mn10200 "$(tdir_mn10200)" +emsp430x1101.c: $(srcdir)/emulparams/msp430x1101.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1101 "$(tdir_msp430x1101)" +emsp430x1111.c: $(srcdir)/emulparams/msp430x1111.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1111 "$(tdir_msp430x1111)" +emsp430x1121.c: $(srcdir)/emulparams/msp430x1121.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1121 "$(tdir_msp430x1121)" +emsp430x1331.c: $(srcdir)/emulparams/msp430x1331.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1331 "$(tdir_msp430x1331)" +emsp430x1351.c: $(srcdir)/emulparams/msp430x1351.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1351 "$(tdir_msp430x1351)" +emsp430x149.c: $(srcdir)/emulparams/msp430x149.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x149 "$(tdir_msp430x149)" +emsp430x148.c: $(srcdir)/emulparams/msp430x148.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x148 "$(tdir_msp430x148)" +emsp430x449.c: $(srcdir)/emulparams/msp430x449.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x449 "$(tdir_msp430x449)" +emsp430x448.c: $(srcdir)/emulparams/msp430x448.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x448 "$(tdir_msp430x448)" +emsp430x447.c: $(srcdir)/emulparams/msp430x447.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x447 "$(tdir_msp430x447)" +emsp430x412.c: $(srcdir)/emulparams/msp430x412.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x412 "$(tdir_msp430x412)" +emsp430x413.c: $(srcdir)/emulparams/msp430x413.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x413 "$(tdir_msp430x413)" +emsp430x147.c: $(srcdir)/emulparams/msp430x147.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x147 "$(tdir_msp430x147)" +emsp430x135.c: $(srcdir)/emulparams/msp430x135.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x135 "$(tdir_msp430x135)" +emsp430x133.c: $(srcdir)/emulparams/msp430x133.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x133 "$(tdir_msp430x133)" +emsp430x110.c: $(srcdir)/emulparams/msp430x110.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x110 "$(tdir_msp430x110)" +emsp430x112.c: $(srcdir)/emulparams/msp430x112.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x112 "$(tdir_msp430x112)" +emsp430x122.c: $(srcdir)/emulparams/msp430x122.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x122 "$(tdir_msp430x122)" +emsp430x1222.c: $(srcdir)/emulparams/msp430x1222.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1222 "$(tdir_msp430x1222)" +emsp430x123.c: $(srcdir)/emulparams/msp430x123.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x123 "$(tdir_msp430x123)" +emsp430x1232.c: $(srcdir)/emulparams/msp430x1232.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1232 "$(tdir_msp430x1232)" +emsp430x311.c: $(srcdir)/emulparams/msp430x311.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x311 "$(tdir_msp430x311)" +emsp430x312.c: $(srcdir)/emulparams/msp430x312.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x312 "$(tdir_msp430x312)" +emsp430x313.c: $(srcdir)/emulparams/msp430x313.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x313 "$(tdir_msp430x313)" +emsp430x314.c: $(srcdir)/emulparams/msp430x314.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x314 "$(tdir_msp430x314)" +emsp430x315.c: $(srcdir)/emulparams/msp430x315.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x315 "$(tdir_msp430x315)" +emsp430x323.c: $(srcdir)/emulparams/msp430x323.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x323 "$(tdir_msp430x323)" +emsp430x325.c: $(srcdir)/emulparams/msp430x325.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x325 "$(tdir_msp430x325)" +emsp430x336.c: $(srcdir)/emulparams/msp430x336.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x336 "$(tdir_msp430x336)" +emsp430x337.c: $(srcdir)/emulparams/msp430x337.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x337 "$(tdir_msp430x337)" +emsp430x435.c: $(srcdir)/emulparams/msp430x435.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x435 "$(tdir_msp430x435)" +emsp430x436.c: $(srcdir)/emulparams/msp430x436.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x436 "$(tdir_msp430x436)" +emsp430x437.c: $(srcdir)/emulparams/msp430x437.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x437 "$(tdir_msp430x437)" +emsp430x167.c: $(srcdir)/emulparams/msp430x167.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x167 "$(tdir_msp430x167)" +emsp430x168.c: $(srcdir)/emulparams/msp430x167.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x168 "$(tdir_msp430x168)" +emsp430x169.c: $(srcdir)/emulparams/msp430x169.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x169 "$(tdir_msp430x169)" +emsp430x155.c: $(srcdir)/emulparams/msp430x155.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x155 "$(tdir_msp430x155)" +emsp430x156.c: $(srcdir)/emulparams/msp430x156.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x156 "$(tdir_msp430x156)" +emsp430x157.c: $(srcdir)/emulparams/msp430x157.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x157 "$(tdir_msp430x157)" enews.c: $(srcdir)/emulparams/news.sh \ $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS} ${GENSCRIPTS} news "$(tdir_news)" diff --git a/ld/Makefile.in b/ld/Makefile.in index 8defa7e75ce..ddef26096e1 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -356,6 +356,44 @@ ALL_EMULATIONS = \ emipslit.o \ emipslnews.o \ emipspe.o \ + emsp430x1101.o \ + emsp430x1111.o \ + emsp430x1121.o \ + emsp430x1331.o \ + emsp430x1351.o \ + emsp430x149.o \ + emsp430x148.o \ + emsp430x147.o \ + emsp430x135.o \ + emsp430x133.o \ + emsp430x110.o \ + emsp430x112.o \ + emsp430x122.o \ + emsp430x1222.o \ + emsp430x123.o \ + emsp430x1232.o \ + emsp430x412.o \ + emsp430x413.o \ + emsp430x311.o \ + emsp430x312.o \ + emsp430x313.o \ + emsp430x314.o \ + emsp430x315.o \ + emsp430x323.o \ + emsp430x325.o \ + emsp430x336.o \ + emsp430x337.o \ + emsp430x435.o \ + emsp430x436.o \ + emsp430x447.o \ + emsp430x448.o \ + emsp430x449.o \ + emsp430x169.o \ + emsp430x168.o \ + emsp430x167.o \ + emsp430x155.o \ + emsp430x156.o \ + emsp430x157.o \ enews.o \ ens32knbsd.o \ eor32.o \ @@ -1662,6 +1700,162 @@ emn10300.c: $(srcdir)/emulparams/mn10300.sh \ emn10200.c: $(srcdir)/emulparams/mn10200.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} mn10200 "$(tdir_mn10200)" +emsp430x1101.c: $(srcdir)/emulparams/msp430x1101.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1101 "$(tdir_msp430x1101)" +emsp430x1111.c: $(srcdir)/emulparams/msp430x1111.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1111 "$(tdir_msp430x1111)" +emsp430x1121.c: $(srcdir)/emulparams/msp430x1121.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1121 "$(tdir_msp430x1121)" +emsp430x1331.c: $(srcdir)/emulparams/msp430x1331.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1331 "$(tdir_msp430x1331)" +emsp430x1351.c: $(srcdir)/emulparams/msp430x1351.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1351 "$(tdir_msp430x1351)" +emsp430x149.c: $(srcdir)/emulparams/msp430x149.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x149 "$(tdir_msp430x149)" +emsp430x148.c: $(srcdir)/emulparams/msp430x148.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x148 "$(tdir_msp430x148)" +emsp430x449.c: $(srcdir)/emulparams/msp430x449.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x449 "$(tdir_msp430x449)" +emsp430x448.c: $(srcdir)/emulparams/msp430x448.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x448 "$(tdir_msp430x448)" +emsp430x447.c: $(srcdir)/emulparams/msp430x447.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x447 "$(tdir_msp430x447)" +emsp430x412.c: $(srcdir)/emulparams/msp430x412.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x412 "$(tdir_msp430x412)" +emsp430x413.c: $(srcdir)/emulparams/msp430x413.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x413 "$(tdir_msp430x413)" +emsp430x147.c: $(srcdir)/emulparams/msp430x147.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x147 "$(tdir_msp430x147)" +emsp430x135.c: $(srcdir)/emulparams/msp430x135.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x135 "$(tdir_msp430x135)" +emsp430x133.c: $(srcdir)/emulparams/msp430x133.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x133 "$(tdir_msp430x133)" +emsp430x110.c: $(srcdir)/emulparams/msp430x110.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x110 "$(tdir_msp430x110)" +emsp430x112.c: $(srcdir)/emulparams/msp430x112.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x112 "$(tdir_msp430x112)" +emsp430x122.c: $(srcdir)/emulparams/msp430x122.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x122 "$(tdir_msp430x122)" +emsp430x1222.c: $(srcdir)/emulparams/msp430x1222.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1222 "$(tdir_msp430x1222)" +emsp430x123.c: $(srcdir)/emulparams/msp430x123.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x123 "$(tdir_msp430x123)" +emsp430x1232.c: $(srcdir)/emulparams/msp430x1232.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x1232 "$(tdir_msp430x1232)" +emsp430x311.c: $(srcdir)/emulparams/msp430x311.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x311 "$(tdir_msp430x311)" +emsp430x312.c: $(srcdir)/emulparams/msp430x312.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x312 "$(tdir_msp430x312)" +emsp430x313.c: $(srcdir)/emulparams/msp430x313.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x313 "$(tdir_msp430x313)" +emsp430x314.c: $(srcdir)/emulparams/msp430x314.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x314 "$(tdir_msp430x314)" +emsp430x315.c: $(srcdir)/emulparams/msp430x315.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x315 "$(tdir_msp430x315)" +emsp430x323.c: $(srcdir)/emulparams/msp430x323.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x323 "$(tdir_msp430x323)" +emsp430x325.c: $(srcdir)/emulparams/msp430x325.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x325 "$(tdir_msp430x325)" +emsp430x336.c: $(srcdir)/emulparams/msp430x336.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x336 "$(tdir_msp430x336)" +emsp430x337.c: $(srcdir)/emulparams/msp430x337.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x337 "$(tdir_msp430x337)" +emsp430x435.c: $(srcdir)/emulparams/msp430x435.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x435 "$(tdir_msp430x435)" +emsp430x436.c: $(srcdir)/emulparams/msp430x436.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x436 "$(tdir_msp430x436)" +emsp430x437.c: $(srcdir)/emulparams/msp430x437.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x437 "$(tdir_msp430x437)" +emsp430x167.c: $(srcdir)/emulparams/msp430x167.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x167 "$(tdir_msp430x167)" +emsp430x168.c: $(srcdir)/emulparams/msp430x167.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x168 "$(tdir_msp430x168)" +emsp430x169.c: $(srcdir)/emulparams/msp430x169.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x169 "$(tdir_msp430x169)" +emsp430x155.c: $(srcdir)/emulparams/msp430x155.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x155 "$(tdir_msp430x155)" +emsp430x156.c: $(srcdir)/emulparams/msp430x156.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x156 "$(tdir_msp430x156)" +emsp430x157.c: $(srcdir)/emulparams/msp430x157.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \ + ${GEN_DEPENDS} + ${GENSCRIPTS} msp430x157 "$(tdir_msp430x157)" enews.c: $(srcdir)/emulparams/news.sh \ $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS} ${GENSCRIPTS} news "$(tdir_news)" diff --git a/ld/configure b/ld/configure index baeaf28a13a..1d261b14a3c 100755 --- a/ld/configure +++ b/ld/configure @@ -719,249 +719,49 @@ test "$host_alias" != "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -# 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:726: 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 - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi -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:756: 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 - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # 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:807: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6 +echo "configure:725: 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 else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:839: 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. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 850 "configure" + ac_save_LIBS="$LIBS" +LIBS="-lcposix $LIBS" +cat > conftest.$ac_ext <&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 - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi +if { (eval echo configure:744: \"$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 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -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:881: 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:886: 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 - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -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:914: 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 - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* +LIBS="$ac_save_LIBS" fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 -echo "configure:946: checking for POSIXized ISC" >&5 -if test -d /etc/conf/kconfig.d && - grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 -then +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - ISC=yes # If later tests want to check for ISC. - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - if test "$GCC" = yes; then - CC="$CC -posix" - else - CC="$CC -Xp" - fi + LIBS="$LIBS -lcposix" else echo "$ac_t""no" 1>&6 - ISC= fi + + BFD_VERSION=`sed -n -e 's/^.._INIT_AUTOMAKE.*,[ ]*\([^ ]*\)[ ]*).*/\1/p' < ${srcdir}/../bfd/configure.in` # Find a good install program. We prefer a C program (faster), @@ -976,7 +776,7 @@ BFD_VERSION=`sed -n -e 's/^.._INIT_AUTOMAKE.*,[ ]*\([^ ]*\)[ ]*).*/\1/p' < ${ # 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:980: checking for a BSD compatible install" >&5 +echo "configure:780: 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 @@ -1029,7 +829,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:1033: checking whether build environment is sane" >&5 +echo "configure:833: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -1086,7 +886,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:1090: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:890: 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 @@ -1132,7 +932,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:1136: checking for working aclocal" >&5 +echo "configure:936: 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. @@ -1145,7 +945,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:1149: checking for working autoconf" >&5 +echo "configure:949: 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. @@ -1158,7 +958,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:1162: checking for working automake" >&5 +echo "configure:962: 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. @@ -1171,7 +971,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:1175: checking for working autoheader" >&5 +echo "configure:975: 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. @@ -1184,7 +984,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:1188: checking for working makeinfo" >&5 +echo "configure:988: 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. @@ -1267,6 +1067,228 @@ else enable_fast_install=yes 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:1074: 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 + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +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:1104: 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 + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # 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:1155: 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 + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1187: 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. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 1198 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:1203: \"$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 + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +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:1229: 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:1234: 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 + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +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:1262: 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 + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" @@ -1279,7 +1301,7 @@ ac_prog=ld if test "$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:1283: checking for ld used by GCC" >&5 +echo "configure:1305: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -1309,10 +1331,10 @@ echo "configure:1283: 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:1313: checking for GNU ld" >&5 +echo "configure:1335: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 -echo "configure:1316: checking for non-GNU ld" >&5 +echo "configure:1338: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1347,7 +1369,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:1351: checking if the linker ($LD) is GNU ld" >&5 +echo "configure:1373: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1364,7 +1386,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 -echo "configure:1368: checking for $LD option to reload object files" >&5 +echo "configure:1390: 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 @@ -1376,7 +1398,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:1380: checking for BSD-compatible nm" >&5 +echo "configure:1402: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1414,7 +1436,7 @@ NM="$lt_cv_path_NM" echo "$ac_t""$NM" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:1418: checking whether ln -s works" >&5 +echo "configure:1440: 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 @@ -1435,7 +1457,7 @@ else fi echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 -echo "configure:1439: checking how to recognise dependant libraries" >&5 +echo "configure:1461: 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 @@ -1608,13 +1630,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:1612: checking for object suffix" >&5 +echo "configure:1634: 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:1618: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1640: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; @@ -1634,7 +1656,7 @@ ac_objext=$ac_cv_objext echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1638: checking for executable suffix" >&5 +echo "configure:1660: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1644,7 +1666,7 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:1670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in *.c | *.o | *.obj) ;; @@ -1677,7 +1699,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:1681: checking for ${ac_tool_prefix}file" >&5 +echo "configure:1703: 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 @@ -1739,7 +1761,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:1743: checking for file" >&5 +echo "configure:1765: 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 @@ -1810,7 +1832,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:1814: checking for $ac_word" >&5 +echo "configure:1836: 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 @@ -1842,7 +1864,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:1846: checking for $ac_word" >&5 +echo "configure:1868: 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 @@ -1877,7 +1899,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:1881: checking for $ac_word" >&5 +echo "configure:1903: 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 @@ -1909,7 +1931,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:1913: checking for $ac_word" >&5 +echo "configure:1935: 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 @@ -1976,8 +1998,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 1980 "configure"' > conftest.$ac_ext - if { (eval echo configure:1981: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + echo '#line 2002 "configure"' > conftest.$ac_ext + if { (eval echo configure:2003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" @@ -1996,7 +2018,7 @@ case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo configure:2000: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + if { (eval echo configure:2022: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case "`/usr/bin/file conftest.o`" in *ELF-32*) HPUX_IA64_MODE="32" @@ -2014,7 +2036,7 @@ ia64-*-hpux*) SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 -echo "configure:2018: checking whether the C compiler needs -belf" >&5 +echo "configure:2040: 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 @@ -2027,14 +2049,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:2060: \"$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 @@ -2217,7 +2239,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:2221: checking for $ac_word" >&5 +echo "configure:2243: 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 @@ -2247,7 +2269,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:2251: checking for $ac_word" >&5 +echo "configure:2273: 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 @@ -2298,7 +2320,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:2302: checking for $ac_word" >&5 +echo "configure:2324: 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 @@ -2330,7 +2352,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:2334: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:2356: 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. @@ -2341,12 +2363,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 2345 "configure" +#line 2367 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:2350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2372: \"$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 @@ -2372,12 +2394,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:2376: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:2398: 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:2381: checking whether we are using GNU C" >&5 +echo "configure:2403: 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 @@ -2386,7 +2408,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2390: \"$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:2412: \"$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 @@ -2405,7 +2427,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:2409: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:2431: 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 @@ -2448,7 +2470,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:2452: checking for a BSD compatible install" >&5 +echo "configure:2474: 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 @@ -2503,7 +2525,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ALL_LINGUAS="fr sv tr es da" echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:2507: checking how to run the C preprocessor" >&5 +echo "configure:2529: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2518,13 +2540,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:2528: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2550: \"$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 : @@ -2535,13 +2557,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:2545: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2567: \"$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 : @@ -2552,13 +2574,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:2562: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2584: \"$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 : @@ -2585,7 +2607,7 @@ echo "$ac_t""$CPP" 1>&6 # 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:2589: checking for $ac_word" >&5 +echo "configure:2611: 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 @@ -2613,12 +2635,12 @@ else fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:2617: checking for ANSI C header files" >&5 +echo "configure:2639: 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 @@ -2626,7 +2648,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2630: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2652: \"$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* @@ -2643,7 +2665,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 @@ -2661,7 +2683,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 @@ -2682,7 +2704,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -2693,7 +2715,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:2697: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:2719: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -2717,12 +2739,12 @@ EOF fi echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:2721: checking for working const" >&5 +echo "configure:2743: 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:2797: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -2792,21 +2814,21 @@ EOF fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:2796: checking for inline" >&5 +echo "configure:2818: 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:2832: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -2832,12 +2854,12 @@ EOF esac echo $ac_n "checking for off_t""... $ac_c" 1>&6 -echo "configure:2836: checking for off_t" >&5 +echo "configure:2858: 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 @@ -2865,12 +2887,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:2869: checking for size_t" >&5 +echo "configure:2891: 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 @@ -2900,19 +2922,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:2904: checking for working alloca.h" >&5 +echo "configure:2926: 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:2916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2938: \"$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 @@ -2933,12 +2955,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:2937: checking for alloca" >&5 +echo "configure:2959: 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:2992: \"$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 @@ -2998,12 +3020,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:3002: checking whether alloca needs Cray hooks" >&5 +echo "configure:3024: 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:3032: checking for $ac_func" >&5 +echo "configure:3054: 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:3082: \"$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 @@ -3083,7 +3105,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:3087: checking stack direction for C alloca" >&5 +echo "configure:3109: 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 @@ -3091,7 +3113,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:3136: \"$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 @@ -3135,17 +3157,17 @@ for ac_hdr in stdlib.h unistd.h sys/stat.h sys/types.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3139: checking for $ac_hdr" >&5 +echo "configure:3161: 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:3149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3171: \"$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* @@ -3174,12 +3196,12 @@ done for ac_func in getpagesize do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3178: checking for $ac_func" >&5 +echo "configure:3200: 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:3228: \"$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 @@ -3227,7 +3249,7 @@ fi done echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -echo "configure:3231: checking for working mmap" >&5 +echo "configure:3253: 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 @@ -3235,7 +3257,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:3414: \"$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 @@ -3416,17 +3438,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:3420: checking for $ac_hdr" >&5 +echo "configure:3442: 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:3430: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3452: \"$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* @@ -3456,12 +3478,12 @@ done __argz_count __argz_stringify __argz_next do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3460: checking for $ac_func" >&5 +echo "configure:3482: 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:3510: \"$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 @@ -3513,12 +3535,12 @@ done for ac_func in stpcpy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3517: checking for $ac_func" >&5 +echo "configure:3539: 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:3567: \"$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 @@ -3575,19 +3597,19 @@ EOF if test $ac_cv_header_locale_h = yes; then echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 -echo "configure:3579: checking for LC_MESSAGES" >&5 +echo "configure:3601: 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:3591: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3613: \"$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 @@ -3608,7 +3630,7 @@ EOF fi fi echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 -echo "configure:3612: checking whether NLS is requested" >&5 +echo "configure:3634: 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" @@ -3628,7 +3650,7 @@ fi EOF echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 -echo "configure:3632: checking whether included gettext is requested" >&5 +echo "configure:3654: 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" @@ -3647,17 +3669,17 @@ fi ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 -echo "configure:3651: checking for libintl.h" >&5 +echo "configure:3673: 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:3661: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3683: \"$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* @@ -3674,19 +3696,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:3678: checking for gettext in libc" >&5 +echo "configure:3700: 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:3690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3712: \"$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 @@ -3702,7 +3724,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:3706: checking for bindtextdomain in -lintl" >&5 +echo "configure:3728: 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 @@ -3710,7 +3732,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:3747: \"$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 @@ -3737,19 +3759,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:3741: checking for gettext in libintl" >&5 +echo "configure:3763: 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:3775: \"$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 @@ -3777,7 +3799,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:3781: checking for $ac_word" >&5 +echo "configure:3803: 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 @@ -3811,12 +3833,12 @@ fi for ac_func in dcgettext do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3815: checking for $ac_func" >&5 +echo "configure:3837: 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:3865: \"$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 @@ -3866,7 +3888,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:3870: checking for $ac_word" >&5 +echo "configure:3892: 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 @@ -3902,7 +3924,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:3906: checking for $ac_word" >&5 +echo "configure:3928: 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 @@ -3934,7 +3956,7 @@ else fi cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* CATOBJEXT=.gmo DATADIRNAME=share @@ -3974,7 +3996,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:3978: checking for $ac_word" >&5 +echo "configure:4000: 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 @@ -4008,7 +4030,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:4012: checking for $ac_word" >&5 +echo "configure:4034: 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 @@ -4044,7 +4066,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:4048: checking for $ac_word" >&5 +echo "configure:4070: 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 @@ -4134,7 +4156,7 @@ fi LINGUAS= else echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 -echo "configure:4138: checking for catalogs to be installed" >&5 +echo "configure:4160: checking for catalogs to be installed" >&5 NEW_LINGUAS= for lang in ${LINGUAS=$ALL_LINGUAS}; do case "$ALL_LINGUAS" in @@ -4162,17 +4184,17 @@ echo "configure:4138: 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:4166: checking for linux/version.h" >&5 +echo "configure:4188: 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:4176: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4198: \"$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* @@ -4237,7 +4259,7 @@ fi echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:4241: checking for executable suffix" >&5 +echo "configure:4263: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4247,7 +4269,7 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:4251: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:4273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in *.c | *.o | *.obj) ;; @@ -4273,7 +4295,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:4277: checking for $ac_word" >&5 +echo "configure:4299: 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 @@ -4309,7 +4331,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:4313: checking for $ac_word" >&5 +echo "configure:4335: 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 @@ -4342,7 +4364,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:4346: checking for $ac_word" >&5 +echo "configure:4368: 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 @@ -4376,7 +4398,7 @@ then *) ac_lib=l ;; esac echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:4380: checking for yywrap in -l$ac_lib" >&5 +echo "configure:4402: 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 @@ -4384,7 +4406,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:4421: \"$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 @@ -4418,7 +4440,7 @@ fi fi echo $ac_n "checking lex output file root""... $ac_c" 1>&6 -echo "configure:4422: checking lex output file root" >&5 +echo "configure:4444: 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 @@ -4439,7 +4461,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:4443: checking whether yytext is a pointer" >&5 +echo "configure:4465: 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 @@ -4451,14 +4473,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:4484: \"$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 @@ -4481,7 +4503,7 @@ fi echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:4485: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo "configure:4507: 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" @@ -4515,17 +4537,17 @@ for ac_hdr in string.h strings.h stdlib.h unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:4519: checking for $ac_hdr" >&5 +echo "configure:4541: 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:4529: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4551: \"$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* @@ -4554,12 +4576,12 @@ done for ac_func in sbrk realpath do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4558: checking for $ac_func" >&5 +echo "configure:4580: 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:4608: \"$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 @@ -4611,12 +4633,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 -echo "configure:4615: checking for $ac_hdr that defines DIR" >&5 +echo "configure:4637: checking for $ac_hdr that defines DIR" >&5 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_hdr> @@ -4624,7 +4646,7 @@ int main() { DIR *dirp = 0; ; return 0; } EOF -if { (eval echo configure:4628: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4650: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* eval "ac_cv_header_dirent_$ac_safe=yes" else @@ -4649,7 +4671,7 @@ done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 -echo "configure:4653: checking for opendir in -ldir" >&5 +echo "configure:4675: checking for opendir in -ldir" >&5 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -4657,7 +4679,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldir $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4694: \"$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 @@ -4690,7 +4712,7 @@ fi else echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 -echo "configure:4694: checking for opendir in -lx" >&5 +echo "configure:4716: checking for opendir in -lx" >&5 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -4698,7 +4720,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lx $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4735: \"$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 @@ -4742,12 +4764,12 @@ EOF esac echo $ac_n "checking whether strstr must be declared""... $ac_c" 1>&6 -echo "configure:4746: checking whether strstr must be declared" >&5 +echo "configure:4768: checking whether strstr must be declared" >&5 if eval "test \"`echo '$''{'bfd_cv_decl_needed_strstr'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -4768,7 +4790,7 @@ int main() { char *(*pfn) = (char *(*)) strstr ; return 0; } EOF -if { (eval echo configure:4772: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4794: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bfd_cv_decl_needed_strstr=no else @@ -4789,12 +4811,12 @@ EOF fi echo $ac_n "checking whether free must be declared""... $ac_c" 1>&6 -echo "configure:4793: checking whether free must be declared" >&5 +echo "configure:4815: checking whether free must be declared" >&5 if eval "test \"`echo '$''{'bfd_cv_decl_needed_free'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -4815,7 +4837,7 @@ int main() { char *(*pfn) = (char *(*)) free ; return 0; } EOF -if { (eval echo configure:4819: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4841: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bfd_cv_decl_needed_free=no else @@ -4836,12 +4858,12 @@ EOF fi echo $ac_n "checking whether sbrk must be declared""... $ac_c" 1>&6 -echo "configure:4840: checking whether sbrk must be declared" >&5 +echo "configure:4862: checking whether sbrk must be declared" >&5 if eval "test \"`echo '$''{'bfd_cv_decl_needed_sbrk'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -4862,7 +4884,7 @@ int main() { char *(*pfn) = (char *(*)) sbrk ; return 0; } EOF -if { (eval echo configure:4866: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4888: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bfd_cv_decl_needed_sbrk=no else @@ -4883,12 +4905,12 @@ EOF fi echo $ac_n "checking whether getenv must be declared""... $ac_c" 1>&6 -echo "configure:4887: checking whether getenv must be declared" >&5 +echo "configure:4909: checking whether getenv must be declared" >&5 if eval "test \"`echo '$''{'bfd_cv_decl_needed_getenv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -4909,7 +4931,7 @@ int main() { char *(*pfn) = (char *(*)) getenv ; return 0; } EOF -if { (eval echo configure:4913: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4935: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bfd_cv_decl_needed_getenv=no else @@ -4930,12 +4952,12 @@ EOF fi echo $ac_n "checking whether environ must be declared""... $ac_c" 1>&6 -echo "configure:4934: checking whether environ must be declared" >&5 +echo "configure:4956: checking whether environ must be declared" >&5 if eval "test \"`echo '$''{'bfd_cv_decl_needed_environ'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -4956,7 +4978,7 @@ int main() { char *(*pfn) = (char *(*)) environ ; return 0; } EOF -if { (eval echo configure:4960: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4982: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bfd_cv_decl_needed_environ=no else @@ -4984,19 +5006,19 @@ fi # constants, while still supporting pre-ANSI compilers which do not # support string concatenation. echo $ac_n "checking whether ANSI C string concatenation works""... $ac_c" 1>&6 -echo "configure:4988: checking whether ANSI C string concatenation works" >&5 +echo "configure:5010: checking whether ANSI C string concatenation works" >&5 if eval "test \"`echo '$''{'ld_cv_string_concatenation'+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:5022: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ld_cv_string_concatenation=yes else @@ -5271,7 +5293,6 @@ s%@build_alias@%$build_alias%g s%@build_cpu@%$build_cpu%g s%@build_vendor@%$build_vendor%g s%@build_os@%$build_os%g -s%@CC@%$CC%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g @@ -5283,6 +5304,7 @@ s%@AUTOMAKE@%$AUTOMAKE%g s%@AUTOHEADER@%$AUTOHEADER%g s%@MAKEINFO@%$MAKEINFO%g s%@SET_MAKE@%$SET_MAKE%g +s%@CC@%$CC%g s%@LN_S@%$LN_S%g s%@OBJEXT@%$OBJEXT%g s%@EXEEXT@%$EXEEXT%g diff --git a/ld/configure.tgt b/ld/configure.tgt index 6860268977d..4a693241e72 100644 --- a/ld/configure.tgt +++ b/ld/configure.tgt @@ -422,6 +422,8 @@ mmix-*-*) targ_emul=mmo ;; mn10200-*-*) targ_emul=mn10200 ;; mn10300-*-*) targ_emul=mn10300 ;; +msp430-*-*) targ_emul=msp430x149 + targ_extra_emuls="msp430x148 msp430x147 msp430x133 msp430x135 msp430x110 msp430x112 msp430x122 msp430x123 msp430x412 msp430x413 msp430x311 msp430x312 msp430x313 msp430x314 msp430x315 msp430x323 msp430x325 msp430x336 msp430x337 msp430x1101 msp430x1111 msp430x1121 msp430x1331 msp430x1351 msp430x435 msp430x436 msp430x437 msp430x447 msp430x448 msp430x449 msp430x1222 msp430x1232 msp430x169 msp430x168 msp430x167 msp430x155 msp430x156 msp430x157" ;; alpha*-*-freebsd*) targ_emul=elf64alpha_fbsd targ_extra_emuls="elf64alpha alpha" tdir_alpha=`echo ${targ_alias} | sed -e 's/freebsd/freebsdecoff/'` diff --git a/ld/emulparams/msp430x110.sh b/ld/emulparams/msp430x110.sh new file mode 100644 index 00000000000..54e8272dc3d --- /dev/null +++ b/ld/emulparams/msp430x110.sh @@ -0,0 +1,14 @@ +ARCH=msp:11 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xfc00 +ROM_SIZE=0x3e0 +RAM_START=0x0200 +RAM_SIZE=128 + +STACK=0x280 diff --git a/ld/emulparams/msp430x1101.sh b/ld/emulparams/msp430x1101.sh new file mode 100644 index 00000000000..9a0273c524e --- /dev/null +++ b/ld/emulparams/msp430x1101.sh @@ -0,0 +1,14 @@ +ARCH=msp:110 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xfc00 +ROM_SIZE=0x3e0 +RAM_START=0x0200 +RAM_SIZE=128 + +STACK=0x280 diff --git a/ld/emulparams/msp430x1111.sh b/ld/emulparams/msp430x1111.sh new file mode 100644 index 00000000000..c8c95e237c1 --- /dev/null +++ b/ld/emulparams/msp430x1111.sh @@ -0,0 +1,14 @@ +ARCH=msp:110 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf800 +ROM_SIZE=0x07e0 +RAM_START=0x0200 +RAM_SIZE=128 + +STACK=0x280 diff --git a/ld/emulparams/msp430x112.sh b/ld/emulparams/msp430x112.sh new file mode 100644 index 00000000000..0b74404b98e --- /dev/null +++ b/ld/emulparams/msp430x112.sh @@ -0,0 +1,14 @@ +ARCH=msp:11 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf000 +ROM_SIZE=0xfe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x1121.sh b/ld/emulparams/msp430x1121.sh new file mode 100644 index 00000000000..e190c2a6219 --- /dev/null +++ b/ld/emulparams/msp430x1121.sh @@ -0,0 +1,14 @@ +ARCH=msp:110 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf000 +ROM_SIZE=0x0fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x122.sh b/ld/emulparams/msp430x122.sh new file mode 100644 index 00000000000..ee2ba40675c --- /dev/null +++ b/ld/emulparams/msp430x122.sh @@ -0,0 +1,14 @@ +ARCH=msp:12 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf000 +ROM_SIZE=0xfe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x1222.sh b/ld/emulparams/msp430x1222.sh new file mode 100644 index 00000000000..ee2ba40675c --- /dev/null +++ b/ld/emulparams/msp430x1222.sh @@ -0,0 +1,14 @@ +ARCH=msp:12 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf000 +ROM_SIZE=0xfe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x123.sh b/ld/emulparams/msp430x123.sh new file mode 100644 index 00000000000..6d946bc2333 --- /dev/null +++ b/ld/emulparams/msp430x123.sh @@ -0,0 +1,14 @@ +ARCH=msp:12 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xe000 +ROM_SIZE=0x1fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x1232.sh b/ld/emulparams/msp430x1232.sh new file mode 100644 index 00000000000..6d946bc2333 --- /dev/null +++ b/ld/emulparams/msp430x1232.sh @@ -0,0 +1,14 @@ +ARCH=msp:12 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xe000 +ROM_SIZE=0x1fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x133.sh b/ld/emulparams/msp430x133.sh new file mode 100644 index 00000000000..1d6104f57c5 --- /dev/null +++ b/ld/emulparams/msp430x133.sh @@ -0,0 +1,14 @@ +ARCH=msp:13 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xe000 +ROM_SIZE=0x1fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x1331.sh b/ld/emulparams/msp430x1331.sh new file mode 100644 index 00000000000..1d6104f57c5 --- /dev/null +++ b/ld/emulparams/msp430x1331.sh @@ -0,0 +1,14 @@ +ARCH=msp:13 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xe000 +ROM_SIZE=0x1fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x135.sh b/ld/emulparams/msp430x135.sh new file mode 100644 index 00000000000..f2eb5448ee9 --- /dev/null +++ b/ld/emulparams/msp430x135.sh @@ -0,0 +1,14 @@ +ARCH=msp:13 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xc000 +ROM_SIZE=0x3fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x1351.sh b/ld/emulparams/msp430x1351.sh new file mode 100644 index 00000000000..f2eb5448ee9 --- /dev/null +++ b/ld/emulparams/msp430x1351.sh @@ -0,0 +1,14 @@ +ARCH=msp:13 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xc000 +ROM_SIZE=0x3fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x147.sh b/ld/emulparams/msp430x147.sh new file mode 100644 index 00000000000..a2747b7d6d4 --- /dev/null +++ b/ld/emulparams/msp430x147.sh @@ -0,0 +1,14 @@ +ARCH=msp:14 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x8000 +ROM_SIZE=0x7fe0 +RAM_START=0x0200 +RAM_SIZE=1K + +STACK=0x600 diff --git a/ld/emulparams/msp430x148.sh b/ld/emulparams/msp430x148.sh new file mode 100644 index 00000000000..5954c70a86d --- /dev/null +++ b/ld/emulparams/msp430x148.sh @@ -0,0 +1,14 @@ +ARCH=msp:14 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x4000 +ROM_SIZE=0xbef0 +RAM_START=0x0200 +RAM_SIZE=0x07ff + +STACK=0xa00 diff --git a/ld/emulparams/msp430x149.sh b/ld/emulparams/msp430x149.sh new file mode 100644 index 00000000000..a695876e38b --- /dev/null +++ b/ld/emulparams/msp430x149.sh @@ -0,0 +1,14 @@ +ARCH=msp:14 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x1100 +ROM_SIZE=0xeee0 +RAM_START=0x0200 +RAM_SIZE=0x07ff + +STACK=0xa00 diff --git a/ld/emulparams/msp430x155.sh b/ld/emulparams/msp430x155.sh new file mode 100644 index 00000000000..5b1c8380bc2 --- /dev/null +++ b/ld/emulparams/msp430x155.sh @@ -0,0 +1,14 @@ +ARCH=msp:15 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xc000 +ROM_SIZE=0x3fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x156.sh b/ld/emulparams/msp430x156.sh new file mode 100644 index 00000000000..0bb2867694e --- /dev/null +++ b/ld/emulparams/msp430x156.sh @@ -0,0 +1,14 @@ +ARCH=msp:15 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xa000 +ROM_SIZE=0x5fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x157.sh b/ld/emulparams/msp430x157.sh new file mode 100644 index 00000000000..21ea6f68331 --- /dev/null +++ b/ld/emulparams/msp430x157.sh @@ -0,0 +1,14 @@ +ARCH=msp:15 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x8000 +ROM_SIZE=0x7fe0 +RAM_START=0x0200 +RAM_SIZE=1K + +STACK=0x600 diff --git a/ld/emulparams/msp430x167.sh b/ld/emulparams/msp430x167.sh new file mode 100644 index 00000000000..3b942f740f2 --- /dev/null +++ b/ld/emulparams/msp430x167.sh @@ -0,0 +1,14 @@ +ARCH=msp:16 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x8000 +ROM_SIZE=0x7fe0 +RAM_START=0x0200 +RAM_SIZE=1K + +STACK=0x600 diff --git a/ld/emulparams/msp430x168.sh b/ld/emulparams/msp430x168.sh new file mode 100644 index 00000000000..f92e6d4d788 --- /dev/null +++ b/ld/emulparams/msp430x168.sh @@ -0,0 +1,14 @@ +ARCH=msp:16 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x4000 +ROM_SIZE=0xbef0 +RAM_START=0x0200 +RAM_SIZE=0x07ff + +STACK=0xa00 diff --git a/ld/emulparams/msp430x169.sh b/ld/emulparams/msp430x169.sh new file mode 100644 index 00000000000..72b0983888c --- /dev/null +++ b/ld/emulparams/msp430x169.sh @@ -0,0 +1,14 @@ +ARCH=msp:16 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x1100 +ROM_SIZE=0xeee0 +RAM_START=0x0200 +RAM_SIZE=0x07ff + +STACK=0xa00 diff --git a/ld/emulparams/msp430x311.sh b/ld/emulparams/msp430x311.sh new file mode 100644 index 00000000000..eebad54ed29 --- /dev/null +++ b/ld/emulparams/msp430x311.sh @@ -0,0 +1,14 @@ +ARCH=msp:31 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf800 +ROM_SIZE=0x07e0 +RAM_START=0x0200 +RAM_SIZE=128 + +STACK=0x280 diff --git a/ld/emulparams/msp430x312.sh b/ld/emulparams/msp430x312.sh new file mode 100644 index 00000000000..789c73b72ba --- /dev/null +++ b/ld/emulparams/msp430x312.sh @@ -0,0 +1,14 @@ +ARCH=msp:31 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf000 +ROM_SIZE=0x0fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x313.sh b/ld/emulparams/msp430x313.sh new file mode 100644 index 00000000000..8fac19fc58d --- /dev/null +++ b/ld/emulparams/msp430x313.sh @@ -0,0 +1,14 @@ +ARCH=msp:31 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xe000 +ROM_SIZE=0x1fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x314.sh b/ld/emulparams/msp430x314.sh new file mode 100644 index 00000000000..3ef19875949 --- /dev/null +++ b/ld/emulparams/msp430x314.sh @@ -0,0 +1,14 @@ +ARCH=msp:31 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xd000 +ROM_SIZE=0x2fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x315.sh b/ld/emulparams/msp430x315.sh new file mode 100644 index 00000000000..4156eb684a1 --- /dev/null +++ b/ld/emulparams/msp430x315.sh @@ -0,0 +1,14 @@ +ARCH=msp:31 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xc000 +ROM_SIZE=0x3fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x323.sh b/ld/emulparams/msp430x323.sh new file mode 100644 index 00000000000..13b9d517098 --- /dev/null +++ b/ld/emulparams/msp430x323.sh @@ -0,0 +1,14 @@ +ARCH=msp:32 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xe000 +ROM_SIZE=0x1fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x325.sh b/ld/emulparams/msp430x325.sh new file mode 100644 index 00000000000..3c8e351e3f0 --- /dev/null +++ b/ld/emulparams/msp430x325.sh @@ -0,0 +1,14 @@ +ARCH=msp:32 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xc000 +ROM_SIZE=0x3fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x336.sh b/ld/emulparams/msp430x336.sh new file mode 100644 index 00000000000..c0dc08c917e --- /dev/null +++ b/ld/emulparams/msp430x336.sh @@ -0,0 +1,14 @@ +ARCH=msp:33 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xa000 +ROM_SIZE=0x5fe0 +RAM_START=0x0200 +RAM_SIZE=1024 + +STACK=0x600 diff --git a/ld/emulparams/msp430x337.sh b/ld/emulparams/msp430x337.sh new file mode 100644 index 00000000000..a52d12948af --- /dev/null +++ b/ld/emulparams/msp430x337.sh @@ -0,0 +1,14 @@ +ARCH=msp:33 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x8000 +ROM_SIZE=0x7fe0 +RAM_START=0x0200 +RAM_SIZE=1024 + +STACK=0x600 diff --git a/ld/emulparams/msp430x412.sh b/ld/emulparams/msp430x412.sh new file mode 100644 index 00000000000..1a1f68b41d1 --- /dev/null +++ b/ld/emulparams/msp430x412.sh @@ -0,0 +1,14 @@ +ARCH=msp:41 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xf000 +ROM_SIZE=0x0fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x413.sh b/ld/emulparams/msp430x413.sh new file mode 100644 index 00000000000..d3a739d323e --- /dev/null +++ b/ld/emulparams/msp430x413.sh @@ -0,0 +1,14 @@ +ARCH=msp:41 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xe000 +ROM_SIZE=0x1fe0 +RAM_START=0x0200 +RAM_SIZE=256 + +STACK=0x300 diff --git a/ld/emulparams/msp430x435.sh b/ld/emulparams/msp430x435.sh new file mode 100644 index 00000000000..d625acea353 --- /dev/null +++ b/ld/emulparams/msp430x435.sh @@ -0,0 +1,14 @@ +ARCH=msp:43 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xc000 +ROM_SIZE=0x3fe0 +RAM_START=0x0200 +RAM_SIZE=512 + +STACK=0x400 diff --git a/ld/emulparams/msp430x436.sh b/ld/emulparams/msp430x436.sh new file mode 100644 index 00000000000..75f711b1a02 --- /dev/null +++ b/ld/emulparams/msp430x436.sh @@ -0,0 +1,14 @@ +ARCH=msp:43 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0xa000 +ROM_SIZE=0x5fe0 +RAM_START=0x0200 +RAM_SIZE=1024 + +STACK=0x600 diff --git a/ld/emulparams/msp430x437.sh b/ld/emulparams/msp430x437.sh new file mode 100644 index 00000000000..92de8cccd41 --- /dev/null +++ b/ld/emulparams/msp430x437.sh @@ -0,0 +1,14 @@ +ARCH=msp:43 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x8000 +ROM_SIZE=0x7fe0 +RAM_START=0x0200 +RAM_SIZE=1024 + +STACK=0x600 diff --git a/ld/emulparams/msp430x447.sh b/ld/emulparams/msp430x447.sh new file mode 100644 index 00000000000..058cc07132f --- /dev/null +++ b/ld/emulparams/msp430x447.sh @@ -0,0 +1,14 @@ +ARCH=msp:44 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x8000 +ROM_SIZE=0x7fe0 +RAM_START=0x0200 +RAM_SIZE=1K + +STACK=0x600 diff --git a/ld/emulparams/msp430x448.sh b/ld/emulparams/msp430x448.sh new file mode 100644 index 00000000000..e8820ce93ad --- /dev/null +++ b/ld/emulparams/msp430x448.sh @@ -0,0 +1,14 @@ +ARCH=msp:44 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x4000 +ROM_SIZE=0xbef0 +RAM_START=0x0200 +RAM_SIZE=0x07ff + +STACK=0xa00 diff --git a/ld/emulparams/msp430x449.sh b/ld/emulparams/msp430x449.sh new file mode 100644 index 00000000000..9c3442eb48c --- /dev/null +++ b/ld/emulparams/msp430x449.sh @@ -0,0 +1,14 @@ +ARCH=msp:44 +MACHINE= +SCRIPT_NAME=elf32msp430 +OUTPUT_FORMAT="elf32-msp430" +MAXPAGESIZE=1 +EMBEDDED=yes +TEMPLATE_NAME=generic + +ROM_START=0x1100 +ROM_SIZE=0xeee0 +RAM_START=0x0200 +RAM_SIZE=0x07ff + +STACK=0xa00 diff --git a/ld/gen-doc.texi b/ld/gen-doc.texi index 485e52c2f23..0a6bd4c5a0a 100644 --- a/ld/gen-doc.texi +++ b/ld/gen-doc.texi @@ -6,6 +6,7 @@ @set H8300 @set I960 @set MMIX +@set MSP430 @set TICOFF @set WIN32 diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 8e3a856672d..0af57653c2b 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -36,6 +36,7 @@ @set MCORE @set MIPS @set MMIX +@set MSP430 @set PDP11 @set PJ @set SH @@ -4393,6 +4394,9 @@ functionality are not listed. @ifset MMIX * MMIX:: @code{ld} and MMIX @end ifset +@ifset MSP430 +* MSP430:: @code{ld} and MSP430 +@end ifset @ifset TICOFF * TI COFF:: @command{ld} and TI COFF @end ifset @@ -4892,6 +4896,39 @@ Initial and trailing multiples of zero-valued 32-bit words in a section, are left out from an mmo file. @end ifset +@ifset MSP430 +@node MSP430 +@section @code{ld} and MSP430 +For the MSP430 it is possible to select the MPU architecture. The flag @samp{-m [mpu type]} +will select an appropriate linker script for selected MPU type. (To get a list of known MPUs +just pass @samp{-m help} option to the linker). + +@cindex MSP430 extra sections +The linker will recognize some extra sections which are MSP430 specific: + +@table @code +@item @samp{.vectors} +Defines a portion of ROM where interrupt vectors located. + +@item @samp{.bootloader} +Defines the bootloader portion of the ROM (if applicable). Any code +in this section will be uploaded to the MPU. + +@item @samp{.infomem} +Defines an information memory section (if applicable). Any code in +this section will be uploaded to the MPU. + +@item @samp{.infomemnobits} +This is the same as the @samp{.infomem} section except that any code +in this section will not be uploaded to the MPU. + +@item @samp{.noinit} +Denotes a portion of RAM located above @samp{.bss} section. + +The last two sections are used by gcc. +@end table +@end ifset + @ifset TICOFF @node TI COFF @section @command{ld}'s support for various TI COFF versions diff --git a/ld/scripttempl/elf32msp430.sc b/ld/scripttempl/elf32msp430.sc new file mode 100644 index 00000000000..763657650ea --- /dev/null +++ b/ld/scripttempl/elf32msp430.sc @@ -0,0 +1,188 @@ +cat < text} + + .data ${RELOCATING-0} : ${RELOCATING+AT (ADDR (.text) + SIZEOF (.text))} + { + ${RELOCATING+ PROVIDE (__data_start = .) ; } + ${RELOCATING+. = ALIGN(2);} + *(.data) + ${RELOCATING+. = ALIGN(2);} + *(.gnu.linkonce.d*) + ${RELOCATING+. = ALIGN(2);} + ${RELOCATING+ _edata = . ; } + } ${RELOCATING+ > data} + + /* Bootloader. */ + .bootloader ${RELOCATING-0} : + { + ${RELOCATING+ PROVIDE (__boot_start = .) ; } + *(.bootloader) + ${RELOCATING+. = ALIGN(2);} + *(.bootloader.*) + } ${RELOCATING+ > bootloader} + + /* Information memory. */ + .infomem ${RELOCATING-0} : + { + *(.infomem) + ${RELOCATING+. = ALIGN(2);} + *(.infomem.*) + } ${RELOCATING+ > infomem} + + /* Information memory (not loaded into MPU). */ + .infomemnobits ${RELOCATING-0} : + { + *(.infomemnobits) + ${RELOCATING+. = ALIGN(2);} + *(.infomemnobits.*) + } ${RELOCATING+ > infomemnobits} + + .bss ${RELOCATING+ SIZEOF(.data) + ADDR(.data)} : + { + ${RELOCATING+ PROVIDE (__bss_start = .) ; } + *(.bss) + *(COMMON) + ${RELOCATING+ PROVIDE (__bss_end = .) ; } + ${RELOCATING+ _end = . ; } + } ${RELOCATING+ > data} + + .noinit ${RELOCATING+ SIZEOF(.bss) + ADDR(.bss)} : + { + ${RELOCATING+ PROVIDE (__noinit_start = .) ; } + *(.noinit) + *(COMMON) + ${RELOCATING+ PROVIDE (__noinit_end = .) ; } + ${RELOCATING+ _end = . ; } + } ${RELOCATING+ > data} + + .vectors ${RELOCATING-0}: + { + ${RELOCATING+ PROVIDE (__vectors_start = .) ; } + *(.vectors*) + ${RELOCATING+ _vectors_end = . ; } + } ${RELOCATING+ > vectors} + + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + + PROVIDE (__stack = ${STACK}) ; +} +EOF diff --git a/ld/scripttempl/elf32msp430_3.sc b/ld/scripttempl/elf32msp430_3.sc new file mode 100644 index 00000000000..019e4b766d8 --- /dev/null +++ b/ld/scripttempl/elf32msp430_3.sc @@ -0,0 +1,157 @@ +cat < text} + + .data ${RELOCATING-0} : ${RELOCATING+AT (ADDR (.text) + SIZEOF (.text))} + { + ${RELOCATING+ PROVIDE (__data_start = .) ; } + *(.data) + *(.gnu.linkonce.d*) + ${RELOCATING+. = ALIGN(2);} + ${RELOCATING+ _edata = . ; } + } ${RELOCATING+ > data} + + .bss ${RELOCATING+ SIZEOF(.data) + ADDR(.data)} : + { + ${RELOCATING+ PROVIDE (__bss_start = .) ; } + *(.bss) + *(COMMON) + ${RELOCATING+ PROVIDE (__bss_end = .) ; } + ${RELOCATING+ _end = . ; } + } ${RELOCATING+ > data} + + .noinit ${RELOCATING+ SIZEOF(.bss) + ADDR(.bss)} : + { + ${RELOCATING+ PROVIDE (__noinit_start = .) ; } + *(.noinit) + *(COMMON) + ${RELOCATING+ PROVIDE (__noinit_end = .) ; } + ${RELOCATING+ _end = . ; } + } ${RELOCATING+ > data} + + .vectors ${RELOCATING-0}: + { + ${RELOCATING+ PROVIDE (__vectors_start = .) ; } + *(.vectors*) + ${RELOCATING+ _vectors_end = . ; } + } ${RELOCATING+ > vectors} + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + + PROVIDE (__stack = ${STACK}) ; +} +EOF diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index c5dff567378..7ff7f953639 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2002-12-30 Dmitry Diky + + * configure.in: Add msp430 target. + * configure: Regenerate. + * disassemble.c: Add entry for msp430 disassembly. + * msp430-dis.c: New file: msp430 disassembler. + 2002-12-27 Chris Demetriou * disassemble.c (disassembler_usage): Add invocation of diff --git a/opcodes/Makefile.in b/opcodes/Makefile.in index da66cf594e8..08ea4b222db 100644 --- a/opcodes/Makefile.in +++ b/opcodes/Makefile.in @@ -1,6 +1,6 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am +# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -451,7 +451,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) @@ -600,7 +600,7 @@ maintainer-clean-recursive: dot_seen=no; \ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ rev="$$subdir $$rev"; \ - test "$$subdir" = "." && dot_seen=yes; \ + test "$$subdir" != "." || dot_seen=yes; \ done; \ test "$$dot_seen" = "no" && rev=". $$rev"; \ target=`echo $@ | sed s/-recursive//`; \ diff --git a/opcodes/configure b/opcodes/configure index 6825a0b020b..8eed735ed5a 100755 --- a/opcodes/configure +++ b/opcodes/configure @@ -2338,7 +2338,7 @@ if test "${enable_install_libbfd+set}" = set; then enableval="$enable_install_libbfd" install_libbfd_p=$enableval else - if test "${host}" = "${target}" -o "$enable_shared" = "yes"; then + if test "${host}" = "${target}" || test "$enable_shared" = "yes"; then install_libbfd_p=yes else install_libbfd_p=no @@ -4625,6 +4625,7 @@ if test x${all_targets} = xfalse ; then bfd_mmix_arch) ta="$ta mmix-dis.lo mmix-opc.lo" ;; bfd_mn10200_arch) ta="$ta m10200-dis.lo m10200-opc.lo" ;; bfd_mn10300_arch) ta="$ta m10300-dis.lo m10300-opc.lo" ;; + bfd_msp430_arch) ta="$ta msp430-dis.lo" ;; bfd_ns32k_arch) ta="$ta ns32k-dis.lo" ;; bfd_openrisc_arch) ta="$ta openrisc-asm.lo openrisc-desc.lo openrisc-dis.lo openrisc-ibld.lo openrisc-opc.lo" using_cgen=yes ;; bfd_or32_arch) ta="$ta or32-dis.lo or32-opc.lo" using_cgen=yes ;; diff --git a/opcodes/configure.in b/opcodes/configure.in index 0e5eb6f5fb4..bc8d6f8e942 100644 --- a/opcodes/configure.in +++ b/opcodes/configure.in @@ -200,6 +200,7 @@ if test x${all_targets} = xfalse ; then bfd_mmix_arch) ta="$ta mmix-dis.lo mmix-opc.lo" ;; bfd_mn10200_arch) ta="$ta m10200-dis.lo m10200-opc.lo" ;; bfd_mn10300_arch) ta="$ta m10300-dis.lo m10300-opc.lo" ;; + bfd_msp430_arch) ta="$ta msp430-dis.lo" ;; bfd_ns32k_arch) ta="$ta ns32k-dis.lo" ;; bfd_openrisc_arch) ta="$ta openrisc-asm.lo openrisc-desc.lo openrisc-dis.lo openrisc-ibld.lo openrisc-opc.lo" using_cgen=yes ;; bfd_or32_arch) ta="$ta or32-dis.lo or32-opc.lo" using_cgen=yes ;; diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index bfee746a0c1..1c2c21c1788 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -49,6 +49,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define ARCH_mmix #define ARCH_mn10200 #define ARCH_mn10300 +#define ARCH_msp430 #define ARCH_ns32k #define ARCH_openrisc #define ARCH_or32 @@ -214,6 +215,11 @@ disassembler (abfd) disassemble = print_insn_m88k; break; #endif +#ifdef ARCH_msp430 + case bfd_arch_msp430: + disassemble = print_insn_msp430; + break; +#endif #ifdef ARCH_ns32k case bfd_arch_ns32k: disassemble = print_insn_ns32k; diff --git a/opcodes/msp430-dis.c b/opcodes/msp430-dis.c new file mode 100644 index 00000000000..767ffa472c1 --- /dev/null +++ b/opcodes/msp430-dis.c @@ -0,0 +1,805 @@ +/* Disassemble MSP430 instructions. + Copyright (C) 2002 Free Software Foundation, Inc. + + Contributed by Dmitry Diky + + 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 +#include +#include +#include + +#include "dis-asm.h" +#include "opintl.h" +#include "libiberty.h" + +#define DASM_SECTION +#include "opcode/msp430.h" +#undef DASM_SECTION + + +static unsigned short msp430dis_opcode + PARAMS ((bfd_vma, disassemble_info *)); +int print_insn_msp430 + PARAMS ((bfd_vma, disassemble_info *)); +int msp430_nooperands + PARAMS ((struct msp430_opcode_s *, bfd_vma, unsigned short, char *, int *)); +int msp430_singleoperand + PARAMS ((disassemble_info *, struct msp430_opcode_s *, bfd_vma, unsigned short, + char *, char *, int *)); +int msp430_doubleoperand + PARAMS ((disassemble_info *, struct msp430_opcode_s *, bfd_vma, unsigned short, + char *, char *, char *, char *, int *)); +int msp430_branchinstr + PARAMS ((disassemble_info *, struct msp430_opcode_s *, bfd_vma, unsigned short, + char *, char *, int *)); + +#define PS(x) (0xffff & (x)) + +static unsigned short +msp430dis_opcode (addr, info) + bfd_vma addr; + disassemble_info *info; +{ + bfd_byte buffer[2]; + int status; + + status = info->read_memory_func (addr, buffer, 2, info); + if (status != 0) + { + info->memory_error_func (status, addr, info); + return -1; + } + return bfd_getl16 (buffer); +} + +int +print_insn_msp430 (addr, info) + bfd_vma addr; + disassemble_info *info; +{ + void *stream = info->stream; + fprintf_ftype prin = info->fprintf_func; + struct msp430_opcode_s *opcode; + char op1[32], op2[32], comm1[64], comm2[64]; + int cmd_len = 0; + unsigned short insn; + int cycles = 0; + char *bc = ""; + char dinfo[32]; /* Debug purposes. */ + + insn = msp430dis_opcode (addr, info); + sprintf (dinfo, "0x%04x", insn); + + if (((int) addr & 0xffff) > 0xffdf) + { + (*prin) (stream, "interrupt service routine at 0x%04x", 0xffff & insn); + return 2; + } + + *comm1 = 0; + *comm2 = 0; + + for (opcode = msp430_opcodes; opcode->name; opcode++) + { + if ((insn & opcode->bin_mask) == opcode->bin_opcode + && opcode->bin_opcode != 0x9300) + { + *op1 = 0; + *op2 = 0; + *comm1 = 0; + *comm2 = 0; + + /* r0 as destination. Ad should be zero. */ + if (opcode->insn_opnumb == 3 && (insn & 0x000f) == 0 + && (0x0080 & insn) == 0) + { + cmd_len = + msp430_branchinstr (info, opcode, addr, insn, op1, comm1, + &cycles); + if (cmd_len) + break; + } + + switch (opcode->insn_opnumb) + { + case 0: + cmd_len = msp430_nooperands (opcode, addr, insn, comm1, &cycles); + break; + case 2: + cmd_len = + msp430_doubleoperand (info, opcode, addr, insn, op1, op2, + comm1, comm2, &cycles); + if (insn & BYTE_OPERATION) + bc = ".b"; + break; + case 1: + cmd_len = + msp430_singleoperand (info, opcode, addr, insn, op1, comm1, + &cycles); + if (insn & BYTE_OPERATION && opcode->fmt != 3) + bc = ".b"; + break; + default: + break; + } + } + + if (cmd_len) + break; + } + + dinfo[5] = 0; + + if (cmd_len < 1) + { + /* Unknown opcode, or invalid combination of operands. */ + (*prin) (stream, ".word 0x%04x; ????", PS (insn)); + return 2; + } + + (*prin) (stream, "%s%s", opcode->name, bc); + + if (*op1) + (*prin) (stream, "\t%s", op1); + if (*op2) + (*prin) (stream, ","); + + if (strlen (op1) < 7) + (*prin) (stream, "\t"); + if (!strlen (op1)) + (*prin) (stream, "\t"); + + if (*op2) + (*prin) (stream, "%s", op2); + if (strlen (op2) < 8) + (*prin) (stream, "\t"); + + if (*comm1 || *comm2) + (*prin) (stream, ";"); + else if (cycles) + { + if (*op2) + (*prin) (stream, ";"); + else + { + if (strlen (op1) < 7) + (*prin) (stream, ";"); + else + (*prin) (stream, "\t;"); + } + } + if (*comm1) + (*prin) (stream, "%s", comm1); + if (*comm1 && *comm2) + (*prin) (stream, ","); + if (*comm2) + (*prin) (stream, " %s", comm2); + return cmd_len; +} + +int +msp430_nooperands (opcode, addr, insn, comm, cycles) + struct msp430_opcode_s *opcode; + bfd_vma addr ATTRIBUTE_UNUSED; + unsigned short insn ATTRIBUTE_UNUSED; + char *comm; + int *cycles; +{ + /* Pop with constant. */ + if (insn == 0x43b2) + return 0; + if (insn == opcode->bin_opcode) + return 2; + + if (opcode->fmt == 0) + { + if ((insn & 0x0f00) != 3 || (insn & 0x0f00) != 2) + return 0; + + strcpy (comm, "emulated..."); + *cycles = 1; + } + else + { + strcpy (comm, "return from interupt"); + *cycles = 5; + } + + return 2; +} + + +int +msp430_singleoperand (info, opcode, addr, insn, op, comm, cycles) + disassemble_info *info; + struct msp430_opcode_s *opcode; + bfd_vma addr; + unsigned short insn; + char *op; + char *comm; + int *cycles; +{ + int regs = 0, regd = 0; + int ad = 0, as = 0; + int where = 0; + int cmd_len = 2; + short dst = 0; + + regd = insn & 0x0f; + regs = (insn & 0x0f00) >> 8; + as = (insn & 0x0030) >> 4; + ad = (insn & 0x0080) >> 7; + + switch (opcode->fmt) + { + case 0: /* Emulated work with dst register. */ + if (regs != 2 && regs != 3 && regs != 1) + return 0; + + /* Check if not clr insn. */ + if (opcode->bin_opcode == 0x4300 && (ad || as)) + return 0; + + /* Check if really inc, incd insns. */ + if ((opcode->bin_opcode & 0xff00) == 0x5300 && as == 3) + return 0; + + if (ad == 0) + { + *cycles = 1; + + /* Register. */ + if (regd == 0) + { + *cycles += 1; + sprintf (op, "r0"); + } + else if (regd == 1) + sprintf (op, "r1"); + + else if (regd == 2) + sprintf (op, "r2"); + + else + sprintf (op, "r%d", regd); + } + else /* ad == 1 msp430dis_opcode. */ + { + if (regd == 0) + { + /* PC relative. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + *cycles = 4; + sprintf (op, "0x%04x", dst); + sprintf (comm, "PC rel. abs addr 0x%04x", + PS ((short) (addr + 2) + dst)); + } + else if (regd == 2) + { + /* Absolute. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + *cycles = 4; + sprintf (op, "&0x%04x", PS (dst)); + } + else + { + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + *cycles = 4; + sprintf (op, "%d(r%d)", dst, regd); + } + } + break; + + case 2: /* rrc, push, call, swpb, rra, sxt, push, call, reti etc... */ + + if (as == 0) + { + if (regd == 3) + { + /* Constsnts. */ + sprintf (op, "#0"); + sprintf (comm, "r3 As==00"); + } + else + { + /* Register. */ + sprintf (op, "r%d", regd); + } + *cycles = 1; + } + else if (as == 2) + { + *cycles = 1; + if (regd == 2) + { + sprintf (op, "#4"); + sprintf (comm, "r2 As==10"); + } + else if (regd == 3) + { + sprintf (op, "#2"); + sprintf (comm, "r3 As==10"); + } + else + { + *cycles = 3; + /* Indexed register mode @Rn. */ + sprintf (op, "@r%d", regd); + } + } + else if (as == 3) + { + *cycles = 1; + if (regd == 2) + { + sprintf (op, "#8"); + sprintf (comm, "r2 As==11"); + } + else if (regd == 3) + { + sprintf (op, "#-1"); + sprintf (comm, "r3 As==11"); + } + else if (regd == 0) + { + *cycles = 3; + /* absolute. @pc+ */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op, "#%d", dst); + sprintf (comm, "#0x%04x", PS (dst)); + } + else + { + *cycles = 3; + sprintf (op, "@r%d+", regd); + } + } + else if (as == 1) + { + *cycles = 4; + if (regd == 0) + { + /* PC relative. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op, "0x%04x", PS (dst)); + sprintf (comm, "PC rel. 0x%04x", + PS ((short) addr + 2 + dst)); + } + else if (regd == 2) + { + /* Absolute. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op, "&0x%04x", PS (dst)); + } + else if (regd == 3) + { + *cycles = 1; + sprintf (op, "#1"); + sprintf (comm, "r3 As==01"); + } + else + { + /* Indexd. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op, "%d(r%d)", dst, regd); + } + } + break; + + case 3: /* Jumps. */ + where = insn & 0x03ff; + if (where & 0x200) + where |= ~0x03ff; + if (where > 512 || where < -511) + return 0; + + where *= 2; + sprintf (op, "$%+-8d", where + 2); + sprintf (comm, "abs 0x%x", PS ((short) (addr) + 2 + where)); + *cycles = 2; + return 2; + break; + default: + cmd_len = 0; + } + + return cmd_len; +} + +int +msp430_doubleoperand (info, opcode, addr, insn, op1, op2, comm1, comm2, cycles) + disassemble_info *info; + struct msp430_opcode_s *opcode; + bfd_vma addr; + unsigned short insn; + char *op1, *op2; + char *comm1, *comm2; + int *cycles; +{ + int regs = 0, regd = 0; + int ad = 0, as = 0; + int cmd_len = 2; + short dst = 0; + + regd = insn & 0x0f; + regs = (insn & 0x0f00) >> 8; + as = (insn & 0x0030) >> 4; + ad = (insn & 0x0080) >> 7; + + if (opcode->fmt == 0) + { + /* Special case: rla and rlc are the only 2 emulated instructions that + fall into two operand instructions. */ + /* With dst, there are only: + Rm Register, + x(Rm) Indexed, + 0xXXXX Relative, + &0xXXXX Absolute + emulated_ins dst + basic_ins dst, dst. */ + + if (regd != regs || as != ad) + return 0; /* May be 'data' section. */ + + if (ad == 0) + { + /* Register mode. */ + if (regd == 3) + { + strcpy (comm1, "Illegal as emulation instr"); + return -1; + } + + sprintf (op1, "r%d", regd); + *cycles = 1; + } + else /* ad == 1 */ + { + if (regd == 0) + { + /* PC relative, Symbolic. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 4; + *cycles = 6; + sprintf (op1, "0x%04x", PS (dst)); + sprintf (comm1, "PC rel. 0x%04x", + PS ((short) addr + 2 + dst)); + + } + else if (regd == 2) + { + /* Absolute. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 4; + *cycles = 6; + sprintf (op1, "&0x%04x", PS (dst)); + } + else + { + /* Indexed. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 4; + *cycles = 6; + sprintf (op1, "%d(r%d)", dst, regd); + } + } + + *op2 = 0; + *comm2 = 0; + return cmd_len; + } + + /* Two operands exactly. */ + if (ad == 0 && regd == 3) + { + /* R2/R3 are illegal as dest: may be data section. */ + strcpy (comm1, "Illegal as 2-op instr"); + return -1; + } + + /* Source. */ + if (as == 0) + { + *cycles = 1; + if (regs == 3) + { + /* Constsnts. */ + sprintf (op1, "#0"); + sprintf (comm1, "r3 As==00"); + } + else + { + /* Register. */ + sprintf (op1, "r%d", regs); + } + } + else if (as == 2) + { + *cycles = 1; + + if (regs == 2) + { + sprintf (op1, "#4"); + sprintf (comm1, "r2 As==10"); + } + else if (regs == 3) + { + sprintf (op1, "#2"); + sprintf (comm1, "r3 As==10"); + } + else + { + *cycles = 2; + + /* Indexed register mode @Rn. */ + sprintf (op1, "@r%d", regs); + } + if (!regs) + *cycles = 3; + } + else if (as == 3) + { + if (regs == 2) + { + sprintf (op1, "#8"); + sprintf (comm1, "r2 As==11"); + *cycles = 1; + } + else if (regs == 3) + { + sprintf (op1, "#-1"); + sprintf (comm1, "r3 As==11"); + *cycles = 1; + } + else if (regs == 0) + { + *cycles = 3; + /* Absolute. @pc+ */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op1, "#%d", dst); + sprintf (comm1, "#0x%04x", PS (dst)); + } + else + { + *cycles = 2; + sprintf (op1, "@r%d+", regs); + } + } + else if (as == 1) + { + if (regs == 0) + { + *cycles = 4; + /* PC relative. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op1, "0x%04x", PS (dst)); + sprintf (comm1, "PC rel. 0x%04x", + PS ((short) addr + 2 + dst)); + } + else if (regs == 2) + { + *cycles = 2; + /* Absolute. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op1, "&0x%04x", PS (dst)); + sprintf (comm1, "0x%04x", PS (dst)); + } + else if (regs == 3) + { + *cycles = 1; + sprintf (op1, "#1"); + sprintf (comm1, "r3 As==01"); + } + else + { + *cycles = 3; + /* Indexed. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op1, "%d(r%d)", dst, regs); + } + } + + /* Destination. Special care needed on addr + XXXX. */ + + if (ad == 0) + { + /* Register. */ + if (regd == 0) + { + *cycles += 1; + sprintf (op2, "r0"); + } + else if (regd == 1) + sprintf (op2, "r1"); + + else if (regd == 2) + sprintf (op2, "r2"); + + else + sprintf (op2, "r%d", regd); + } + else /* ad == 1. */ + { + * cycles += 3; + + if (regd == 0) + { + /* PC relative. */ + *cycles += 1; + dst = msp430dis_opcode (addr + cmd_len, info); + sprintf (op2, "0x%04x", PS (dst)); + sprintf (comm2, "PC rel. 0x%04x", + PS ((short) addr + cmd_len + dst)); + cmd_len += 2; + } + else if (regd == 2) + { + /* Absolute. */ + dst = msp430dis_opcode (addr + cmd_len, info); + cmd_len += 2; + sprintf (op2, "&0x%04x", PS (dst)); + } + else + { + dst = msp430dis_opcode (addr + cmd_len, info); + cmd_len += 2; + sprintf (op2, "%d(r%d)", dst, regd); + } + } + + return cmd_len; +} + + +int +msp430_branchinstr (info, opcode, addr, insn, op1, comm1, cycles) + disassemble_info *info; + struct msp430_opcode_s *opcode ATTRIBUTE_UNUSED; + bfd_vma addr ATTRIBUTE_UNUSED; + unsigned short insn; + char *op1; + char *comm1; + int *cycles; +{ + int regs = 0, regd = 0; + int ad = 0, as = 0; + int cmd_len = 2; + short dst = 0; + + regd = insn & 0x0f; + regs = (insn & 0x0f00) >> 8; + as = (insn & 0x0030) >> 4; + ad = (insn & 0x0080) >> 7; + + if (regd != 0) /* Destination register is not a PC. */ + return 0; + + /* dst is a source register. */ + if (as == 0) + { + /* Constants. */ + if (regs == 3) + { + *cycles = 1; + sprintf (op1, "#0"); + sprintf (comm1, "r3 As==00"); + } + else + { + /* Register. */ + *cycles = 1; + sprintf (op1, "r%d", regs); + } + } + else if (as == 2) + { + if (regs == 2) + { + *cycles = 2; + sprintf (op1, "#4"); + sprintf (comm1, "r2 As==10"); + } + else if (regs == 3) + { + *cycles = 1; + sprintf (op1, "#2"); + sprintf (comm1, "r3 As==10"); + } + else + { + /* Indexed register mode @Rn. */ + *cycles = 2; + sprintf (op1, "@r%d", regs); + } + } + else if (as == 3) + { + if (regs == 2) + { + *cycles = 1; + sprintf (op1, "#8"); + sprintf (comm1, "r2 As==11"); + } + else if (regs == 3) + { + *cycles = 1; + sprintf (op1, "#-1"); + sprintf (comm1, "r3 As==11"); + } + else if (regs == 0) + { + /* Absolute. @pc+ */ + *cycles = 3; + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op1, "#0x%04x", PS (dst)); + } + else + { + *cycles = 2; + sprintf (op1, "@r%d+", regs); + } + } + else if (as == 1) + { + * cycles = 3; + + if (regs == 0) + { + /* PC relative. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + (*cycles)++; + sprintf (op1, "0x%04x", PS (dst)); + sprintf (comm1, "PC rel. 0x%04x", + PS ((short) addr + 2 + dst)); + } + else if (regs == 2) + { + /* Absolute. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op1, "&0x%04x", PS (dst)); + } + else if (regs == 3) + { + (*cycles)--; + sprintf (op1, "#1"); + sprintf (comm1, "r3 As==01"); + } + else + { + /* Indexd. */ + dst = msp430dis_opcode (addr + 2, info); + cmd_len += 2; + sprintf (op1, "%d(r%d)", dst, regs); + } + } + + return cmd_len; +}