diff --git a/MANIFEST b/MANIFEST
deleted file mode 100644
index 1e876de..0000000
--- a/MANIFEST
+++ /dev/null
@@ -1,249 +0,0 @@
-By codito
- added files:
-  gas/testsuite/gas/arc/general_a700.d
-  gas/testsuite/gas/arc/dsp1.d
-  gas/testsuite/gas/arc/general_a700.s
-  gas/testsuite/gas/arc/dsp1.s
-  gas/testsuite/gas/arc/ld_arc700.s
-  gas/testsuite/gas/arc/sub_s.d
-  gas/testsuite/gas/arc/lsl_s.d
-  gas/testsuite/gas/arc/gen_simd.d
-  gas/testsuite/gas/arc/sub_s.s
-  gas/testsuite/gas/arc/lsl_s.s
-  gas/testsuite/gas/arc/prefetch.d
-  gas/testsuite/gas/arc/gen_simd.s
-  gas/testsuite/gas/arc/reloctest.d
-  gas/testsuite/gas/arc/arc700.exp
-  gas/testsuite/gas/arc/dsp2.d
-  gas/testsuite/gas/arc/prefetch.s
-  gas/testsuite/gas/arc/reloctest.s
-  gas/testsuite/gas/arc/dsp2.s
-  gas/testsuite/gas/arc/mpy_a700.d
-  gas/testsuite/gas/arc/ex_arc700.s
-  gas/testsuite/gas/arc/mpy_a700.s
-  gas/config/extlib
-  gas/config/extlib/configure
-  gas/config/extlib/Makefile.in
-  gas/config/extlib/arcsimd.s
-  gas/config/extlib/configure.in
-  gas/config/extlib/arcextlib.s
-  include/elf/ChangeLog.codito
-  libgloss/arc/syscall.h (delivered as linux/include/asm-arcnommu/unistd.h)
-  ld/emultempl/arclinux.em
-  ld/configdoc.texi
-  ld/scripttempl/elfarc.sc
-  ld/scripttempl/arclinux.sc
-  ld/emulparams/arclinux.sh
-  md5.sum
-  opcodes/ChangeLog.codito
-  opcodes/arcompact-dis.c
- changed files:
-  bfd/archures.c (merged)
-  bfd/bfd-in2.h (merged/regenerated)
-  bfd/config.bfd
-  bfd/configure.in
-  bfd/cpu-arc.c (merged)
-  bfd/elf32-arc.c
-  bfd/reloc.c
-  bfd/cpu-arc.c
-  Makefile.in
-  gas/configure.tgt (patch was originally in configure.in)
-  gas/doc/c-arc.texi
-  gas/doc/as.texinfo
-  gas/configure.in
-  gas/testsuite/gas/arc/swi.d
-  gas/testsuite/gas/arc/sbc.d
-  gas/testsuite/gas/arc/sleep.d
-  gas/testsuite/gas/arc/brk.d
-  gas/testsuite/gas/arc/swi.s
-  gas/testsuite/gas/arc/rrc.d
-  gas/testsuite/gas/arc/bic.d
-  gas/testsuite/gas/arc/extb.d
-  gas/testsuite/gas/arc/arc.exp
-  gas/testsuite/gas/arc/asl.d
-  gas/testsuite/gas/arc/asr.d
-  gas/testsuite/gas/arc/sexw.d
-  gas/testsuite/gas/arc/adc.d
-  gas/testsuite/gas/arc/lsr.d
-  gas/testsuite/gas/arc/mov.d
-  gas/testsuite/gas/arc/ror.d
-  gas/testsuite/gas/arc/and.d
-  gas/testsuite/gas/arc/xor.d
-  gas/testsuite/gas/arc/rlc.d
-  gas/testsuite/gas/arc/or.d
-  gas/testsuite/gas/arc/sexb.d
-  gas/testsuite/gas/arc/jl.d
-  gas/testsuite/gas/arc/extw.d
-  gas/testsuite/gas/arc/add.d
-  gas/testsuite/gas/arc/sub.d
-  gas/struc-symbol.h
-  gas/config/tc-arc.c
-  gas/config/tc-arc.h
-  gas/Makefile.am
-  include/dis-asm.h
-  include/elf/arc.h
-  include/elf/common.h (adapted)
-  include/opcode/arc.h
-  ld/configure.in
-  ld/emulparams/arcelf.sh
-  ld/configure.tgt
-  ld/Makefile.am
-  binutils/configure.in
-  binutils/testsuite/binutils-all/objdump.exp
-  binutils/readelf.c
-  opcodes/configure.in
-  opcodes/arc-dis.c
-  opcodes/arc-dis.h
-  opcodes/arc-opc.c
-  opcodes/Makefile.am
-  opcodes/arc-ext.c
-  opcodes/arc-ext.h
-  gdb/doc/Makefile.in
-  gdb/doc/gdb.texinfo
-  gdb/remote.c
-  gdb/testsuite/gdb.base/float.exp
-  gdb/testsuite/lib/gdbserver-support.exp
-  gdb/testsuite/gdb.asm/asm-source.exp
-  gdb/dwarf2read.c
-  gdb/dwarf2-frame.c
-  gdb/configure.tgt
-  gdb/version.in
-  gdb/gdbserver/Makefile.in
-  gdb/gdbserver/configure.srv
-  gdb/gdbserver/proc-service.c
-  gdb/gdbserver/remote-utils.c
-  gdb/Makefile.in
-
-By ARC employees:
- added files:
-  cgen/cpu/ARCompact.cpu
-  cgen/cpu/arc.opc
-  cgen/cpu/arc.cpu
-  cpu/arc.opc
-  cpu/sh-sim.cpu
-  cpu/arc.cpu
-  cpu/ARCompact.cpu
-  gas/ChangeLog.ARC
-  gdb/config/arc/arc.mt
-  include/gdb/target-io/arc.h
-  ld/ChangeLog.ARC
-  opcodes/arc-opc.h
-  opcodes/arc-opinst.c
-  opcodes/arc-desc.c
-  opcodes/arc-desc.h
-  opcodes/arc-ibld.c
-  opcodes/arc-asm.c
-  sim/arc/ChangeLog
-  sim/arc/configure.ac
-  sim/arc/mloop5.in
-  sim/arc/mloop6.in
-  sim/arc/mloop7.in
-  sim/arc/arc-sim.h
-  sim/arc/Makefile.in
-  sim/arc/tconfig.in
-  sim/arc/sim-main.h
-  sim/arc/devices.c
-  sim/arc/sim-if.c
-  sim/arc/arc5.c
-  sim/arc/arc6.c
-  sim/arc/arc7.c
-  sim/arc/config.in
-  sim/arc/configure
-  sim/arc/arch.h
-  sim/arc/arch.c
-  sim/arc/decode5.h
-  sim/arc/decode6.h
-  sim/arc/decode7.h
-  sim/arc/decode5.c
-  sim/arc/decode6.c
-  sim/arc/decode7.c
-  sim/arc/sem5-switch.c
-  sim/arc/sem6-switch.c
-  sim/arc/sem7-switch.c
-  sim/arc/sem5.c
-  sim/arc/sem6.c
-  sim/arc/sem7.c
-  sim/arc/cpu5.h
-  sim/arc/cpu6.h
-  sim/arc/cpu7.h
-  sim/arc/cpuall.h
-  sim/arc/cpu5.c
-  sim/arc/cpu6.c
-  sim/arc/cpu7.c
-  sim/arc/model5.c
-  sim/arc/model6.c
-  sim/arc/model7.c
-  sim/arc/traps.c
-  sim/common/ChangeLog.ARC
-  newlib/ChangeLog.ARC
-  newlib/libc/sys/arc/sys/fcntl.h
- replaced files:
-  opcodes/arc-dis.c
-  opcodes/arc-opc.c
- changed files:
-  bfd/configure
-  bfd/elf32-arc.c
-  bfd/libbfd.h
-  bfd/bfd-in2.h
-  cgen/ChangeLog
-  cgen/read.scm
-  cgen/sim-cpu.scm
-  cgen/utils-sim.scm
-  cgen/cpu/ip2k.opc
-  cgen/cpu/sparc.opc
-  cgen/cpu/xc16x.opc
-  cgen/cpu/fr30.opc
-  cgen/cpu/mep.opc
-  cgen/cpu/m32r.opc
-  cgen/cpu/i960.opc
-  cgen/cpu/sh.opc
-  cgen/cpu/iq2000.opc
-  cgen/cpu/openrisc.opc
-  cgen/cpu/xstormy16.opc
-  cgen/opc-itab.scm
-  cpu/ChangeLog
-  gas/config/tc-arc.c
-  gas/config/tc-arc.h
-  gas/configure
-  gas/Makefile.in
-  gas/doc/c-arc.texi
-  gas/as.c
-  gas/symbols.c
-  gas/symbols.h
-  gdb/ChangeLog
-  gdb/configure.tgt
-  include/ChangeLog
-  include/dis-asm.h
-  include/gdb/callback.h
-  include/gdb/ChangeLog
-  include/opcode/arc.h
-  include/opcode/cgen.h
-  ld/ChangeLog
-  ld/scripttempl/arclinux.sc
-  ld/scripttempl/elfarc.sc
-  ld/emulparams/arclinux.sh
-  ld/Makefile.am
-  ld/Makefile.in
-  libgloss/ChangeLog
-  opcodes/arc-dis.h
-  opcodes/arc-dis.c
-  opcodes/arc-ext.h
-  opcodes/arc-ext.c
-  opcodes/arc-opc.c
-  opcodes/ChangeLog
-  opcodes/configure
-  opcodes/configure.in
-  opcodes/Makefile.am
-  opcodes/Makefile.in
-  opcodes/cgen-dis.c
-  sim/ChangeLog
-  sim/configure.ac
-  sim/configure
-  sim/common/callback.c
-  sim/common/cgen-trace.c
-  sim/common/ChangeLog
-  sim/common/gennltvals.sh
-  sim/common/gentvals.sh
-  sim/common/nltvals.def
-  sim/common/sim-utils.c
-  sim/common/syscall.c
diff --git a/Makefile.in b/Makefile.in
index 027a03b..981ce54 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -354,7 +354,6 @@
 AS_FOR_TARGET=@AS_FOR_TARGET@
 CC_FOR_TARGET=$(STAGE_CC_WRAPPER) @CC_FOR_TARGET@ $(FLAGS_FOR_TARGET)
 
-
 # If GCC_FOR_TARGET is not overriden on the command line, then this
 # variable is passed down to the gcc Makefile, where it is used to
 # build libgcc2.a.  We define it here so that it can itself be
diff --git a/README.arcgdb b/README.arcgdb
new file mode 100755
index 0000000..7710624
--- /dev/null
+++ b/README.arcgdb
@@ -0,0 +1,146 @@
+Building gdb
+============
+
+You can build ARC GDB in two possible ways: one for debugging linux applications,
+and one for debugging programs directly on the CPU using either the built-in simulator,
+or the xISS (a fast instruction set simulator), or a JTAG connection to a hardware target.
+
+
+arc-linux-uclibc-gdb
+--------------------
+
+You will need to build GDB as well as gdbserver.
+
+For building GDB, do
+   $ ./configure --target=arc-linux-uclibc --prefix=/install/path
+   $ make 
+   $ make install
+
+(Where /install/path is a path to a directory where you want to install GDB.)
+
+
+For building gdbserver:
+
+You will need the arc-linux-uclibc-gcc toolchain.  It should be in your path.
+
+   $ cd gdbserver
+   $ source ./build_gdbserver.sh
+   $ ./configure --host=i386-redhat-linux-gnu --target=arc-linux-uclibc --prefix=/install/path
+   $ make
+   $ make install
+
+If you do not have the build_gdbserver.sh script, you will need these variables set in your
+environment:
+
+   CFLAGS="-mA7 -static -O0"
+   LDFLAGS="-mA7"
+   CC=arc-linux-uclibc-gcc
+
+You will find a gdbserver in your install path.
+Copy it to an NFS share that is accessible from the board.
+
+Please use the script at <SOURCE-DIR>/insight/src/build_gdbserver.sh for reference.
+
+
+arc-elf32-gdb
+-------------
+
+Do
+   $ ./configure --target=arc-elf32 --prefix=/install/path \
+                 --with-expat [ --with-libexpat-prefix=/expat/install/path ] \
+                 [ --with-xiss  --with-xiss-prefix=/xISS/install/path ]
+   $ make 
+   $ make install
+
+(Where /install/path is a path to a directory where you want to install GDB.)
+
+You will need to have the expat library (available from http://www.libexpat.org) installed on your machine.
+The `configure' script will search for this library in several standard locations; if it is installed in an
+unusual path, you can use the `--with-libexpat-prefix' option to specify its location. 
+
+If you have the xISS (ARC Fast Instruction Set Simulator) installed, you may optionally build gdb to be able
+to use it directly, by specifying the --with-xiss and --with-xiss-prefix options.  In this case, the xISS
+installation must have been built with the option "--enable-mdb" specified to the 'configure' script in
+order that the required header files are located in the /xISS/install/path/include directory.
+
+
+Running gdb
+===========
+
+XISS
+----
+If you have built arc-elf32-gdb to be able to use the xISS directly, you will need to set the environment
+variable XISS_HOME to identify the /xISS/install/path directory in order to be able to use the gdb
+'target arcxiss' command.
+
+
+XISS instruction address trace file
+-----------------------------------
+arc-elf32-gdb may be used in conjection with the xISS to trace instruction execution; it may create a file
+containing the address of each instruction executed, in the order in which they were executed.  This file
+contains the data in a compressed encoding which results in a saving of about 80% of the uncompressed data
+size.  See the ARC gdb 'Getting Started' manual for more information.
+
+
+Auxiliary registers XML file
+----------------------------
+
+When using gdb, you will need to provide it with a file which describes the auxiliary registers of the target
+(e.g. ARCAngel 4, simulator) upon which you are debugging.
+
+By default, gdb will look for a file named 'arc-registers.xml'; it will look first in your current working
+directory, and then in your home directory.  Alternatively, a file may be specified by means of the
+'arc-reg-read-file' command.
+
+It is also possible to add new descriptions using the 'arc-reg-read-extra-file' command, thus allowing
+processor variants to be described by sets of common files and variant-specific files.
+
+Files containing descriptions for the ARC700, ARC600 and A5 variants of the ARC processor architecture are
+provided at
+
+   gdb/features/arc700-cpu.xml
+   gdb/features/arc600-cpu.xml
+   gdb/features/arc-a5-cpu.xml
+
+It is suggested that you copy the appropriate file for your target architecture to your home or working directory,
+and rename it to 'arc-registers.xml'.
+
+It is simple to define a new target description; the XML schema for the description is defined in the
+file
+
+    gdb/features/arc-registers.dtd 
+
+
+In essence, a target description consists of a set of register descriptions. Each register description has
+these attributes:
+
+        name        : the register name (case-insensitive); may be 'unused'
+        description : an (optional) textual description of the register's function
+        number      : the number of the register in the auxiliary register set (e.g. 0x0A for STATUS32)
+        mask        : a 32-bit mask which defines which bits of the register are valid (0xFFFFFFFF by default)
+        access      : the register's read/write access: R/O, R/W or W/O (R/W by default)
+
+
+Each register description may also have a set of field descriptions. Each field description has
+these attributes:
+
+        name        : the field name (case-insensitive); may be 'reserved'
+        description : an (optional) textual description of the field's function
+        onwrite     : the (optional) value (for a reserved field) which must be supplied on a write operation
+        offset      : the offset in bits of the field from the least significant bit (0) of the register
+        size        : the size of the field in bits
+        access      : the field's read/write access: R/O, R/W or W/O (the register's access by default)
+
+
+Each field description may also have a set of field meanings.  Each field meaning has these attributes:
+
+        value       : a value that the field may contain
+        description : a textual explanation of the meaning of the field when it contains that value
+
+
+There may also be a set of Build Configuration Registers (BCRs).  The descriptions of these registers do
+not have an access attribute; and, although a BCR may have a number of fields (which do not have access
+or onwrite attributes), these fields do not have field meanings.
+
+It is also possible to include definitions of Extension Core Registers: the descriptions of these have 
+merely the register number (which must be between 32 and 59 inclusive), and mask and access attributes.
diff --git a/bfd/archures.c b/bfd/archures.c
index 16a4d33..0a9d99b 100644
--- a/bfd/archures.c
+++ b/bfd/archures.c
@@ -300,7 +300,7 @@
 .#define bfd_mach_v850e 	'E'
 .#define bfd_mach_v850e1	'1'
 .  bfd_arch_arc,       {* ARC Cores *}
-.#define bfd_mach_arc_a4         0
+.#define bfd_mach_arc_unknown    0
 .#define bfd_mach_arc_a5         1
 .#define bfd_mach_arc_arc600     2
 .#define bfd_mach_arc_arc700     3
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 12f6a40..78e2ea5 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1977,7 +1977,7 @@
 #define bfd_mach_v850e         'E'
 #define bfd_mach_v850e1        '1'
   bfd_arch_arc,       /* ARC Cores */
-#define bfd_mach_arc_a4         0
+#define bfd_mach_arc_unknown    0
 #define bfd_mach_arc_a5         1
 #define bfd_mach_arc_arc600     2
 #define bfd_mach_arc_arc700     3
@@ -3254,11 +3254,11 @@
 in bits 10 through 0.  */
   BFD_RELOC_ARC_S13_PCREL,
 
-/* ARCompact Middle-endian 32 bit word relocation  */
+/* ARCompact Middle-endian 32 bit word relocation.  */
   BFD_RELOC_ARC_32_ME,
 
 /* ARCompact PC Relative 32 bit relocation.  */
-  BFD_RELOC_ARC_PC32 ,
+  BFD_RELOC_ARC_PC32,
 
 /* ARC 700 GOT specific relocation. This computes the distance from the current 
 pcl to the symbol's global offset table entry.  */
@@ -3266,12 +3266,12 @@
 
 /* ARC 700 PLT specific relocation. This computes the distance from the base 
 of the PLT to the symbols PLT entry.  */
-  BFD_RELOC_ARC_PLT32 ,
+  BFD_RELOC_ARC_PLT32,
 
 /* ARC 700 Copy relocation. This refers to a location in the writable segment 
 and during execution the dynamic linker copies data associated with the shared
 objects symbol to the location specified by the offset. Created for 
-dynamic linking by the linker .  */
+dynamic linking by the linker.  */
   BFD_RELOC_ARC_COPY,
 
 /* ARC 700 Global Data relocaton.This is to set a GOT entry to the address
@@ -3294,7 +3294,7 @@
   BFD_RELOC_ARC_GOTOFF,
 
 /* This gives the difference between the address of the GOT base and the 
-current PC. The symbol referenced is _GLOBAL_OFFSET_TABLE .  */
+current PC. The symbol referenced is _GLOBAL_OFFSET_TABLE.  */
   BFD_RELOC_ARC_GOTPC,
 
 /* ARC 700 GOT specific relocation. This computes the distance from the base
diff --git a/bfd/configure b/bfd/configure
index 892d328..bb56d77 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -1,81 +1,35 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59.
+# Generated by GNU Autoconf 2.61.
 #
-# Copyright (C) 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -96,124 +50,466 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
   fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
+  case $as_dir in
 	 /*)
-	   if ("$as_dir/$as_base" -c '
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
+  chmod +x "$as_me.lineno" ||
     { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -222,7 +518,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -231,15 +548,6 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 
 
 # Check that we are running under the correct shell.
@@ -390,29 +698,26 @@
 
 
 
+exec 7<&0 </dev/null 6>&1
+
 # Name of the host.
 # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
-exec 6>&1
-
 #
 # Initializations.
 #
 ac_default_prefix=/usr/local
+ac_clean_files=
 ac_config_libobj_dir=.
+LIBOBJS=
 cross_compiling=no
 subdirs=
 MFLAGS=
 MAKEFLAGS=
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
 # Identity of this package.
 PACKAGE_NAME=
 PACKAGE_TARNAME=
@@ -424,42 +729,207 @@
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
-#if HAVE_SYS_TYPES_H
+#ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
-#if HAVE_SYS_STAT_H
+#ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #endif
-#if STDC_HEADERS
+#ifdef STDC_HEADERS
 # include <stdlib.h>
 # include <stddef.h>
 #else
-# if HAVE_STDLIB_H
+# ifdef HAVE_STDLIB_H
 #  include <stdlib.h>
 # endif
 #endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
 #  include <memory.h>
 # endif
 # include <string.h>
 #endif
-#if HAVE_STRINGS_H
+#ifdef HAVE_STRINGS_H
 # include <strings.h>
 #endif
-#if HAVE_INTTYPES_H
+#ifdef HAVE_INTTYPES_H
 # include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
 #endif
-#if HAVE_UNISTD_H
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE AR ac_ct_AR RANLIB ac_ct_RANLIB LIBTOOL SED EGREP FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM LN_S lt_ECHO CPP DEBUGDIR PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI WARN_CFLAGS NO_WERROR MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT GENINSRC_NEVER_TRUE GENINSRC_NEVER_FALSE INSTALL_LIBBFD_TRUE INSTALL_LIBBFD_FALSE host_noncanonical target_noncanonical bfdlibdir bfdincludedir USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT MKINSTALLDIRS MSGFMT MSGMERGE HDEFINES BFD_HOST_64BIT_LONG BFD_HOST_64BIT_LONG_LONG BFD_HOST_64_BIT_DEFINED BFD_HOST_64_BIT BFD_HOST_U_64_BIT BFD_HOSTPTR_T CC_FOR_BUILD EXEEXT_FOR_BUILD COREFILE COREFLAG WIN32LDFLAGS WIN32LIBADD TDEFINES wordsize bfd64_libs all_backends bfd_backends bfd_machines bfd_default_target_size bfd_file_ptr bfd_ufile_ptr tdefaults datarootdir docdir htmldir LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+target
+target_cpu
+target_vendor
+target_os
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+AR
+RANLIB
+LIBTOOL
+SED
+GREP
+EGREP
+FGREP
+LD
+DUMPBIN
+ac_ct_DUMPBIN
+NM
+LN_S
+lt_ECHO
+CPP
+DEBUGDIR
+PKGVERSION
+REPORT_BUGS_TO
+REPORT_BUGS_TEXI
+WARN_CFLAGS
+NO_WERROR
+MAINTAINER_MODE_TRUE
+MAINTAINER_MODE_FALSE
+MAINT
+GENINSRC_NEVER_TRUE
+GENINSRC_NEVER_FALSE
+INSTALL_LIBBFD_TRUE
+INSTALL_LIBBFD_FALSE
+host_noncanonical
+target_noncanonical
+bfdlibdir
+bfdincludedir
+USE_NLS
+LIBINTL
+LIBINTL_DEP
+INCINTL
+XGETTEXT
+GMSGFMT
+POSUB
+CATALOGS
+DATADIRNAME
+INSTOBJEXT
+GENCAT
+CATOBJEXT
+MKINSTALLDIRS
+MSGFMT
+MSGMERGE
+HDEFINES
+BFD_HOST_64BIT_LONG
+BFD_HOST_64BIT_LONG_LONG
+BFD_HOST_64_BIT_DEFINED
+BFD_HOST_64_BIT
+BFD_HOST_U_64_BIT
+BFD_HOSTPTR_T
+CC_FOR_BUILD
+EXEEXT_FOR_BUILD
+COREFILE
+COREFLAG
+WIN32LDFLAGS
+WIN32LIBADD
+TDEFINES
+wordsize
+bfd64_libs
+all_backends
+bfd_backends
+bfd_machines
+bfd_default_target_size
+bfd_file_ptr
+bfd_ufile_ptr
+tdefaults
+LIBOBJS
+LTLIBOBJS'
 ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -486,34 +956,48 @@
 # and all the variables that are supposed to be based on exec_prefix
 # by default will actually change.
 # Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
 
 ac_prev=
+ac_dashdash=
 for ac_option
 do
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
+    eval $ac_prev=\$ac_option
     ac_prev=
     continue
   fi
 
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
-  case $ac_option in
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
@@ -535,33 +1019,45 @@
   --config-cache | -C)
     cache_file=config.cache ;;
 
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+  -datadir | --datadir | --datadi | --datad)
     ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
     datadir=$ac_optarg ;;
 
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
   -disable-* | --disable-*)
     ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
     ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -588,6 +1084,12 @@
   -host=* | --host=* | --hos=* | --ho=*)
     host_alias=$ac_optarg ;;
 
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
@@ -612,13 +1114,16 @@
   | --libexe=* | --libex=* | --libe=*)
     libexecdir=$ac_optarg ;;
 
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
   -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
+  | --localstate | --localstat | --localsta | --localst | --locals)
     ac_prev=localstatedir ;;
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
     localstatedir=$ac_optarg ;;
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
@@ -683,6 +1188,16 @@
   | --progr-tra=* | --program-tr=* | --program-t=*)
     program_transform_name=$ac_optarg ;;
 
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
@@ -735,24 +1250,20 @@
   -with-* | --with-*)
     ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
 
   -without-* | --without-*)
     ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -783,8 +1294,7 @@
     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
    { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
+    eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
@@ -804,27 +1314,19 @@
    { (exit 1); exit 1; }; }
 fi
 
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
 do
-  eval ac_val=$`echo $ac_var`
+  eval ac_val=\$$ac_var
   case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -851,74 +1353,76 @@
 test "$silent" = yes && exec 6>/dev/null
 
 
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$0" : 'X\(//\)[^/]' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
+  if test ! -r "$srcdir/$ac_unique_file"; then
     srcdir=..
   fi
 else
   ac_srcdir_defaulted=no
 fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
 fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
    { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
 
 #
 # Report the --help message.
@@ -947,9 +1451,6 @@
   -n, --no-create         do not create output files
       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
 
-_ACEOF
-
-  cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
 			  [$ac_default_prefix]
@@ -967,15 +1468,22 @@
   --bindir=DIR           user executables [EPREFIX/bin]
   --sbindir=DIR          system admin executables [EPREFIX/sbin]
   --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
   --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
   --libdir=DIR           object code libraries [EPREFIX/lib]
   --includedir=DIR       C header files [PREFIX/include]
   --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -1001,10 +1509,8 @@
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --disable-dependency-tracking  speeds up one-time build
   --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-shared[=PKGS]
-                          build shared libraries [default=no]
-  --enable-static[=PKGS]
-                          build static libraries [default=yes]
+  --enable-shared[=PKGS]  build shared libraries [default=no]
+  --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
@@ -1039,126 +1545,95 @@
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
 _ACEOF
+ac_status=$?
 fi
 
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
+    test -d "$ac_dir" || continue
     ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
   done
 fi
 
-test -n "$ac_init_help" && exit 0
+test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
-  exit 0
+  exit
 fi
-exec 5>config.log
-cat >&5 <<_ACEOF
+cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by $as_me, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
 
 _ACEOF
+exec 5>>config.log
 {
 cat <<_ASUNAME
 ## --------- ##
@@ -1177,7 +1652,7 @@
 /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
 /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
 /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
 /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
 /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
@@ -1191,6 +1666,7 @@
   test -z "$as_dir" && as_dir=.
   echo "PATH: $as_dir"
 done
+IFS=$as_save_IFS
 
 } >&5
 
@@ -1212,7 +1688,6 @@
 ac_configure_args=
 ac_configure_args0=
 ac_configure_args1=
-ac_sep=
 ac_must_keep_next=false
 for ac_pass in 1 2
 do
@@ -1223,7 +1698,7 @@
     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    *\'*)
       ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
@@ -1245,9 +1720,7 @@
 	  -* ) ac_must_keep_next=true ;;
 	esac
       fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
+      ac_configure_args="$ac_configure_args '$ac_arg'"
       ;;
     esac
   done
@@ -1258,8 +1731,8 @@
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
 # would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
   # Save into config.log some information that might help in debugging.
   {
@@ -1272,20 +1745,34 @@
 _ASBOX
     echo
     # The following way of writing the cache mishandles newlines in values,
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
   (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
     *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-}
+    esac |
+    sort
+)
     echo
 
     cat <<\_ASBOX
@@ -1296,22 +1783,28 @@
     echo
     for ac_var in $ac_subst_vars
     do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
       cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
 _ASBOX
       echo
       for ac_var in $ac_subst_files
       do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
@@ -1323,26 +1816,24 @@
 ## ----------- ##
 _ASBOX
       echo
-      sed "/^$/d" confdefs.h | sort
+      cat confdefs.h
       echo
     fi
     test "$ac_signal" != 0 &&
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
-     ' 0
+' 0
 for ac_signal in 1 2 13 15; do
   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
 done
 ac_signal=0
 
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
+rm -f -r conftest* confdefs.h
 
 # Predefined preprocessor variables.
 
@@ -1373,14 +1864,17 @@
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in $CONFIG_SITE; do
+shift
+for ac_site_file
+do
   if test -r "$ac_site_file"; then
     { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
 echo "$as_me: loading site script $ac_site_file" >&6;}
@@ -1396,8 +1890,8 @@
     { echo "$as_me:$LINENO: loading cache $cache_file" >&5
 echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
     esac
   fi
 else
@@ -1409,12 +1903,11 @@
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+for ac_var in $ac_precious_vars; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
       { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
@@ -1439,8 +1932,7 @@
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -1457,6 +1949,22 @@
    { (exit 1); exit 1; }; }
 fi
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -1466,122 +1974,155 @@
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install-sh -c"
     break
-  elif test -f $ac_dir/install.sh; then
+  elif test -f "$ac_dir/install.sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install.sh -c"
     break
-  elif test -f $ac_dir/shtool; then
+  elif test -f "$ac_dir/shtool"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/shtool install -c"
     break
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
    { (exit 1); exit 1; }; }
 fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
 
 # Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
    { (exit 1); exit 1; }; }
 
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
 if test "${ac_cv_build+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
   { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
 echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
    { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
 if test "${ac_cv_host+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+fi
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
-echo "$as_me:$LINENO: checking target system type" >&5
-echo $ECHO_N "checking target system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6; }
 if test "${ac_cv_target+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_target_alias=$target_alias
-test "x$ac_cv_target_alias" = "x" &&
-  ac_cv_target_alias=$ac_cv_host_alias
-ac_cv_target=`$ac_config_sub $ac_cv_target_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+fi
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_target" >&5
-echo "${ECHO_T}$ac_cv_target" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5
+echo "$as_me: error: invalid value of canonical target" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 target=$ac_cv_target
-target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
 
 
 # The aliases save the names the user supplied, while $host etc.
@@ -1598,8 +2139,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1612,32 +2153,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1650,36 +2193,51 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
   CC="$ac_cv_prog_CC"
 fi
 
 if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1692,74 +2250,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+
   fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1773,7 +2291,7 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -1784,6 +2302,7 @@
   fi
 done
 done
+IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
@@ -1801,22 +2320,23 @@
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+  for ac_prog in cl.exe
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1829,36 +2349,38 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$CC" && break
   done
 fi
 if test -z "$CC"; then
   ac_ct_CC=$CC
-  for ac_prog in cl
+  for ac_prog in cl.exe
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1871,29 +2393,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_CC" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 fi
 
 fi
@@ -1906,21 +2444,35 @@
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
@@ -1945,47 +2497,77 @@
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
 do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
 	;;
     [ab].out )
 	# We found the default executable, but exeext='' is most
 	# certainly right.
 	break;;
     *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
 	break;;
     * )
 	break;;
   esac
 done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
 else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
@@ -1997,19 +2579,21 @@
 fi
 
 ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
 
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
   if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -2028,22 +2612,27 @@
     fi
   fi
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
 rm -f a.out a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
 
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
@@ -2054,9 +2643,8 @@
 for ac_file in conftest.exe conftest conftest.*; do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
 	  break;;
     * ) break;;
   esac
@@ -2070,14 +2658,14 @@
 fi
 
 rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
 if test "${ac_cv_objext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2097,14 +2685,20 @@
 }
 _ACEOF
 rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
@@ -2122,12 +2716,12 @@
 
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2150,50 +2744,49 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2209,38 +2802,118 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -2256,12 +2929,12 @@
     CFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
+  ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2295,12 +2968,17 @@
 /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    function prototypes and stuff, but not '\xHH' hex character constants.
    These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
+   as 'x'.  The following induces an error, until -std is added to get
    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
    array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
+   that's true only with -std.  */
 int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -2315,205 +2993,57 @@
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
+rm -f conftest.$ac_ext
 CC=$ac_save_CC
 
 fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
   *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2521,13 +3051,12 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for library containing strerror" >&5
-echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for library containing strerror" >&5
+echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; }
 if test "${ac_cv_search_strerror+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_func_search_save_LIBS=$LIBS
-ac_cv_search_strerror=no
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -2535,115 +3064,73 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char strerror ();
 int
 main ()
 {
-strerror ();
+return strerror ();
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_strerror="none required"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_strerror" = no; then
-  for ac_lib in cposix; do
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char strerror ();
-int
-main ()
-{
-strerror ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_strerror="-l$ac_lib"
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_strerror=$ac_res
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-  done
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_strerror+set}" = set; then
+  break
 fi
+done
+if test "${ac_cv_search_strerror+set}" = set; then
+  :
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
-echo "${ECHO_T}$ac_cv_search_strerror" >&6
-if test "$ac_cv_search_strerror" != no; then
-  test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS"
+{ echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+echo "${ECHO_T}$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
 
@@ -2662,8 +3149,8 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -2685,7 +3172,7 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -2704,21 +3191,22 @@
     ;;
 esac
 done
+IFS=$as_save_IFS
 
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
     INSTALL=$ac_cv_path_install
   else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
+    # removed, or if the value is a relative name.
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -2728,8 +3216,8 @@
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
 # Just in case
 sleep 1
 echo timestamp > conftest.file
@@ -2771,20 +3259,20 @@
 Check your system clock" >&2;}
    { (exit 1); exit 1; }; }
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 test "$program_prefix" != NONE &&
-  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
 test "$program_suffix" != NONE &&
-  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
 # Double any \ or $.  echo might interpret backslashes.
 # By default was `s,x,x', remove it if useless.
 cat <<\_ACEOF >conftest.sed
 s/[\\$]/&&/g;s/;s,x,x,$//
 _ACEOF
 program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm conftest.sed
+rm -f conftest.sed
 
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
@@ -2836,8 +3324,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AWK+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2850,54 +3338,57 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AWK="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AWK=$ac_cv_prog_AWK
 if test -n "$AWK"; then
-  echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AWK" && break
 done
 
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
 all:
-	@echo 'ac_maketemp="$(MAKE)"'
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
 _ACEOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
 rm -f conftest.make
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   SET_MAKE=
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
@@ -2912,7 +3403,7 @@
 
 DEPDIR="${am__leading_dot}deps"
 
-          ac_config_commands="$ac_config_commands depfiles"
+ac_config_commands="$ac_config_commands depfiles"
 
 
 am_make=${MAKE-make}
@@ -2922,8 +3413,8 @@
 .PHONY: am__doit
 END
 # If we don't find an include directive, just comment out the code.
-echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
 am__include="#"
 am__quote=
 _am_result=none
@@ -2950,15 +3441,15 @@
 fi
 
 
-echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
 rm -f confinc confmf
 
-# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+# Check whether --enable-dependency-tracking was given.
 if test "${enable_dependency_tracking+set}" = set; then
-  enableval="$enable_dependency_tracking"
+  enableval=$enable_dependency_tracking;
+fi
 
-fi;
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
@@ -3033,8 +3524,8 @@
   if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3047,32 +3538,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3085,27 +3578,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
 fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  STRIP=$ac_ct_STRIP
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
 else
   STRIP="$ac_cv_prog_STRIP"
 fi
@@ -3126,8 +3633,8 @@
 
 depcc="$CC"   am_compiler_list=
 
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3216,8 +3723,8 @@
 fi
 
 fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
 
 
@@ -3238,8 +3745,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3252,32 +3759,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AR="${ac_tool_prefix}ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AR=$ac_cv_prog_AR
 if test -n "$AR"; then
-  echo "$as_me:$LINENO: result: $AR" >&5
-echo "${ECHO_T}$AR" >&6
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_AR"; then
   ac_ct_AR=$AR
   # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3290,26 +3799,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_AR="ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_AR=$ac_cv_prog_ac_ct_AR
 if test -n "$ac_ct_AR"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
-echo "${ECHO_T}$ac_ct_AR" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  AR=$ac_ct_AR
+  if test "x$ac_ct_AR" = x; then
+    AR=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
 else
   AR="$ac_cv_prog_AR"
 fi
@@ -3317,8 +3841,8 @@
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3331,32 +3855,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3369,36 +3895,49 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
 fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  RANLIB=$ac_ct_RANLIB
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
 else
   RANLIB="$ac_cv_prog_RANLIB"
 fi
 
 
-# Check whether --enable-shared or --disable-shared was given.
+# Check whether --enable-shared was given.
 if test "${enable_shared+set}" = set; then
-  enableval="$enable_shared"
-  p=${PACKAGE-default}
+  enableval=$enable_shared; p=${PACKAGE-default}
     case $enableval in
     yes) enable_shared=yes ;;
     no) enable_shared=no ;;
@@ -3417,7 +3956,8 @@
     esac
 else
   enable_shared=no
-fi;
+fi
+
 
 
 
@@ -3435,8 +3975,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3449,32 +3989,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3487,36 +4029,51 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
   CC="$ac_cv_prog_CC"
 fi
 
 if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3529,74 +4086,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+
   fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3610,7 +4127,7 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -3621,6 +4138,7 @@
   fi
 done
 done
+IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
@@ -3638,22 +4156,23 @@
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+  for ac_prog in cl.exe
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3666,36 +4185,38 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$CC" && break
   done
 fi
 if test -z "$CC"; then
   ac_ct_CC=$CC
-  for ac_prog in cl
+  for ac_prog in cl.exe
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3708,29 +4229,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_CC" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 fi
 
 fi
@@ -3743,27 +4280,41 @@
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3786,50 +4337,49 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3845,38 +4395,118 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -3892,12 +4522,12 @@
     CFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
+  ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -3931,12 +4561,17 @@
 /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    function prototypes and stuff, but not '\xHH' hex character constants.
    These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
+   as 'x'.  The following induces an error, until -std is added to get
    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
    array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
+   that's true only with -std.  */
 int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -3951,205 +4586,57 @@
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
+rm -f conftest.$ac_ext
 CC=$ac_save_CC
 
 fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
   *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -4190,10 +4677,9 @@
 
 
 
-# Check whether --enable-static or --disable-static was given.
+# Check whether --enable-static was given.
 if test "${enable_static+set}" = set; then
-  enableval="$enable_static"
-  p=${PACKAGE-default}
+  enableval=$enable_static; p=${PACKAGE-default}
     case $enableval in
     yes) enable_static=yes ;;
     no) enable_static=no ;;
@@ -4212,7 +4698,7 @@
     esac
 else
   enable_static=yes
-fi;
+fi
 
 
 
@@ -4222,13 +4708,14 @@
 
 
 
-# Check whether --with-pic or --without-pic was given.
+
+# Check whether --with-pic was given.
 if test "${with_pic+set}" = set; then
-  withval="$with_pic"
-  pic_mode="$withval"
+  withval=$with_pic; pic_mode="$withval"
 else
   pic_mode=default
-fi;
+fi
+
 
 test -z "$pic_mode" && pic_mode=default
 
@@ -4238,10 +4725,9 @@
 
 
 
-# Check whether --enable-fast-install or --disable-fast-install was given.
+# Check whether --enable-fast-install was given.
 if test "${enable_fast_install+set}" = set; then
-  enableval="$enable_fast_install"
-  p=${PACKAGE-default}
+  enableval=$enable_fast_install; p=${PACKAGE-default}
     case $enableval in
     yes) enable_fast_install=yes ;;
     no) enable_fast_install=no ;;
@@ -4260,7 +4746,7 @@
     esac
 else
   enable_fast_install=yes
-fi;
+fi
 
 
 
@@ -4269,64 +4755,90 @@
 
 
 
-echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
-echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
-if test "${lt_cv_path_SED+set}" = set; then
+
+{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; }
+if test "${ac_cv_path_SED+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  # Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" | sed 99q >conftest.sed
+     $as_unset ac_script || ac_script=
+     # Extract the first word of "sed gsed" to use in msg output
+if test -z "$SED"; then
+set dummy sed gsed; ac_prog_name=$2
+if test "${ac_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_SED_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
+  for ac_prog in sed gsed; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+    # Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
   done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_SED_found && break 3
+  done
+done
+
 done
 IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
+
 
 fi
 
-SED=$lt_cv_path_SED
+SED="$ac_cv_path_SED"
+if test -z "$SED"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+fi
 
-echo "$as_me:$LINENO: result: $SED" >&5
-echo "${ECHO_T}$SED" >&6
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5
+echo "${ECHO_T}$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
 
 test -z "$SED" && SED=sed
 Xsed="$SED -e 1s/^X//"
@@ -4341,34 +4853,249 @@
 
 
 
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
-
-
-echo "$as_me:$LINENO: checking for fgrep" >&5
-echo $ECHO_N "checking for fgrep... $ECHO_C" >&6
-if test "${ac_cv_prog_fgrep+set}" = set; then
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if echo 'ab*c' | (grep -F 'ab*c') >/dev/null 2>&1
-    then ac_cv_prog_fgrep='grep -F'
-    else ac_cv_prog_fgrep='fgrep'
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
     fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_fgrep" >&5
-echo "${ECHO_T}$ac_cv_prog_fgrep" >&6
- FGREP=$ac_cv_prog_fgrep
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     # Extract the first word of "fgrep" to use in msg output
+if test -z "$FGREP"; then
+set dummy fgrep; ac_prog_name=$2
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_FGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in fgrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+    # Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_FGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+FGREP="$ac_cv_path_FGREP"
+if test -z "$FGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
 
 
 test -z "$GREP" && GREP=grep
@@ -4391,18 +5118,18 @@
 
 
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
+# Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
 else
   with_gnu_ld=no
-fi;
+fi
+
 ac_prog=ld
 if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
-echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
   case $host in
   *-*-mingw*)
     # gcc leaves a trailing carriage return which upsets mingw
@@ -4431,11 +5158,11 @@
     ;;
   esac
 elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
 else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
 fi
 if test "${lt_cv_path_LD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4468,17 +5195,17 @@
 
 LD="$lt_cv_path_LD"
 if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
 if test "${lt_cv_prog_gnu_ld+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4492,8 +5219,8 @@
   ;;
 esac
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
 with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
@@ -4505,8 +5232,8 @@
 
 
 
-echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
-echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
+echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6; }
 if test "${lt_cv_path_NM+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4554,8 +5281,8 @@
   : ${lt_cv_path_NM=no}
 fi
 fi
-echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
-echo "${ECHO_T}$lt_cv_path_NM" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6; }
 if test "$lt_cv_path_NM" != "no"; then
   NM="$lt_cv_path_NM"
 else
@@ -4565,8 +5292,8 @@
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_DUMPBIN+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4579,25 +5306,27 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 DUMPBIN=$ac_cv_prog_DUMPBIN
 if test -n "$DUMPBIN"; then
-  echo "$as_me:$LINENO: result: $DUMPBIN" >&5
-echo "${ECHO_T}$DUMPBIN" >&6
+  { echo "$as_me:$LINENO: result: $DUMPBIN" >&5
+echo "${ECHO_T}$DUMPBIN" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$DUMPBIN" && break
   done
 fi
@@ -4607,8 +5336,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4621,30 +5350,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
 if test -n "$ac_ct_DUMPBIN"; then
-  echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
-echo "${ECHO_T}$ac_ct_DUMPBIN" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
+echo "${ECHO_T}$ac_ct_DUMPBIN" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_DUMPBIN" && break
 done
-test -n "$ac_ct_DUMPBIN" || ac_ct_DUMPBIN=":"
 
-  DUMPBIN=$ac_ct_DUMPBIN
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
 fi
 
 
@@ -4659,43 +5403,43 @@
 
 
 
-echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
-echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
+echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6; }
 if test "${lt_cv_nm_interface+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:4669: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:5413: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4672: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:5416: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4675: output\"" >&5)
+  (eval echo "\"\$as_me:5419: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
   fi
   rm -f conftest*
 fi
-echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
-echo "${ECHO_T}$lt_cv_nm_interface" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
+echo "${ECHO_T}$lt_cv_nm_interface" >&6; }
 
-echo "$as_me:$LINENO: checking whether ln -s works" >&5
-echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; }
 LN_S=$as_ln_s
 if test "$LN_S" = "ln -s"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
-  echo "$as_me:$LINENO: result: no, using $LN_S" >&5
-echo "${ECHO_T}no, using $LN_S" >&6
+  { echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6; }
 fi
 
 # find the maximum length of command line arguments
-echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
-echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; }
 if test "${lt_cv_sys_max_cmd_len+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4814,11 +5558,11 @@
 fi
 
 if test -n $lt_cv_sys_max_cmd_len ; then
-  echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
-echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+  { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; }
 else
-  echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
+  { echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6; }
 fi
 max_cmd_len=$lt_cv_sys_max_cmd_len
 
@@ -4832,26 +5576,26 @@
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
-echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
+echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6; }
 # Try some XSI features
 xsi_shell=no
 ( _lt_dummy="a/b/c"
   test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
       = c,a/b,, ) >/dev/null 2>&1 \
   && xsi_shell=yes
-echo "$as_me:$LINENO: result: $xsi_shell" >&5
-echo "${ECHO_T}$xsi_shell" >&6
+{ echo "$as_me:$LINENO: result: $xsi_shell" >&5
+echo "${ECHO_T}$xsi_shell" >&6; }
 
 
-echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
-echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
+echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6; }
 lt_shell_append=no
 ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
     >/dev/null 2>&1 \
   && lt_shell_append=yes
-echo "$as_me:$LINENO: result: $lt_shell_append" >&5
-echo "${ECHO_T}$lt_shell_append" >&6
+{ echo "$as_me:$LINENO: result: $lt_shell_append" >&5
+echo "${ECHO_T}$lt_shell_append" >&6; }
 
 
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
@@ -4885,15 +5629,15 @@
 
 
 
-echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
-echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; }
 if test "${lt_cv_ld_reload_flag+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   lt_cv_ld_reload_flag='-r'
 fi
-echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
-echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; }
 reload_flag=$lt_cv_ld_reload_flag
 case $reload_flag in
 "" | " "*) ;;
@@ -4919,8 +5663,8 @@
 
 
 
-echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
-echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
+echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; }
 if test "${lt_cv_deplibs_check_method+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5109,8 +5853,8 @@
 esac
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
-echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; }
 file_magic_cmd=$lt_cv_file_magic_cmd
 deplibs_check_method=$lt_cv_deplibs_check_method
 test -z "$deplibs_check_method" && deplibs_check_method=unknown
@@ -5129,8 +5873,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5143,32 +5887,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AR="${ac_tool_prefix}ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AR=$ac_cv_prog_AR
 if test -n "$AR"; then
-  echo "$as_me:$LINENO: result: $AR" >&5
-echo "${ECHO_T}$AR" >&6
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_AR"; then
   ac_ct_AR=$AR
   # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5181,27 +5927,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_AR="ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
 fi
 fi
 ac_ct_AR=$ac_cv_prog_ac_ct_AR
 if test -n "$ac_ct_AR"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
-echo "${ECHO_T}$ac_ct_AR" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  AR=$ac_ct_AR
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
 else
   AR="$ac_cv_prog_AR"
 fi
@@ -5222,8 +5982,8 @@
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5236,32 +5996,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5274,27 +6036,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
 fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  STRIP=$ac_ct_STRIP
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
 else
   STRIP="$ac_cv_prog_STRIP"
 fi
@@ -5309,8 +6085,8 @@
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5323,32 +6099,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5361,27 +6139,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
 fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  RANLIB=$ac_ct_RANLIB
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
 else
   RANLIB="$ac_cv_prog_RANLIB"
 fi
@@ -5454,8 +6246,8 @@
 
 
 # Check for command to grab the raw symbol name followed by C symbol from nm.
-echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
-echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; }
 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5673,11 +6465,11 @@
   lt_cv_sys_global_symbol_to_cdecl=
 fi
 if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  echo "$as_me:$LINENO: result: failed" >&5
-echo "${ECHO_T}failed" >&6
+  { echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6; }
 else
-  echo "$as_me:$LINENO: result: ok" >&5
-echo "${ECHO_T}ok" >&6
+  { echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6; }
 fi
 
 
@@ -5696,11 +6488,11 @@
 
 
 
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+# Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then
-  enableval="$enable_libtool_lock"
+  enableval=$enable_libtool_lock;
+fi
 
-fi;
 test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
@@ -5727,7 +6519,7 @@
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 5730 "configure"' > conftest.$ac_ext
+  echo '#line 6522 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -5819,8 +6611,8 @@
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
   SAVE_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -belf"
-  echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; }
 if test "${lt_cv_cc_needs_belf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5846,35 +6638,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   lt_cv_cc_needs_belf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-lt_cv_cc_needs_belf=no
+	lt_cv_cc_needs_belf=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
      ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -5883,8 +6672,8 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; }
   if test x"$lt_cv_cc_needs_belf" != x"yes"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
     CFLAGS="$SAVE_CFLAGS"
@@ -5918,8 +6707,8 @@
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -5953,24 +6742,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -5979,9 +6766,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -5991,24 +6779,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -6019,6 +6805,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -6036,8 +6823,8 @@
 else
   ac_cv_prog_CPP=$CPP
 fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
@@ -6060,24 +6847,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -6086,9 +6871,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -6098,24 +6884,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -6126,6 +6910,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -6148,8 +6933,8 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6173,35 +6958,31 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_stdc=no
+	ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
@@ -6257,6 +7038,7 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ctype.h>
+#include <stdlib.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
@@ -6276,18 +7058,27 @@
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
 	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
+      return 2;
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -6300,12 +7091,14 @@
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
 fi
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -6328,9 +7121,9 @@
 		  inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -6344,38 +7137,35 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
@@ -6390,9 +7180,9 @@
 for ac_header in dlfcn.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -6406,38 +7196,35 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
@@ -6498,8 +7285,8 @@
    setopt NO_GLOB_SUBST
 fi
 
-echo "$as_me:$LINENO: checking for objdir" >&5
-echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6; }
 if test "${lt_cv_objdir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6513,8 +7300,8 @@
 fi
 rmdir .libs 2>/dev/null
 fi
-echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
-echo "${ECHO_T}$lt_cv_objdir" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6; }
 objdir=$lt_cv_objdir
 
 
@@ -6606,8 +7393,8 @@
 case $deplibs_check_method in
 file_magic*)
   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; }
 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6659,11 +7446,11 @@
 
 MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
 if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
@@ -6672,8 +7459,8 @@
 
 if test -z "$lt_cv_path_MAGIC_CMD"; then
   if test -n "$ac_tool_prefix"; then
-    echo "$as_me:$LINENO: checking for file" >&5
-echo $ECHO_N "checking for file... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6; }
 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6725,11 +7512,11 @@
 
 MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
 if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
@@ -6809,8 +7596,8 @@
 if test "$GCC" = yes; then
   lt_prog_compiler_no_builtin_flag=' -fno-builtin'
 
-  echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6827,11 +7614,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:6830: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:7617: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:6834: \$? = $ac_status" >&5
+   echo "$as_me:7621: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -6844,8 +7631,8 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
@@ -6864,8 +7651,8 @@
 lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
 
   if test "$GCC" = yes; then
     lt_prog_compiler_wl='-Wl,'
@@ -7119,8 +7906,8 @@
     lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
     ;;
 esac
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6; }
 
 
 
@@ -7131,8 +7918,8 @@
 # Check to make sure the PIC flag actually works.
 #
 if test -n "$lt_prog_compiler_pic"; then
-  echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; }
 if test "${lt_prog_compiler_pic_works+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7149,11 +7936,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7152: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:7939: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:7156: \$? = $ac_status" >&5
+   echo "$as_me:7943: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -7166,8 +7953,8 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; }
 
 if test x"$lt_prog_compiler_pic_works" = xyes; then
     case $lt_prog_compiler_pic in
@@ -7190,8 +7977,8 @@
 # Check to make sure the static flag actually works.
 #
 wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
 if test "${lt_prog_compiler_static_works+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7218,8 +8005,8 @@
    LDFLAGS="$save_LDFLAGS"
 
 fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; }
 
 if test x"$lt_prog_compiler_static_works" = xyes; then
     :
@@ -7233,8 +8020,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
 if test "${lt_cv_prog_compiler_c_o+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7254,11 +8041,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7257: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8044: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:7261: \$? = $ac_status" >&5
+   echo "$as_me:8048: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -7280,16 +8067,16 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
 
 
 
-  echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
 if test "${lt_cv_prog_compiler_c_o+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7309,11 +8096,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7312: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8099: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:7316: \$? = $ac_status" >&5
+   echo "$as_me:8103: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -7335,8 +8122,8 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
@@ -7344,16 +8131,16 @@
 hard_links="nottested"
 if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
   # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
   hard_links=yes
   $RM conftest*
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   touch conftest.a
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
   if test "$hard_links" = no; then
     { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
@@ -7368,8 +8155,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
 
   runpath_var=
   allow_undefined_flag=
@@ -7804,27 +8591,23 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
 
 lt_aix_libpath_sed='
     /Import File Strings/,/^$/ {
@@ -7842,8 +8625,10 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
@@ -7873,27 +8658,23 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
 
 lt_aix_libpath_sed='
     /Import File Strings/,/^$/ {
@@ -7911,8 +8692,10 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
@@ -8167,35 +8950,33 @@
 int foo(void) {}
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
 
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
         LDFLAGS="$save_LDFLAGS"
       else
@@ -8448,8 +9229,8 @@
     fi
   fi
 
-echo "$as_me:$LINENO: result: $ld_shlibs" >&5
-echo "${ECHO_T}$ld_shlibs" >&6
+{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6; }
 test "$ld_shlibs" = no && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
@@ -8485,8 +9266,8 @@
       # Test whether the compiler implicitly links with -lc since on some
       # systems, -lgcc has to come before -lc. If gcc already passes -lc
       # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
       $RM conftest*
       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
@@ -8523,8 +9304,8 @@
         cat conftest.err 1>&5
       fi
       $RM conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
-echo "${ECHO_T}$archive_cmds_need_lc" >&6
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6; }
       ;;
     esac
   fi
@@ -8687,8 +9468,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
 withGCC=$GCC
 if test "$withGCC" = yes; then
   case $host_os in
@@ -9120,27 +9901,23 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir"; then
   shlibpath_overrides_runpath=yes
 fi
@@ -9149,8 +9926,10 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
   LDFLAGS=$save_LDFLAGS
   libdir=$save_libdir
@@ -9363,8 +10142,8 @@
   dynamic_linker=no
   ;;
 esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
 test "$dynamic_linker" = no && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
@@ -9458,8 +10237,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
@@ -9483,8 +10262,8 @@
   # directories.
   hardcode_action=unsupported
 fi
-echo "$as_me:$LINENO: result: $hardcode_action" >&5
-echo "${ECHO_T}$hardcode_action" >&6
+{ echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6; }
 
 if test "$hardcode_action" = relink ||
    test "$inherit_rpath" = yes; then
@@ -9528,8 +10307,8 @@
 
   darwin*)
   # if libdl is installed we need to link against it
-    echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dl_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9542,56 +10321,53 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 int
 main ()
 {
-dlopen ();
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dl_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dl_dlopen=no
+	ac_cv_lib_dl_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
 if test $ac_cv_lib_dl_dlopen = yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
 else
@@ -9605,8 +10381,8 @@
     ;;
 
   *)
-    echo "$as_me:$LINENO: checking for shl_load" >&5
-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; }
 if test "${ac_cv_func_shl_load+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9633,73 +10409,64 @@
 
 #undef shl_load
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char shl_load ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_shl_load) || defined (__stub___shl_load)
+#if defined __stub_shl_load || defined __stub___shl_load
 choke me
-#else
-char (*f) () = shl_load;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != shl_load;
+return shl_load ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_func_shl_load=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_func_shl_load=no
+	ac_cv_func_shl_load=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
-echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6; }
 if test $ac_cv_func_shl_load = yes; then
   lt_cv_dlopen="shl_load"
 else
-  echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dld_shl_load+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9712,61 +10479,58 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char shl_load ();
 int
 main ()
 {
-shl_load ();
+return shl_load ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dld_shl_load=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dld_shl_load=no
+	ac_cv_lib_dld_shl_load=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; }
 if test $ac_cv_lib_dld_shl_load = yes; then
   lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
 else
-  echo "$as_me:$LINENO: checking for dlopen" >&5
-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
 if test "${ac_cv_func_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9793,73 +10557,64 @@
 
 #undef dlopen
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_dlopen) || defined (__stub___dlopen)
+#if defined __stub_dlopen || defined __stub___dlopen
 choke me
-#else
-char (*f) () = dlopen;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != dlopen;
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_func_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_func_dlopen=no
+	ac_cv_func_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
-echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6; }
 if test $ac_cv_func_dlopen = yes; then
   lt_cv_dlopen="dlopen"
 else
-  echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dl_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9872,61 +10627,58 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 int
 main ()
 {
-dlopen ();
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dl_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dl_dlopen=no
+	ac_cv_lib_dl_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
 if test $ac_cv_lib_dl_dlopen = yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
 else
-  echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; }
 if test "${ac_cv_lib_svld_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9939,61 +10691,58 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 int
 main ()
 {
-dlopen ();
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_svld_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_svld_dlopen=no
+	ac_cv_lib_svld_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; }
 if test $ac_cv_lib_svld_dlopen = yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
 else
-  echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dld_dld_link+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10006,56 +10755,53 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dld_link ();
 int
 main ()
 {
-dld_link ();
+return dld_link ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dld_dld_link=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dld_dld_link=no
+	ac_cv_lib_dld_dld_link=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; }
 if test $ac_cv_lib_dld_dld_link = yes; then
   lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
 fi
@@ -10095,8 +10841,8 @@
     save_LIBS="$LIBS"
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
-    echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; }
 if test "${lt_cv_dlopen_self+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10106,7 +10852,7 @@
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10109 "configure"
+#line 10855 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10190,13 +10936,13 @@
 
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6; }
 
     if test "x$lt_cv_dlopen_self" = xyes; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+      { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; }
 if test "${lt_cv_dlopen_self_static+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10206,7 +10952,7 @@
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10209 "configure"
+#line 10955 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10290,8 +11036,8 @@
 
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; }
     fi
 
     CPPFLAGS="$save_CPPFLAGS"
@@ -10329,13 +11075,13 @@
 
 striplib=
 old_striplib=
-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; }
 if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
   test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
   test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
@@ -10343,16 +11089,16 @@
     if test -n "$STRIP" ; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
-      echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+      { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
     else
-      echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+      { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
     fi
     ;;
   *)
-    echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
     ;;
   esac
 fi
@@ -10369,13 +11115,13 @@
 
 
   # Report which library types will actually be built
-  echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-  echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
+  { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6; }
 
-  echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
   test "$can_build_shared" = "no" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
@@ -10395,15 +11141,15 @@
     fi
     ;;
   esac
-  echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
+  { echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6; }
 
-  echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; }
   # Make sure either enable_shared or enable_static is yes.
   test "$enable_shared" = yes || enable_static=yes
-  echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
+  { echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6; }
 
 
 
@@ -10429,7 +11175,7 @@
 
 
 
-                  ac_config_commands="$ac_config_commands libtool"
+        ac_config_commands="$ac_config_commands libtool"
 
 
 
@@ -10438,10 +11184,9 @@
 
 
 
-# Check whether --enable-64-bit-bfd or --disable-64-bit-bfd was given.
+# Check whether --enable-64-bit-bfd was given.
 if test "${enable_64_bit_bfd+set}" = set; then
-  enableval="$enable_64_bit_bfd"
-  case "${enableval}" in
+  enableval=$enable_64_bit_bfd; case "${enableval}" in
   yes)  want64=true  ;;
   no)   want64=false ;;
   *)    { { echo "$as_me:$LINENO: error: bad value ${enableval} for 64-bit-bfd option" >&5
@@ -10450,11 +11195,11 @@
 esac
 else
   want64=false
-fi;
-# Check whether --enable-targets or --disable-targets was given.
+fi
+
+# Check whether --enable-targets was given.
 if test "${enable_targets+set}" = set; then
-  enableval="$enable_targets"
-  case "${enableval}" in
+  enableval=$enable_targets; case "${enableval}" in
   yes | "") { { echo "$as_me:$LINENO: error: enable-targets option must specify target names or 'all'" >&5
 echo "$as_me: error: enable-targets option must specify target names or 'all'" >&2;}
    { (exit 1); exit 1; }; }
@@ -10462,23 +11207,23 @@
   no)       enable_targets= ;;
   *)        enable_targets=$enableval ;;
 esac
-fi;
-# Check whether --enable-commonbfdlib or --disable-commonbfdlib was given.
+fi
+
+# Check whether --enable-commonbfdlib was given.
 if test "${enable_commonbfdlib+set}" = set; then
-  enableval="$enable_commonbfdlib"
-  case "${enableval}" in
+  enableval=$enable_commonbfdlib; case "${enableval}" in
   yes) commonbfdlib=true ;;
   no)  commonbfdlib=false ;;
   *)   { { echo "$as_me:$LINENO: error: bad value ${enableval} for BFD commonbfdlib option" >&5
 echo "$as_me: error: bad value ${enableval} for BFD commonbfdlib option" >&2;}
    { (exit 1); exit 1; }; } ;;
 esac
-fi;
+fi
 
-# Check whether --with-mmap or --without-mmap was given.
+
+# Check whether --with-mmap was given.
 if test "${with_mmap+set}" = set; then
-  withval="$with_mmap"
-  case "${withval}" in
+  withval=$with_mmap; case "${withval}" in
   yes)  want_mmap=true ;;
   no)   want_mmap=false ;;
   *)    { { echo "$as_me:$LINENO: error: bad value ${withval} for BFD with-mmap option" >&5
@@ -10487,11 +11232,11 @@
 esac
 else
   want_mmap=false
-fi;
-# Check whether --enable-secureplt or --disable-secureplt was given.
+fi
+
+# Check whether --enable-secureplt was given.
 if test "${enable_secureplt+set}" = set; then
-  enableval="$enable_secureplt"
-  case "${enableval}" in
+  enableval=$enable_secureplt; case "${enableval}" in
   yes)  use_secureplt=true  ;;
   no)   use_secureplt=false ;;
   *)    { { echo "$as_me:$LINENO: error: bad value ${enableval} for secureplt option" >&5
@@ -10500,7 +11245,8 @@
 esac
 else
   use_secureplt=false
-fi; if test $use_secureplt = true; then
+fi
+if test $use_secureplt = true; then
 
 cat >>confdefs.h <<\_ACEOF
 #define USE_SECUREPLT 1
@@ -10510,19 +11256,18 @@
 
 DEBUGDIR=${libdir}/debug
 
-# Check whether --with-separate-debug-dir or --without-separate-debug-dir was given.
+# Check whether --with-separate-debug-dir was given.
 if test "${with_separate_debug_dir+set}" = set; then
-  withval="$with_separate_debug_dir"
-  DEBUGDIR="${withval}"
-fi;
+  withval=$with_separate_debug_dir; DEBUGDIR="${withval}"
+fi
+
 
 
 # Check to see if we should allow the generation of
 # symbols with the ELF standard's STT_COMMON type.
-# Check whether --enable-elf-stt-common or --disable-elf-stt-common was given.
+# Check whether --enable-elf-stt-common was given.
 if test "${enable_elf_stt_common+set}" = set; then
-  enableval="$enable_elf_stt_common"
-  case "${enableval}" in
+  enableval=$enable_elf_stt_common; case "${enableval}" in
   yes) want_elf_stt_common=true ;;
   no)  want_elf_stt_common=false ;;
   *)   { { echo "$as_me:$LINENO: error: bad value ${enableval} for ELF STT_COMMON option" >&5
@@ -10536,7 +11281,8 @@
 # the loader does not support it. So by default we always choose to
 # disable this feature.
   want_elf_stt_common=false
-fi; if test $want_elf_stt_common = true; then
+fi
+if test $want_elf_stt_common = true; then
 
 cat >>confdefs.h <<\_ACEOF
 #define USE_STT_COMMON 1
@@ -10546,10 +11292,9 @@
 
 
 
-# Check whether --with-pkgversion or --without-pkgversion was given.
+# Check whether --with-pkgversion was given.
 if test "${with_pkgversion+set}" = set; then
-  withval="$with_pkgversion"
-  case "$withval" in
+  withval=$with_pkgversion; case "$withval" in
       yes) { { echo "$as_me:$LINENO: error: package version not specified" >&5
 echo "$as_me: error: package version not specified" >&2;}
    { (exit 1); exit 1; }; } ;;
@@ -10559,15 +11304,15 @@
 else
   PKGVERSION="(GNU Binutils) "
 
-fi;
+fi
 
 
 
 
-# Check whether --with-bugurl or --without-bugurl was given.
+
+# Check whether --with-bugurl was given.
 if test "${with_bugurl+set}" = set; then
-  withval="$with_bugurl"
-  case "$withval" in
+  withval=$with_bugurl; case "$withval" in
       yes) { { echo "$as_me:$LINENO: error: bug URL not specified" >&5
 echo "$as_me: error: bug URL not specified" >&2;}
    { (exit 1); exit 1; }; } ;;
@@ -10579,7 +11324,8 @@
 else
   BUGURL="http://www.sourceware.org/bugzilla/"
 
-fi;
+fi
+
   case ${BUGURL} in
   "")
     REPORT_BUGS_TO=
@@ -10597,17 +11343,17 @@
 
 GCC_WARN_CFLAGS="-W -Wall -Wstrict-prototypes -Wmissing-prototypes"
 
-# Check whether --enable-werror or --disable-werror was given.
+# Check whether --enable-werror was given.
 if test "${enable_werror+set}" = set; then
-  enableval="$enable_werror"
-  case "${enableval}" in
+  enableval=$enable_werror; case "${enableval}" in
      yes | y) ERROR_ON_WARNING="yes" ;;
      no | n)  ERROR_ON_WARNING="no" ;;
      *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-werror" >&5
 echo "$as_me: error: bad value ${enableval} for --enable-werror" >&2;}
    { (exit 1); exit 1; }; } ;;
    esac
-fi;
+fi
+
 
 # Enable -Wno-format by default when using gcc on mingw
 case "${host}" in
@@ -10634,10 +11380,9 @@
   WARN_CFLAGS="${GCC_WARN_CFLAGS}"
 fi
 
-# Check whether --enable-build-warnings or --disable-build-warnings was given.
+# Check whether --enable-build-warnings was given.
 if test "${enable_build_warnings+set}" = set; then
-  enableval="$enable_build_warnings"
-  case "${enableval}" in
+  enableval=$enable_build_warnings; case "${enableval}" in
   yes)	WARN_CFLAGS="${GCC_WARN_CFLAGS}";;
   no)	if test "${GCC}" = yes ; then
 	  WARN_CFLAGS="-w"
@@ -10648,7 +11393,8 @@
         WARN_CFLAGS="${t} ${GCC_WARN_CFLAGS}";;
   *)    WARN_CFLAGS=`echo "${enableval}" | sed -e "s/,/ /g"`;;
 esac
-fi;
+fi
+
 
 if test x"$silent" != x"yes" && test x"$WARN_CFLAGS" != x""; then
   echo "Setting warning flags = $WARN_CFLAGS" 6>&1
@@ -10658,7 +11404,7 @@
 
 
 
-          ac_config_headers="$ac_config_headers config.h:config.in"
+ac_config_headers="$ac_config_headers config.h:config.in"
 
 
 if test -z "$target" ; then
@@ -10667,17 +11413,17 @@
    { (exit 1); exit 1; }; }
 fi
 
-echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
-echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
-    # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; }
+    # Check whether --enable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
-  enableval="$enable_maintainer_mode"
-  USE_MAINTAINER_MODE=$enableval
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
 else
   USE_MAINTAINER_MODE=no
-fi;
-  echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
-echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; }
 
 
 if test $USE_MAINTAINER_MODE = yes; then
@@ -10716,21 +11462,21 @@
   *) target_noncanonical=${target_alias} ;;
 esac
 
-echo "$as_me:$LINENO: checking whether to install libbfd" >&5
-echo $ECHO_N "checking whether to install libbfd... $ECHO_C" >&6
-  # Check whether --enable-install-libbfd or --disable-install-libbfd was given.
+{ echo "$as_me:$LINENO: checking whether to install libbfd" >&5
+echo $ECHO_N "checking whether to install libbfd... $ECHO_C" >&6; }
+  # Check whether --enable-install-libbfd was given.
 if test "${enable_install_libbfd+set}" = set; then
-  enableval="$enable_install_libbfd"
-  install_libbfd_p=$enableval
+  enableval=$enable_install_libbfd; install_libbfd_p=$enableval
 else
   if test "${host}" = "${target}" || test "$enable_shared" = "yes"; then
         install_libbfd_p=yes
       else
         install_libbfd_p=no
       fi
-fi;
-  echo "$as_me:$LINENO: result: $install_libbfd_p" >&5
-echo "${ECHO_T}$install_libbfd_p" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $install_libbfd_p" >&5
+echo "${ECHO_T}$install_libbfd_p" >&6; }
 
 
 if test $install_libbfd_p = yes; then
@@ -10779,22 +11525,22 @@
 if test -f  ../intl/config.intl; then
   .  ../intl/config.intl
 fi
-echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
 if test x"$USE_NLS" != xyes; then
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 else
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
 cat >>confdefs.h <<\_ACEOF
 #define ENABLE_NLS 1
 _ACEOF
 
 
-  echo "$as_me:$LINENO: checking for catalogs to be installed" >&5
-echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for catalogs to be installed" >&5
+echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6; }
   # Look for .po and .gmo files in the source directory.
   CATALOGS=
   XLINGUAS=
@@ -10825,8 +11571,8 @@
     fi
   done
   LINGUAS="$XLINGUAS"
-  echo "$as_me:$LINENO: result: $LINGUAS" >&5
-echo "${ECHO_T}$LINGUAS" >&6
+  { echo "$as_me:$LINENO: result: $LINGUAS" >&5
+echo "${ECHO_T}$LINGUAS" >&6; }
 
 
     DATADIRNAME=share
@@ -10852,17 +11598,17 @@
 
 
 
-  echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
-    # Check whether --enable-nls or --disable-nls was given.
+  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+    # Check whether --enable-nls was given.
 if test "${enable_nls+set}" = set; then
-  enableval="$enable_nls"
-  USE_NLS=$enableval
+  enableval=$enable_nls; USE_NLS=$enableval
 else
   USE_NLS=yes
-fi;
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
 
 
 
@@ -10899,8 +11645,8 @@
 
 # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_MSGFMT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10930,17 +11676,17 @@
 fi
 MSGFMT="$ac_cv_path_MSGFMT"
 if test "$MSGFMT" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGFMT" >&5
-echo "${ECHO_T}$MSGFMT" >&6
+  { echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
   # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_GMSGFMT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10955,30 +11701,31 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
   test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
   ;;
 esac
 fi
 GMSGFMT=$ac_cv_path_GMSGFMT
-
 if test -n "$GMSGFMT"; then
-  echo "$as_me:$LINENO: result: $GMSGFMT" >&5
-echo "${ECHO_T}$GMSGFMT" >&6
+  { echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
 
+
 # Prepare PATH_SEPARATOR.
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
@@ -11009,8 +11756,8 @@
 
 # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_XGETTEXT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -11040,11 +11787,11 @@
 fi
 XGETTEXT="$ac_cv_path_XGETTEXT"
 if test "$XGETTEXT" != ":"; then
-  echo "$as_me:$LINENO: result: $XGETTEXT" >&5
-echo "${ECHO_T}$XGETTEXT" >&6
+  { echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
     rm -f messages.po
@@ -11080,8 +11827,8 @@
 
 # Extract the first word of "msgmerge", so it can be a program name with args.
 set dummy msgmerge; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_MSGMERGE+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -11110,11 +11857,11 @@
 fi
 MSGMERGE="$ac_cv_path_MSGMERGE"
 if test "$MSGMERGE" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGMERGE" >&5
-echo "${ECHO_T}$MSGMERGE" >&6
+  { echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
@@ -11124,8 +11871,8 @@
       : ;
     else
       GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
-      echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
-echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6
+      { echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
+echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; }
       GMSGFMT=":"
     fi
   fi
@@ -11135,14 +11882,14 @@
        (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
       : ;
     else
-      echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
-echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
+      { echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6; }
       XGETTEXT=":"
     fi
         rm -f messages.po
   fi
 
-            ac_config_commands="$ac_config_commands default-1"
+  ac_config_commands="$ac_config_commands default-1"
 
 
 
@@ -11163,8 +11910,8 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11186,7 +11933,7 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -11205,21 +11952,22 @@
     ;;
 esac
 done
+IFS=$as_save_IFS
 
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
     INSTALL=$ac_cv_path_install
   else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
+    # removed, or if the value is a relative name.
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -11237,8 +11985,8 @@
 BFD_HOST_U_64_BIT=
 BFD_HOSTPTR_T="unsigned long"
 
-echo "$as_me:$LINENO: checking for long long" >&5
-echo $ECHO_N "checking for long long... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6; }
 if test "${ac_cv_type_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -11249,61 +11997,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long long ac__type_new_;
 int
 main ()
 {
-if ((long long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_long_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long_long=no
+	ac_cv_type_long_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
-echo "${ECHO_T}$ac_cv_type_long_long" >&6
 
-echo "$as_me:$LINENO: checking size of long long" >&5
-echo $ECHO_N "checking size of long long... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long long" >&5
+echo $ECHO_N "checking size of long long... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -11313,10 +12057,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -11324,27 +12069,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -11354,10 +12094,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -11365,56 +12106,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -11422,27 +12160,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -11452,10 +12185,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -11463,50 +12197,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -11517,10 +12249,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -11528,52 +12261,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_long_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+'') if test "$ac_cv_type_long_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long long), 77
+echo "$as_me: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long_long=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -11581,8 +12307,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long long)); }
-unsigned long ulongval () { return (long) (sizeof (long long)); }
+   typedef long long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -11591,35 +12318,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -11630,29 +12366,32 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+if test "$ac_cv_type_long_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long long), 77
+echo "$as_me: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long_long=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long_long=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for void *" >&5
-echo $ECHO_N "checking for void *... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for void *" >&5
+echo $ECHO_N "checking for void *... $ECHO_C" >&6; }
 if test "${ac_cv_type_void_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -11663,61 +12402,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef void * ac__type_new_;
 int
 main ()
 {
-if ((void * *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (void *))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_void_p=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_void_p=no
+	ac_cv_type_void_p=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
-echo "${ECHO_T}$ac_cv_type_void_p" >&6
 
-echo "$as_me:$LINENO: checking size of void *" >&5
-echo $ECHO_N "checking size of void *... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
+echo "${ECHO_T}$ac_cv_type_void_p" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of void *" >&5
+echo $ECHO_N "checking size of void *... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_void_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_void_p" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -11727,10 +12462,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -11738,27 +12474,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -11768,10 +12499,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -11779,56 +12511,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -11836,27 +12565,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -11866,10 +12590,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -11877,50 +12602,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -11931,10 +12654,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -11942,52 +12666,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_void_p=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+'') if test "$ac_cv_type_void_p" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (void *), 77
+echo "$as_me: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_void_p=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -11995,8 +12712,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (void *)); }
-unsigned long ulongval () { return (long) (sizeof (void *)); }
+   typedef void * ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -12005,35 +12723,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (void *))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (void *))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (void *))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -12044,29 +12771,32 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+if test "$ac_cv_type_void_p" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (void *), 77
+echo "$as_me: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_void_p=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_void_p=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
-echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
+echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_VOID_P $ac_cv_sizeof_void_p
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for long" >&5
-echo $ECHO_N "checking for long... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6; }
 if test "${ac_cv_type_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -12077,61 +12807,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long ac__type_new_;
 int
 main ()
 {
-if ((long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long=no
+	ac_cv_type_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
-echo "${ECHO_T}$ac_cv_type_long" >&6
 
-echo "$as_me:$LINENO: checking size of long" >&5
-echo $ECHO_N "checking size of long... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -12141,10 +12867,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -12152,27 +12879,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -12182,10 +12904,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -12193,56 +12916,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -12250,27 +12970,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -12280,10 +12995,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -12291,50 +13007,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -12345,10 +13059,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -12356,52 +13071,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+'') if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -12409,8 +13117,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long)); }
-unsigned long ulongval () { return (long) (sizeof (long)); }
+   typedef long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -12419,35 +13128,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -12458,22 +13176,25 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_LONG $ac_cv_sizeof_long
 _ACEOF
@@ -12523,8 +13244,8 @@
 if test "x$cross_compiling" = "xno"; then
   EXEEXT_FOR_BUILD='$(EXEEXT)'
 else
-  echo "$as_me:$LINENO: checking for build system executable suffix" >&5
-echo $ECHO_N "checking for build system executable suffix... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for build system executable suffix" >&5
+echo $ECHO_N "checking for build system executable suffix... $ECHO_C" >&6; }
 if test "${bfd_cv_build_exeext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -12541,8 +13262,8 @@
      rm -f conftest*
      test x"${bfd_cv_build_exeext}" = x && bfd_cv_build_exeext=no
 fi
-echo "$as_me:$LINENO: result: $bfd_cv_build_exeext" >&5
-echo "${ECHO_T}$bfd_cv_build_exeext" >&6
+{ echo "$as_me:$LINENO: result: $bfd_cv_build_exeext" >&5
+echo "${ECHO_T}$bfd_cv_build_exeext" >&6; }
   EXEEXT_FOR_BUILD=""
   test x"${bfd_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${bfd_cv_build_exeext}
 fi
@@ -12558,18 +13279,19 @@
 for ac_header in alloca.h stddef.h string.h strings.h stdlib.h time.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -12580,41 +13302,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -12623,24 +13341,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -12648,9 +13364,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -12674,25 +13391,19 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------------ ##
-## Report this to the AC_PACKAGE_NAME lists.  ##
-## ------------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -12710,18 +13421,19 @@
 for ac_header in fcntl.h sys/file.h sys/time.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -12732,41 +13444,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -12775,24 +13483,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -12800,9 +13506,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -12826,25 +13533,19 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------------ ##
-## Report this to the AC_PACKAGE_NAME lists.  ##
-## ------------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -12869,8 +13570,8 @@
   unset ac_cv_type_int_fast32_t
   unset ac_cv_type_uint64_t
   echo $ECHO_N "looking for a compliant stdint.h in $i, $ECHO_C" >&6
-  echo "$as_me:$LINENO: checking for uintmax_t" >&5
-echo $ECHO_N "checking for uintmax_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for uintmax_t" >&5
+echo $ECHO_N "checking for uintmax_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uintmax_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -12883,58 +13584,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uintmax_t ac__type_new_;
 int
 main ()
 {
-if ((uintmax_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uintmax_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uintmax_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uintmax_t=no
+	ac_cv_type_uintmax_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uintmax_t" >&5
-echo "${ECHO_T}$ac_cv_type_uintmax_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uintmax_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintmax_t" >&6; }
 if test $ac_cv_type_uintmax_t = yes; then
   acx_cv_header_stdint=$i
 else
   continue
 fi
 
-  echo "$as_me:$LINENO: checking for uintptr_t" >&5
-echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for uintptr_t" >&5
+echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uintptr_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -12947,58 +13645,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uintptr_t ac__type_new_;
 int
 main ()
 {
-if ((uintptr_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uintptr_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uintptr_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uintptr_t=no
+	ac_cv_type_uintptr_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
-echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6; }
 if test $ac_cv_type_uintptr_t = yes; then
   :
 else
   acx_cv_header_stdint_kind="(mostly complete)"
 fi
 
-  echo "$as_me:$LINENO: checking for int_least32_t" >&5
-echo $ECHO_N "checking for int_least32_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for int_least32_t" >&5
+echo $ECHO_N "checking for int_least32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_int_least32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13011,58 +13706,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef int_least32_t ac__type_new_;
 int
 main ()
 {
-if ((int_least32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (int_least32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_int_least32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int_least32_t=no
+	ac_cv_type_int_least32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int_least32_t" >&5
-echo "${ECHO_T}$ac_cv_type_int_least32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int_least32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_least32_t" >&6; }
 if test $ac_cv_type_int_least32_t = yes; then
   :
 else
   acx_cv_header_stdint_kind="(mostly complete)"
 fi
 
-  echo "$as_me:$LINENO: checking for int_fast32_t" >&5
-echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for int_fast32_t" >&5
+echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_int_fast32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13075,58 +13767,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef int_fast32_t ac__type_new_;
 int
 main ()
 {
-if ((int_fast32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (int_fast32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_int_fast32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int_fast32_t=no
+	ac_cv_type_int_fast32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
-echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6; }
 if test $ac_cv_type_int_fast32_t = yes; then
   :
 else
   acx_cv_header_stdint_kind="(mostly complete)"
 fi
 
-  echo "$as_me:$LINENO: checking for uint64_t" >&5
-echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for uint64_t" >&5
+echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uint64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13139,50 +13828,47 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uint64_t ac__type_new_;
 int
 main ()
 {
-if ((uint64_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uint64_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uint64_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint64_t=no
+	ac_cv_type_uint64_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint64_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint64_t" >&6; }
 if test $ac_cv_type_uint64_t = yes; then
   :
 else
@@ -13198,8 +13884,8 @@
     unset ac_cv_type_uint32_t
     unset ac_cv_type_uint64_t
     echo $ECHO_N "looking for an incomplete stdint.h in $i, $ECHO_C" >&6
-    echo "$as_me:$LINENO: checking for uint32_t" >&5
-echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for uint32_t" >&5
+echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uint32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13212,58 +13898,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uint32_t ac__type_new_;
 int
 main ()
 {
-if ((uint32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uint32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uint32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint32_t=no
+	ac_cv_type_uint32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint32_t" >&6; }
 if test $ac_cv_type_uint32_t = yes; then
   acx_cv_header_stdint=$i
 else
   continue
 fi
 
-    echo "$as_me:$LINENO: checking for uint64_t" >&5
-echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for uint64_t" >&5
+echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uint64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13276,53 +13959,50 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uint64_t ac__type_new_;
 int
 main ()
 {
-if ((uint64_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uint64_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uint64_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint64_t=no
+	ac_cv_type_uint64_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint64_t" >&6
 
-    echo "$as_me:$LINENO: checking for uintptr_t" >&5
-echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint64_t" >&6; }
+
+    { echo "$as_me:$LINENO: checking for uintptr_t" >&5
+echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uintptr_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13335,50 +14015,47 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uintptr_t ac__type_new_;
 int
 main ()
 {
-if ((uintptr_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uintptr_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uintptr_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uintptr_t=no
+	ac_cv_type_uintptr_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
-echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6; }
 
     break
   done
@@ -13389,8 +14066,8 @@
     unset ac_cv_type_u_int32_t
     unset ac_cv_type_u_int64_t
     echo $ECHO_N "looking for u_intXX_t types in $i, $ECHO_C" >&6
-    echo "$as_me:$LINENO: checking for u_int32_t" >&5
-echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for u_int32_t" >&5
+echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_u_int32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13403,58 +14080,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef u_int32_t ac__type_new_;
 int
 main ()
 {
-if ((u_int32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (u_int32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_u_int32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_u_int32_t=no
+	ac_cv_type_u_int32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5
-echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; }
 if test $ac_cv_type_u_int32_t = yes; then
   acx_cv_header_stdint=$i
 else
   continue
 fi
 
-    echo "$as_me:$LINENO: checking for u_int64_t" >&5
-echo $ECHO_N "checking for u_int64_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for u_int64_t" >&5
+echo $ECHO_N "checking for u_int64_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_u_int64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13467,50 +14141,47 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef u_int64_t ac__type_new_;
 int
 main ()
 {
-if ((u_int64_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (u_int64_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_u_int64_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_u_int64_t=no
+	ac_cv_type_u_int64_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_u_int64_t" >&5
-echo "${ECHO_T}$ac_cv_type_u_int64_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int64_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int64_t" >&6; }
 
     break
   done
@@ -13527,19 +14198,27 @@
 
 # ----------------- Summarize what we found so far
 
-echo "$as_me:$LINENO: checking what to include in bfd_stdint.h" >&5
-echo $ECHO_N "checking what to include in bfd_stdint.h... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking what to include in bfd_stdint.h" >&5
+echo $ECHO_N "checking what to include in bfd_stdint.h... $ECHO_C" >&6; }
 
-case `$as_basename bfd_stdint.h ||
+case `$as_basename -- bfd_stdint.h ||
 $as_expr X/bfd_stdint.h : '.*/\([^/][^/]*\)/*$' \| \
 	 Xbfd_stdint.h : 'X\(//\)$' \| \
-	 Xbfd_stdint.h : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 Xbfd_stdint.h : 'X\(/\)' \| . 2>/dev/null ||
 echo X/bfd_stdint.h |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'` in
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'` in
   stdint.h) { echo "$as_me:$LINENO: WARNING: are you sure you want it there?" >&5
 echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
   inttypes.h) { echo "$as_me:$LINENO: WARNING: are you sure you want it there?" >&5
@@ -13547,15 +14226,15 @@
   *) ;;
 esac
 
-echo "$as_me:$LINENO: result: $acx_cv_header_stdint $acx_cv_header_stdint_kind" >&5
-echo "${ECHO_T}$acx_cv_header_stdint $acx_cv_header_stdint_kind" >&6
+{ echo "$as_me:$LINENO: result: $acx_cv_header_stdint $acx_cv_header_stdint_kind" >&5
+echo "${ECHO_T}$acx_cv_header_stdint $acx_cv_header_stdint_kind" >&6; }
 
 # ----------------- done included file, check C basic types --------
 
 # Lacking an uintptr_t?  Test size of void *
 case "$acx_cv_header_stdint:$ac_cv_type_uintptr_t" in
-  stddef.h:* | *:no) echo "$as_me:$LINENO: checking for void *" >&5
-echo $ECHO_N "checking for void *... $ECHO_C" >&6
+  stddef.h:* | *:no) { echo "$as_me:$LINENO: checking for void *" >&5
+echo $ECHO_N "checking for void *... $ECHO_C" >&6; }
 if test "${ac_cv_type_void_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13566,61 +14245,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef void * ac__type_new_;
 int
 main ()
 {
-if ((void * *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (void *))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_void_p=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_void_p=no
+	ac_cv_type_void_p=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
-echo "${ECHO_T}$ac_cv_type_void_p" >&6
 
-echo "$as_me:$LINENO: checking size of void *" >&5
-echo $ECHO_N "checking size of void *... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
+echo "${ECHO_T}$ac_cv_type_void_p" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of void *" >&5
+echo $ECHO_N "checking size of void *... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_void_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_void_p" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -13630,10 +14305,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -13641,27 +14317,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -13671,10 +14342,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -13682,56 +14354,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -13739,27 +14408,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -13769,10 +14433,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -13780,50 +14445,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -13834,10 +14497,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -13845,52 +14509,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_void_p=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+'') if test "$ac_cv_type_void_p" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (void *), 77
+echo "$as_me: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_void_p=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -13898,8 +14555,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (void *)); }
-unsigned long ulongval () { return (long) (sizeof (void *)); }
+   typedef void * ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -13908,35 +14566,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (void *))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (void *))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (void *))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -13947,22 +14614,25 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+if test "$ac_cv_type_void_p" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (void *), 77
+echo "$as_me: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_void_p=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_void_p=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
-echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
+echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_VOID_P $ac_cv_sizeof_void_p
 _ACEOF
@@ -13972,8 +14642,8 @@
 
 # Lacking an uint64_t?  Test size of long
 case "$acx_cv_header_stdint:$ac_cv_type_uint64_t:$ac_cv_type_u_int64_t" in
-  stddef.h:*:* | *:no:no) echo "$as_me:$LINENO: checking for long" >&5
-echo $ECHO_N "checking for long... $ECHO_C" >&6
+  stddef.h:*:* | *:no:no) { echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6; }
 if test "${ac_cv_type_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13984,61 +14654,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long ac__type_new_;
 int
 main ()
 {
-if ((long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long=no
+	ac_cv_type_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
-echo "${ECHO_T}$ac_cv_type_long" >&6
 
-echo "$as_me:$LINENO: checking size of long" >&5
-echo $ECHO_N "checking size of long... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -14048,10 +14714,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -14059,27 +14726,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -14089,10 +14751,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -14100,56 +14763,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -14157,27 +14817,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -14187,10 +14842,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -14198,50 +14854,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -14252,10 +14906,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -14263,52 +14918,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+'') if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -14316,8 +14964,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long)); }
-unsigned long ulongval () { return (long) (sizeof (long)); }
+   typedef long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -14326,35 +14975,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -14365,22 +15023,25 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_LONG $ac_cv_sizeof_long
 _ACEOF
@@ -14390,8 +15051,8 @@
 
 if test $acx_cv_header_stdint = stddef.h; then
   # Lacking a good header?  Test size of everything and deduce all types.
-  echo "$as_me:$LINENO: checking for int" >&5
-echo $ECHO_N "checking for int... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6; }
 if test "${ac_cv_type_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -14402,61 +15063,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef int ac__type_new_;
 int
 main ()
 {
-if ((int *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (int))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_int=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int=no
+	ac_cv_type_int=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
-echo "${ECHO_T}$ac_cv_type_int" >&6
 
-echo "$as_me:$LINENO: checking size of int" >&5
-echo $ECHO_N "checking size of int... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_int" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -14466,10 +15123,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -14477,27 +15135,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -14507,10 +15160,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -14518,56 +15172,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -14575,27 +15226,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -14605,10 +15251,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -14616,50 +15263,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -14670,10 +15315,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -14681,52 +15327,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_int=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+'') if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -14734,8 +15373,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (int)); }
-unsigned long ulongval () { return (long) (sizeof (int)); }
+   typedef int ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -14744,35 +15384,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (int))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -14783,29 +15432,32 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_int=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
-echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_INT $ac_cv_sizeof_int
 _ACEOF
 
 
-  echo "$as_me:$LINENO: checking for short" >&5
-echo $ECHO_N "checking for short... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for short" >&5
+echo $ECHO_N "checking for short... $ECHO_C" >&6; }
 if test "${ac_cv_type_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -14816,61 +15468,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef short ac__type_new_;
 int
 main ()
 {
-if ((short *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (short))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_short=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_short=no
+	ac_cv_type_short=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
-echo "${ECHO_T}$ac_cv_type_short" >&6
 
-echo "$as_me:$LINENO: checking size of short" >&5
-echo $ECHO_N "checking size of short... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
+echo "${ECHO_T}$ac_cv_type_short" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of short" >&5
+echo $ECHO_N "checking size of short... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_short" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -14880,10 +15528,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -14891,27 +15540,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -14921,10 +15565,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -14932,56 +15577,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -14989,27 +15631,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -15019,10 +15656,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -15030,50 +15668,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -15084,10 +15720,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -15095,52 +15732,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_short=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+'') if test "$ac_cv_type_short" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (short), 77
+echo "$as_me: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_short=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -15148,8 +15778,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (short)); }
-unsigned long ulongval () { return (long) (sizeof (short)); }
+   typedef short ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -15158,35 +15789,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (short))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (short))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (short))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -15197,29 +15837,32 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+if test "$ac_cv_type_short" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (short), 77
+echo "$as_me: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_short=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_short=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
-echo "${ECHO_T}$ac_cv_sizeof_short" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_short" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_SHORT $ac_cv_sizeof_short
 _ACEOF
 
 
-  echo "$as_me:$LINENO: checking for char" >&5
-echo $ECHO_N "checking for char... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for char" >&5
+echo $ECHO_N "checking for char... $ECHO_C" >&6; }
 if test "${ac_cv_type_char+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -15230,61 +15873,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef char ac__type_new_;
 int
 main ()
 {
-if ((char *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (char))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_char=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_char=no
+	ac_cv_type_char=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5
-echo "${ECHO_T}$ac_cv_type_char" >&6
 
-echo "$as_me:$LINENO: checking size of char" >&5
-echo $ECHO_N "checking size of char... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5
+echo "${ECHO_T}$ac_cv_type_char" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of char" >&5
+echo $ECHO_N "checking size of char... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_char+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_char" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -15294,10 +15933,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -15305,27 +15945,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -15335,10 +15970,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -15346,56 +15982,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -15403,27 +16036,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -15433,10 +16061,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -15444,50 +16073,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -15498,10 +16125,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -15509,52 +16137,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_char=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+'') if test "$ac_cv_type_char" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (char), 77
+echo "$as_me: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_char=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -15562,8 +16183,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (char)); }
-unsigned long ulongval () { return (long) (sizeof (char)); }
+   typedef char ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -15572,35 +16194,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (char))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (char))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (char))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -15611,41 +16242,44 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+if test "$ac_cv_type_char" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (char), 77
+echo "$as_me: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_char=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_char=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5
-echo "${ECHO_T}$ac_cv_sizeof_char" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5
+echo "${ECHO_T}$ac_cv_sizeof_char" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_CHAR $ac_cv_sizeof_char
 _ACEOF
 
 
 
-  echo "$as_me:$LINENO: checking for type equivalent to int8_t" >&5
-echo $ECHO_N "checking for type equivalent to int8_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int8_t" >&5
+echo $ECHO_N "checking for type equivalent to int8_t... $ECHO_C" >&6; }
   case "$ac_cv_sizeof_char" in
     1) acx_cv_type_int8_t=char ;;
     *) { { echo "$as_me:$LINENO: error: no 8-bit type" >&5
 echo "$as_me: error: no 8-bit type" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_int8_t" >&5
-echo "${ECHO_T}$acx_cv_type_int8_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_int8_t" >&5
+echo "${ECHO_T}$acx_cv_type_int8_t" >&6; }
 
-  echo "$as_me:$LINENO: checking for type equivalent to int16_t" >&5
-echo $ECHO_N "checking for type equivalent to int16_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int16_t" >&5
+echo $ECHO_N "checking for type equivalent to int16_t... $ECHO_C" >&6; }
   case "$ac_cv_sizeof_int:$ac_cv_sizeof_short" in
     2:*) acx_cv_type_int16_t=int ;;
     *:2) acx_cv_type_int16_t=short ;;
@@ -15653,11 +16287,11 @@
 echo "$as_me: error: no 16-bit type" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_int16_t" >&5
-echo "${ECHO_T}$acx_cv_type_int16_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_int16_t" >&5
+echo "${ECHO_T}$acx_cv_type_int16_t" >&6; }
 
-  echo "$as_me:$LINENO: checking for type equivalent to int32_t" >&5
-echo $ECHO_N "checking for type equivalent to int32_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int32_t" >&5
+echo $ECHO_N "checking for type equivalent to int32_t... $ECHO_C" >&6; }
   case "$ac_cv_sizeof_int:$ac_cv_sizeof_long" in
     4:*) acx_cv_type_int32_t=int ;;
     *:4) acx_cv_type_int32_t=long ;;
@@ -15665,8 +16299,8 @@
 echo "$as_me: error: no 32-bit type" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_int32_t" >&5
-echo "${ECHO_T}$acx_cv_type_int32_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_int32_t" >&5
+echo "${ECHO_T}$acx_cv_type_int32_t" >&6; }
 fi
 
 # These tests are here to make the output prettier
@@ -15675,17 +16309,17 @@
   case "$ac_cv_sizeof_long" in
     8) acx_cv_type_int64_t=long ;;
   esac
-  echo "$as_me:$LINENO: checking for type equivalent to int64_t" >&5
-echo $ECHO_N "checking for type equivalent to int64_t... $ECHO_C" >&6
-  echo "$as_me:$LINENO: result: ${acx_cv_type_int64_t-'using preprocessor symbols'}" >&5
-echo "${ECHO_T}${acx_cv_type_int64_t-'using preprocessor symbols'}" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int64_t" >&5
+echo $ECHO_N "checking for type equivalent to int64_t... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: ${acx_cv_type_int64_t-'using preprocessor symbols'}" >&5
+echo "${ECHO_T}${acx_cv_type_int64_t-'using preprocessor symbols'}" >&6; }
 fi
 
 # Now we can use the above types
 
 if test "$ac_cv_type_uintptr_t" != yes; then
-  echo "$as_me:$LINENO: checking for type equivalent to intptr_t" >&5
-echo $ECHO_N "checking for type equivalent to intptr_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to intptr_t" >&5
+echo $ECHO_N "checking for type equivalent to intptr_t... $ECHO_C" >&6; }
   case $ac_cv_sizeof_void_p in
     2) acx_cv_type_intptr_t=int16_t ;;
     4) acx_cv_type_intptr_t=int32_t ;;
@@ -15694,17 +16328,17 @@
 echo "$as_me: error: no equivalent for intptr_t" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_intptr_t" >&5
-echo "${ECHO_T}$acx_cv_type_intptr_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_intptr_t" >&5
+echo "${ECHO_T}$acx_cv_type_intptr_t" >&6; }
 fi
 
 # ----------------- done all checks, emit header -------------
-          ac_config_commands="$ac_config_commands bfd_stdint.h"
+ac_config_commands="$ac_config_commands bfd_stdint.h"
 
 
 
-echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
-echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; }
 if test "${ac_cv_header_time+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -15728,38 +16362,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_header_time=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_time=no
+	ac_cv_header_time=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
-echo "${ECHO_T}$ac_cv_header_time" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6; }
 if test $ac_cv_header_time = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -15776,9 +16406,9 @@
 ac_header_dirent=no
 for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
   as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
-echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -15800,38 +16430,35 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
@@ -15843,13 +16470,12 @@
 done
 # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
 if test $ac_header_dirent = dirent.h; then
-  echo "$as_me:$LINENO: checking for library containing opendir" >&5
-echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; }
 if test "${ac_cv_search_opendir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_func_search_save_LIBS=$LIBS
-ac_cv_search_opendir=no
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -15857,126 +16483,83 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char opendir ();
 int
 main ()
 {
-opendir ();
+return opendir ();
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_opendir="none required"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_opendir" = no; then
-  for ac_lib in dir; do
+for ac_lib in '' dir; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char opendir ();
-int
-main ()
-{
-opendir ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_opendir="-l$ac_lib"
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_opendir=$ac_res
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-  done
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_opendir+set}" = set; then
+  break
 fi
+done
+if test "${ac_cv_search_opendir+set}" = set; then
+  :
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
-echo "${ECHO_T}$ac_cv_search_opendir" >&6
-if test "$ac_cv_search_opendir" != no; then
-  test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+{ echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
 
 else
-  echo "$as_me:$LINENO: checking for library containing opendir" >&5
-echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; }
 if test "${ac_cv_search_opendir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_func_search_save_LIBS=$LIBS
-ac_cv_search_opendir=no
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -15984,122 +16567,80 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char opendir ();
 int
 main ()
 {
-opendir ();
+return opendir ();
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_opendir="none required"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_opendir" = no; then
-  for ac_lib in x; do
+for ac_lib in '' x; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char opendir ();
-int
-main ()
-{
-opendir ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_opendir="-l$ac_lib"
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_opendir=$ac_res
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-  done
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_opendir+set}" = set; then
+  break
 fi
+done
+if test "${ac_cv_search_opendir+set}" = set; then
+  :
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
-echo "${ECHO_T}$ac_cv_search_opendir" >&6
-if test "$ac_cv_search_opendir" != no; then
-  test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+{ echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
 
 fi
 
-echo "$as_me:$LINENO: checking whether string.h and strings.h may both be included" >&5
-echo $ECHO_N "checking whether string.h and strings.h may both be included... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether string.h and strings.h may both be included" >&5
+echo $ECHO_N "checking whether string.h and strings.h may both be included... $ECHO_C" >&6; }
 if test "${gcc_cv_header_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16120,38 +16661,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   gcc_cv_header_string=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-gcc_cv_header_string=no
+	gcc_cv_header_string=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $gcc_cv_header_string" >&5
-echo "${ECHO_T}$gcc_cv_header_string" >&6
+{ echo "$as_me:$LINENO: result: $gcc_cv_header_string" >&5
+echo "${ECHO_T}$gcc_cv_header_string" >&6; }
 if test $gcc_cv_header_string = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -16170,9 +16707,9 @@
 for ac_func in fcntl getpagesize setitimer sysconf fdopen getuid getgid
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -16198,68 +16735,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -16272,9 +16801,9 @@
 for ac_func in strtoull
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -16300,68 +16829,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -16371,8 +16892,8 @@
 done
 
 
-echo "$as_me:$LINENO: checking whether basename is declared" >&5
-echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether basename is declared" >&5
+echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_basename+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16387,7 +16908,7 @@
 main ()
 {
 #ifndef basename
-  char *p = (char *) basename;
+  (void) basename;
 #endif
 
   ;
@@ -16395,38 +16916,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_basename=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_basename=no
+	ac_cv_have_decl_basename=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_basename" >&5
-echo "${ECHO_T}$ac_cv_have_decl_basename" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_basename" >&5
+echo "${ECHO_T}$ac_cv_have_decl_basename" >&6; }
 if test $ac_cv_have_decl_basename = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16443,8 +16960,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether ftello is declared" >&5
-echo $ECHO_N "checking whether ftello is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether ftello is declared" >&5
+echo $ECHO_N "checking whether ftello is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_ftello+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16459,7 +16976,7 @@
 main ()
 {
 #ifndef ftello
-  char *p = (char *) ftello;
+  (void) ftello;
 #endif
 
   ;
@@ -16467,38 +16984,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_ftello=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_ftello=no
+	ac_cv_have_decl_ftello=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_ftello" >&5
-echo "${ECHO_T}$ac_cv_have_decl_ftello" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ftello" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ftello" >&6; }
 if test $ac_cv_have_decl_ftello = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16515,8 +17028,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether ftello64 is declared" >&5
-echo $ECHO_N "checking whether ftello64 is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether ftello64 is declared" >&5
+echo $ECHO_N "checking whether ftello64 is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_ftello64+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16531,7 +17044,7 @@
 main ()
 {
 #ifndef ftello64
-  char *p = (char *) ftello64;
+  (void) ftello64;
 #endif
 
   ;
@@ -16539,38 +17052,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_ftello64=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_ftello64=no
+	ac_cv_have_decl_ftello64=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_ftello64" >&5
-echo "${ECHO_T}$ac_cv_have_decl_ftello64" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ftello64" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ftello64" >&6; }
 if test $ac_cv_have_decl_ftello64 = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16587,8 +17096,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether fseeko is declared" >&5
-echo $ECHO_N "checking whether fseeko is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether fseeko is declared" >&5
+echo $ECHO_N "checking whether fseeko is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_fseeko+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16603,7 +17112,7 @@
 main ()
 {
 #ifndef fseeko
-  char *p = (char *) fseeko;
+  (void) fseeko;
 #endif
 
   ;
@@ -16611,38 +17120,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_fseeko=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_fseeko=no
+	ac_cv_have_decl_fseeko=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fseeko" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fseeko" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fseeko" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fseeko" >&6; }
 if test $ac_cv_have_decl_fseeko = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16659,8 +17164,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether fseeko64 is declared" >&5
-echo $ECHO_N "checking whether fseeko64 is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether fseeko64 is declared" >&5
+echo $ECHO_N "checking whether fseeko64 is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_fseeko64+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16675,7 +17180,7 @@
 main ()
 {
 #ifndef fseeko64
-  char *p = (char *) fseeko64;
+  (void) fseeko64;
 #endif
 
   ;
@@ -16683,38 +17188,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_fseeko64=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_fseeko64=no
+	ac_cv_have_decl_fseeko64=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fseeko64" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fseeko64" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fseeko64" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fseeko64" >&6; }
 if test $ac_cv_have_decl_fseeko64 = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16742,8 +17243,8 @@
  ;;
 esac
 
-echo "$as_me:$LINENO: checking whether ffs is declared" >&5
-echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether ffs is declared" >&5
+echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_ffs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16758,7 +17259,7 @@
 main ()
 {
 #ifndef ffs
-  char *p = (char *) ffs;
+  (void) ffs;
 #endif
 
   ;
@@ -16766,38 +17267,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_ffs=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_ffs=no
+	ac_cv_have_decl_ffs=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5
-echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6; }
 if test $ac_cv_have_decl_ffs = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16814,8 +17311,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether free is declared" >&5
-echo $ECHO_N "checking whether free is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether free is declared" >&5
+echo $ECHO_N "checking whether free is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_free+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16830,7 +17327,7 @@
 main ()
 {
 #ifndef free
-  char *p = (char *) free;
+  (void) free;
 #endif
 
   ;
@@ -16838,38 +17335,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_free=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_free=no
+	ac_cv_have_decl_free=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_free" >&5
-echo "${ECHO_T}$ac_cv_have_decl_free" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_free" >&5
+echo "${ECHO_T}$ac_cv_have_decl_free" >&6; }
 if test $ac_cv_have_decl_free = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16886,8 +17379,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether getenv is declared" >&5
-echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether getenv is declared" >&5
+echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_getenv+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16902,7 +17395,7 @@
 main ()
 {
 #ifndef getenv
-  char *p = (char *) getenv;
+  (void) getenv;
 #endif
 
   ;
@@ -16910,38 +17403,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_getenv=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_getenv=no
+	ac_cv_have_decl_getenv=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
-echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6; }
 if test $ac_cv_have_decl_getenv = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -16958,8 +17447,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether malloc is declared" >&5
-echo $ECHO_N "checking whether malloc is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether malloc is declared" >&5
+echo $ECHO_N "checking whether malloc is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_malloc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -16974,7 +17463,7 @@
 main ()
 {
 #ifndef malloc
-  char *p = (char *) malloc;
+  (void) malloc;
 #endif
 
   ;
@@ -16982,38 +17471,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_malloc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_malloc=no
+	ac_cv_have_decl_malloc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_malloc" >&5
-echo "${ECHO_T}$ac_cv_have_decl_malloc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_malloc" >&5
+echo "${ECHO_T}$ac_cv_have_decl_malloc" >&6; }
 if test $ac_cv_have_decl_malloc = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -17030,8 +17515,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether realloc is declared" >&5
-echo $ECHO_N "checking whether realloc is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether realloc is declared" >&5
+echo $ECHO_N "checking whether realloc is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_realloc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17046,7 +17531,7 @@
 main ()
 {
 #ifndef realloc
-  char *p = (char *) realloc;
+  (void) realloc;
 #endif
 
   ;
@@ -17054,38 +17539,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_realloc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_realloc=no
+	ac_cv_have_decl_realloc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_realloc" >&5
-echo "${ECHO_T}$ac_cv_have_decl_realloc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_realloc" >&5
+echo "${ECHO_T}$ac_cv_have_decl_realloc" >&6; }
 if test $ac_cv_have_decl_realloc = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -17102,8 +17583,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether stpcpy is declared" >&5
-echo $ECHO_N "checking whether stpcpy is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether stpcpy is declared" >&5
+echo $ECHO_N "checking whether stpcpy is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_stpcpy+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17118,7 +17599,7 @@
 main ()
 {
 #ifndef stpcpy
-  char *p = (char *) stpcpy;
+  (void) stpcpy;
 #endif
 
   ;
@@ -17126,38 +17607,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_stpcpy=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_stpcpy=no
+	ac_cv_have_decl_stpcpy=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_stpcpy" >&5
-echo "${ECHO_T}$ac_cv_have_decl_stpcpy" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_stpcpy" >&5
+echo "${ECHO_T}$ac_cv_have_decl_stpcpy" >&6; }
 if test $ac_cv_have_decl_stpcpy = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -17174,8 +17651,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether strstr is declared" >&5
-echo $ECHO_N "checking whether strstr is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether strstr is declared" >&5
+echo $ECHO_N "checking whether strstr is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_strstr+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17190,7 +17667,7 @@
 main ()
 {
 #ifndef strstr
-  char *p = (char *) strstr;
+  (void) strstr;
 #endif
 
   ;
@@ -17198,38 +17675,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_strstr=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_strstr=no
+	ac_cv_have_decl_strstr=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strstr" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strstr" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strstr" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strstr" >&6; }
 if test $ac_cv_have_decl_strstr = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -17246,8 +17719,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether snprintf is declared" >&5
-echo $ECHO_N "checking whether snprintf is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether snprintf is declared" >&5
+echo $ECHO_N "checking whether snprintf is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_snprintf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17262,7 +17735,7 @@
 main ()
 {
 #ifndef snprintf
-  char *p = (char *) snprintf;
+  (void) snprintf;
 #endif
 
   ;
@@ -17270,38 +17743,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_snprintf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_snprintf=no
+	ac_cv_have_decl_snprintf=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_snprintf" >&5
-echo "${ECHO_T}$ac_cv_have_decl_snprintf" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_snprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_snprintf" >&6; }
 if test $ac_cv_have_decl_snprintf = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -17318,8 +17787,8 @@
 fi
 
 
-echo "$as_me:$LINENO: checking whether vsnprintf is declared" >&5
-echo $ECHO_N "checking whether vsnprintf is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether vsnprintf is declared" >&5
+echo $ECHO_N "checking whether vsnprintf is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_vsnprintf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17334,7 +17803,7 @@
 main ()
 {
 #ifndef vsnprintf
-  char *p = (char *) vsnprintf;
+  (void) vsnprintf;
 #endif
 
   ;
@@ -17342,38 +17811,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_vsnprintf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_vsnprintf=no
+	ac_cv_have_decl_vsnprintf=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_vsnprintf" >&5
-echo "${ECHO_T}$ac_cv_have_decl_vsnprintf" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_vsnprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_vsnprintf" >&6; }
 if test $ac_cv_have_decl_vsnprintf = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -17554,8 +18019,8 @@
 	COREFLAG="$COREFLAG -DAIX_CORE_DUMPX_CORE"
 	# Not all versions of AIX with -DAIX_CORE_DUMPX_CORE
 	# have c_impl as a member of struct core_dumpx
-	echo "$as_me:$LINENO: checking for c_impl in struct core_dumpx" >&5
-echo $ECHO_N "checking for c_impl in struct core_dumpx... $ECHO_C" >&6
+	{ echo "$as_me:$LINENO: checking for c_impl in struct core_dumpx" >&5
+echo $ECHO_N "checking for c_impl in struct core_dumpx... $ECHO_C" >&6; }
 	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -17572,42 +18037,38 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
 
 cat >>confdefs.h <<\_ACEOF
 #define HAVE_ST_C_IMPL 1
 _ACEOF
 
-	  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+	  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 	;;
   rs6000-*-aix4*)	COREFILE=rs6000-core.lo ;;
   rs6000-*-*)		COREFILE=rs6000-core.lo ;;
@@ -17673,18 +18134,19 @@
 for ac_header in sys/procfs.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -17695,41 +18157,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -17738,24 +18196,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -17763,9 +18219,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -17789,25 +18246,19 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------------ ##
-## Report this to the AC_PACKAGE_NAME lists.  ##
-## ------------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -17820,8 +18271,8 @@
 done
 
   if test "$ac_cv_header_sys_procfs_h" = yes; then
-    echo "$as_me:$LINENO: checking for prstatus_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for prstatus_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for prstatus_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for prstatus_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_prstatus_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17843,36 +18294,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_prstatus_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_prstatus_t=no
+	bfd_cv_have_sys_procfs_type_prstatus_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_prstatus_t = yes; then
@@ -17882,11 +18329,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prstatus_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prstatus_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prstatus_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prstatus_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for prstatus32_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for prstatus32_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for prstatus32_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for prstatus32_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_prstatus32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17908,36 +18355,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_prstatus32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_prstatus32_t=no
+	bfd_cv_have_sys_procfs_type_prstatus32_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_prstatus32_t = yes; then
@@ -17947,11 +18390,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prstatus32_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prstatus32_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prstatus32_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prstatus32_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for prstatus_t.pr_who in sys/procfs.h" >&5
-echo $ECHO_N "checking for prstatus_t.pr_who in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for prstatus_t.pr_who in sys/procfs.h" >&5
+echo $ECHO_N "checking for prstatus_t.pr_who in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -17973,36 +18416,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who=no
+	bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who = yes; then
@@ -18012,11 +18451,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_prstatus_t_pr_who" >&6; }
 
-    echo "$as_me:$LINENO: checking for prstatus32_t.pr_who in sys/procfs.h" >&5
-echo $ECHO_N "checking for prstatus32_t.pr_who in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for prstatus32_t.pr_who in sys/procfs.h" >&5
+echo $ECHO_N "checking for prstatus32_t.pr_who in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18038,36 +18477,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who=no
+	bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who = yes; then
@@ -18077,11 +18512,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_prstatus32_t_pr_who" >&6; }
 
-    echo "$as_me:$LINENO: checking for pstatus_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for pstatus_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for pstatus_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for pstatus_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_pstatus_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18103,36 +18538,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_pstatus_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_pstatus_t=no
+	bfd_cv_have_sys_procfs_type_pstatus_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_pstatus_t = yes; then
@@ -18142,11 +18573,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_pstatus_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_pstatus_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_pstatus_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_pstatus_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for pxstatus_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for pxstatus_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for pxstatus_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for pxstatus_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_pxstatus_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18168,36 +18599,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_pxstatus_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_pxstatus_t=no
+	bfd_cv_have_sys_procfs_type_pxstatus_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_pxstatus_t = yes; then
@@ -18207,11 +18634,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_pxstatus_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_pxstatus_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_pxstatus_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_pxstatus_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for pstatus32_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for pstatus32_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for pstatus32_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for pstatus32_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_pstatus32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18233,36 +18660,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_pstatus32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_pstatus32_t=no
+	bfd_cv_have_sys_procfs_type_pstatus32_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_pstatus32_t = yes; then
@@ -18272,11 +18695,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_pstatus32_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_pstatus32_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_pstatus32_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_pstatus32_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for prpsinfo_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for prpsinfo_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for prpsinfo_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for prpsinfo_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_prpsinfo_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18298,36 +18721,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_prpsinfo_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_prpsinfo_t=no
+	bfd_cv_have_sys_procfs_type_prpsinfo_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_prpsinfo_t = yes; then
@@ -18337,11 +18756,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prpsinfo_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prpsinfo_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prpsinfo_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prpsinfo_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for prpsinfo32_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for prpsinfo32_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for prpsinfo32_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for prpsinfo32_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_prpsinfo32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18363,36 +18782,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_prpsinfo32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_prpsinfo32_t=no
+	bfd_cv_have_sys_procfs_type_prpsinfo32_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_prpsinfo32_t = yes; then
@@ -18402,11 +18817,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prpsinfo32_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prpsinfo32_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_prpsinfo32_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_prpsinfo32_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for psinfo_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for psinfo_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for psinfo_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for psinfo_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_psinfo_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18428,36 +18843,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_psinfo_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_psinfo_t=no
+	bfd_cv_have_sys_procfs_type_psinfo_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_psinfo_t = yes; then
@@ -18467,11 +18878,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_psinfo_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_psinfo_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_psinfo_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_psinfo_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for psinfo32_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for psinfo32_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for psinfo32_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for psinfo32_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_psinfo32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18493,36 +18904,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_psinfo32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_psinfo32_t=no
+	bfd_cv_have_sys_procfs_type_psinfo32_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_psinfo32_t = yes; then
@@ -18532,11 +18939,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_psinfo32_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_psinfo32_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_psinfo32_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_psinfo32_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for lwpstatus_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for lwpstatus_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for lwpstatus_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for lwpstatus_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_lwpstatus_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18558,36 +18965,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_lwpstatus_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_lwpstatus_t=no
+	bfd_cv_have_sys_procfs_type_lwpstatus_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_lwpstatus_t = yes; then
@@ -18597,11 +19000,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_lwpstatus_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_lwpstatus_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_lwpstatus_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_lwpstatus_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for lwpxstatus_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for lwpxstatus_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for lwpxstatus_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for lwpxstatus_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_lwpxstatus_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18623,36 +19026,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_lwpxstatus_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_lwpxstatus_t=no
+	bfd_cv_have_sys_procfs_type_lwpxstatus_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_lwpxstatus_t = yes; then
@@ -18662,11 +19061,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_lwpxstatus_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_lwpxstatus_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_lwpxstatus_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_lwpxstatus_t" >&6; }
 
-    echo "$as_me:$LINENO: checking for lwpstatus_t.pr_context in sys/procfs.h" >&5
-echo $ECHO_N "checking for lwpstatus_t.pr_context in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for lwpstatus_t.pr_context in sys/procfs.h" >&5
+echo $ECHO_N "checking for lwpstatus_t.pr_context in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18688,36 +19087,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context=no
+	bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context = yes; then
@@ -18727,11 +19122,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_context" >&6; }
 
-    echo "$as_me:$LINENO: checking for lwpstatus_t.pr_reg in sys/procfs.h" >&5
-echo $ECHO_N "checking for lwpstatus_t.pr_reg in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for lwpstatus_t.pr_reg in sys/procfs.h" >&5
+echo $ECHO_N "checking for lwpstatus_t.pr_reg in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18753,36 +19148,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg=no
+	bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg = yes; then
@@ -18792,11 +19183,11 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_member_lwpstatus_t_pr_reg" >&6; }
 
-    echo "$as_me:$LINENO: checking for win32_pstatus_t in sys/procfs.h" >&5
-echo $ECHO_N "checking for win32_pstatus_t in sys/procfs.h... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for win32_pstatus_t in sys/procfs.h" >&5
+echo $ECHO_N "checking for win32_pstatus_t in sys/procfs.h... $ECHO_C" >&6; }
  if test "${bfd_cv_have_sys_procfs_type_win32_pstatus_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -18818,36 +19209,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   bfd_cv_have_sys_procfs_type_win32_pstatus_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-bfd_cv_have_sys_procfs_type_win32_pstatus_t=no
+	bfd_cv_have_sys_procfs_type_win32_pstatus_t=no
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
  if test $bfd_cv_have_sys_procfs_type_win32_pstatus_t = yes; then
@@ -18857,8 +19244,8 @@
 _ACEOF
 
  fi
- echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_win32_pstatus_t" >&5
-echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_win32_pstatus_t" >&6
+ { echo "$as_me:$LINENO: result: $bfd_cv_have_sys_procfs_type_win32_pstatus_t" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_procfs_type_win32_pstatus_t" >&6; }
 
   fi
 fi
@@ -19362,8 +19749,8 @@
     fi
     if test -n "$GCC" ; then
        bad_64bit_gcc=no;
-       echo "$as_me:$LINENO: checking for gcc version with buggy 64-bit support" >&5
-echo $ECHO_N "checking for gcc version with buggy 64-bit support... $ECHO_C" >&6
+       { echo "$as_me:$LINENO: checking for gcc version with buggy 64-bit support" >&5
+echo $ECHO_N "checking for gcc version with buggy 64-bit support... $ECHO_C" >&6; }
        # Add more tests for gcc versions with non-working 64-bit support here.
        cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -19376,11 +19763,11 @@
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   $EGREP ": 2 : 91 : 1 :" >/dev/null 2>&1; then
   bad_64bit_gcc=yes;
-		    echo "$as_me:$LINENO: result: yes: egcs-1.1.2 on ix86 spotted" >&5
-echo "${ECHO_T}yes: egcs-1.1.2 on ix86 spotted" >&6
+		    { echo "$as_me:$LINENO: result: yes: egcs-1.1.2 on ix86 spotted" >&5
+echo "${ECHO_T}yes: egcs-1.1.2 on ix86 spotted" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 rm -f conftest*
 
@@ -19417,9 +19804,9 @@
 for ac_func in ftello ftello64 fseeko fseeko64 fopen64
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -19445,68 +19832,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -19516,8 +19895,8 @@
 done
 
 if test x"$ac_cv_func_ftello" = xyes -a x"$ac_cv_func_fseeko" = xyes; then
-    echo "$as_me:$LINENO: checking for off_t" >&5
-echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_off_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -19528,61 +19907,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef off_t ac__type_new_;
 int
 main ()
 {
-if ((off_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (off_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_off_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_off_t=no
+	ac_cv_type_off_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
-echo "${ECHO_T}$ac_cv_type_off_t" >&6
 
-echo "$as_me:$LINENO: checking size of off_t" >&5
-echo $ECHO_N "checking size of off_t... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of off_t" >&5
+echo $ECHO_N "checking size of off_t... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_off_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_off_t" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -19592,10 +19967,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef off_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (off_t))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -19603,27 +19979,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -19633,10 +20004,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef off_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (off_t))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -19644,56 +20016,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef off_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (off_t))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -19701,27 +20070,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -19731,10 +20095,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef off_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (off_t))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -19742,50 +20107,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -19796,10 +20159,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef off_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (off_t))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -19807,52 +20171,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_off_t=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t), 77
+'') if test "$ac_cv_type_off_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (off_t), 77
+echo "$as_me: error: cannot compute sizeof (off_t)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -19860,8 +20217,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (off_t)); }
-unsigned long ulongval () { return (long) (sizeof (off_t)); }
+   typedef off_t ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -19870,35 +20228,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (off_t))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (off_t))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (off_t))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -19909,30 +20276,33 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t), 77
+if test "$ac_cv_type_off_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (off_t), 77
+echo "$as_me: error: cannot compute sizeof (off_t)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_off_t=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_off_t" >&5
-echo "${ECHO_T}$ac_cv_sizeof_off_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_off_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_off_t" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_OFF_T $ac_cv_sizeof_off_t
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking file_ptr type" >&5
-echo $ECHO_N "checking file_ptr type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking file_ptr type" >&5
+echo $ECHO_N "checking file_ptr type... $ECHO_C" >&6; }
 bfd_file_ptr="long"
 bfd_ufile_ptr="unsigned long"
 if test x"$ac_cv_func_ftello64" = xyes -a x"$ac_cv_func_fseeko64" = xyes \
@@ -19940,8 +20310,8 @@
     bfd_file_ptr=BFD_HOST_64_BIT
     bfd_ufile_ptr=BFD_HOST_U_64_BIT
 fi
-echo "$as_me:$LINENO: result: $bfd_file_ptr" >&5
-echo "${ECHO_T}$bfd_file_ptr" >&6
+{ echo "$as_me:$LINENO: result: $bfd_file_ptr" >&5
+echo "${ECHO_T}$bfd_file_ptr" >&6; }
 
 
 
@@ -19959,18 +20329,19 @@
 for ac_header in stdlib.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -19981,41 +20352,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -20024,24 +20391,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -20049,9 +20414,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -20075,25 +20441,19 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------------ ##
-## Report this to the AC_PACKAGE_NAME lists.  ##
-## ------------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -20109,9 +20469,9 @@
 for ac_func in getpagesize
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -20137,68 +20497,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -20207,8 +20559,8 @@
 fi
 done
 
-echo "$as_me:$LINENO: checking for working mmap" >&5
-echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6; }
 if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -20250,21 +20602,21 @@
 #include <fcntl.h>
 #include <sys/mman.h>
 
-#if !STDC_HEADERS && !HAVE_STDLIB_H
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
 char *malloc ();
 #endif
 
 /* This mess was copied from the GNU getpagesize.h.  */
-#if !HAVE_GETPAGESIZE
+#ifndef HAVE_GETPAGESIZE
 /* Assume that all systems that can run configure have sys/param.h.  */
-# if !HAVE_SYS_PARAM_H
+# ifndef HAVE_SYS_PARAM_H
 #  define HAVE_SYS_PARAM_H 1
 # endif
 
 # ifdef _SC_PAGESIZE
 #  define getpagesize() sysconf(_SC_PAGESIZE)
 # else /* no _SC_PAGESIZE */
-#  if HAVE_SYS_PARAM_H
+#  ifdef HAVE_SYS_PARAM_H
 #   include <sys/param.h>
 #   ifdef EXEC_PAGESIZE
 #    define getpagesize() EXEC_PAGESIZE
@@ -20303,15 +20655,15 @@
   /* First, make a file with some known garbage in it. */
   data = (char *) malloc (pagesize);
   if (!data)
-    exit (1);
+    return 1;
   for (i = 0; i < pagesize; ++i)
     *(data + i) = rand ();
   umask (0);
   fd = creat ("conftest.mmap", 0600);
   if (fd < 0)
-    exit (1);
+    return 1;
   if (write (fd, data, pagesize) != pagesize)
-    exit (1);
+    return 1;
   close (fd);
 
   /* Next, try to mmap the file at a fixed address which already has
@@ -20319,17 +20671,17 @@
      we see the same garbage.  */
   fd = open ("conftest.mmap", O_RDWR);
   if (fd < 0)
-    exit (1);
+    return 1;
   data2 = (char *) malloc (2 * pagesize);
   if (!data2)
-    exit (1);
-  data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1);
+    return 1;
+  data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1);
   if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
 		     MAP_PRIVATE | MAP_FIXED, fd, 0L))
-    exit (1);
+    return 1;
   for (i = 0; i < pagesize; ++i)
     if (*(data + i) != *(data2 + i))
-      exit (1);
+      return 1;
 
   /* Finally, make sure that changes to the mapped area do not
      percolate back to the file as seen by read().  (This is a bug on
@@ -20338,24 +20690,33 @@
     *(data2 + i) = *(data2 + i) + 1;
   data3 = (char *) malloc (pagesize);
   if (!data3)
-    exit (1);
+    return 1;
   if (read (fd, data3, pagesize) != pagesize)
-    exit (1);
+    return 1;
   for (i = 0; i < pagesize; ++i)
     if (*(data + i) != *(data3 + i))
-      exit (1);
+      return 1;
   close (fd);
-  exit (0);
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -20368,11 +20729,13 @@
 ( exit $ac_status )
 ac_cv_func_mmap_fixed_mapped=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
+
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5
-echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6; }
 if test $ac_cv_func_mmap_fixed_mapped = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -20387,9 +20750,9 @@
 for ac_func in madvise mprotect
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -20415,68 +20778,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -20494,10 +20849,10 @@
 esac
 
 rm -f doc/config.status
-                                        ac_config_files="$ac_config_files Makefile doc/Makefile bfd-in3.h:bfd-in2.h po/Makefile.in:po/Make-in"
+ac_config_files="$ac_config_files Makefile doc/Makefile bfd-in3.h:bfd-in2.h po/Makefile.in:po/Make-in"
 
 
-          ac_config_commands="$ac_config_commands default"
+ac_config_commands="$ac_config_commands default"
 
 
 
@@ -20522,39 +20877,58 @@
 
 # The following way of writing the cache mishandles newlines in values,
 # but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
+# So, we kill variables containing newlines.
 # Ultrix sh set writes to stderr and can't be redirected directly,
 # and sets the high bit in the cache file unless we assign to the vars.
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
   (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       # `set' does not quote correctly, so add quotes (double-quote
       # substitution turns \\\\ into \\, and sed turns \\ into \).
       sed -n \
 	"s/'/'\\\\''/g;
 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
+      ;; #(
     *)
       # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-} |
+    esac |
+    sort
+) |
   sed '
+     /^ac_cv_env_/b end
      t clear
-     : clear
+     :clear
      s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
      t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
     cat confcache >$cache_file
   else
-    echo "not updating unwritable cache $cache_file"
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -20563,32 +20937,18 @@
 # Let make expand exec_prefix.
 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
-
 DEFS=-DHAVE_CONFIG_H
 
 ac_libobjs=
 ac_ltlibobjs=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
 done
 LIBOBJS=$ac_libobjs
 
@@ -20654,73 +21014,26 @@
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -20741,126 +21054,198 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
 do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -20869,7 +21254,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -20878,31 +21284,14 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 exec 6>&1
 
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# Save the log message, to keep $[0] and so on meaningful, and to
 # report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
+# values after options handling.
+ac_log="
 This file was extended by $as_me, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -20910,30 +21299,20 @@
   CONFIG_COMMANDS = $CONFIG_COMMANDS
   $ $0 $@
 
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
 _ACEOF
 
+cat >>$CONFIG_STATUS <<_ACEOF
 # Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
 
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
+_ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
-
 ac_cs_usage="\
 \`$as_me' instantiates files from templates according to the
 current configuration.
@@ -20941,7 +21320,7 @@
 Usage: $0 [OPTIONS] [FILE]...
 
   -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
+  -V, --version    print version number and configuration settings, then exit
   -q, --quiet      do not print progress messages
   -d, --debug      don't remove temporary files
       --recheck    update $as_me by reconfiguring in the same conditions
@@ -20960,19 +21339,21 @@
 $config_commands
 
 Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
 config.status
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 2006 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
 _ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
@@ -20983,39 +21364,24 @@
 do
   case $1 in
   --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
     ac_shift=:
     ;;
-  -*)
+  *)
     ac_option=$1
     ac_optarg=$2
     ac_shift=shift
     ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
   esac
 
   case $ac_option in
   # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
     ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
     $ac_shift
@@ -21025,18 +21391,24 @@
     $ac_shift
     CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
     ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil | --si | --s)
     ac_cs_silent=: ;;
 
   # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
    { (exit 1); exit 1; }; } ;;
 
-  *) ac_config_targets="$ac_config_targets $1" ;;
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
 
   esac
   shift
@@ -21052,17 +21424,28 @@
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
 fi
 
 _ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 #
-# INIT-COMMANDS section.
+# INIT-COMMANDS
 #
-
 AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
 
 
@@ -21334,29 +21717,30 @@
 
 _ACEOF
 
-
-
 cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
 for ac_config_target in $ac_config_targets
 do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-  "bfd-in3.h" ) CONFIG_FILES="$CONFIG_FILES bfd-in3.h:bfd-in2.h" ;;
-  "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in:po/Make-in" ;;
-  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-  "libtool" ) CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-  "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-  "bfd_stdint.h" ) CONFIG_COMMANDS="$CONFIG_COMMANDS bfd_stdint.h" ;;
-  "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+    "bfd_stdint.h") CONFIG_COMMANDS="$CONFIG_COMMANDS bfd_stdint.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "bfd-in3.h") CONFIG_FILES="$CONFIG_FILES bfd-in3.h:bfd-in2.h" ;;
+    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in:po/Make-in" ;;
+    "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
   esac
 done
 
+
 # If the user did not use the arguments to specify the items to instantiate,
 # then the envvar interface is used.  Set only those that are not.
 # We use the long form for the default assignment because of an extremely
@@ -21368,410 +21752,512 @@
 fi
 
 # Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
+# simply because there is no reason against having it here, and in addition,
 # creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
 $debug ||
 {
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
   trap '{ (exit 1); exit 1; }' 1 2 13 15
 }
-
 # Create a (secure) tmp directory for tmp files.
 
 {
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
   test -n "$tmp" && test -d "$tmp"
 }  ||
 {
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
 } ||
 {
    echo "$me: cannot create a temporary directory in ." >&2
    { (exit 1); exit 1; }
 }
 
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
 #
-# CONFIG_FILES section.
+# Set up the sed scripts for CONFIG_FILES section.
 #
 
 # No need to generate the scripts if there are no CONFIG_FILES.
 # This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;t t
-s,@target@,$target,;t t
-s,@target_cpu@,$target_cpu,;t t
-s,@target_vendor@,$target_vendor,;t t
-s,@target_os@,$target_os,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s,@INSTALL_DATA@,$INSTALL_DATA,;t t
-s,@CYGPATH_W@,$CYGPATH_W,;t t
-s,@PACKAGE@,$PACKAGE,;t t
-s,@VERSION@,$VERSION,;t t
-s,@ACLOCAL@,$ACLOCAL,;t t
-s,@AUTOCONF@,$AUTOCONF,;t t
-s,@AUTOMAKE@,$AUTOMAKE,;t t
-s,@AUTOHEADER@,$AUTOHEADER,;t t
-s,@MAKEINFO@,$MAKEINFO,;t t
-s,@install_sh@,$install_sh,;t t
-s,@STRIP@,$STRIP,;t t
-s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
-s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
-s,@mkdir_p@,$mkdir_p,;t t
-s,@AWK@,$AWK,;t t
-s,@SET_MAKE@,$SET_MAKE,;t t
-s,@am__leading_dot@,$am__leading_dot,;t t
-s,@AMTAR@,$AMTAR,;t t
-s,@am__tar@,$am__tar,;t t
-s,@am__untar@,$am__untar,;t t
-s,@DEPDIR@,$DEPDIR,;t t
-s,@am__include@,$am__include,;t t
-s,@am__quote@,$am__quote,;t t
-s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
-s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
-s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
-s,@CCDEPMODE@,$CCDEPMODE,;t t
-s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
-s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
-s,@AR@,$AR,;t t
-s,@ac_ct_AR@,$ac_ct_AR,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@LIBTOOL@,$LIBTOOL,;t t
-s,@SED@,$SED,;t t
-s,@EGREP@,$EGREP,;t t
-s,@FGREP@,$FGREP,;t t
-s,@GREP@,$GREP,;t t
-s,@LD@,$LD,;t t
-s,@DUMPBIN@,$DUMPBIN,;t t
-s,@ac_ct_DUMPBIN@,$ac_ct_DUMPBIN,;t t
-s,@NM@,$NM,;t t
-s,@LN_S@,$LN_S,;t t
-s,@lt_ECHO@,$lt_ECHO,;t t
-s,@CPP@,$CPP,;t t
-s,@DEBUGDIR@,$DEBUGDIR,;t t
-s,@PKGVERSION@,$PKGVERSION,;t t
-s,@REPORT_BUGS_TO@,$REPORT_BUGS_TO,;t t
-s,@REPORT_BUGS_TEXI@,$REPORT_BUGS_TEXI,;t t
-s,@WARN_CFLAGS@,$WARN_CFLAGS,;t t
-s,@NO_WERROR@,$NO_WERROR,;t t
-s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
-s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
-s,@MAINT@,$MAINT,;t t
-s,@GENINSRC_NEVER_TRUE@,$GENINSRC_NEVER_TRUE,;t t
-s,@GENINSRC_NEVER_FALSE@,$GENINSRC_NEVER_FALSE,;t t
-s,@INSTALL_LIBBFD_TRUE@,$INSTALL_LIBBFD_TRUE,;t t
-s,@INSTALL_LIBBFD_FALSE@,$INSTALL_LIBBFD_FALSE,;t t
-s,@host_noncanonical@,$host_noncanonical,;t t
-s,@target_noncanonical@,$target_noncanonical,;t t
-s,@bfdlibdir@,$bfdlibdir,;t t
-s,@bfdincludedir@,$bfdincludedir,;t t
-s,@USE_NLS@,$USE_NLS,;t t
-s,@LIBINTL@,$LIBINTL,;t t
-s,@LIBINTL_DEP@,$LIBINTL_DEP,;t t
-s,@INCINTL@,$INCINTL,;t t
-s,@XGETTEXT@,$XGETTEXT,;t t
-s,@GMSGFMT@,$GMSGFMT,;t t
-s,@POSUB@,$POSUB,;t t
-s,@CATALOGS@,$CATALOGS,;t t
-s,@DATADIRNAME@,$DATADIRNAME,;t t
-s,@INSTOBJEXT@,$INSTOBJEXT,;t t
-s,@GENCAT@,$GENCAT,;t t
-s,@CATOBJEXT@,$CATOBJEXT,;t t
-s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
-s,@MSGFMT@,$MSGFMT,;t t
-s,@MSGMERGE@,$MSGMERGE,;t t
-s,@HDEFINES@,$HDEFINES,;t t
-s,@BFD_HOST_64BIT_LONG@,$BFD_HOST_64BIT_LONG,;t t
-s,@BFD_HOST_64BIT_LONG_LONG@,$BFD_HOST_64BIT_LONG_LONG,;t t
-s,@BFD_HOST_64_BIT_DEFINED@,$BFD_HOST_64_BIT_DEFINED,;t t
-s,@BFD_HOST_64_BIT@,$BFD_HOST_64_BIT,;t t
-s,@BFD_HOST_U_64_BIT@,$BFD_HOST_U_64_BIT,;t t
-s,@BFD_HOSTPTR_T@,$BFD_HOSTPTR_T,;t t
-s,@CC_FOR_BUILD@,$CC_FOR_BUILD,;t t
-s,@EXEEXT_FOR_BUILD@,$EXEEXT_FOR_BUILD,;t t
-s,@COREFILE@,$COREFILE,;t t
-s,@COREFLAG@,$COREFLAG,;t t
-s,@WIN32LDFLAGS@,$WIN32LDFLAGS,;t t
-s,@WIN32LIBADD@,$WIN32LIBADD,;t t
-s,@TDEFINES@,$TDEFINES,;t t
-s,@wordsize@,$wordsize,;t t
-s,@bfd64_libs@,$bfd64_libs,;t t
-s,@all_backends@,$all_backends,;t t
-s,@bfd_backends@,$bfd_backends,;t t
-s,@bfd_machines@,$bfd_machines,;t t
-s,@bfd_default_target_size@,$bfd_default_target_size,;t t
-s,@bfd_file_ptr@,$bfd_file_ptr,;t t
-s,@bfd_ufile_ptr@,$bfd_ufile_ptr,;t t
-s,@tdefaults@,$tdefaults,;t t
-s,@datarootdir@,$datarootdir,;t t
-s,@docdir@,$docdir,;t t
-s,@htmldir@,$htmldir,;t t
-s,@LIBOBJS@,$LIBOBJS,;t t
-s,@LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
+if test -n "$CONFIG_FILES"; then
 
 _ACEOF
 
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+target!$target$ac_delim
+target_cpu!$target_cpu$ac_delim
+target_vendor!$target_vendor$ac_delim
+target_os!$target_os$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+AR!$AR$ac_delim
+RANLIB!$RANLIB$ac_delim
+LIBTOOL!$LIBTOOL$ac_delim
+SED!$SED$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+FGREP!$FGREP$ac_delim
+LD!$LD$ac_delim
+DUMPBIN!$DUMPBIN$ac_delim
+ac_ct_DUMPBIN!$ac_ct_DUMPBIN$ac_delim
+NM!$NM$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+LN_S!$LN_S$ac_delim
+lt_ECHO!$lt_ECHO$ac_delim
+CPP!$CPP$ac_delim
+DEBUGDIR!$DEBUGDIR$ac_delim
+PKGVERSION!$PKGVERSION$ac_delim
+REPORT_BUGS_TO!$REPORT_BUGS_TO$ac_delim
+REPORT_BUGS_TEXI!$REPORT_BUGS_TEXI$ac_delim
+WARN_CFLAGS!$WARN_CFLAGS$ac_delim
+NO_WERROR!$NO_WERROR$ac_delim
+MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim
+MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim
+MAINT!$MAINT$ac_delim
+GENINSRC_NEVER_TRUE!$GENINSRC_NEVER_TRUE$ac_delim
+GENINSRC_NEVER_FALSE!$GENINSRC_NEVER_FALSE$ac_delim
+INSTALL_LIBBFD_TRUE!$INSTALL_LIBBFD_TRUE$ac_delim
+INSTALL_LIBBFD_FALSE!$INSTALL_LIBBFD_FALSE$ac_delim
+host_noncanonical!$host_noncanonical$ac_delim
+target_noncanonical!$target_noncanonical$ac_delim
+bfdlibdir!$bfdlibdir$ac_delim
+bfdincludedir!$bfdincludedir$ac_delim
+USE_NLS!$USE_NLS$ac_delim
+LIBINTL!$LIBINTL$ac_delim
+LIBINTL_DEP!$LIBINTL_DEP$ac_delim
+INCINTL!$INCINTL$ac_delim
+XGETTEXT!$XGETTEXT$ac_delim
+GMSGFMT!$GMSGFMT$ac_delim
+POSUB!$POSUB$ac_delim
+CATALOGS!$CATALOGS$ac_delim
+DATADIRNAME!$DATADIRNAME$ac_delim
+INSTOBJEXT!$INSTOBJEXT$ac_delim
+GENCAT!$GENCAT$ac_delim
+CATOBJEXT!$CATOBJEXT$ac_delim
+MKINSTALLDIRS!$MKINSTALLDIRS$ac_delim
+MSGFMT!$MSGFMT$ac_delim
+MSGMERGE!$MSGMERGE$ac_delim
+HDEFINES!$HDEFINES$ac_delim
+BFD_HOST_64BIT_LONG!$BFD_HOST_64BIT_LONG$ac_delim
+BFD_HOST_64BIT_LONG_LONG!$BFD_HOST_64BIT_LONG_LONG$ac_delim
+BFD_HOST_64_BIT_DEFINED!$BFD_HOST_64_BIT_DEFINED$ac_delim
+BFD_HOST_64_BIT!$BFD_HOST_64_BIT$ac_delim
+BFD_HOST_U_64_BIT!$BFD_HOST_U_64_BIT$ac_delim
+BFD_HOSTPTR_T!$BFD_HOSTPTR_T$ac_delim
+CC_FOR_BUILD!$CC_FOR_BUILD$ac_delim
+EXEEXT_FOR_BUILD!$EXEEXT_FOR_BUILD$ac_delim
+COREFILE!$COREFILE$ac_delim
+COREFLAG!$COREFLAG$ac_delim
+WIN32LDFLAGS!$WIN32LDFLAGS$ac_delim
+WIN32LIBADD!$WIN32LIBADD$ac_delim
+TDEFINES!$TDEFINES$ac_delim
+wordsize!$wordsize$ac_delim
+bfd64_libs!$bfd64_libs$ac_delim
+all_backends!$all_backends$ac_delim
+bfd_backends!$bfd_backends$ac_delim
+bfd_machines!$bfd_machines$ac_delim
+bfd_default_target_size!$bfd_default_target_size$ac_delim
+bfd_file_ptr!$bfd_file_ptr$ac_delim
+bfd_ufile_ptr!$bfd_ufile_ptr$ac_delim
+tdefaults!$tdefaults$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 60; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
 fi # test -n "$CONFIG_FILES"
 
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
   esac
 
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+  ac_dir=`$as_dirname -- "$ac_file" ||
 $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$ac_file" : 'X\(//\)[^/]' \| \
 	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
     as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
     done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-
   ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
 
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
 
   case $INSTALL in
   [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
   esac
-
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
 _ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
 cat >>$CONFIG_STATUS <<_ACEOF
   sed "$ac_vpsub
 $extrasub
@@ -21779,248 +22265,130 @@
 cat >>$CONFIG_STATUS <<\_ACEOF
 :t
 /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-s,@INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out
 
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
 
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  rm -f "$tmp/stdin"
   case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
   esac
-
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
 _ACEOF
 
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
 
-# This sed command replaces #undef with comments.  This is necessary, for
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
 
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
 do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
   echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
   rm -f conftest.defines
   mv conftest.tail conftest.defines
 done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
+rm -f conftest.defines conftest.tail
 
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
 cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
   if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
       { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
 echo "$as_me: $ac_file is unchanged" >&6;}
     else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
       rm -f $ac_file
-      mv $tmp/config.h $ac_file
+      mv "$tmp/config.h" $ac_file
     fi
   else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
+    echo "/* $configure_input  */"
+    cat "$ac_result"
   fi
+  rm -f "$tmp/out12"
 # Compute $ac_file's index in $config_headers.
 _am_stamp_count=1
 for _am_header in $config_headers :; do
@@ -22031,135 +22399,39 @@
       _am_stamp_count=`expr $_am_stamp_count + 1` ;;
   esac
 done
-echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+echo "timestamp for $ac_file" >`$as_dirname -- $ac_file ||
 $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X$ac_file : 'X\(//\)[^/]' \| \
 	 X$ac_file : 'X\(//\)$' \| \
-	 X$ac_file : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X$ac_file : 'X\(/\)' \| . 2>/dev/null ||
 echo X$ac_file |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`/stamp-h$_am_stamp_count
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
 
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
 
 
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
   # Strip MF so we end up with the name of the file.
   mf=`echo "$mf" | sed -e 's/:.*$//'`
   # Check whether this is an Automake generated Makefile or not.
@@ -22169,18 +22441,29 @@
   # each Makefile.in and add a new line on top of each file to say so.
   # So let's grep whole file.
   if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
-    dirpart=`(dirname "$mf") 2>/dev/null ||
+    dirpart=`$as_dirname -- "$mf" ||
 $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$mf" : 'X\(//\)[^/]' \| \
 	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   else
     continue
   fi
@@ -22202,49 +22485,76 @@
        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
     # Make sure the directory exists.
     test -f "$dirpart/$file" && continue
-    fdir=`(dirname "$file") 2>/dev/null ||
+    fdir=`$as_dirname -- "$file" ||
 $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$file" : 'X\(//\)[^/]' \| \
 	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    { if $as_mkdir_p; then
-    mkdir -p $dirpart/$fdir
-  else
-    as_dir=$dirpart/$fdir
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
     as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
     done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-
     # echo "creating $dirpart/$file"
     echo '# dummy' > "$dirpart/$file"
   done
 done
  ;;
-    libtool )
+    "libtool":C)
 
     # See if we are running on zsh, and set the options which allow our
     # commands through without removal of \ escapes.
@@ -22793,7 +23103,7 @@
   chmod +x "$ofile"
 
  ;;
-    default-1 )
+    "default-1":C)
     for ac_file in $CONFIG_FILES; do
       # Support "outfile[:infile[:infile...]]"
       case "$ac_file" in
@@ -22894,7 +23204,7 @@
         ;;
       esac
     done ;;
-    bfd_stdint.h )
+    "bfd_stdint.h":C)
 if test "$GCC" = yes; then
   echo "/* generated for " `$CC --version | sed 1q` "*/" > tmp-stdint.h
 else
@@ -23222,7 +23532,7 @@
 fi
 
  ;;
-    default )
+    "default":C)
 case "$srcdir" in
   .) srcdirpre= ;;
   *) srcdirpre='$(srcdir)/' ;;
@@ -23240,11 +23550,10 @@
     -e "s,@POFILES@,$POFILES," \
     -e "s,@GMOFILES@,$GMOFILES," \
     po/Makefile.in > po/Makefile ;;
-  esac
-done
-_ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+  esac
+done # for ac_tag
+
 
 { (exit 0); exit 0; }
 _ACEOF
diff --git a/bfd/configure.in b/bfd/configure.in
index 295cf36..99ea584 100644
--- a/bfd/configure.in
+++ b/bfd/configure.in
@@ -8,7 +8,7 @@
 AC_CANONICAL_TARGET
 AC_ISC_POSIX
 
-AM_INIT_AUTOMAKE(bfd, 2.18-arc-20070530)
+AM_INIT_AUTOMAKE(bfd, 2.18.50)
 
 dnl These must be called before AM_PROG_LIBTOOL, because it may want
 dnl to call AC_CHECK_PROG.
diff --git a/bfd/cpu-arc.c b/bfd/cpu-arc.c
index 69ed133..4f7cc88 100644
--- a/bfd/cpu-arc.c
+++ b/bfd/cpu-arc.c
@@ -42,16 +42,15 @@
 
 static const bfd_arch_info_type arch_info_struct[] =
 {
-  ARC ( bfd_mach_arc_a4, "A4", FALSE, &arch_info_struct[1] ),
-  ARC ( bfd_mach_arc_a5, "A5", FALSE, &arch_info_struct[2] ),
-  ARC ( bfd_mach_arc_arc600, "ARC600", FALSE, &arch_info_struct[3] ),
-  ARC ( bfd_mach_arc_arc600, "A6", FALSE, &arch_info_struct[4] ),
-  ARC ( bfd_mach_arc_arc700, "ARC700", FALSE, &arch_info_struct[5]),
-  ARC ( bfd_mach_arc_arc700, "A7", FALSE, NULL),
+  ARC ( bfd_mach_arc_a5,     "A5",     FALSE, &arch_info_struct[1] ),
+  ARC ( bfd_mach_arc_arc600, "ARC600", FALSE, &arch_info_struct[2] ),
+  ARC ( bfd_mach_arc_arc600, "A6",     FALSE, &arch_info_struct[3] ),
+  ARC ( bfd_mach_arc_arc700, "ARC700", FALSE, &arch_info_struct[4] ),
+  ARC ( bfd_mach_arc_arc700, "A7",     FALSE, NULL ),
 };
 
 const bfd_arch_info_type bfd_arc_arch =
-  ARC ( bfd_mach_arc_a4, "A4", TRUE, &arch_info_struct[0] );
+  ARC ( bfd_mach_arc_arc700, "ARC700", TRUE, &arch_info_struct[0] );
 
 /* Utility routines.  */
 
diff --git a/bfd/doc/Makefile.in b/bfd/doc/Makefile.in
index e27d0f3..c21fefd 100644
--- a/bfd/doc/Makefile.in
+++ b/bfd/doc/Makefile.in
@@ -461,10 +461,13 @@
 	    $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
 	  esac; \
 	  if test -f $$base; then d=.; else d=$(srcdir); fi; \
-	  for file in $$d/$$base*; do \
-	    relfile=`expr "$$file" : "$$d/\(.*\)"`; \
-	    test -f $(distdir)/$$relfile || \
-	      cp -p $$file $(distdir)/$$relfile; \
+	  base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+	    if test -f $$file; then \
+	      relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+	      test -f $(distdir)/$$relfile || \
+		cp -p $$file $(distdir)/$$relfile; \
+	    else :; fi; \
 	  done; \
 	done
 
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 548d726..43ff90e 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -3,13 +3,6 @@
    Free Software Foundation, Inc.
    Contributed by Doug Evans (dje@cygnus.com).
 
-   Sources derived from work done by Sankhya Technologies (www.sankhya.com)
-
-   Cleaned up , Comments and Position Independent Code support added by
-   Saurabh Verma (saurabh.verma@codito.com)
-   Ramana Radhakrishnan(ramana.radhakrishnan@codito.com)
-
-
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
@@ -27,20 +20,28 @@
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-#include "sysdep.h"
 #include "bfd.h"
+#include "sysdep.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/arc.h"
 
   /* ****************************************************************
-   * NOTE: The pic related work starts after the comment marked as 
+   * NOTE: The pic related work starts after the comment marked as
    * ~~~~~~        "* PIC-related routines for the arc backend "
    * ****************************************************************/
 #define BFD_DEBUG_PIC(x)
-  
-/* #define BFD_DEBUG_PIC(x) (fprintf(stderr,"DEBUG: %d@%s: ", \
-   __LINE__,__PRETTY_FUNCTION__),x) */
+
+  /*#define BFD_DEBUG_PIC(x) (fprintf(stderr,"DEBUG: %d@%s: ",__LINE__,__PRETTY_FUNCTION__),x)*/
+
+static reloc_howto_type *arc_elf32_bfd_reloc_type_lookup
+  PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
+static void arc_info_to_howto_rel
+  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
+static bfd_boolean arc_elf_object_p PARAMS ((bfd *));
+static void arc_elf_final_write_processing PARAMS ((bfd *, bfd_boolean));
+static bfd_reloc_status_type arc_elf_b22_pcrel
+  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
 
 /* We must define USE_RELA to get the proper fixups for PC relative
    branches to symbols defined in other object files. The addend is
@@ -48,43 +49,21 @@
    relative address is calculated. mlm */
 #define USE_RELA
 
-/* Handle PC relative relocation */
-static bfd_reloc_status_type
-arc_elf_b22_pcrel (bfd *abfd ATTRIBUTE_UNUSED,
-		   arelent *reloc_entry,
-		   asymbol *symbol,
-		   void *data ATTRIBUTE_UNUSED,
-		   asection *input_section,
-		   bfd *output_bfd,
-		   char **error_message ATTRIBUTE_UNUSED)
-{
-  /* If incremental linking, update the address of the relocation with the
-     section offset */
-
-
-  if (output_bfd != (bfd *) NULL)
-    {
-      reloc_entry->address += input_section->output_offset;
-      if ((symbol->flags & BSF_SECTION_SYM) && symbol->section)
-	reloc_entry->addend
-	  += ((**(reloc_entry->sym_ptr_ptr)).section)->output_offset;
-      return bfd_reloc_ok;
-    }
-  return bfd_reloc_continue;
-}
-
 #define bfd_put32(a,b,c)
-static bfd_vma bfd_get_32_me (bfd *, const unsigned char *);
-static void bfd_put_32_me (bfd *, bfd_vma, unsigned char *);
+static bfd_vma bfd_get_32_me
+PARAMS ((bfd *, const unsigned char *));
+static void bfd_put_32_me
+PARAMS ((bfd *, bfd_vma, unsigned char *));
 
 
 static bfd_reloc_status_type arcompact_elf_me_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
+PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
 static bfd_reloc_status_type arc_unsupported_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_boolean arc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd);
+PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
+static bfd_boolean arc_elf_merge_private_bfd_data
+PARAMS ((bfd *ibfd, bfd *obfd));
 static reloc_howto_type * arc_elf_calculate_howto_index
-  (enum elf_arc_reloc_type r_type);
+(enum elf_arc_reloc_type r_type);
 
 
 #define INIT_SYM_STRING "init"
@@ -135,14 +114,14 @@
 /* Declare this now that the above structures are defined.  */
 
 static bfd_boolean elf_ARC_discard_copies
-  (struct elf_ARC_link_hash_entry *, void *);
+  PARAMS ((struct elf_ARC_link_hash_entry *, PTR));
 
 /* Traverse an ARC ELF linker hash table.  */
 
 #define elf_ARC_link_hash_traverse(table, func, info)			\
   (elf_link_hash_traverse						\
    (&(table)->root,							\
-    (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),	\
+    (bfd_boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),	\
     (info)))
 
 /* Get the ARC ELF linker hash table from a link_info structure.  */
@@ -153,8 +132,8 @@
 /* Create an entry in an ARC ELF linker hash table.  */
 
 static struct bfd_hash_entry *
-elf_ARC_link_hash_newfunc (struct bfd_hash_entry *entry, 
-                           struct bfd_hash_table *table, 
+elf_ARC_link_hash_newfunc (struct bfd_hash_entry *entry,
+                           struct bfd_hash_table *table,
                            const char *string)
 {
   struct elf_ARC_link_hash_entry *ret =
@@ -193,9 +172,9 @@
   if (ret == (struct elf_ARC_link_hash_table *) NULL)
     return NULL;
 
+
   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
-				       elf_ARC_link_hash_newfunc,
-				       sizeof (struct elf_ARC_link_hash_entry)))
+				       elf_ARC_link_hash_newfunc,/* stub for ARC (according to ChangeLog 2006-05-24  Bjoern Haase )*/0 ))
     {
       bfd_release (abfd, ret);
       return NULL;
@@ -214,48 +193,47 @@
 /*ARGSUSED*/
 static bfd_boolean
 elf_ARC_discard_copies (struct elf_ARC_link_hash_entry * h,
-                        void *ignore ATTRIBUTE_UNUSED)
+                        PTR ignore ATTRIBUTE_UNUSED)
 {
   struct elf_ARC_pcrel_relocs_copied *s;
-  
+
   /* We only discard relocs for symbols defined in a regular object.  */
-  if (!h->root.def_regular)
+  if((h->root.def_regular) == 0)
     return TRUE;
 
   for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
-    s->section->size -= 
-      s->count * sizeof (Elf32_External_Rela); /* relA */
+    s->section->rawsize -= s->count * sizeof (Elf32_External_Rel);
 
   return TRUE;
 }
 
-/* The HOWTO Array needs to be specified as follows. 
+/* The HOWTO Array needs to be specified as follows.
    HOWTO
    {
     type        --- > Relocation Type
     rightshift  --- > Rightshift the value by this amount.
     size        --- > Size 0- byte , 1-short, 2 -long
-    bitsize     --- > Exact bitsize. 
+    bitsize     --- > Exact bitsize.
     pcrel       --- > PC Relative reloc.
-    bitpos      --- > Bit Position. 
-    complain_on_overflow ---> What complaint on overflow. 
-    function    --- > Any special function to be used . 
+    bitpos      --- > Bit Position.
+    complain_on_overflow ---> What complaint on overflow.
+    function    --- > Any special function to be used .
     name        --- > Relocation Name.
-    partial_inplace--> Addend sits partially in place and in 
+    partial_inplace--> Addend sits partially in place and in
                        Reloc Table.
-    srcmask       ---> Source Mask 0 for RELA and corresponding 
+    srcmask       ---> Source Mask 0 for RELA and corresponding
                        field if USE_REL or partial_inplace
-		       is set. 
+		       is set.
     dstmask       ---> Destination Mask . Destination field mask.
     pcreloffset   ---> pcrel offset . If a PCREL reloc is created
-                       and the assembler leaves an offset in here. 
-		       
+                       and the assembler leaves an offset in here.
+
    }
    If in the backend you need to access the howto array, please
-   use the arc_elf_calculate_howto_index function.  All changes in 
-   the HOWTO array need a corresponding change in the above mentioned 
-   function. The need for this function is the presence of a hole 
-   in the ARC ABI. 
+   use the arc_elf_calculate_howto_index function.  All changes in
+   the HOWTO array need a corresponding change in the above mentioned
+   function. The need for this function is the presence of a hole
+   in the ARC ABI.
 */
 
 #define ARC_RELA_HOWTO(type,rightshift,size,bitsz,pcrel,bitpos , \
@@ -289,16 +267,13 @@
                   "R_ARC_16",0xffff),
   ARC_RELA_HOWTO (R_ARC_24   ,0 ,2 ,24,FALSE,0,bfd_elf_generic_reloc,
                   "R_ARC_24",0xffffff),
-  /* A standard 32 bit relocation.  */
-  ARC_RELA_HOWTO (R_ARC_32   ,0 ,2 ,32,FALSE,0,bfd_elf_generic_reloc,
+  ARC_RELA_HOWTO (R_ARC_32   ,0 ,3 ,32,FALSE,0,bfd_elf_generic_reloc,
                   "R_ARC_32",-1),
-  /* A 26 bit absolute branch, right shifted by 2.  */
   ARC_RELA_HOWTO (R_ARC_B26  ,2 ,2 ,26,FALSE,0,bfd_elf_generic_reloc,
                   "R_ARC_B26",0xffffff),
-  /* A relative 22 bit branch; bits 21-2 are stored in bits 26-7.  */
   ARC_RELA_HOWTO (R_ARC_B22_PCREL,2,2,22,TRUE,7,arc_elf_b22_pcrel,
                   "R_ARC_B22_PCREL",0x7ffff80),
-  ARC_RELA_HOWTO (R_ARC_H30 ,2 ,2 ,32, FALSE, 0, bfd_elf_generic_reloc,
+  ARC_RELA_HOWTO (R_ARC_H30 ,2 ,3 ,32, FALSE, 0, bfd_elf_generic_reloc,
                   "R_ARC_H30",-1),
   ARC_UNSUPPORTED_HOWTO(R_ARC_N8,"R_ARC_N8"),
   ARC_UNSUPPORTED_HOWTO(R_ARC_N16,"R_ARC_N16"),
@@ -318,27 +293,20 @@
   ARCOMPACT_RELA_HOWTO (R_ARC_S25W_PCREL,2,2,25,TRUE,0,arcompact_elf_me_reloc,
                         "R_ARC_S25W_PCREL",0x7fcffcf),
 
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA32,0,2,32,FALSE,0,arcompact_elf_me_reloc,
-                        "R_ARC_SDA32",-1),
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA_LDST,0,2,9,FALSE,15,arcompact_elf_me_reloc,
-                        "R_ARC_SDA_LDST",0x00ff8000),
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA_LDST1,1,2,10,FALSE,15,arcompact_elf_me_reloc,
-                        "R_ARC_SDA_LDST1",0x00ff8000),
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA_LDST2,2,2,11,FALSE,15,arcompact_elf_me_reloc,
-                        "R_ARC_SDA_LDST2",0x00ff8000),
-
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA16_LD,0,2,9,FALSE,0,arcompact_elf_me_reloc,
-                        "R_ARC_SDA16_LD",0x01ff),
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA16_LD1,1,2,10,FALSE,0,arcompact_elf_me_reloc,
-                        "R_ARC_SDA16_LD1",0x01ff),
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA16_LD2,2,2,11,FALSE,0,arcompact_elf_me_reloc,
-                        "R_ARC_SDA16_LD2",0x01ff),
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA32,"R_ARC_SDA32"),
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA_LDST,"R_ARC_SDALDST"),
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA_LDST1,"R_ARC_SDALDST1"),
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA_LDST2,"R_ARC_SDALDST2"),
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA16_LD,"R_ARC_SDA16_LD"),
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA16_LD1,"R_ARC_SDA16_LD1"),
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA16_LD2,"R_ARC_SDA16_LD2"),
 
   ARCOMPACT_RELA_HOWTO (R_ARC_S13_PCREL,2,1,13,TRUE,0,arcompact_elf_me_reloc,
                         "R_ARC_S13_PCREL",0x7ff),
 
   ARC_UNSUPPORTED_HOWTO (R_ARC_W,"R_ARC_W"),
 
+
 /* 'Middle-endian' (ME) 32-bit word relocations, stored in two half-words.
    The individual half-words are stored in the native endian of the
    machine; this is how all 32-bit instructions and long-words are stored
@@ -346,13 +314,10 @@
 
   ARC_RELA_HOWTO (R_ARC_32_ME ,0 ,2 ,32, FALSE, 0, arcompact_elf_me_reloc,
                   "R_ARC_32_ME",-1),
-  
+
   ARC_UNSUPPORTED_HOWTO (R_ARC_N32_ME,"R_ARC_N32_ME"),
   ARC_UNSUPPORTED_HOWTO (R_ARC_SECTOFF_ME,"R_ARC_SECTOFF_ME"),
-
-  ARCOMPACT_RELA_HOWTO (R_ARC_SDA32_ME,0,2,32,FALSE,0,arcompact_elf_me_reloc,
-                        "R_ARC_SDA32_ME",-1),
-
+  ARC_UNSUPPORTED_HOWTO (R_ARC_SDA32_ME,"R_ARC_SDA32_ME"),
   ARC_UNSUPPORTED_HOWTO (R_ARC_W_ME,"R_ARC_W_ME"),
   ARC_UNSUPPORTED_HOWTO (R_ARC_H30_ME,"R_ARC_H30_ME"),
   ARC_UNSUPPORTED_HOWTO (R_ARC_SECTOFF_U8,"R_ARC_SECTOFF_U8"),
@@ -399,96 +364,14 @@
                   "R_ARC_GOTPC",-1),
 };
 
-/*Indicates whether the value contained in
-  the relocation type is signed, usnigned
-  or the reclocation type is unsupported.
-  0 -> unsigned reloc type
-  1 -> signed reloc type
-  -1 -> reloc type unsupported*/
-short arc_signed_reloc_type[] =
-{
-  0, // R_ARC_NONE              Reloc Number
-  0, // R_ARC_8
-  0, // R_ARC_16
-  0, // R_ARC_24
-  0, // R_ARC_32
-  0, // R_ARC_B26
-  1, // R_ARC_B22_PCREL          0x6
 
-  0, // R_ARC_H30                0x7
- -1, // R_ARC_N8
- -1, // R_ARC_N16
- -1, // R_ARC_N24
- -1, // R_ARC_N32
- -1, // R_ARC_SDA
- -1, // R_ARC_SECTOFF            0xD
-
-  1, // R_ARC_S21H_PCREL         0xE
-  1, // R_ARC_S21W_PCREL
-  1, // R_ARC_S25H_PCREL
-  1, // R_ARC_S25W_PCREL         0x11
-
-  1, // R_ARC_SDA32              0x12
-  1, // R_ARC_SDA_LDST
-  1, // R_ARC_SDA_LDST1
-  1, // R_ARC_SDA_LDST2          0x15
-
-  1, // R_ARC_SDA16_LD           0x16
-  1, // R_ARC_SDA16_LD1
-  1, // R_ARC_SDA16_LD2          0x18
-
-  1, // R_ARC_S13_PCREL          0x19
-
-  -1, // R_ARC_W                 0x1A
-  0, // R_ARC_32_ME              0x1B
-  
-  -1, // R_ARC_N32_ME            0x1c
-  -1, // R_ARC_SECTOFF_ME        0x1D
-
-  0, // R_ARC_SDA32_ME           0x1E
-
-  -1, // R_ARC_W_ME              0x1F
-  -1, // R_ARC_H30_ME
-  -1, // R_ARC_SECTOFF_U8
-  -1, // R_ARC_SECTOFF_S9
-  -1, // R_AC_SECTOFF_U8
-  -1, // R_AC_SECTOFF_U8_1
-  -1, // R_AC_SECTOFF_U8_2
-  -1, // R_AC_SECTOFF_S9
-  -1, // R_AC_SECTOFF_S9_1
-  -1, // R_AC_SECTOFF_S9_2
-  -1, // R_ARC_SECTOFF_ME_1
-  -1, // R_ARC_SECTOFF_ME_2
-  -1, // R_ARC_SECTOFF_1
-  -1, // R_ARC_SECTOFF_2         0x2c
-
-  -1, // R_ARC_hole_base starts here 0x2d
-  -1, // 0x2e
-  -1, // 0x2f
-  -1, // 0x30
-  -1, // ends here               0x31
-
-  0, //  R_ARC_PC32              0x32
-  0, //  R_ARC_GOTPC32
-  0, //  R_ARC_PLT32
-  0, //  R_ARC_COPY
-  0, //  R_ARC_GLOB_DAT
-  0, //  R_ARC_JMP_SLOT
-  0, //  R_ARC_RELATIVE
-  0, //  R_ARC_GOTOFF
-  0, //  R_ARC_GOTPC             0x3a
-  0, //  R_ARC_GOT32             0x3b
-};
-
-
-
-static bfd_reloc_status_type 
-arc_unsupported_reloc (bfd * ibfd ATTRIBUTE_UNUSED, 
+static bfd_reloc_status_type
+arc_unsupported_reloc (bfd * ibfd ATTRIBUTE_UNUSED,
 		       arelent * rel ATTRIBUTE_UNUSED,
-		       asymbol * sym ATTRIBUTE_UNUSED, 
-		       void *ptr ATTRIBUTE_UNUSED,
-		       asection * section ATTRIBUTE_UNUSED, 
-		       bfd *obfd ATTRIBUTE_UNUSED, 
+		       asymbol * sym ATTRIBUTE_UNUSED,
+		       PTR ptr ATTRIBUTE_UNUSED,
+		       asection * section ATTRIBUTE_UNUSED,
+		       bfd *obfd ATTRIBUTE_UNUSED,
 		       char ** data ATTRIBUTE_UNUSED
 		       )
 {
@@ -522,35 +405,26 @@
   { BFD_RELOC_ARC_32_ME, R_ARC_32_ME },
   { BFD_RELOC_ARC_PC32, R_ARC_PC32 },
   { BFD_RELOC_ARC_GOTPC32, R_ARC_GOTPC32 },
-  { BFD_RELOC_ARC_COPY , R_ARC_COPY },
+  { BFD_RELOC_ARC_COPY , R_ARC_COPY},
   { BFD_RELOC_ARC_JMP_SLOT, R_ARC_JMP_SLOT },
   { BFD_RELOC_ARC_GLOB_DAT, R_ARC_GLOB_DAT },
-  { BFD_RELOC_ARC_GOTOFF , R_ARC_GOTOFF },
-  { BFD_RELOC_ARC_GOTPC , R_ARC_GOTPC },
+  { BFD_RELOC_ARC_GOTOFF , R_ARC_GOTOFF},
+  { BFD_RELOC_ARC_GOTPC , R_ARC_GOTPC},
   { BFD_RELOC_ARC_PLT32 , R_ARC_PLT32 },
-
-  { BFD_RELOC_ARC_SDA, R_ARC_SDA },
-  { BFD_RELOC_ARC_SDA32, R_ARC_SDA32 },
-  { BFD_RELOC_ARC_SDA32_ME, R_ARC_SDA32_ME },
-  { BFD_RELOC_ARC_SDA_LDST, R_ARC_SDA_LDST },
-  { BFD_RELOC_ARC_SDA_LDST1, R_ARC_SDA_LDST1 },
-  { BFD_RELOC_ARC_SDA_LDST2, R_ARC_SDA_LDST2 },
-  { BFD_RELOC_ARC_SDA16_LD, R_ARC_SDA16_LD },
-  { BFD_RELOC_ARC_SDA16_LD1, R_ARC_SDA16_LD1 },
-  { BFD_RELOC_ARC_SDA16_LD2, R_ARC_SDA16_LD2 }
 };
 
 static reloc_howto_type *
-arc_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
-				 bfd_reloc_code_real_type code)
+arc_elf32_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
+                                 bfd_reloc_code_real_type code)
 {
   unsigned int i;
+
   for (i = 0;
        i < sizeof (arc_reloc_map) / sizeof (struct arc_reloc_map);
        i++)
     {
       if (arc_reloc_map[i].bfd_reloc_val == code)
-        { 
+        {
           enum elf_arc_reloc_type r_type;
           r_type = arc_reloc_map[i].elf_reloc_val;
           return arc_elf_calculate_howto_index(r_type);
@@ -560,31 +434,15 @@
   return NULL;
 }
 
-static reloc_howto_type *
-bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
-				 const char *r_name)
-{
-  unsigned int i;
-
-  for (i = 0;
-       i < sizeof (elf_arc_howto_table) / sizeof (elf_arc_howto_table[0]);
-       i++)
-    if (elf_arc_howto_table[i].name != NULL
-	&& strcasecmp (elf_arc_howto_table[i].name, r_name) == 0)
-      return &elf_arc_howto_table[i];
-
-  return NULL;
-}
-
 /* Calculate the howto index.  */
-static reloc_howto_type * 
+static reloc_howto_type *
 arc_elf_calculate_howto_index(enum elf_arc_reloc_type r_type)
 {
   BFD_ASSERT (r_type < (unsigned int) R_ARC_max);
-  BFD_ASSERT ((r_type < (unsigned int) R_ARC_hole_base)
-	      || (r_type
-		  >= (unsigned int) R_ARC_hole_base + R_ARC_reloc_hole_gap));
-  if (r_type > R_ARC_hole_base)
+  BFD_ASSERT ((r_type < (unsigned int)R_ARC_hole_base) ||
+	      (r_type >= (unsigned int) R_ARC_hole_base +
+	       R_ARC_reloc_hole_gap));
+  if(r_type > R_ARC_hole_base)
     r_type -= R_ARC_reloc_hole_gap;
   return &elf_arc_howto_table[r_type];
 
@@ -592,17 +450,17 @@
 /* Set the howto pointer for an ARC ELF reloc.  */
 
 static void
-arc_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
-		       arelent *cache_ptr,
-		       Elf_Internal_Rela *dst)
+arc_info_to_howto_rel (bfd * abfd ATTRIBUTE_UNUSED,
+                       arelent * cache_ptr,
+                       Elf_Internal_Rela *dst)
 {
   enum elf_arc_reloc_type r_type;
 
-
   r_type = ELF32_R_TYPE (dst->r_info);
   cache_ptr->howto = arc_elf_calculate_howto_index(r_type);
 }
- 
+
+
 /* Merge backend specific data from an object file to the output
    object file when linking.  */
 static bfd_boolean
@@ -610,26 +468,22 @@
 {
   unsigned short mach_ibfd;
   static unsigned short mach_obfd = EM_NONE;
-  
+
   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
 	 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return TRUE;
-  if (bfd_count_sections (ibfd) == 0)
+  if(bfd_count_sections(ibfd) == 0)
     return TRUE ; /* For the case of empty archive files */
-  
-  mach_ibfd = elf_elfheader (ibfd)->e_machine;
+
+  mach_ibfd = elf_elfheader(ibfd)->e_machine;
 
    /* Check if we have the same endianess.  */
   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
     {
-      _bfd_error_handler (_("\
-ERROR: Endian Match failed . Attempting to link %B with binary %s \
-of opposite endian-ness"),
-			  ibfd, bfd_get_filename (obfd));
       return FALSE;
     }
 
-  if (mach_obfd == EM_NONE)
+  if(mach_obfd == EM_NONE)
     {
       mach_obfd = mach_ibfd;
     }
@@ -638,37 +492,35 @@
       if((mach_ibfd==EM_ARC && mach_obfd==EM_ARCOMPACT) ||
 	 (mach_ibfd==EM_ARCOMPACT && mach_obfd==EM_ARC))
 	{
-	  _bfd_error_handler (_("\ERROR: Attempting to link an %s binary(%B) \
+	  _bfd_error_handler(_("\ERROR: Attempting to link an %s binary(%s) \
 with a binary incompatible %s binary(%s)"),
-			      (mach_ibfd == EM_ARC) ? "A4" : "ARCompact",
-			      ibfd,
-			      (mach_obfd == EM_ARC) ? "A4" : "ARCompact",
-			      bfd_get_filename (obfd));
+			     (mach_ibfd == EM_ARC)?"A4":"ARCompact",
+			     bfd_get_filename(ibfd) ,
+			     (mach_obfd == EM_ARC)?"A4":"ARCompact",
+			     bfd_get_filename(obfd));
 	  return FALSE;
 	}
     }
-  
+
   if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
     {
       return bfd_set_arch_mach (obfd, bfd_arch_arc, bfd_get_mach(ibfd));
     }
-  
+
   return TRUE;
 }
 
 /* Set the right machine number for an ARC ELF file.  */
 
 static bfd_boolean
-arc_elf_object_p (bfd *abfd)
+arc_elf_object_p (abfd)
+     bfd *abfd;
 {
   int mach;
   unsigned long arch = elf_elfheader (abfd)->e_flags & EF_ARC_MACH;
 
   switch (arch)
     {
-    case E_ARC_MACH_A4:
-      mach = bfd_mach_arc_a4;
-      break;
     case E_ARC_MACH_A5:
       mach = bfd_mach_arc_a5;
       break;
@@ -691,18 +543,15 @@
    This gets the ARC architecture right based on the machine number.  */
 
 static void
-arc_elf_final_write_processing (bfd *abfd,
-				bfd_boolean linker ATTRIBUTE_UNUSED)
+arc_elf_final_write_processing (abfd, linker)
+     bfd *abfd;
+     bfd_boolean linker ATTRIBUTE_UNUSED;
 {
   int mach;
   unsigned long val;
 
   switch (mach = bfd_get_mach (abfd))
     {
-    case bfd_mach_arc_a4:
-      val = E_ARC_MACH_A4;
-      elf_elfheader (abfd)->e_machine = EM_ARC;
-      break;
     case bfd_mach_arc_a5:
       val = E_ARC_MACH_A5;
       elf_elfheader (abfd)->e_machine = EM_ARCOMPACT;
@@ -725,10 +574,10 @@
 
 /* Handle an ARCompact 'middle-endian' relocation.  */
 static bfd_reloc_status_type
-arcompact_elf_me_reloc (bfd *abfd , 
+arcompact_elf_me_reloc (bfd *abfd ,
                         arelent *reloc_entry,
                         asymbol *symbol_in,
-                        void *data, 
+                        PTR data,
                         asection *input_section,
                         bfd *output_bfd,
                         char ** error_message ATTRIBUTE_UNUSED)
@@ -750,7 +599,7 @@
 
       /* In case of relocateable link and if the reloc is against a
          section symbol, the addend needs to be adjusted according to
-         where the section symbol winds up in the output section.  */ 
+         where the section symbol winds up in the output section.  */
 
       if ((symbol_in->flags & BSF_SECTION_SYM) && symbol_in->section)
         reloc_entry->addend += symbol_in->section->output_offset;
@@ -759,9 +608,9 @@
     }
 
   /* Return an error if the symbol is not defined. An undefined weak
-     symbol is considered to have a value of zero (SVR4 ABI, p. 4-27). */ 
+     symbol is considered to have a value of zero (SVR4 ABI, p. 4-27). */
 
-  if (symbol_in != NULL && bfd_is_und_section (symbol_in->section) 
+  if (symbol_in != NULL && bfd_is_und_section (symbol_in->section)
       && ((symbol_in->flags & BSF_WEAK) == 0))
     return bfd_reloc_undefined;
 
@@ -851,6 +700,7 @@
       /* Extract the instruction opcode alone from 'insn' */
       insn = insn & 0xf8010030;
 
+
       insn |= ((((sym_value >> 1) & 0x3ff) << 17)
                | (((sym_value >> 1) & 0xffc00) >> 4)
                | (((sym_value >> 1) & 0xf00000) >> 20));
@@ -924,7 +774,7 @@
 {
   bfd_vma value = 0;
 
-  if (bfd_big_endian(abfd)) { 
+  if (bfd_big_endian(abfd)) {
     value = bfd_get_32 (abfd, data);
   }
   else {
@@ -933,10 +783,10 @@
     value |= (bfd_get_8 (abfd, data + 2) & 255);
     value |= ((bfd_get_8 (abfd, data + 3) & 255) << 8);
   }
- 
+
   return value;
 }
- 
+
 static void
 bfd_put_32_me (bfd *abfd, bfd_vma value,unsigned char *data)
 {
@@ -944,24 +794,50 @@
   bfd_put_16 (abfd, value & 0xffff, data + 2);
 }
 
+/* Handle PC relative relocation */
+bfd_reloc_status_type
+arc_elf_b22_pcrel (bfd *abfd ATTRIBUTE_UNUSED,
+                   arelent *reloc_entry,
+                   asymbol *symbol,
+                   PTR data ATTRIBUTE_UNUSED,
+                   asection *input_section,
+                   bfd *output_bfd,
+                   char **error_message ATTRIBUTE_UNUSED)
+{
+  /* If incremental linking, update the address of the relocation with the
+     section offset */
+
+
+  if (output_bfd != (bfd *) NULL)
+  {
+    reloc_entry->address += input_section->output_offset;
+    if ((symbol->flags & BSF_SECTION_SYM) && symbol->section)
+      reloc_entry->addend  += ((**(reloc_entry->sym_ptr_ptr)).section)->output_offset;
+
+    return bfd_reloc_ok;
+  }
+
+  return bfd_reloc_continue;
+}
 
 /* ******************************************
- * PIC-related routines for the arc backend 
+ * PIC-related routines for the arc backend
  * ******************************************/
 
-/* This will be overridden by the interpreter specified in
+/* This will be overridden by the interpreter ld-linux.so specified in
    the linker specs */
-#define ELF_DYNAMIC_INTERPRETER  "/sbin/ld-uClibc.so"
+#define ELF_DYNAMIC_INTERPRETER  "/sbin/ld-uClibc-0.9.26.so"
+/*"/usr/local/arc/lib/libc.so.1"*/
 
 /* size of one plt entry */
 #define PLT_ENTRY_SIZE  12
 
 /* The zeroth entry in the absolute plt entry */
-static const bfd_byte elf_arc_abs_plt0_entry [2 * PLT_ENTRY_SIZE] = 
-  { 
+static const bfd_byte elf_arc_abs_plt0_entry [2 * PLT_ENTRY_SIZE] =
+  {
     0x00, 0x16,			/* ld %r11, [0] */
     0x0b, 0x70,
-    0x00, 0x00, 
+    0x00, 0x00,
     0x00, 0x00,
     0x00, 0x16,			/* ld %r10, [0] */
     0x0a, 0x70,			/*  */
@@ -974,22 +850,22 @@
   };
 
 /* Contents of the subsequent entries in the absolute plt */
-static const bfd_byte elf_arc_abs_pltn_entry [PLT_ENTRY_SIZE] = 
-  { 
+static const bfd_byte elf_arc_abs_pltn_entry [PLT_ENTRY_SIZE] =
+  {
     0x30, 0x27,			/* ld %r12, [%pc,func@gotpc] */
     0x8c, 0x7f,			/* ------ " " -------------- */
     0x00, 0x00,			/* ------ " " -------------- */
     0x00, 0x00,			/* ------ " " -------------- */
-    0x20, 0x7c, 		/* j_s.d [%r12]              */ 
+    0x20, 0x7c, 		/* j_s.d [%r12]              */
     0xef, 0x74,			/* mov_s %r12, %pcl          */
   };
 
 /* The zeroth entry in the pic plt entry */
-static const bfd_byte elf_arc_pic_plt0_entry [2 * PLT_ENTRY_SIZE] = 
-  { 
+static const bfd_byte elf_arc_pic_plt0_entry [2 * PLT_ENTRY_SIZE] =
+  {
     0x30, 0x27,			/* ld %r11, [pcl,0] : 0 to be replaced by _DYNAMIC@GOTPC+4 */
     0x8b, 0x7f,
-    0x00, 0x00, 
+    0x00, 0x00,
     0x00, 0x00,
     0x30, 0x27,			/* ld %r10, [pcl,0] : 0 to be replaced by -DYNAMIC@GOTPC+8  */
     0x8a, 0x7f,			/*  */
@@ -1002,80 +878,34 @@
   };
 
 /* Contents of the subsequent entries in the pic plt */
-static const bfd_byte elf_arc_pic_pltn_entry [PLT_ENTRY_SIZE] = 
-  { 
+static const bfd_byte elf_arc_pic_pltn_entry [PLT_ENTRY_SIZE] =
+  {
     0x30, 0x27,			/* ld %r12, [%pc,func@got]   */
     0x8c, 0x7f,			/* ------ " " -------------- */
     0x00, 0x00,			/* ------ " " -------------- */
     0x00, 0x00,			/* ------ " " -------------- */
-    0x20, 0x7c, 		/* j_s.d [%r12]              */ 
+    0x20, 0x7c, 		/* j_s.d [%r12]              */
     0xef, 0x74,			/* mov_s %r12, %pcl          */
   };
 
 
 /* Function: arc_plugin_one_reloc
  * Brief   : Fill in the relocated value of the symbol into an insn
- *           depending on the relocation type. The instruction is 
+ *           depending on the relocation type. The instruction is
  *           assumed to have been read in the correct format (ME / LE/ BE)
- * Args    : 1. insn              : the original insn into which the relocated
- *                                  value has to be filled in.  
- *           2. rel               : the relocation entry.  
- *           3. value             : the value to be plugged in the insn.  
- *           4. overflow_detected : Pointer to short to indicate relocation
- *                                  overflows.
- *           5. symbol_defined    : bool value representing if the symbol
- *                                  definition is present.  
+ * Args    : 1. insn   : the original insn into which the relocated
+ *                       value has to be filled in.
+ *           2. r_type : the relocation type.
+ *           3. value  : the value to be plugged in the insn.
  * Returns : the insn with the relocated value plugged in.
  */
+/* FIXME::: Ramana this whole function needs to check for overflows. */
 static unsigned long
-arc_plugin_one_reloc (unsigned long insn, Elf_Internal_Rela *rel,
-                      int value,
-                      short *overflow_detected, bfd_boolean symbol_defined
-		      )
+arc_plugin_one_reloc (unsigned long insn, enum elf_arc_reloc_type r_type,
+		      int value)
 {
   unsigned long offset;
-  long long check_overfl_pos,check_overfl_neg;
-  reloc_howto_type *howto;
-  enum elf_arc_reloc_type r_type;
 
-  r_type           = ELF32_R_TYPE (rel->r_info);
-  howto            = arc_elf_calculate_howto_index(r_type);
-
-  if (arc_signed_reloc_type [howto->type] == 1)
-    {
-      check_overfl_pos = (long long)1 << (howto->bitsize-1);
-      check_overfl_neg = -check_overfl_pos;
-      if ((value >= check_overfl_pos) || (check_overfl_neg > value))
-	*overflow_detected = 1;
-    }
-  else
-    {
-      check_overfl_pos = (long long)1 << (howto->bitsize);
-      check_overfl_neg = 0;
-      if ((unsigned int) value >= check_overfl_pos)
-	*overflow_detected = 1;
-    }
-
-    if (*overflow_detected
-      && symbol_defined == TRUE)
-    {
-      (*_bfd_error_handler ) ("Error: Overflow detected in relocation value;");
-      if (howto->pc_relative)
-	(*_bfd_error_handler) ("Relocation value should be between %lld and %lld whereas it  %d",
-			     check_overfl_pos - 1, (signed long long) check_overfl_neg,
-			      value);
-      else
-	(*_bfd_error_handler) ("Relocation value should be between %lld and %lld whereas it  %ld",
-			       check_overfl_pos - 1, (signed long long) check_overfl_neg,
-			       (unsigned int) value);
-
-      bfd_set_error (bfd_error_bad_value);
-      *overflow_detected = 1;
-      return 0;
-    }
-  else
-    *overflow_detected = 0;
-  
   switch(r_type)
   {
     case R_ARC_B26:
@@ -1089,36 +919,33 @@
 
       /* Extract the instruction opcode alone from 'insn' */
       insn = insn & 0xff000000;
-      /* With the addend now being in the addend table, there is no 
-       * need to use this 
+      /* With the addend now being in the addend table, there is no
+       * need to use this
        */
       /* Ramana : No longer required since
-       * addends no longer exist in place 
+       * addends no longer exist in place
        */
       /*      value += offset; */
       insn |= ((value >> 2) & (~0xff000000));
       break;
-	
+
     case R_ARC_B22_PCREL:
 	/* Retrieve the offset from the instruction, if any */
 	/* Extract the first 10 bits from Position 6 to 15 in insn */
 	offset = ((insn << 5) >> 12);
-	
+
 	/* Fill in 2 bit to get the 22 bit Offset Value */
 	offset = offset << 2;
-	
+
 	/* Extract the instruction opcode alone from 'insn' */
 	insn = insn & 0xf800007f;
-	
-	/* Ramana: All addends exist in the relocation table. Ignore
-	 *  the in place addend 
-	 */
-	/*value += offset; */
-	
+
+	value += offset;
+
 	insn |= ((value >> 2) << 7) & (~0xf800007f);
-	
+
 	break;
-	
+
     case R_ARC_S21H_PCREL:
       /* Retrieve the offset from the instruction, if any */
       /* Extract the first 10 bits from Position 6 to 15 in insn */
@@ -1134,12 +961,12 @@
       insn = insn & 0xf801003f;
 
 
-      
+
       /* Ramana: All addends exist in the relocation table. Ignore
-       *  the in place addend 
+       *  the in place addend
        */
       /*value += offset; */
-      
+
 
       insn |= ((((value >> 1) & 0x3ff) << 17)
                | (((value >> 1) & 0xffc00) >> 4));
@@ -1159,9 +986,9 @@
       insn = insn & 0xf803003f;
 
       /* Ramana: All addends exist in the relocation table. Ignore
-       *  the in place addend 
+       *  the in place addend
        */
-      
+
       /*value += offset;*/
 
 
@@ -1187,9 +1014,9 @@
       insn = insn & 0xf8010030;
 
       /* Ramana: All addends exist in the relocation table. Ignore
-       *  the in place addend 
+       *  the in place addend
        */
-      
+
       /* value += offset; */
 
       insn |= ((((value >> 1) & 0x3ff) << 17)
@@ -1215,31 +1042,31 @@
       {
 	insn = insn & 0xf803003f;
       }
-    
+
     insn |= ((((value >> 2) & 0x1ff) << 18)
 	     | (((value >> 2) & 0x7fe00) >> 3));
     break;
   case R_ARC_S25W_PCREL:
 
-       /* Retrieve the offset from the instruction, if any */ 	 
-       /* Extract the high 4 bits from Position 0 to 3 in insn */ 	 
-       offset = ((insn << 28) >> 28) << 10; 	 
-  	 
-       /* Extract the next 10 bits from Position 6 to 15 in insn */ 	 
-       offset |= ((insn << 16) >> 22); 	 
-       offset = offset << 9; 	 
-  	 
-       /* Extract the remaining 9 bits from Position 18 to 26 in insn */ 	 
-       offset |= ((insn << 5) >> 23); 	 
-  	 
-       /* Fill in 2 bits to get the 25 bit Offset Value */ 	 
+       /* Retrieve the offset from the instruction, if any */
+       /* Extract the high 4 bits from Position 0 to 3 in insn */
+       offset = ((insn << 28) >> 28) << 10;
+
+       /* Extract the next 10 bits from Position 6 to 15 in insn */
+       offset |= ((insn << 16) >> 22);
+       offset = offset << 9;
+
+       /* Extract the remaining 9 bits from Position 18 to 26 in insn */
+       offset |= ((insn << 5) >> 23);
+
+       /* Fill in 2 bits to get the 25 bit Offset Value */
        offset = offset << 2;
       /* Extract the instruction opcode alone from 'insn' */
       insn = insn & 0xf8030030;
       /* Ramana: All addends exist in the relocation table. Ignore
-       *  the in place addend 
+       *  the in place addend
        */
-      
+
       /* value += offset; 	 */
 
       insn |= ((((value >> 2) & 0x1ff) << 18)
@@ -1258,9 +1085,9 @@
       insn = (insn & 0xf800ffff);
 
       /* Ramana: All addends exist in the relocation table. Ignore
-       *  the in place addend 
+       *  the in place addend
        */
-      
+
       /* value += offset; */
 
       insn |= ((value >> 2) & 0x7ff) << 16;
@@ -1272,53 +1099,23 @@
   case R_ARC_GOTPC32:
   case R_ARC_32_ME:
       insn = value;
-      
+
   case R_ARC_8:
   case R_ARC_16:
   case R_ARC_24:
-    /* One would have to OR the value here since 
+    /* One would have to OR the value here since
        insn would contain the bits read in correctly. */
 
-    
+
     insn |= value ;
       break;
-
-  case R_ARC_SDA32_ME:
-    insn |= value;
-    break;
- 
-  case R_ARC_SDA_LDST2:
-    value >>= 1;
-  case R_ARC_SDA_LDST1:
-    value >>= 1;
-  case R_ARC_SDA_LDST:
-    value &= 0x1ff;
-    insn |= ( ((value & 0xff) << 16)  | ((value >> 8) << 15));
-    break;
-
-  case R_ARC_SDA16_LD:
-    /* FIXME: The 16-bit insns shd not come in as higher bits of a 32-bit word */
-    insn |= (value & 0x1ff) <<16;
-    break;
-
-  case R_ARC_SDA16_LD1:
-    /* FIXME: The 16-bit insns shd not come in as higher bits of a 32-bit word */
-    insn |= ((value >> 1) & 0x1ff ) <<16;
-    break;
-
-  case R_ARC_SDA16_LD2:
-    /* FIXME: The 16-bit insns shd not come in as higher bits of a 32-bit word */
-    insn |= ((value >> 2) & 0x1ff) <<16;
-    break;
-
   default:
-    /* FIXME:: This should go away once the HOWTO Array 
-       is used for this purpose. 
+    /* FIXME:: This should go away once the HOWTO Array
+       is used for this purpose.
     */
-    fprintf(stderr, "Unsupported reloc used : %s (value = %d)\n", (arc_elf_calculate_howto_index(r_type))->name, value);
     break;
   }
-  
+
   return insn;
 }
 
@@ -1332,9 +1129,9 @@
  * Returns  : True/False as the return status.
  */
 static bfd_boolean
-elf_arc_check_relocs (bfd *abfd, 
-                      struct bfd_link_info *info, 
-                      asection *sec, 
+elf_arc_check_relocs (bfd *abfd,
+                      struct bfd_link_info *info,
+                      asection *sec,
                       const Elf_Internal_Rela *relocs)
 {
   bfd *dynobj;
@@ -1434,7 +1231,7 @@
 		}
 
 
-	      h->got.offset = sgot->size;
+	      h->got.offset = sgot->rawsize;
 	      BFD_DEBUG_PIC(fprintf(stderr, "got entry stab entry %d got offset=0x%x\n",r_symndx,
 				    h->got.offset));
 
@@ -1446,7 +1243,7 @@
 		}
 
 	      BFD_DEBUG_PIC(fprintf (stderr, "Got raw size increased\n"));
-	      srelgot->size += sizeof (Elf32_External_Rela);
+	      srelgot->rawsize += sizeof (Elf32_External_Rela);
 	    }
 	  else
 	    {
@@ -1475,21 +1272,21 @@
 
 	      BFD_DEBUG_PIC(fprintf(stderr, "got entry stab entry %d\n",r_symndx));
 
-	      
-	      local_got_offsets[r_symndx] = sgot->size;
+
+	      local_got_offsets[r_symndx] = sgot->rawsize;
 
 	      if (info->shared)
 		{
 		  /* If we are generating a shared object, we need to
                      output a R_ARC_RELATIVE reloc so that the dynamic
                      linker can adjust this GOT entry.  */
-		  srelgot->size += sizeof (Elf32_External_Rela);
+		  srelgot->rawsize += sizeof (Elf32_External_Rela);
 		}
 	    }
-	  
+
 	  BFD_DEBUG_PIC(fprintf (stderr, "Got raw size increased\n"));
 
-	  sgot->size += 4;
+	  sgot->rawsize += 4;
 
 	  break;
 
@@ -1528,7 +1325,8 @@
 	  if (info->shared
 	      && (ELF32_R_TYPE (rel->r_info) != R_ARC_PC32
 		  || (h != NULL
-		      && (!info->symbolic || !h->def_regular))))
+		      && (! info->symbolic
+			  || (h->def_regular) == 0))))
 	    {
 	      /* When creating a shared object, we must copy these
                  reloc types into the output file.  We create a reloc
@@ -1565,7 +1363,7 @@
 		    }
 		}
 
-	      sreloc->size += sizeof (Elf32_External_Rela);
+	      sreloc->rawsize += sizeof (Elf32_External_Rela);
 
 	      /* If we are linking with -Bsymbolic, and this is a
                  global symbol, we count the number of PC relative
@@ -1619,7 +1417,7 @@
 /* Function : elf_arc_relocate_section
  * Brief    : Relocate an arc section, by handling all the relocations
  *           appearing in that section.
- * Args     : output_bfd    : The bfd being written to. 
+ * Args     : output_bfd    : The bfd being written to.
  *            info          : Link information.
  *            input_bfd     : The input bfd.
  *            input_section : The section being relocated.
@@ -1627,18 +1425,18 @@
  *            relocs        : List of relocations in the section.
  *            local_syms    : is a pointer to the swapped in local symbols.
  *            local_section : is an array giving the section in the input file
- *                            corresponding to the st_shndx field of each 
+ *                            corresponding to the st_shndx field of each
  *                            local symbol.
- * Returns  :  
+ * Returns  :
  */
 static bfd_boolean
-elf_arc_relocate_section (bfd *output_bfd, 
-                          struct bfd_link_info *info, 
-                          bfd *input_bfd, 
+elf_arc_relocate_section (bfd *output_bfd,
+                          struct bfd_link_info *info,
+                          bfd *input_bfd,
                           asection *input_section,
-			  bfd_byte * contents, 
-                          Elf_Internal_Rela *relocs, 
-                          Elf_Internal_Sym *local_syms, 
+					      bfd_byte * contents,
+                          Elf_Internal_Rela *relocs,
+                          Elf_Internal_Sym *local_syms,
                           asection **local_sections)
 {
   bfd *dynobj;
@@ -1650,7 +1448,6 @@
   asection *sreloc;
   Elf_Internal_Rela *rel;
   Elf_Internal_Rela *relend;
-  short overflow_detected=0;
 
   dynobj = elf_hash_table (info)->dynobj;
   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
@@ -1673,9 +1470,8 @@
       asection *sec;
       bfd_vma relocation;
       bfd_reloc_status_type r;
-      bfd_boolean symbol_defined = TRUE;
 
-      /* Distance of the relocation slot in the insn .This value is used for 
+      /* Distance of the relocation slot in the insn .This value is used for
 	 handling relative relocations. */
       long offset_in_insn = 0;
 
@@ -1684,7 +1480,7 @@
 
 
       r_type = ELF32_R_TYPE (rel->r_info);
-      
+
       if (r_type >= (int) R_ARC_max)
 	{
 	  bfd_set_error (bfd_error_bad_value);
@@ -1706,7 +1502,7 @@
 	     in which case we have to adjust according to where the
 	     section symbol winds up in the output section.  */
 
-	  /* Checks if this is a local symbol 
+	  /* Checks if this is a local symbol
 	   * and thus the reloc might (will??) be against a section symbol.
 	   */
 	  if (r_symndx < symtab_hdr->sh_info)
@@ -1716,15 +1512,13 @@
 		{
 		  sec = local_sections[r_symndx];
 
-		  /* for RELA relocs.Just adjust the addend 
+		  /* for RELA relocs.Just adjust the addend
 		     value in the relocation entry.  */
 		  rel->r_addend += sec->output_offset + sym->st_value;
 
 		  BFD_DEBUG_PIC(fprintf (stderr, "local symbols reloc \
-(section=%d %s) seen in %s\n", \
-					 r_symndx,\
-					 local_sections[r_symndx]->name, \
-					 __PRETTY_FUNCTION__)); 
+(section=%d %s) seen in %s\n", r_symndx, local_sections[r_symndx]->name, \
+					 __PRETTY_FUNCTION__));
 		}
 	    }
 
@@ -1751,18 +1545,18 @@
 	    {
 	      asection *msec;
 	      msec = sec;
-	      rel->r_addend = _bfd_elf_rel_local_sym (output_bfd, sym, 
+	      rel->r_addend = _bfd_elf_rel_local_sym (output_bfd, sym,
 						      &msec, rel->r_addend);
  	      rel->r_addend -= relocation;
 	      rel->r_addend += msec->output_section->vma + msec->output_offset;
 	    }
-	  
-	  relocation += rel->r_addend; 
+
+	  relocation += rel->r_addend;
 	}
       else
 	{
 	  /* Global symbols */
-	  
+
 	  /* get the symbol's entry in the symtab */
 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
 
@@ -1782,10 +1576,10 @@
 		      && elf_hash_table (info)->dynamic_sections_created
 		      && (! info->shared
 			  || (! info->symbolic && h->dynindx != -1)
-			  || !h->def_regular))
+			  || (h->def_regular) == 0))
 		  || (info->shared
 		      && ((! info->symbolic && h->dynindx != -1)
-			  || !h->def_regular)
+			  || (h->def_regular) == 0)
 		      && (r_type == R_ARC_32
 			  || r_type == R_ARC_PC32)
 		      && (input_section->flags & SEC_ALLOC) != 0))
@@ -1803,13 +1597,6 @@
 		     bfd_get_section_name (input_bfd, input_section));
 		  relocation = 0;
 		}
-	    else if (0 && r_type == R_ARC_SDA16_LD2) /* FIXME: delete this piece of code */
-	      {
-		  relocation = (h->root.u.def.value
-				+ sec->output_offset);
-		  /* add the addend since the arc has RELA relocations */
-		  relocation += rel->r_addend;
-	      }
 	      else
 		{
 		  relocation = (h->root.u.def.value
@@ -1829,7 +1616,6 @@
 		     (info, h->root.root.string,
 		      input_bfd, input_section, rel->r_offset, TRUE)))
 		return FALSE;
-	      symbol_defined = FALSE;
 	      relocation = 0;
 	    }
 	}
@@ -1858,7 +1644,7 @@
 	      if (! elf_hash_table (info)->dynamic_sections_created
 		  || (info->shared
 		      && (info->symbolic || h->dynindx == -1)
-		      && h->def_regular))
+		      && (h->def_regular)))
 		{
 		  /* This is actually a static link, or it is a
 		     -Bsymbolic link and the symbol is defined
@@ -1908,7 +1694,7 @@
 		    {
 		      asection *srelgot;
 		      Elf_Internal_Rela outrel;
-		      bfd_byte *loc;		      
+		      bfd_byte *loc;
 
 		      srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
 		      BFD_ASSERT (srelgot != NULL);
@@ -1933,7 +1719,7 @@
 	    }
 
 	  BFD_DEBUG_PIC(fprintf(stderr, "RELOCATION =%x\n",relocation));
-	  /* the data in GOT32 relocs is 4 bytes into the insn */
+	  /* the data in GOTPC32 relocs is 4 bytes into the insn */
 	  offset_in_insn = 4;
 
 	  break;
@@ -1968,7 +1754,7 @@
 	    }
 
 	  relocation = sgot->output_section->vma;
-	  
+
 	  offset_in_insn = 4;
 	  break;
 
@@ -2008,7 +1794,8 @@
 	      && (r_type != R_ARC_PC32
 		  || (h != NULL
 		      && h->dynindx != -1
-		      && (!info->symbolic || !h->def_regular))))
+		      && (! info->symbolic
+			  || (h->def_regular) == 0))))
 	    {
 	      Elf_Internal_Rela outrel;
 	      bfd_boolean skip, relocate;
@@ -2041,13 +1828,13 @@
 
 	      skip = FALSE;
 
-	      outrel.r_offset = _bfd_elf_section_offset (output_bfd, 
-							 info, 
+	      outrel.r_offset = _bfd_elf_section_offset (output_bfd,
+							 info,
 							 input_section,
 							 rel->r_offset);
 	      if (outrel.r_offset == (bfd_vma) -1)
 		  skip = TRUE;
-	      	      
+
 	      outrel.r_addend = 0;
 	      outrel.r_offset += (input_section->output_section->vma
 				  + input_section->output_offset);
@@ -2072,7 +1859,7 @@
                      become local.  */
 		  if (h == NULL
 		      || ((info->symbolic || h->dynindx == -1)
-			  && h->def_regular))
+			  && (h->def_regular) != 0))
 		    {
 		      relocate = TRUE;
 		      outrel.r_addend = 0;
@@ -2114,38 +1901,7 @@
  	  offset_in_insn = -4;
 	  break;
 
-	case R_ARC_SDA32_ME:
-
-	case R_ARC_SDA_LDST:
-	case R_ARC_SDA_LDST1:
-	case R_ARC_SDA_LDST2:
-
-	case R_ARC_SDA16_LD:
-	case R_ARC_SDA16_LD1:
-	case R_ARC_SDA16_LD2:
-	  {
-	    /* Get the base of .sdata section */
-	    struct elf_link_hash_entry *h;
-	    
-	    h = elf_link_hash_lookup (elf_hash_table (info), "__SDATA_BEGIN__",
-				      FALSE, FALSE, TRUE);
-	    
-	    if (h->root.type == bfd_link_hash_undefined)
-	    {
-	      (*_bfd_error_handler)("Error: Linker symbol __SDATA_BEGIN__ not found");
-	      bfd_set_error (bfd_error_bad_value);
-	      return FALSE;
-	    }
-
-	    /* Subtract the address of __SDATA_BEGIN__ from the relocation value */
-	    ///	    fprintf (stderr, "relocation BEFORE = 0x%x SDATA_BEGIN = 0x%x\n", relocation, h->root.u.def.value);
-	    relocation -= (h->root.u.def.value + h->root.u.def.section->output_section->vma);
-	    //	    fprintf (stderr, "relocation AFTER = 0x%x SDATA_BEGIN = 0x%x\n", relocation, h->root.u.def.value);
-	    break;
-	  }
 	default:
-	  /* FIXME: Putting in a random dummy relocation value for the time being */
-	  //	  fprintf (stderr, "In %s, relocation = 0x%x,  r_type = %d\n", __PRETTY_FUNCTION__, relocation, r_type);
 	  break;
 	}
 
@@ -2158,50 +1914,36 @@
 	  insn = bfd_get_32_me (input_bfd, contents + rel->r_offset);
 	else
 	  insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
-      
-      BFD_DEBUG_PIC(fprintf(stderr, "relocation before the pc relative stuff @offset 0x%x= %d[0x%x]\n", 
+
+      BFD_DEBUG_PIC(fprintf(stderr, "relocation before the pc relative stuff @offset 0x%x= %d[0x%x]\n",
 			    rel->r_offset,relocation, relocation));
 
       BFD_DEBUG_PIC(fprintf(stderr,"addend = 0x%x\n",rel->r_addend));
 
       /* For branches we need to find the offset from pcl rounded down to 4 byte boundary.Hence the (& ~3) */
-      if (howto->pc_relative || r_type==R_ARC_PLT32 || r_type==R_ARC_GOTPC || r_type==R_ARC_GOTPC32)
+      if (howto->pc_relative || r_type==R_ARC_PLT32 || r_type==R_ARC_GOTPC)
 	{
-	  relocation -= (((input_section->output_section->vma + input_section->output_offset + rel->r_offset) & ~3) - offset_in_insn );
+	  relocation -= (((input_section->output_section->vma + input_section->output_offset +
+			   rel->r_offset) & ~3) - offset_in_insn );
 	}
-#if 0
       else if (r_type==R_ARC_GOTPC32)
 	{
-	  relocation -= (input_section->output_section->vma + 
-			 input_section->output_offset + rel->r_offset 
+	  relocation -= (input_section->output_section->vma +
+			 input_section->output_offset + rel->r_offset
 			 - offset_in_insn );
 	}
-#endif
 
 
 
-      BFD_DEBUG_PIC(fprintf(stderr, "relocation AFTER the pc relative handling = %d[0x%x]\n", relocation, relocation));
+      BFD_DEBUG_PIC(fprintf(stderr, \
+			    "relocation AFTER the pc relative \
+handling = %d[0x%x]\n", relocation, relocation));
 
       /* What does the modified insn look like */
-      insn = arc_plugin_one_reloc (insn, rel, relocation,
-				   &overflow_detected, symbol_defined);
+      insn = arc_plugin_one_reloc (insn, r_type, relocation);
 
-      if (overflow_detected)
-	{
-	  if(h)
-	    (*_bfd_error_handler) ("Global symbol: \"%s\".", h->root.root.string);
-	  else
-	    (*_bfd_error_handler) ("Local symbol: \"%s\".", local_sections[r_symndx]->name);
-	  (*_bfd_error_handler) ("\nRelocation type is:%s \nFileName:%s \
-                             \nSection Name:%s\
-                             \nOffset in Section:%ld", howto->name, bfd_get_filename (input_bfd),
-			     bfd_get_section_name (input_bfd, input_section),
-			     rel->r_offset);
-
-	  return FALSE;
-	}
-      
-      BFD_DEBUG_PIC (fprintf (stderr, "Relocation = %d [0x%x]\n", relocation, relocation));
+      BFD_DEBUG_PIC (fprintf (stderr, "Relocation = %d [0x%x]\n", \
+			      relocation, relocation));
 
       /* now write back into the section, with middle endian encoding
 	 only for executable section */
@@ -2214,7 +1956,7 @@
 	  bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
 
       r = bfd_reloc_ok;
-      
+
 
       if (r != bfd_reloc_ok)
 	{
@@ -2239,34 +1981,35 @@
 		    if (*name == '\0')
 		      name = bfd_section_name (input_bfd, sec);
 		  }
+		/* <irf-todo>
 		if (! ((*info->callbacks->reloc_overflow)
-		       (info, (h ? &h->root : NULL), name, howto->name,
-			(bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
-		  return FALSE;
+		       (info, name, howto->name, (bfd_vma) 0,
+			input_bfd, input_section, rel->r_offset)))
+		  return FALSE;*/
 	      }
 	      break;
 	    }
 	}
-      
+
     }
-  
+
   return TRUE;
 }
 
 
 /* Function :  elf_arc_finish_dynamic_symbol
  * Brief    :  Finish up dynamic symbol handling.  We set the
- *           contents of various dynamic sections here.  
- * Args     :  output_bfd : 
+ *           contents of various dynamic sections here.
+ * Args     :  output_bfd :
  *             info       :
  *             h          :
  *             sym        :
  * Returns  : True/False as the return status.
  */
 static bfd_boolean
-elf_arc_finish_dynamic_symbol (bfd *output_bfd, 
-                               struct bfd_link_info *info, 
-                               struct elf_link_hash_entry *h, 
+elf_arc_finish_dynamic_symbol (bfd *output_bfd,
+                               struct bfd_link_info *info,
+                               struct elf_link_hash_entry *h,
                                Elf_Internal_Sym *sym)
 {
   bfd *dynobj;
@@ -2350,7 +2093,7 @@
 
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
 
-      if (!h->def_regular)
+      if ((h->def_regular) == 0)
 	{
 	  /* Mark the symbol as undefined, rather than as defined in
 	     the .plt section.  Leave the value alone.  */
@@ -2384,7 +2127,7 @@
 	 initialized in the relocate_section function.  */
       if (info->shared
 	  && (info->symbolic || h->dynindx == -1)
-	  && h->def_regular)
+	  && (h->def_regular))
 	{
 	  rel.r_addend = 0;
 	  rel.r_info = ELF32_R_INFO (0, R_ARC_RELATIVE);
@@ -2398,12 +2141,12 @@
 	}
 
       loc = srel->contents;
-      loc += srel->reloc_count++ * sizeof (Elf32_External_Rela);/* relA */
-      
+      loc += srel->reloc_count++ * sizeof (Elf32_External_Rel);
+
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
     }
 
-  if (h->needs_copy)
+  if ((h->needs_copy) != 0)
     {
       asection *s;
       Elf_Internal_Rela rel;
@@ -2418,8 +2161,7 @@
       s = bfd_get_section_by_name (h->root.u.def.section->owner,
 				   ".rela.bss");
       BFD_ASSERT (s != NULL);
-      
-      rel.r_addend = 0;
+
       rel.r_offset = (h->root.u.def.value
 		      + h->root.u.def.section->output_section->vma
 		      + h->root.u.def.section->output_offset);
@@ -2427,7 +2169,7 @@
 
       loc =  s->contents;
       loc += s->reloc_count++ * sizeof (Elf32_External_Rela); /* relA */
-      
+
       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
     }
 
@@ -2442,15 +2184,14 @@
 
 
 /* Function :  elf_arc_finish_dynamic_sections
- * Brief    :  Finish up the dynamic sections handling.  
- * Args     :  output_bfd : 
+ * Brief    :  Finish up the dynamic sections handling.
+ * Args     :  output_bfd :
  *             info       :
  *             h          :
  *             sym        :
  * Returns  : True/False as the return status.
  */
-static bfd_boolean
-elf_arc_finish_dynamic_sections (bfd *output_bfd,struct bfd_link_info *info)
+static bfd_boolean elf_arc_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *sgot;
@@ -2473,7 +2214,7 @@
       BFD_ASSERT (splt != NULL && sdyn != NULL);
 
       dyncon = (Elf32_External_Dyn *) sdyn->contents;
-      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
+      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->rawsize);
       for (; dyncon < dynconend; dyncon++)
 	{
 	  Elf_Internal_Dyn dyn;
@@ -2524,8 +2265,7 @@
 		else
 		  {
 		    (*_bfd_error_handler)
-		      ("warning: specified init/fini symbol %s not found.Defaulting to address of symbol %s", 
-		       name, oldname);
+		      ("warning: specified init/fini symbol %s not found.Defaulting to address of symbol %s", name, oldname);
 
 		    /* restore the default name */
 		    name = oldname;
@@ -2547,15 +2287,15 @@
 			       library and does not apply to this one.  */
 			    dyn.d_un.d_val = 0;
 			  }
-			
+
 			bfd_elf32_swap_dyn_out (dynobj, &dyn, dyncon);
 		      }
-		
+
 		  }
 
 	      }
 	      break;
-	      
+
 	    case DT_PLTGOT:
 	      name = ".plt";
 	      goto get_vma;
@@ -2571,7 +2311,10 @@
 	    case DT_PLTRELSZ:
 	      s = bfd_get_section_by_name (output_bfd, ".rela.plt");
 	      BFD_ASSERT (s != NULL);
-	      dyn.d_un.d_val = s->size;
+	      if (s->size != 0)
+		dyn.d_un.d_val = s->size;
+	      else
+		dyn.d_un.d_val = s->rawsize;
 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
 	      break;
 
@@ -2587,21 +2330,25 @@
 		 about changing the DT_REL entry.  */
 	      s = bfd_get_section_by_name (output_bfd, ".rela.plt");
 	      if (s != NULL)
-		dyn.d_un.d_val -= s->size;
+		{
+		  if (s->size != 0)
+		    dyn.d_un.d_val -= s->size;
+		  else
+		    dyn.d_un.d_val -= s->rawsize;
+		}
 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
 	      break;
 	    }
 	}
 
       /* Fill in the first entry in the procedure linkage table.  */
-      if (splt->size > 0)
+      if (splt->rawsize > 0)
 	{
 	  if (info->shared)
 	    {
 	      memcpy (splt->contents, elf_arc_pic_plt0_entry, 2 * PLT_ENTRY_SIZE);
-	      
-	      /* fill in the _DYNAMIC@GOTPC+4 and  
-		 _DYNAMIC@GOTPC+8 at PLT0+4 and PLT0+12 */
+
+	      /* fill in the   _DYNAMIC@GOTPC+4 and  _DYNAMIC@GOTPC+8 at PLT0+4 and PLT0+12 */
 	      bfd_put_32_me (output_bfd,
 			     ( sgot->output_section->vma + sgot->output_offset + 4 )
 			     -(splt->output_section->vma + splt->output_offset ),
@@ -2610,7 +2357,7 @@
 			     (sgot->output_section->vma + sgot->output_offset + 8)
 			     -(splt->output_section->vma + splt->output_offset +8),
 			     splt->contents + 12);
-	      
+
 	      /* put got base at plt0+12 */
 	      bfd_put_32 (output_bfd,
 			  (sgot->output_section->vma + sgot->output_offset),
@@ -2648,7 +2395,7 @@
 
 
   /* Fill in the first three entries in the global offset table.  */
-  if (sgot->size > 0)
+  if (sgot->rawsize > 0)
     {
       if (sdyn == NULL)
 	bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
@@ -2671,9 +2418,7 @@
    change the definition to something the rest of the link can
    understand.  */
 
-static bfd_boolean
-elf_arc_adjust_dynamic_symbol (struct bfd_link_info *info, 
-                               struct elf_link_hash_entry *h)
+static bfd_boolean elf_arc_adjust_dynamic_symbol (struct bfd_link_info * info, struct elf_link_hash_entry *h)
 {
   bfd *dynobj;
   asection *s;
@@ -2683,23 +2428,28 @@
 
   /* Make sure we know what is going on here.  */
   BFD_ASSERT (dynobj != NULL
-	      && (h->needs_plt
+	      && ((h->needs_plt)
 		  || h->u.weakdef != NULL
-		  || (h->def_dynamic && h->ref_regular && !h->def_regular)));
+		  || ((h->def_dynamic) != 0
+		      && (h->ref_regular) != 0
+		      && (h->def_regular) == 0)));
 
   /* If this is a function, put it in the procedure linkage table.  We
      will fill in the contents of the procedure linkage table later,
      when we know the address of the .got section.  */
-  if (h->type == STT_FUNC || h->needs_plt)
+  if (h->type == STT_FUNC
+      || (h->needs_plt) != 0)
     {
-      if (!info->shared && !h->def_dynamic && !h->ref_dynamic)
+      if (! info->shared
+	  && (h->def_dynamic) == 0
+	  && (h->ref_dynamic) == 0)
 	{
 	  /* This case can occur if we saw a PLT32 reloc in an input
              file, but the symbol was never referred to by a dynamic
              object.  In such a case, we don't actually need to build
              a procedure linkage table, and we can just do a PC32
              reloc instead.  */
-	  BFD_ASSERT (h->needs_plt);
+	  BFD_ASSERT ((h->needs_plt) != 0);
 	  return TRUE;
 	}
 
@@ -2715,43 +2465,44 @@
 
       /* If this is the first .plt entry, make room for the special
 	 first entry.  */
-      if (s->size == 0)
+      if (s->rawsize == 0)
 	{
-	  s->size += 2 *PLT_ENTRY_SIZE;
-	  BFD_DEBUG_PIC (fprintf (stderr, "first plt entry at %d\n", s->size));
+	  s->rawsize += 2 *PLT_ENTRY_SIZE;
+	  BFD_DEBUG_PIC (fprintf (stderr, "first plt entry at %d\n", s->rawsize));
 	}
-      else
-	{
-	  BFD_DEBUG_PIC (fprintf (stderr, "Next plt entry at %d\n", s->size));
-	}
-  
+      else {
+	  BFD_DEBUG_PIC (fprintf (stderr, "Next plt entry at %d\n", s->rawsize));
+  	  printf("Unimplimented path: elf32-arc.c: <Irf-todo>");
+  	  }
+
       /* If this symbol is not defined in a regular file, and we are
 	 not generating a shared library, then set the symbol to this
 	 location in the .plt.  This is required to make function
 	 pointers compare as equal between the normal executable and
 	 the shared library.  */
-      if (!info->shared && !h->def_regular)
+      if (! info->shared
+	  && (h->def_regular) == 0)
 	{
 	  h->root.u.def.section = s;
-	  h->root.u.def.value = s->size;
+	  h->root.u.def.value = s->rawsize;
 	}
 
-      h->plt.offset = s->size;
+      h->plt.offset = s->rawsize;
 
       /* Make room for this entry.  */
-      s->size += PLT_ENTRY_SIZE;
+      s->rawsize += PLT_ENTRY_SIZE;
 
       /* We also need to make an entry in the .got.plt section, which
 	 will be placed in the .got section by the linker script.  */
 
       s = bfd_get_section_by_name (dynobj, ".got.plt");
       BFD_ASSERT (s != NULL);
-      s->size += 4;
+      s->rawsize += 4;
 
       /* We also need to make an entry in the .rela.plt section.  */
       s = bfd_get_section_by_name (dynobj, ".rela.plt");
       BFD_ASSERT (s != NULL);
-      s->size += sizeof (Elf32_External_Rela);
+      s->rawsize += sizeof (Elf32_External_Rela);
 
       return TRUE;
     }
@@ -2801,7 +2552,7 @@
 
       srel = bfd_get_section_by_name (dynobj, ".rela.bss");
       BFD_ASSERT (srel != NULL);
-      srel->size += sizeof (Elf32_External_Rela);
+      srel->rawsize += sizeof (Elf32_External_Rela);
       h->needs_copy = 1;
     }
 
@@ -2812,7 +2563,8 @@
     power_of_two = 3;
 
   /* Apply the required alignment.  */
-  s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
+  s->rawsize = BFD_ALIGN (s->rawsize,
+			    (bfd_size_type) (1 << power_of_two));
   if (power_of_two > bfd_get_section_alignment (dynobj, s))
     {
       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
@@ -2821,10 +2573,10 @@
 
   /* Define the symbol as being at this point in the section.  */
   h->root.u.def.section = s;
-  h->root.u.def.value = s->size;
+  h->root.u.def.value = s->rawsize;
 
   /* Increment the section size to make room for the symbol.  */
-  s->size += h->size;
+  s->rawsize += h->size;
 
   return TRUE;
 }
@@ -2832,7 +2584,7 @@
 /* Set the sizes of the dynamic sections.  */
 
 static bfd_boolean
-elf_arc_size_dynamic_sections (bfd *output_bfd, 
+elf_arc_size_dynamic_sections (bfd *output_bfd,
                                struct bfd_link_info *info)
 {
   bfd *dynobj;
@@ -2847,13 +2599,13 @@
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       struct elf_link_hash_entry *h;
-      
+
       /* Set the contents of the .interp section to the interpreter.  */
       if (! info->shared)
 	{
 	  s = bfd_get_section_by_name (dynobj, ".interp");
 	  BFD_ASSERT (s != NULL);
-	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
+	  s->rawsize = sizeof ELF_DYNAMIC_INTERPRETER;
 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
 	}
 
@@ -2861,13 +2613,13 @@
 	 values later, in elf_bfd_final_link, but we must add the entries
 	 now so that we know the final size of the .dynamic section.  */
       /* Checking if the .init section is present. We also create DT_INIT / DT_FINE
-       * entries if the init_str has been changed by the user 
+       * entries if the init_str has been changed by the user
        */
       h =  elf_link_hash_lookup (elf_hash_table (info), "init", FALSE,
 				FALSE, FALSE);
       if ((h != NULL
-	   && (h->ref_regular || h->def_regular))
-	  || (strcmp (init_str, INIT_SYM_STRING) != 0))	      
+	  && (h->ref_regular || h->def_regular) != 0)
+	  || (strcmp(init_str,INIT_SYM_STRING) != 0))
 	{
 	    /*Ravi: changed from bfd_elf32_add_dynamic_entry */
 	    if (! _bfd_elf_add_dynamic_entry (info, DT_INIT, 0))
@@ -2876,9 +2628,9 @@
       h =  elf_link_hash_lookup (elf_hash_table (info), "fini", FALSE,
 				 FALSE, FALSE);
       if ((h != NULL
-	   && (h->ref_regular || h->def_regular))
-	  || (strcmp (fini_str, FINI_SYM_STRING) != 0))	      
-		      
+	  && (h->ref_regular || h->def_regular) != 0)
+	 || (strcmp(fini_str,FINI_SYM_STRING) != 0))
+
 	{
 	    /*Ravi: changed from bfd_elf32_add_dynamic_entry */
 	    if (! _bfd_elf_add_dynamic_entry (info, DT_FINI, 0))
@@ -2895,7 +2647,7 @@
          below.  */
       s = bfd_get_section_by_name (dynobj, ".rela.got");
       if (s != NULL)
-	s->size = 0;
+	s->rawsize = 0;
     }
 
   /* If this is a -Bsymbolic shared link, then we need to discard all
@@ -2905,7 +2657,7 @@
   if (info->shared && info->symbolic)
     elf_ARC_link_hash_traverse (elf_ARC_hash_table (info),
 				 elf_ARC_discard_copies,
-				 (void *) NULL);
+				 (PTR) NULL);
 
   /* The check_relocs and adjust_dynamic_symbol entry points have
      determined the sizes of the various dynamic sections.  Allocate
@@ -2929,7 +2681,7 @@
 
       if (strcmp (name, ".plt") == 0)
 	{
-	  if (s->size == 0)
+	  if (s->rawsize == 0)
 	    {
 	      /* Strip this section if we don't need it; see the
                  comment below.  */
@@ -2943,7 +2695,7 @@
 	}
       else if (strncmp (name, ".rela", 5) == 0)
 	{
-	  if (s->size == 0)
+	  if (s->rawsize == 0)
 	    {
 	      /* If we don't need this section, strip it from the
 		 output file.  This is mostly to handle .rela.bss and
@@ -3008,8 +2760,8 @@
 	}
 
       /* Allocate memory for the section contents.  */
-      s->contents = (bfd_byte *) bfd_alloc (dynobj, s->size);
-      if (s->contents == NULL && s->size != 0)
+      s->contents = (bfd_byte *) bfd_alloc (dynobj, s->rawsize);
+      if (s->contents == NULL && s->rawsize != 0)
 	return FALSE;
     }
 
@@ -3057,7 +2809,6 @@
 
   return TRUE;
 }
-
 /* Core file support. */
 /* Support for core dump NOTE sections.  */
 
@@ -3066,16 +2817,16 @@
 {
   int offset;
   size_t size;
-  
+
   switch (note->descsz)
     {
     default:
       return FALSE;
-      
+
     case 240:		/* Linux/ARC700 */
       /* pr_cursig */
       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
-      
+
       /* pr_pid */
       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
 
@@ -3085,7 +2836,7 @@
 
       break;
     }
-    
+
 
   /* Make a ".reg/999" section.  */
   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
@@ -3095,34 +2846,35 @@
 static bfd_boolean
 elf_arc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 {
-  
+
   switch (note->descsz)
     {
     default:
       return FALSE;
-      
+
     case 124:		/* ARC / Linux elf_prpsinfo.  */
       elf_tdata (abfd)->core_program
 	= _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
       elf_tdata (abfd)->core_command
 	= _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
     }
-  
-  
+
+
   /* Note that for some reason, a spurious space is tacked
      onto the end of the args in some (at least one anyway)
      implementations, so strip it off if it exists.  */
   {
     char *command = elf_tdata (abfd)->core_command;
     int n = strlen (command);
-    
+
     if (0 < n && command[n - 1] == ' ')
       command[n - 1] = '\0';
   }
-  
+
   return TRUE;
 }
 
+
 #define TARGET_LITTLE_SYM	bfd_elf32_littlearc_vec
 #define TARGET_LITTLE_NAME	"elf32-littlearc"
 #define TARGET_BIG_SYM		bfd_elf32_bigarc_vec
@@ -3132,24 +2884,48 @@
 #define ELF_MACHINE_ALT1	EM_ARCOMPACT
 #define ELF_MAXPAGESIZE		0x1000
 
-#define elf_info_to_howto                    arc_info_to_howto_rel
-#define elf_info_to_howto_rel                arc_info_to_howto_rel
-#define bfd_elf32_bfd_merge_private_bfd_data arc_elf_merge_private_bfd_data
-#define bfd_elf32_bfd_reloc_type_lookup      arc_elf32_bfd_reloc_type_lookup
 
-#define elf_backend_object_p                 arc_elf_object_p
-#define elf_backend_final_write_processing   arc_elf_final_write_processing
-#define elf_backend_relocate_section         elf_arc_relocate_section
-#define elf_backend_check_relocs             elf_arc_check_relocs
-#define elf_backend_adjust_dynamic_symbol    elf_arc_adjust_dynamic_symbol
+#define elf_info_to_howto	arc_info_to_howto_rel
+#define elf_info_to_howto_rel	arc_info_to_howto_rel
+#define bfd_elf32_bfd_merge_private_bfd_data \
+				arc_elf_merge_private_bfd_data
+#define bfd_elf32_bfd_reloc_type_lookup \
+                                arc_elf32_bfd_reloc_type_lookup
+static reloc_howto_type *
+bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                                 const char *r_name)
+{
+  unsigned int i;
 
-#define elf_backend_finish_dynamic_sections  elf_arc_finish_dynamic_sections
+  for (i = 0;
+       i < sizeof (elf_arc_howto_table) / sizeof (elf_arc_howto_table[0]);
+       i++)
+    if (elf_arc_howto_table[i].name != NULL
+        && strcasecmp (elf_arc_howto_table[i].name, r_name) == 0)
+      return &elf_arc_howto_table[i];
 
-#define elf_backend_finish_dynamic_symbol    elf_arc_finish_dynamic_symbol
+  return NULL;
+}
 
-#define elf_backend_create_dynamic_sections  _bfd_elf_create_dynamic_sections
+#define elf_backend_object_p	arc_elf_object_p
+#define elf_backend_final_write_processing \
+				arc_elf_final_write_processing
+#define elf_backend_relocate_section    elf_arc_relocate_section
+#define elf_backend_check_relocs	elf_arc_check_relocs
+#define elf_backend_adjust_dynamic_symbol \
+					elf_arc_adjust_dynamic_symbol
 
-#define elf_backend_size_dynamic_sections    elf_arc_size_dynamic_sections
+#define elf_backend_finish_dynamic_sections \
+					elf_arc_finish_dynamic_sections
+
+#define elf_backend_finish_dynamic_symbol \
+					elf_arc_finish_dynamic_symbol
+
+#define elf_backend_create_dynamic_sections \
+                                        _bfd_elf_create_dynamic_sections
+
+#define elf_backend_size_dynamic_sections \
+					elf_arc_size_dynamic_sections
 
 #define elf_backend_want_got_plt 1
 #define elf_backend_plt_readonly 1
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index 0eced4c..cd21fc9 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -1408,26 +1408,15 @@
   "BFD_RELOC_ARC_S25W_PCREL",
   "BFD_RELOC_ARC_S13_PCREL",
   "BFD_RELOC_ARC_32_ME",
-  "BFD_RELOC_ARC_PC32 ",
+  "BFD_RELOC_ARC_PC32",
   "BFD_RELOC_ARC_GOTPC32",
-  "BFD_RELOC_ARC_PLT32 ",
+  "BFD_RELOC_ARC_PLT32",
   "BFD_RELOC_ARC_COPY",
   "BFD_RELOC_ARC_GLOB_DAT",
   "BFD_RELOC_ARC_JMP_SLOT",
   "BFD_RELOC_ARC_RELATIVE",
   "BFD_RELOC_ARC_GOTOFF",
   "BFD_RELOC_ARC_GOTPC",
-  "BFD_RELOC_ARC_GOT32",
-  "BFD_RELOC_ARC_SDA",
-  "BFD_RELOC_ARC_SDA32",
-  "BFD_RELOC_ARC_SDA_LDST",
-  "BFD_RELOC_ARC_SDA_LDST1",
-  "BFD_RELOC_ARC_SDA_LDST2",
-  "BFD_RELOC_ARC_SDA16_LD",
-  "BFD_RELOC_ARC_SDA16_LD1",
-  "BFD_RELOC_ARC_SDA16_LD2",
-  "BFD_RELOC_ARC_SDA32_ME",
-
   "BFD_RELOC_BFIN_16_IMM",
   "BFD_RELOC_BFIN_16_HIGH",
   "BFD_RELOC_BFIN_4_PCREL",
diff --git a/bfd/po/SRC-POTFILES.in b/bfd/po/SRC-POTFILES.in
index 5a3d361..afe567a 100644
--- a/bfd/po/SRC-POTFILES.in
+++ b/bfd/po/SRC-POTFILES.in
@@ -134,6 +134,12 @@
 efi-app-ia32.c
 efi-app-ia64.c
 efi-app-x86_64.c
+efi-bsdrv-ia32.c
+efi-bsdrv-ia64.c
+efi-bsdrv-x86_64.c
+efi-rtdrv-ia32.c
+efi-rtdrv-ia64.c
+efi-rtdrv-x86_64.c
 elf32-am33lin.c
 elf32-arc.c
 elf32-arm.c
diff --git a/bfd/po/bfd.pot b/bfd/po/bfd.pot
index 81d7dba..594afcf 100644
--- a/bfd/po/bfd.pot
+++ b/bfd/po/bfd.pot
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: bug-binutils@gnu.org\n"
-"POT-Creation-Date: 2007-09-17 15:01+0100\n"
+"POT-Creation-Date: 2009-03-23 14:17+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -222,29 +222,29 @@
 msgid "%B: unsupported relocation: ALPHA_R_GPRELLOW"
 msgstr ""
 
-#: coff-alpha.c:1574 elf32-m32r.c:2487 elf64-alpha.c:3953 elf64-alpha.c:4106
+#: coff-alpha.c:1574 elf32-m32r.c:2487 elf64-alpha.c:3970 elf64-alpha.c:4125
 #: elf32-ia64.c:4468 elf64-ia64.c:4468
 msgid "%B: unknown relocation type %d"
 msgstr ""
 
-#: coff-arm.c:1036
+#: coff-arm.c:1039
 #, c-format
 msgid "%B: unable to find THUMB glue '%s' for `%s'"
 msgstr ""
 
-#: coff-arm.c:1065
+#: coff-arm.c:1068
 #, c-format
 msgid "%B: unable to find ARM glue '%s' for `%s'"
 msgstr ""
 
-#: coff-arm.c:1367 elf32-arm.c:4167
+#: coff-arm.c:1370 elf32-arm.c:4299
 #, c-format
 msgid ""
 "%B(%s): warning: interworking not enabled.\n"
 "  first occurrence: %B: arm call to thumb"
 msgstr ""
 
-#: coff-arm.c:1457
+#: coff-arm.c:1460
 #, c-format
 msgid ""
 "%B(%s): warning: interworking not enabled.\n"
@@ -252,105 +252,105 @@
 "  consider relinking with --support-old-code enabled"
 msgstr ""
 
-#: coff-arm.c:1750 cofflink.c:3018 coff-tic80.c:695
+#: coff-arm.c:1755 cofflink.c:3018 coff-tic80.c:695
 msgid "%B: bad reloc address 0x%lx in section `%A'"
 msgstr ""
 
-#: coff-arm.c:2075
+#: coff-arm.c:2080
 msgid "%B: illegal symbol index in reloc: %d"
 msgstr ""
 
-#: coff-arm.c:2206
+#: coff-arm.c:2211
 #, c-format
 msgid "ERROR: %B is compiled for APCS-%d, whereas %B is compiled for APCS-%d"
 msgstr ""
 
-#: coff-arm.c:2222 elf32-arm.c:7072
+#: coff-arm.c:2227 elf32-arm.c:7255
 #, c-format
 msgid ""
 "ERROR: %B passes floats in float registers, whereas %B passes them in "
 "integer registers"
 msgstr ""
 
-#: coff-arm.c:2225 elf32-arm.c:7076
+#: coff-arm.c:2230 elf32-arm.c:7259
 #, c-format
 msgid ""
 "ERROR: %B passes floats in integer registers, whereas %B passes them in "
 "float registers"
 msgstr ""
 
-#: coff-arm.c:2239
+#: coff-arm.c:2244
 #, c-format
 msgid ""
 "ERROR: %B is compiled as position independent code, whereas target %B is "
 "absolute position"
 msgstr ""
 
-#: coff-arm.c:2242
+#: coff-arm.c:2247
 #, c-format
 msgid ""
 "ERROR: %B is compiled as absolute position code, whereas target %B is "
 "position independent"
 msgstr ""
 
-#: coff-arm.c:2270 elf32-arm.c:7141
+#: coff-arm.c:2275 elf32-arm.c:7324
 #, c-format
 msgid "Warning: %B supports interworking, whereas %B does not"
 msgstr ""
 
-#: coff-arm.c:2273 elf32-arm.c:7147
+#: coff-arm.c:2278 elf32-arm.c:7330
 #, c-format
 msgid "Warning: %B does not support interworking, whereas %B does"
 msgstr ""
 
-#: coff-arm.c:2297
+#: coff-arm.c:2302
 #, c-format
 msgid "private flags = %x:"
 msgstr ""
 
-#: coff-arm.c:2305 elf32-arm.c:7198
+#: coff-arm.c:2310 elf32-arm.c:7381
 #, c-format
 msgid " [floats passed in float registers]"
 msgstr ""
 
-#: coff-arm.c:2307
+#: coff-arm.c:2312
 #, c-format
 msgid " [floats passed in integer registers]"
 msgstr ""
 
-#: coff-arm.c:2310 elf32-arm.c:7201
+#: coff-arm.c:2315 elf32-arm.c:7384
 #, c-format
 msgid " [position independent]"
 msgstr ""
 
-#: coff-arm.c:2312
+#: coff-arm.c:2317
 #, c-format
 msgid " [absolute position]"
 msgstr ""
 
-#: coff-arm.c:2316
+#: coff-arm.c:2321
 #, c-format
 msgid " [interworking flag not initialised]"
 msgstr ""
 
-#: coff-arm.c:2318
+#: coff-arm.c:2323
 #, c-format
 msgid " [interworking supported]"
 msgstr ""
 
-#: coff-arm.c:2320
+#: coff-arm.c:2325
 #, c-format
 msgid " [interworking not supported]"
 msgstr ""
 
-#: coff-arm.c:2366 elf32-arm.c:6578
+#: coff-arm.c:2371 elf32-arm.c:6763
 #, c-format
 msgid ""
 "Warning: Not setting interworking flag of %B since it has already been "
 "specified as non-interworking"
 msgstr ""
 
-#: coff-arm.c:2370 elf32-arm.c:6582
+#: coff-arm.c:2375 elf32-arm.c:6767
 #, c-format
 msgid "Warning: Clearing the interworking flag of %B due to outside request"
 msgstr ""
@@ -426,7 +426,7 @@
 msgid "uncertain calling convention for non-COFF symbol"
 msgstr ""
 
-#: cofflink.c:513 elflink.c:4175
+#: cofflink.c:513 elflink.c:4217
 msgid "Warning: type of symbol `%s' changed from %d to %d in %B"
 msgstr ""
 
@@ -444,7 +444,7 @@
 msgid "%s: warning: %s: line number overflow: 0x%lx > 0xffff"
 msgstr ""
 
-#: coff-m68k.c:506 elf32-bfin.c:5434 elf32-m68k.c:2400
+#: coff-m68k.c:506 elf32-bfin.c:5414 elf32-m68k.c:2405
 msgid "unsupported reloc type"
 msgstr ""
 
@@ -646,415 +646,427 @@
 "      Type: %s"
 msgstr ""
 
-#: elf32-arm.c:2524
+#: elf32-arc.c:625
+msgid ""
+"ERROR: Endian Match failed . Attempting to link %B with binary %s of "
+"opposite endian-ness"
+msgstr ""
+
+#: elf32-arc.c:641
+msgid ""
+"\\ERROR: Attempting to link an %s binary(%B) with a binary incompatible %s "
+"binary(%s)"
+msgstr ""
+
+#: elf32-arm.c:2538
 #, c-format
 msgid "unable to find THUMB glue '%s' for '%s'"
 msgstr ""
 
-#: elf32-arm.c:2557
+#: elf32-arm.c:2572
 #, c-format
 msgid "unable to find ARM glue '%s' for '%s'"
 msgstr ""
 
-#: elf32-arm.c:3127
+#: elf32-arm.c:3242
 msgid "%B: BE8 images only valid in big-endian mode."
 msgstr ""
 
 #. Give a warning, but do as the user requests anyway.
-#: elf32-arm.c:3331
+#: elf32-arm.c:3462
 msgid ""
 "%B: warning: selected VFP11 erratum workaround is not necessary for target "
 "architecture"
 msgstr ""
 
-#: elf32-arm.c:3865 elf32-arm.c:3885
+#: elf32-arm.c:3996 elf32-arm.c:4016
 msgid "%B: unable to find VFP11 veneer `%s'"
 msgstr ""
 
-#: elf32-arm.c:3930
+#: elf32-arm.c:4061
 #, c-format
 msgid "Invalid TARGET2 relocation type '%s'."
 msgstr ""
 
-#: elf32-arm.c:4071
+#: elf32-arm.c:4203
 msgid ""
 "%B(%s): warning: interworking not enabled.\n"
 "  first occurrence: %B: thumb call to arm"
 msgstr ""
 
-#: elf32-arm.c:4759
+#: elf32-arm.c:4930
 msgid "\\%B: Warning: Arm BLX instruction targets Arm function '%s'."
 msgstr ""
 
-#: elf32-arm.c:5059
+#: elf32-arm.c:5230
 msgid "%B: Warning: Thumb BLX instruction targets thumb function '%s'."
 msgstr ""
 
-#: elf32-arm.c:5689
+#: elf32-arm.c:5860
 msgid "%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"
 msgstr ""
 
-#: elf32-arm.c:5890
+#: elf32-arm.c:6075
 msgid ""
 "%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group "
 "relocations"
 msgstr ""
 
-#: elf32-arm.c:5930 elf32-arm.c:6017 elf32-arm.c:6100 elf32-arm.c:6185
+#: elf32-arm.c:6115 elf32-arm.c:6202 elf32-arm.c:6285 elf32-arm.c:6370
 msgid "%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"
 msgstr ""
 
-#: elf32-arm.c:6369 elf32-sh.c:3304 elf64-sh64.c:1556
+#: elf32-arm.c:6554 elf32-sh.c:3308 elf64-sh64.c:1556
 msgid "%B(%A+0x%lx): %s relocation against SEC_MERGE section"
 msgstr ""
 
-#: elf32-arm.c:6458 elf64-ppc.c:10050
+#: elf32-arm.c:6643 elf64-ppc.c:10111
 msgid "%B(%A+0x%lx): %s used with TLS symbol %s"
 msgstr ""
 
-#: elf32-arm.c:6459 elf64-ppc.c:10051
+#: elf32-arm.c:6644 elf64-ppc.c:10112
 msgid "%B(%A+0x%lx): %s used with non-TLS symbol %s"
 msgstr ""
 
-#: elf32-arm.c:6482 elf32-i386.c:3492 elf32-m32r.c:2598 elf32-m68k.c:1989
-#: elf32-ppc.c:6796 elf32-s390.c:3048 elf32-sh.c:3408 elf32-xtensa.c:2290
-#: elf64-ppc.c:11215 elf64-s390.c:3009 elf64-sh64.c:1648 elf64-x86-64.c:3168
-#: elf-hppa.h:2194 elf-m10300.c:1460 elfxx-sparc.c:3256
+#: elf32-arm.c:6667 elf32-i386.c:3499 elf32-m32r.c:2598 elf32-m68k.c:1994
+#: elf32-ppc.c:6909 elf32-s390.c:3058 elf32-sh.c:3412 elf32-xtensa.c:2268
+#: elf64-ppc.c:11254 elf64-s390.c:3019 elf64-sh64.c:1648 elf64-x86-64.c:3176
+#: elf-hppa.h:2201 elf-m10300.c:1546 elfxx-sparc.c:3268
 msgid "%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"
 msgstr ""
 
-#: elf32-arm.c:6516
+#: elf32-arm.c:6701
 msgid "out of range"
 msgstr ""
 
-#: elf32-arm.c:6520
+#: elf32-arm.c:6705
 msgid "unsupported relocation"
 msgstr ""
 
-#: elf32-arm.c:6528
+#: elf32-arm.c:6713
 msgid "unknown error"
 msgstr ""
 
-#: elf32-arm.c:6628
+#: elf32-arm.c:6812
 msgid ""
 "Warning: Clearing the interworking flag of %B because non-interworking code "
 "in %B has been linked with it"
 msgstr ""
 
-#: elf32-arm.c:6730
+#: elf32-arm.c:6914
 msgid "ERROR: %B uses VFP register arguments, %B does not"
 msgstr ""
 
-#: elf32-arm.c:6780
+#: elf32-arm.c:6964
 msgid "ERROR: %B: Conflicting architecture profiles %c/%c"
 msgstr ""
 
-#: elf32-arm.c:6795
+#: elf32-arm.c:6979
 msgid "Warning: %B: Conflicting platform configuration"
 msgstr ""
 
-#: elf32-arm.c:6804
+#: elf32-arm.c:6988
 msgid "ERROR: %B: Conflicting use of R9"
 msgstr ""
 
-#: elf32-arm.c:6816
+#: elf32-arm.c:7000
 msgid "ERROR: %B: SB relative addressing conflicts with use of R9"
 msgstr ""
 
-#: elf32-arm.c:6838
+#: elf32-arm.c:7022
 msgid "ERROR: %B: Conflicting definitions of wchar_t"
 msgstr ""
 
-#: elf32-arm.c:6867
+#: elf32-arm.c:7051
 msgid ""
 "warning: %B uses %s enums yet the output is to use %s enums; use of enum "
 "values across objects may fail"
 msgstr ""
 
-#: elf32-arm.c:6880
+#: elf32-arm.c:7064
 msgid "ERROR: %B uses iWMMXt register arguments, %B does not"
 msgstr ""
 
-#: elf32-arm.c:6920
+#: elf32-arm.c:7104
 msgid "Warning: %B: Unknown EABI object attribute %d"
 msgstr ""
 
-#: elf32-arm.c:7045
+#: elf32-arm.c:7228
 msgid ""
 "ERROR: Source object %B has EABI version %d, but target %B has EABI version %"
 "d"
 msgstr ""
 
-#: elf32-arm.c:7061
+#: elf32-arm.c:7244
 msgid "ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"
 msgstr ""
 
-#: elf32-arm.c:7086
+#: elf32-arm.c:7269
 msgid "ERROR: %B uses VFP instructions, whereas %B does not"
 msgstr ""
 
-#: elf32-arm.c:7090
+#: elf32-arm.c:7273
 msgid "ERROR: %B uses FPA instructions, whereas %B does not"
 msgstr ""
 
-#: elf32-arm.c:7100
+#: elf32-arm.c:7283
 msgid "ERROR: %B uses Maverick instructions, whereas %B does not"
 msgstr ""
 
-#: elf32-arm.c:7104
+#: elf32-arm.c:7287
 msgid "ERROR: %B does not use Maverick instructions, whereas %B does"
 msgstr ""
 
-#: elf32-arm.c:7123
+#: elf32-arm.c:7306
 msgid "ERROR: %B uses software FP, whereas %B uses hardware FP"
 msgstr ""
 
-#: elf32-arm.c:7127
+#: elf32-arm.c:7310
 msgid "ERROR: %B uses hardware FP, whereas %B uses software FP"
 msgstr ""
 
 #. Ignore init flag - it may not be set, despite the flags field
 #. containing valid data.
 #. Ignore init flag - it may not be set, despite the flags field containing valid data.
-#: elf32-arm.c:7174 elf32-bfin.c:4795 elf32-cris.c:3234 elf32-m68hc1x.c:1277
-#: elf32-m68k.c:623 elf32-score.c:3753 elf32-vax.c:538 elfxx-mips.c:11351
+#: elf32-arm.c:7357 elf32-bfin.c:4803 elf32-cris.c:3235 elf32-m68hc1x.c:1274
+#: elf32-m68k.c:623 elf32-score.c:3750 elf32-vax.c:538 elfxx-mips.c:11714
 #, c-format
 msgid "private flags = %lx:"
 msgstr ""
 
-#: elf32-arm.c:7183
+#: elf32-arm.c:7366
 #, c-format
 msgid " [interworking enabled]"
 msgstr ""
 
-#: elf32-arm.c:7191
+#: elf32-arm.c:7374
 #, c-format
 msgid " [VFP float format]"
 msgstr ""
 
-#: elf32-arm.c:7193
+#: elf32-arm.c:7376
 #, c-format
 msgid " [Maverick float format]"
 msgstr ""
 
-#: elf32-arm.c:7195
+#: elf32-arm.c:7378
 #, c-format
 msgid " [FPA float format]"
 msgstr ""
 
-#: elf32-arm.c:7204
+#: elf32-arm.c:7387
 #, c-format
 msgid " [new ABI]"
 msgstr ""
 
-#: elf32-arm.c:7207
+#: elf32-arm.c:7390
 #, c-format
 msgid " [old ABI]"
 msgstr ""
 
-#: elf32-arm.c:7210
+#: elf32-arm.c:7393
 #, c-format
 msgid " [software FP]"
 msgstr ""
 
-#: elf32-arm.c:7219
+#: elf32-arm.c:7402
 #, c-format
 msgid " [Version1 EABI]"
 msgstr ""
 
-#: elf32-arm.c:7222 elf32-arm.c:7233
+#: elf32-arm.c:7405 elf32-arm.c:7416
 #, c-format
 msgid " [sorted symbol table]"
 msgstr ""
 
-#: elf32-arm.c:7224 elf32-arm.c:7235
+#: elf32-arm.c:7407 elf32-arm.c:7418
 #, c-format
 msgid " [unsorted symbol table]"
 msgstr ""
 
-#: elf32-arm.c:7230
+#: elf32-arm.c:7413
 #, c-format
 msgid " [Version2 EABI]"
 msgstr ""
 
-#: elf32-arm.c:7238
+#: elf32-arm.c:7421
 #, c-format
 msgid " [dynamic symbols use segment index]"
 msgstr ""
 
-#: elf32-arm.c:7241
+#: elf32-arm.c:7424
 #, c-format
 msgid " [mapping symbols precede others]"
 msgstr ""
 
-#: elf32-arm.c:7248
+#: elf32-arm.c:7431
 #, c-format
 msgid " [Version3 EABI]"
 msgstr ""
 
-#: elf32-arm.c:7252
+#: elf32-arm.c:7435
 #, c-format
 msgid " [Version4 EABI]"
 msgstr ""
 
-#: elf32-arm.c:7256
+#: elf32-arm.c:7439
 #, c-format
 msgid " [Version5 EABI]"
 msgstr ""
 
-#: elf32-arm.c:7259
+#: elf32-arm.c:7442
 #, c-format
 msgid " [BE8]"
 msgstr ""
 
-#: elf32-arm.c:7262
+#: elf32-arm.c:7445
 #, c-format
 msgid " [LE8]"
 msgstr ""
 
-#: elf32-arm.c:7268
+#: elf32-arm.c:7451
 #, c-format
 msgid " <EABI version unrecognised>"
 msgstr ""
 
-#: elf32-arm.c:7275
+#: elf32-arm.c:7458
 #, c-format
 msgid " [relocatable executable]"
 msgstr ""
 
-#: elf32-arm.c:7278
+#: elf32-arm.c:7461
 #, c-format
 msgid " [has entry point]"
 msgstr ""
 
-#: elf32-arm.c:7283
+#: elf32-arm.c:7466
 #, c-format
 msgid "<Unrecognised flag bits set>"
 msgstr ""
 
-#: elf32-arm.c:7522 elf32-i386.c:1231 elf32-s390.c:1003 elf32-xtensa.c:814
-#: elf64-s390.c:958 elf64-x86-64.c:1011 elfxx-sparc.c:1115
+#: elf32-arm.c:7704 elf32-i386.c:1232 elf32-s390.c:1006 elf32-xtensa.c:821
+#: elf64-s390.c:961 elf64-x86-64.c:1012 elfxx-sparc.c:1117
 msgid "%B: bad symbol index: %d"
 msgstr ""
 
-#: elf32-arm.c:8080 elf32-cris.c:2400 elf32-hppa.c:1906 elf32-i370.c:506
-#: elf32-i386.c:1801 elf32-m32r.c:1931 elf32-m68k.c:1338 elf32-ppc.c:4314
-#: elf32-s390.c:1679 elf32-sh.c:2584 elf32-vax.c:1050 elf64-ppc.c:5906
-#: elf64-s390.c:1654 elf64-sh64.c:3438 elf64-x86-64.c:1631 elf-m10300.c:4207
-#: elfxx-sparc.c:1797
+#: elf32-arm.c:8265 elf32-cris.c:2403 elf32-hppa.c:1920 elf32-i370.c:506
+#: elf32-i386.c:1803 elf32-m32r.c:1931 elf32-m68k.c:1343 elf32-ppc.c:4431
+#: elf32-s390.c:1687 elf32-sh.c:2583 elf32-vax.c:1055 elf64-ppc.c:5902
+#: elf64-s390.c:1662 elf64-sh64.c:3437 elf64-x86-64.c:1637 elf-m10300.c:4389
+#: elfxx-sparc.c:1806
 #, c-format
 msgid "dynamic variable `%s' is zero size"
 msgstr ""
 
-#: elf32-arm.c:8603
+#: elf32-arm.c:8791
 #, c-format
 msgid "Errors encountered processing file %s"
 msgstr ""
 
-#: elf32-arm.c:9853 elf32-arm.c:9875
+#: elf32-arm.c:10059 elf32-arm.c:10081
 msgid "%B: error: VFP11 veneer out of range"
 msgstr ""
 
-#: elf32-avr.c:1253 elf32-bfin.c:2795 elf32-cr16.c:887 elf32-cr16c.c:790
-#: elf32-cris.c:1538 elf32-crx.c:933 elf32-d10v.c:517 elf32-fr30.c:616
-#: elf32-frv.c:4129 elf32-h8300.c:516 elf32-i860.c:1218 elf32-ip2k.c:1499
-#: elf32-iq2000.c:647 elf32-m32c.c:560 elf32-m32r.c:3124 elf32-m68hc1x.c:1133
-#: elf32-mep.c:642 elf32-msp430.c:497 elf32-mt.c:402 elf32-openrisc.c:411
-#: elf32-score.c:2456 elf32-spu.c:2813 elf32-v850.c:1701 elf32-xstormy16.c:946
-#: elf64-mmix.c:1533 elf-m10200.c:456 elf-m10300.c:1523
+#: elf32-avr.c:1250 elf32-bfin.c:2796 elf32-cr16.c:959 elf32-cr16c.c:790
+#: elf32-cris.c:1538 elf32-crx.c:933 elf32-d10v.c:516 elf32-fr30.c:616
+#: elf32-frv.c:4112 elf32-h8300.c:516 elf32-i860.c:1218 elf32-ip2k.c:1499
+#: elf32-iq2000.c:691 elf32-m32c.c:560 elf32-m32r.c:3124 elf32-m68hc1x.c:1130
+#: elf32-mep.c:541 elf32-msp430.c:493 elf32-mt.c:402 elf32-openrisc.c:411
+#: elf32-score.c:2451 elf32-spu.c:2797 elf32-v850.c:1703 elf32-xstormy16.c:948
+#: elf64-mmix.c:1533 elf-m10200.c:456 elf-m10300.c:1609
 msgid "internal error: out of range error"
 msgstr ""
 
-#: elf32-avr.c:1257 elf32-bfin.c:2799 elf32-cr16.c:891 elf32-cr16c.c:794
-#: elf32-cris.c:1542 elf32-crx.c:937 elf32-d10v.c:521 elf32-fr30.c:620
-#: elf32-frv.c:4133 elf32-h8300.c:520 elf32-i860.c:1222 elf32-iq2000.c:651
-#: elf32-m32c.c:564 elf32-m32r.c:3128 elf32-m68hc1x.c:1137 elf32-mep.c:646
-#: elf32-msp430.c:501 elf32-openrisc.c:415 elf32-score.c:2460 elf32-spu.c:2817
-#: elf32-v850.c:1705 elf32-xstormy16.c:950 elf64-mmix.c:1537 elf-m10200.c:460
-#: elf-m10300.c:1527 elfxx-mips.c:8032
+#: elf32-avr.c:1254 elf32-bfin.c:2800 elf32-cr16.c:963 elf32-cr16c.c:794
+#: elf32-cris.c:1542 elf32-crx.c:937 elf32-d10v.c:520 elf32-fr30.c:620
+#: elf32-frv.c:4116 elf32-h8300.c:520 elf32-i860.c:1222 elf32-iq2000.c:695
+#: elf32-m32c.c:564 elf32-m32r.c:3128 elf32-m68hc1x.c:1134 elf32-mep.c:545
+#: elf32-msp430.c:497 elf32-openrisc.c:415 elf32-score.c:2455 elf32-spu.c:2801
+#: elf32-v850.c:1707 elf32-xstormy16.c:952 elf64-mmix.c:1537 elf-m10200.c:460
+#: elf-m10300.c:1613 elfxx-mips.c:8326
 msgid "internal error: unsupported relocation error"
 msgstr ""
 
-#: elf32-avr.c:1261 elf32-bfin.c:2803 elf32-cris.c:1546 elf32-fr30.c:624
-#: elf32-frv.c:4137 elf32-i860.c:1226 elf32-ip2k.c:1510 elf32-iq2000.c:655
-#: elf32-m32c.c:568 elf32-mep.c:650 elf32-msp430.c:505 elf32-mt.c:406
-#: elf32-openrisc.c:419 elf32-v850.c:1709 elf32-xstormy16.c:954
+#: elf32-avr.c:1258 elf32-bfin.c:2804 elf32-cris.c:1546 elf32-fr30.c:624
+#: elf32-frv.c:4120 elf32-i860.c:1226 elf32-ip2k.c:1510 elf32-iq2000.c:699
+#: elf32-m32c.c:568 elf32-mep.c:549 elf32-msp430.c:501 elf32-mt.c:406
+#: elf32-openrisc.c:419 elf32-v850.c:1711 elf32-xstormy16.c:956
 #: elf64-mmix.c:1541
 msgid "internal error: dangerous relocation"
 msgstr ""
 
-#: elf32-avr.c:1265 elf32-bfin.c:2807 elf32-cr16.c:899 elf32-cr16c.c:802
-#: elf32-cris.c:1550 elf32-crx.c:945 elf32-d10v.c:529 elf32-fr30.c:628
-#: elf32-frv.c:4141 elf32-h8300.c:528 elf32-i860.c:1230 elf32-ip2k.c:1514
-#: elf32-iq2000.c:659 elf32-m32c.c:572 elf32-m32r.c:3136 elf32-m68hc1x.c:1145
-#: elf32-mep.c:654 elf32-msp430.c:509 elf32-mt.c:410 elf32-openrisc.c:423
-#: elf32-score.c:2468 elf32-spu.c:2825 elf32-v850.c:1725 elf32-xstormy16.c:958
-#: elf64-mmix.c:1545 elf-m10200.c:468 elf-m10300.c:1540
+#: elf32-avr.c:1262 elf32-bfin.c:2808 elf32-cr16.c:971 elf32-cr16c.c:802
+#: elf32-cris.c:1550 elf32-crx.c:945 elf32-d10v.c:528 elf32-fr30.c:628
+#: elf32-frv.c:4124 elf32-h8300.c:528 elf32-i860.c:1230 elf32-ip2k.c:1514
+#: elf32-iq2000.c:703 elf32-m32c.c:572 elf32-m32r.c:3136 elf32-m68hc1x.c:1142
+#: elf32-mep.c:553 elf32-msp430.c:505 elf32-mt.c:410 elf32-openrisc.c:423
+#: elf32-score.c:2463 elf32-spu.c:2809 elf32-v850.c:1727 elf32-xstormy16.c:960
+#: elf64-mmix.c:1545 elf-m10200.c:468 elf-m10300.c:1626
 msgid "internal error: unknown error"
 msgstr ""
 
-#: elf32-avr.c:2369 elf32-hppa.c:595 elf32-m68hc1x.c:164 elf64-ppc.c:3808
+#: elf32-avr.c:2366 elf32-hppa.c:604 elf32-m68hc1x.c:164 elf64-ppc.c:3807
 msgid "%B: cannot create stub entry %s"
 msgstr ""
 
-#: elf32-bfin.c:2274
+#: elf32-bfin.c:2259
 msgid "%B: relocation at `%A+0x%x' references symbol `%s' with nonzero addend"
 msgstr ""
 
-#: elf32-bfin.c:2288 elf32-frv.c:2919
+#: elf32-bfin.c:2273 elf32-frv.c:2902
 msgid "relocation references symbol not defined in the module"
 msgstr ""
 
-#: elf32-bfin.c:2385
+#: elf32-bfin.c:2370
 msgid "R_BFIN_FUNCDESC references dynamic symbol with nonzero addend"
 msgstr ""
 
-#: elf32-bfin.c:2424 elf32-bfin.c:2547 elf32-frv.c:3656 elf32-frv.c:3777
+#: elf32-bfin.c:2409 elf32-bfin.c:2535 elf32-frv.c:3639 elf32-frv.c:3760
 msgid "cannot emit fixups in read-only section"
 msgstr ""
 
-#: elf32-bfin.c:2452 elf32-bfin.c:2587 elf32-frv.c:3687 elf32-frv.c:3821
+#: elf32-bfin.c:2437 elf32-bfin.c:2584 elf32-frv.c:3670 elf32-frv.c:3804
 msgid "cannot emit dynamic relocations in read-only section"
 msgstr ""
 
-#: elf32-bfin.c:2505
+#: elf32-bfin.c:2493
 msgid "R_BFIN_FUNCDESC_VALUE references dynamic symbol with nonzero addend"
 msgstr ""
 
-#: elf32-bfin.c:2673
+#: elf32-bfin.c:2674
 msgid "relocations between different segments are not supported"
 msgstr ""
 
-#: elf32-bfin.c:2674
+#: elf32-bfin.c:2675
 msgid "warning: relocation references a different segment"
 msgstr ""
 
-#: elf32-bfin.c:3083
+#: elf32-bfin.c:3092
 msgid "%B(%A+0x%lx): unresolvable relocation against symbol `%s'"
 msgstr ""
 
-#: elf32-bfin.c:3116 elf32-i386.c:3533 elf32-m68k.c:2030 elf32-s390.c:3100
-#: elf64-s390.c:3061 elf64-x86-64.c:3207
+#: elf32-bfin.c:3125 elf32-i386.c:3540 elf32-m68k.c:2035 elf32-s390.c:3110
+#: elf64-s390.c:3071 elf64-x86-64.c:3215
 msgid "%B(%A+0x%lx): reloc against `%s': error %d"
 msgstr ""
 
-#: elf32-bfin.c:4687 elf32-frv.c:6423
+#: elf32-bfin.c:4695 elf32-frv.c:6402
 msgid "%B: unsupported relocation type %i"
 msgstr ""
 
-#: elf32-bfin.c:4868 elf32-frv.c:6831
+#: elf32-bfin.c:4848 elf32-frv.c:6810
 #, c-format
 msgid "%s: cannot link non-fdpic object file into fdpic executable"
 msgstr ""
 
-#: elf32-bfin.c:4872 elf32-frv.c:6835
+#: elf32-bfin.c:4852 elf32-frv.c:6814
 #, c-format
 msgid "%s: cannot link fdpic object file into non-fdpic executable"
 msgstr ""
 
-#: elf32-cr16.c:895 elf32-cr16c.c:798 elf32-crx.c:941 elf32-d10v.c:525
-#: elf32-h8300.c:524 elf32-m32r.c:3132 elf32-m68hc1x.c:1141 elf32-score.c:2464
-#: elf32-spu.c:2821 elf-m10200.c:464
+#: elf32-cr16.c:967 elf32-cr16c.c:798 elf32-crx.c:941 elf32-d10v.c:524
+#: elf32-h8300.c:524 elf32-m32r.c:3132 elf32-m68hc1x.c:1138 elf32-score.c:2459
+#: elf32-spu.c:2805 elf-m10200.c:464
 msgid "internal error: dangerous error"
 msgstr ""
 
@@ -1096,144 +1108,144 @@
 msgid "%B: Internal inconsistency; no relocation section %s"
 msgstr ""
 
-#: elf32-cris.c:2511
+#: elf32-cris.c:2510
 msgid ""
 "%B, section %A:\n"
 "  v10/v32 compatible object %s must not contain a PIC relocation"
 msgstr ""
 
-#: elf32-cris.c:2698 elf32-cris.c:2766
+#: elf32-cris.c:2697 elf32-cris.c:2765
 msgid ""
 "%B, section %A:\n"
 "  relocation %s should not be used in a shared object; recompile with -fPIC"
 msgstr ""
 
-#: elf32-cris.c:3183
+#: elf32-cris.c:3184
 msgid "Unexpected machine number"
 msgstr ""
 
-#: elf32-cris.c:3237
+#: elf32-cris.c:3238
 #, c-format
 msgid " [symbols have a _ prefix]"
 msgstr ""
 
-#: elf32-cris.c:3240
+#: elf32-cris.c:3241
 #, c-format
 msgid " [v10 and v32]"
 msgstr ""
 
-#: elf32-cris.c:3243
+#: elf32-cris.c:3244
 #, c-format
 msgid " [v32]"
 msgstr ""
 
-#: elf32-cris.c:3288
+#: elf32-cris.c:3289
 msgid "%B: uses _-prefixed symbols, but writing file with non-prefixed symbols"
 msgstr ""
 
-#: elf32-cris.c:3289
+#: elf32-cris.c:3290
 msgid "%B: uses non-prefixed symbols, but writing file with _-prefixed symbols"
 msgstr ""
 
-#: elf32-cris.c:3308
+#: elf32-cris.c:3309
 msgid "%B contains CRIS v32 code, incompatible with previous objects"
 msgstr ""
 
-#: elf32-cris.c:3310
+#: elf32-cris.c:3311
 msgid "%B contains non-CRIS-v32 code, incompatible with previous objects"
 msgstr ""
 
-#: elf32-frv.c:1523 elf32-frv.c:1672
+#: elf32-frv.c:1506 elf32-frv.c:1655
 msgid "relocation requires zero addend"
 msgstr ""
 
-#: elf32-frv.c:2906
+#: elf32-frv.c:2889
 msgid "%B(%A+0x%x): relocation to `%s+%x' may have caused the error above"
 msgstr ""
 
-#: elf32-frv.c:2995
+#: elf32-frv.c:2978
 msgid "R_FRV_GETTLSOFF not applied to a call instruction"
 msgstr ""
 
-#: elf32-frv.c:3037
+#: elf32-frv.c:3020
 msgid "R_FRV_GOTTLSDESC12 not applied to an lddi instruction"
 msgstr ""
 
-#: elf32-frv.c:3108
+#: elf32-frv.c:3091
 msgid "R_FRV_GOTTLSDESCHI not applied to a sethi instruction"
 msgstr ""
 
-#: elf32-frv.c:3145
+#: elf32-frv.c:3128
 msgid "R_FRV_GOTTLSDESCLO not applied to a setlo or setlos instruction"
 msgstr ""
 
-#: elf32-frv.c:3193
+#: elf32-frv.c:3176
 msgid "R_FRV_TLSDESC_RELAX not applied to an ldd instruction"
 msgstr ""
 
-#: elf32-frv.c:3277
+#: elf32-frv.c:3260
 msgid "R_FRV_GETTLSOFF_RELAX not applied to a calll instruction"
 msgstr ""
 
-#: elf32-frv.c:3332
+#: elf32-frv.c:3315
 msgid "R_FRV_GOTTLSOFF12 not applied to an ldi instruction"
 msgstr ""
 
-#: elf32-frv.c:3362
+#: elf32-frv.c:3345
 msgid "R_FRV_GOTTLSOFFHI not applied to a sethi instruction"
 msgstr ""
 
-#: elf32-frv.c:3391
+#: elf32-frv.c:3374
 msgid "R_FRV_GOTTLSOFFLO not applied to a setlo or setlos instruction"
 msgstr ""
 
-#: elf32-frv.c:3422
+#: elf32-frv.c:3405
 msgid "R_FRV_TLSOFF_RELAX not applied to an ld instruction"
 msgstr ""
 
-#: elf32-frv.c:3467
+#: elf32-frv.c:3450
 msgid "R_FRV_TLSMOFFHI not applied to a sethi instruction"
 msgstr ""
 
-#: elf32-frv.c:3494
+#: elf32-frv.c:3477
 msgid "R_FRV_TLSMOFFLO not applied to a setlo or setlos instruction"
 msgstr ""
 
-#: elf32-frv.c:3615
+#: elf32-frv.c:3598
 msgid "R_FRV_FUNCDESC references dynamic symbol with nonzero addend"
 msgstr ""
 
-#: elf32-frv.c:3735
+#: elf32-frv.c:3718
 msgid "R_FRV_FUNCDESC_VALUE references dynamic symbol with nonzero addend"
 msgstr ""
 
-#: elf32-frv.c:3992 elf32-frv.c:4148
+#: elf32-frv.c:3975 elf32-frv.c:4131
 msgid "%B(%A+0x%lx): reloc against `%s': %s"
 msgstr ""
 
-#: elf32-frv.c:3994 elf32-frv.c:3998
+#: elf32-frv.c:3977 elf32-frv.c:3981
 msgid "relocation references a different segment"
 msgstr ""
 
-#: elf32-frv.c:6745
+#: elf32-frv.c:6724
 #, c-format
 msgid ""
 "%s: compiled with %s and linked with modules that use non-pic relocations"
 msgstr ""
 
-#: elf32-frv.c:6798 elf32-iq2000.c:808 elf32-m32c.c:819
+#: elf32-frv.c:6777 elf32-iq2000.c:852 elf32-m32c.c:814
 #, c-format
 msgid "%s: compiled with %s and linked with modules compiled with %s"
 msgstr ""
 
-#: elf32-frv.c:6810
+#: elf32-frv.c:6789
 #, c-format
 msgid ""
 "%s: uses different unknown e_flags (0x%lx) fields than previous modules (0x%"
 "lx)"
 msgstr ""
 
-#: elf32-frv.c:6860 elf32-iq2000.c:845 elf32-m32c.c:855 elf32-mt.c:587
+#: elf32-frv.c:6839 elf32-iq2000.c:889 elf32-m32c.c:850 elf32-mt.c:583
 #, c-format
 msgid "private flags = 0x%lx:"
 msgstr ""
@@ -1242,63 +1254,63 @@
 msgid "%B: Relocations in generic ELF (EM: %d)"
 msgstr ""
 
-#: elf32-hppa.c:844 elf32-hppa.c:3577
+#: elf32-hppa.c:853 elf32-hppa.c:3594
 msgid "%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"
 msgstr ""
 
-#: elf32-hppa.c:1253
+#: elf32-hppa.c:1262
 msgid ""
 "%B: relocation %s can not be used when making a shared object; recompile "
 "with -fPIC"
 msgstr ""
 
-#: elf32-hppa.c:1506
+#: elf32-hppa.c:1517
 #, c-format
 msgid "Could not find relocation section for %s"
 msgstr ""
 
-#: elf32-hppa.c:2795
+#: elf32-hppa.c:2809
 msgid "%B: duplicate export stub %s"
 msgstr ""
 
-#: elf32-hppa.c:3413
+#: elf32-hppa.c:3430
 msgid ""
 "%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"
 msgstr ""
 
-#: elf32-hppa.c:4267
+#: elf32-hppa.c:4284
 msgid "%B(%A+0x%lx): cannot handle %s for %s"
 msgstr ""
 
-#: elf32-hppa.c:4574
+#: elf32-hppa.c:4591
 msgid ".got section not immediately after .plt section"
 msgstr ""
 
-#: elf32-i386.c:362 elf32-ppc.c:1616 elf32-s390.c:379 elf64-ppc.c:2152
+#: elf32-i386.c:362 elf32-ppc.c:1616 elf32-s390.c:379 elf64-ppc.c:2153
 #: elf64-s390.c:403 elf64-x86-64.c:222
 msgid "%B: invalid relocation type %d"
 msgstr ""
 
-#: elf32-i386.c:1180 elf64-x86-64.c:961
+#: elf32-i386.c:1179 elf64-x86-64.c:960
 msgid ""
 "%B: TLS transition from %s to %s against `%s' at 0x%lx in section `%A' failed"
 msgstr ""
 
-#: elf32-i386.c:1359 elf32-s390.c:1185 elf32-sh.c:5063 elf64-s390.c:1149
-#: elfxx-sparc.c:1243
+#: elf32-i386.c:1360 elf32-s390.c:1188 elf32-sh.c:5071 elf64-s390.c:1152
+#: elfxx-sparc.c:1245
 msgid "%B: `%s' accessed both as normal and thread local symbol"
 msgstr ""
 
-#: elf32-i386.c:1474 elf32-s390.c:1294 elf64-ppc.c:4870 elf64-s390.c:1261
-#: elf64-x86-64.c:1294
+#: elf32-i386.c:1475 elf32-s390.c:1297 elf64-ppc.c:4869 elf64-s390.c:1264
+#: elf64-x86-64.c:1295
 msgid "%B: bad relocation section name `%s'"
 msgstr ""
 
-#: elf32-i386.c:2536
+#: elf32-i386.c:2543
 msgid "%B: unrecognized relocation (0x%x) in section `%A'"
 msgstr ""
 
-#: elf32-i386.c:2758
+#: elf32-i386.c:2765
 msgid ""
 "%B: relocation R_386_GOTOFF against protected function `%s' can not be used "
 "when making a shared object"
@@ -1328,7 +1340,7 @@
 msgid "unsupported relocation between data/insn address spaces"
 msgstr ""
 
-#: elf32-iq2000.c:821 elf32-m32c.c:831
+#: elf32-iq2000.c:865 elf32-m32c.c:826
 #, c-format
 msgid "%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"
 msgstr ""
@@ -1365,88 +1377,88 @@
 msgid ": m32r2 instructions"
 msgstr ""
 
-#: elf32-m68hc1x.c:1045
+#: elf32-m68hc1x.c:1042
 #, c-format
 msgid ""
 "Reference to the far symbol `%s' using a wrong relocation may result in "
 "incorrect execution"
 msgstr ""
 
-#: elf32-m68hc1x.c:1068
+#: elf32-m68hc1x.c:1065
 #, c-format
 msgid ""
 "banked address [%lx:%04lx] (%lx) is not in the same bank as current banked "
 "address [%lx:%04lx] (%lx)"
 msgstr ""
 
-#: elf32-m68hc1x.c:1087
+#: elf32-m68hc1x.c:1084
 #, c-format
 msgid ""
 "reference to a banked address [%lx:%04lx] in the normal address space at %"
 "04lx"
 msgstr ""
 
-#: elf32-m68hc1x.c:1220
+#: elf32-m68hc1x.c:1217
 msgid ""
 "%B: linking files compiled for 16-bit integers (-mshort) and others for 32-"
 "bit integers"
 msgstr ""
 
-#: elf32-m68hc1x.c:1227
+#: elf32-m68hc1x.c:1224
 msgid ""
 "%B: linking files compiled for 32-bit double (-fshort-double) and others for "
 "64-bit double"
 msgstr ""
 
-#: elf32-m68hc1x.c:1236
+#: elf32-m68hc1x.c:1233
 msgid "%B: linking files compiled for HCS12 with others compiled for HC12"
 msgstr ""
 
-#: elf32-m68hc1x.c:1252 elf32-ppc.c:3734 elf64-sparc.c:697 elfxx-mips.c:11312
+#: elf32-m68hc1x.c:1249 elf32-ppc.c:3784 elf64-sparc.c:697 elfxx-mips.c:11675
 msgid "%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"
 msgstr ""
 
-#: elf32-m68hc1x.c:1280
+#: elf32-m68hc1x.c:1277
 #, c-format
 msgid "[abi=32-bit int, "
 msgstr ""
 
-#: elf32-m68hc1x.c:1282
+#: elf32-m68hc1x.c:1279
 #, c-format
 msgid "[abi=16-bit int, "
 msgstr ""
 
-#: elf32-m68hc1x.c:1285
+#: elf32-m68hc1x.c:1282
 #, c-format
 msgid "64-bit double, "
 msgstr ""
 
-#: elf32-m68hc1x.c:1287
+#: elf32-m68hc1x.c:1284
 #, c-format
 msgid "32-bit double, "
 msgstr ""
 
-#: elf32-m68hc1x.c:1290
+#: elf32-m68hc1x.c:1287
 #, c-format
 msgid "cpu=HC11]"
 msgstr ""
 
-#: elf32-m68hc1x.c:1292
+#: elf32-m68hc1x.c:1289
 #, c-format
 msgid "cpu=HCS12]"
 msgstr ""
 
-#: elf32-m68hc1x.c:1294
+#: elf32-m68hc1x.c:1291
 #, c-format
 msgid "cpu=HC12]"
 msgstr ""
 
-#: elf32-m68hc1x.c:1297
+#: elf32-m68hc1x.c:1294
 #, c-format
 msgid " [memory=bank-model]"
 msgstr ""
 
-#: elf32-m68hc1x.c:1299
+#: elf32-m68hc1x.c:1296
 #, c-format
 msgid " [memory=flat]"
 msgstr ""
@@ -1463,15 +1475,15 @@
 msgid "%B: Unknown relocation type %d\n"
 msgstr ""
 
-#: elf32-mep.c:812
+#: elf32-mep.c:654
 msgid "%B and %B are for different cores"
 msgstr ""
 
-#: elf32-mep.c:829
+#: elf32-mep.c:671
 msgid "%B and %B are for different configurations"
 msgstr ""
 
-#: elf32-mep.c:867
+#: elf32-mep.c:709
 #, c-format
 msgid "private flags = 0x%lx"
 msgstr ""
@@ -1489,116 +1501,124 @@
 msgid "generic linker can't handle %s"
 msgstr ""
 
-#: elf32-ppc.c:2163
+#: elf32-ppc.c:2161
 msgid "corrupt or empty %s section in %B"
 msgstr ""
 
-#: elf32-ppc.c:2170
+#: elf32-ppc.c:2168
 msgid "unable to read in %s section from %B"
 msgstr ""
 
-#: elf32-ppc.c:2176
+#: elf32-ppc.c:2174
 msgid "corrupt %s section in %B"
 msgstr ""
 
-#: elf32-ppc.c:2219
+#: elf32-ppc.c:2217
 msgid "warning: unable to set size of %s section in %B"
 msgstr ""
 
-#: elf32-ppc.c:2267
+#: elf32-ppc.c:2265
 msgid "failed to allocate space for new APUinfo section."
 msgstr ""
 
-#: elf32-ppc.c:2286
+#: elf32-ppc.c:2284
 msgid "failed to compute new APUinfo section."
 msgstr ""
 
-#: elf32-ppc.c:2289
+#: elf32-ppc.c:2287
 msgid "failed to install new APUinfo section."
 msgstr ""
 
-#: elf32-ppc.c:3022
+#: elf32-ppc.c:3009
 msgid "%B: relocation %s cannot be used when making a shared object"
 msgstr ""
 
 #. It does not make sense to have a procedure linkage
 #. table entry for a local symbol.
-#: elf32-ppc.c:3292
+#: elf32-ppc.c:3280
 msgid "%B(%A+0x%lx): %s reloc against local symbol"
 msgstr ""
 
-#: elf32-ppc.c:3633 elf32-ppc.c:3637 elfxx-mips.c:11056 elfxx-mips.c:11075
-#: elfxx-mips.c:11090
+#: elf32-ppc.c:3635 elf32-ppc.c:3638 elfxx-mips.c:11379 elfxx-mips.c:11405
+#: elfxx-mips.c:11427 elfxx-mips.c:11453
 msgid "Warning: %B uses hard float, %B uses soft float"
 msgstr ""
 
-#: elf32-ppc.c:3640 elf32-ppc.c:3644 elfxx-mips.c:11037 elfxx-mips.c:11041
+#: elf32-ppc.c:3641 elf32-ppc.c:3645 elfxx-mips.c:11359 elfxx-mips.c:11363
 msgid "Warning: %B uses unknown floating point ABI %d"
 msgstr ""
 
-#: elf32-ppc.c:3699
+#: elf32-ppc.c:3687 elf32-ppc.c:3691
+msgid "Warning: %B uses unknown vector ABI %d"
+msgstr ""
+
+#: elf32-ppc.c:3695
+msgid "Warning: %B uses vector ABI \"%s\", %B uses \"%s\""
+msgstr ""
+
+#: elf32-ppc.c:3749
 msgid ""
 "%B: compiled with -mrelocatable and linked with modules compiled normally"
 msgstr ""
 
-#: elf32-ppc.c:3707
+#: elf32-ppc.c:3757
 msgid ""
 "%B: compiled normally and linked with modules compiled with -mrelocatable"
 msgstr ""
 
-#: elf32-ppc.c:3793
+#: elf32-ppc.c:3843
 msgid "Using bss-plt due to %B"
 msgstr ""
 
-#: elf32-ppc.c:6002 elf64-ppc.c:10567
+#: elf32-ppc.c:6109 elf64-ppc.c:10606
 msgid "%B: unknown relocation type %d for symbol %s"
 msgstr ""
 
-#: elf32-ppc.c:6252
+#: elf32-ppc.c:6359
 msgid "%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"
 msgstr ""
 
-#: elf32-ppc.c:6597 elf32-ppc.c:6623 elf32-ppc.c:6682
+#: elf32-ppc.c:6710 elf32-ppc.c:6736 elf32-ppc.c:6795
 msgid ""
 "%B: the target (%s) of a %s relocation is in the wrong output section (%s)"
 msgstr ""
 
-#: elf32-ppc.c:6737
+#: elf32-ppc.c:6850
 msgid "%B: relocation %s is not yet supported for symbol %s."
 msgstr ""
 
-#: elf32-ppc.c:6845 elf64-ppc.c:11262
+#: elf32-ppc.c:6958 elf64-ppc.c:11301
 msgid "%B(%A+0x%lx): %s reloc against `%s': error %d"
 msgstr ""
 
-#: elf32-s390.c:2238 elf64-s390.c:2212
+#: elf32-s390.c:2246 elf64-s390.c:2220
 msgid "%B(%A+0x%lx): invalid instruction for TLS relocation %s"
 msgstr ""
 
-#: elf32-score.c:1418 elfxx-mips.c:2701
+#: elf32-score.c:1415 elfxx-mips.c:2746
 msgid "not enough GOT space for local GOT entries"
 msgstr ""
 
-#: elf32-score.c:2550
+#: elf32-score.c:2545
 #, c-format
 msgid "%s: Malformed reloc detected for section %s"
 msgstr ""
 
-#: elf32-score.c:2601
+#: elf32-score.c:2596
 msgid "%B: CALL15 reloc at 0x%lx not against global symbol"
 msgstr ""
 
-#: elf32-score.c:3756
+#: elf32-score.c:3753
 #, c-format
 msgid " [pic]"
 msgstr ""
 
-#: elf32-score.c:3760
+#: elf32-score.c:3757
 #, c-format
 msgid " [fix dep]"
 msgstr ""
 
-#: elf32-score.c:3802 elfxx-mips.c:11221
+#: elf32-score.c:3799 elfxx-mips.c:11584
 msgid "%B: warning: linking PIC files with non-PIC files"
 msgstr ""
 
@@ -1617,7 +1637,7 @@
 msgid "%s: object size does not match that of target %s"
 msgstr ""
 
-#: elf32-sh64.c:450 elf64-sh64.c:2894
+#: elf32-sh64.c:450 elf64-sh64.c:2893
 #, c-format
 msgid "%s: encountered datalabel symbol in input"
 msgstr ""
@@ -1681,27 +1701,27 @@
 msgid "%B: 0x%lx: fatal: reloc overflow while relaxing"
 msgstr ""
 
-#: elf32-sh.c:3249 elf64-sh64.c:1526
+#: elf32-sh.c:3253 elf64-sh64.c:1526
 msgid "Unexpected STO_SH5_ISA32 on local symbol is not handled"
 msgstr ""
 
-#: elf32-sh.c:3486
+#: elf32-sh.c:3490
 msgid "%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"
 msgstr ""
 
-#: elf32-sh.c:3519 elf32-sh.c:3534
+#: elf32-sh.c:3523 elf32-sh.c:3538
 msgid "%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"
 msgstr ""
 
-#: elf32-sh.c:3548
+#: elf32-sh.c:3552
 msgid "%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"
 msgstr ""
 
-#: elf32-sh.c:3562
+#: elf32-sh.c:3566
 msgid "%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"
 msgstr ""
 
-#: elf32-sh.c:5275 elf64-alpha.c:4533
+#: elf32-sh.c:5283 elf64-alpha.c:4552
 msgid "%B: TLS local exec code cannot be linked into shared objects"
 msgstr ""
 
@@ -1725,153 +1745,161 @@
 msgid "%B: linking little endian files with big endian files"
 msgstr ""
 
-#: elf32-spu.c:995
+#: elf32-spu.c:553
+msgid "%X%P: overlay sections %A and %A do not start at the same address.\n"
+msgstr ""
+
+#: elf32-spu.c:1072
 msgid "warning: call to non-function symbol %s defined in %B"
 msgstr ""
 
-#: elf32-spu.c:1315
+#: elf32-spu.c:1288
 msgid "%B is not allowed to define %s"
 msgstr ""
 
-#: elf32-spu.c:1352
+#: elf32-spu.c:1335
 #, c-format
 msgid "%s in overlay section"
 msgstr ""
 
-#: elf32-spu.c:1363
+#: elf32-spu.c:1356 elf64-ppc.c:9818
+msgid "stubs don't match calculated size"
+msgstr ""
+
+#: elf32-spu.c:1365
 msgid "overlay stub relocation overflow"
 msgstr ""
 
-#: elf32-spu.c:1820
+#: elf32-spu.c:1799
 #, c-format
 msgid "warning: %s overlaps %s\n"
 msgstr ""
 
-#: elf32-spu.c:1836
+#: elf32-spu.c:1815
 #, c-format
 msgid "warning: %s exceeds section size\n"
 msgstr ""
 
-#: elf32-spu.c:1867
+#: elf32-spu.c:1846
 msgid "%A:0x%v not found in function table\n"
 msgstr ""
 
-#: elf32-spu.c:1958
+#: elf32-spu.c:1937
 msgid ""
 "%B(%A+0x%v): call to non-code section %B(%A), stack analysis incomplete\n"
 msgstr ""
 
-#: elf32-spu.c:2079
+#: elf32-spu.c:2058
 #, c-format
 msgid "%A link_order not found\n"
 msgstr ""
 
-#: elf32-spu.c:2358
+#: elf32-spu.c:2336
 #, c-format
 msgid "Stack analysis will ignore the call from %s to %s\n"
 msgstr ""
 
-#: elf32-spu.c:2513
+#: elf32-spu.c:2490
 msgid "%s: 0x%v 0x%v\n"
 msgstr ""
 
-#: elf32-spu.c:2517
+#: elf32-spu.c:2495
 msgid "  calls:\n"
 msgstr ""
 
-#: elf32-spu.c:2524
+#: elf32-spu.c:2502
 #, c-format
 msgid "   %s%s %s\n"
 msgstr ""
 
-#: elf32-spu.c:2585
+#: elf32-spu.c:2563
 msgid "Stack size for call graph root nodes.\n"
 msgstr ""
 
-#: elf32-spu.c:2586
+#: elf32-spu.c:2564
 msgid ""
 "\n"
 "Stack size for functions.  Annotations: '*' max stack, 't' tail call\n"
 msgstr ""
 
-#: elf32-spu.c:2615
+#: elf32-spu.c:2593
 msgid "  %s: 0x%v\n"
 msgstr ""
 
-#: elf32-spu.c:2625
+#: elf32-spu.c:2603
 msgid "Maximum stack required is 0x%v\n"
 msgstr ""
 
-#: elf32-spu.c:2751
+#: elf32-spu.c:2729
 msgid "%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"
 msgstr ""
 
-#: elf32-v850.c:163
+#: elf32-v850.c:165
 #, c-format
 msgid "Variable `%s' cannot occupy in multiple small data regions"
 msgstr ""
 
-#: elf32-v850.c:166
+#: elf32-v850.c:168
 #, c-format
 msgid ""
 "Variable `%s' can only be in one of the small, zero, and tiny data regions"
 msgstr ""
 
-#: elf32-v850.c:169
+#: elf32-v850.c:171
 #, c-format
 msgid ""
 "Variable `%s' cannot be in both small and zero data regions simultaneously"
 msgstr ""
 
-#: elf32-v850.c:172
+#: elf32-v850.c:174
 #, c-format
 msgid ""
 "Variable `%s' cannot be in both small and tiny data regions simultaneously"
 msgstr ""
 
-#: elf32-v850.c:175
+#: elf32-v850.c:177
 #, c-format
 msgid ""
 "Variable `%s' cannot be in both zero and tiny data regions simultaneously"
 msgstr ""
 
-#: elf32-v850.c:478
+#: elf32-v850.c:480
 #, c-format
 msgid "FAILED to find previous HI16 reloc\n"
 msgstr ""
 
-#: elf32-v850.c:1713
+#: elf32-v850.c:1715
 msgid "could not locate special linker symbol __gp"
 msgstr ""
 
-#: elf32-v850.c:1717
+#: elf32-v850.c:1719
 msgid "could not locate special linker symbol __ep"
 msgstr ""
 
-#: elf32-v850.c:1721
+#: elf32-v850.c:1723
 msgid "could not locate special linker symbol __ctbp"
 msgstr ""
 
-#: elf32-v850.c:1871
+#: elf32-v850.c:1873
 msgid "%B: Architecture mismatch with previous modules"
 msgstr ""
 
-#: elf32-v850.c:1890
+#: elf32-v850.c:1892
 #, c-format
 msgid "private flags = %lx: "
 msgstr ""
 
-#: elf32-v850.c:1895
+#: elf32-v850.c:1897
 #, c-format
 msgid "v850 architecture"
 msgstr ""
 
-#: elf32-v850.c:1896
+#: elf32-v850.c:1898
 #, c-format
 msgid "v850e architecture"
 msgstr ""
 
-#: elf32-v850.c:1897
+#: elf32-v850.c:1899
 #, c-format
 msgid "v850e1 architecture"
 msgstr ""
@@ -1898,17 +1926,17 @@
 "%ld"
 msgstr ""
 
-#: elf32-vax.c:1584
+#: elf32-vax.c:1589
 #, c-format
 msgid "%s: warning: PLT addend of %d to `%s' from %s section ignored"
 msgstr ""
 
-#: elf32-vax.c:1721
+#: elf32-vax.c:1726
 #, c-format
 msgid "%s: warning: %s relocation against symbol `%s' from %s section"
 msgstr ""
 
-#: elf32-vax.c:1727
+#: elf32-vax.c:1732
 #, c-format
 msgid "%s: warning: %s relocation to 0x%x from %s section"
 msgstr ""
@@ -1917,98 +1945,98 @@
 msgid "non-zero addend in @fptr reloc"
 msgstr ""
 
-#: elf32-xtensa.c:733
+#: elf32-xtensa.c:740
 msgid "%B(%A): invalid property table"
 msgstr ""
 
-#: elf32-xtensa.c:2177
+#: elf32-xtensa.c:2148
 msgid "%B(%A+0x%lx): relocation offset out of range (size=0x%x)"
 msgstr ""
 
-#: elf32-xtensa.c:2234
+#: elf32-xtensa.c:2205
 msgid "dynamic relocation in read-only section"
 msgstr ""
 
-#: elf32-xtensa.c:2407
+#: elf32-xtensa.c:2385
 msgid "internal inconsistency in size of .got.loc section"
 msgstr ""
 
-#: elf32-xtensa.c:2714
+#: elf32-xtensa.c:2695
 msgid "%B: incompatible machine type. Output is 0x%x. Input is 0x%x"
 msgstr ""
 
-#: elf32-xtensa.c:3920 elf32-xtensa.c:3928
+#: elf32-xtensa.c:3901 elf32-xtensa.c:3909
 msgid "Attempt to convert L32R/CALLX to CALL failed"
 msgstr ""
 
-#: elf32-xtensa.c:5522 elf32-xtensa.c:5598 elf32-xtensa.c:6714
+#: elf32-xtensa.c:5511 elf32-xtensa.c:5587 elf32-xtensa.c:6703
 msgid ""
 "%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"
 msgstr ""
 
-#: elf32-xtensa.c:6454
+#: elf32-xtensa.c:6443
 msgid ""
 "%B(%A+0x%lx): could not decode instruction for XTENSA_ASM_SIMPLIFY "
 "relocation; possible configuration mismatch"
 msgstr ""
 
-#: elf32-xtensa.c:8168
+#: elf32-xtensa.c:8204
 msgid "invalid relocation address"
 msgstr ""
 
-#: elf32-xtensa.c:8217
+#: elf32-xtensa.c:8253
 msgid "overflow after relaxation"
 msgstr ""
 
-#: elf32-xtensa.c:9343
+#: elf32-xtensa.c:9389
 msgid "%B(%A+0x%lx): unexpected fix for %s relocation"
 msgstr ""
 
-#: elf64-alpha.c:453
+#: elf64-alpha.c:452
 msgid "GPDISP relocation did not find ldah and lda instructions"
 msgstr ""
 
-#: elf64-alpha.c:2404
+#: elf64-alpha.c:2416
 msgid "%B: .got subsegment exceeds 64K (size %d)"
 msgstr ""
 
-#: elf64-alpha.c:4277 elf64-alpha.c:4289
+#: elf64-alpha.c:4296 elf64-alpha.c:4308
 msgid "%B: gp-relative relocation against dynamic symbol %s"
 msgstr ""
 
-#: elf64-alpha.c:4315 elf64-alpha.c:4450
+#: elf64-alpha.c:4334 elf64-alpha.c:4469
 msgid "%B: pc-relative relocation against dynamic symbol %s"
 msgstr ""
 
-#: elf64-alpha.c:4343
+#: elf64-alpha.c:4362
 msgid "%B: change in gp: BRSGP %s"
 msgstr ""
 
-#: elf64-alpha.c:4368
+#: elf64-alpha.c:4387
 msgid "<unknown>"
 msgstr ""
 
-#: elf64-alpha.c:4373
+#: elf64-alpha.c:4392
 msgid "%B: !samegp reloc against symbol without .prologue: %s"
 msgstr ""
 
-#: elf64-alpha.c:4425
+#: elf64-alpha.c:4444
 msgid "%B: unhandled dynamic relocation against %s"
 msgstr ""
 
-#: elf64-alpha.c:4457
+#: elf64-alpha.c:4476
 msgid "%B: pc-relative relocation against undefined weak symbol %s"
 msgstr ""
 
-#: elf64-alpha.c:4517
+#: elf64-alpha.c:4536
 msgid "%B: dtp-relative relocation against dynamic symbol %s"
 msgstr ""
 
-#: elf64-alpha.c:4540
+#: elf64-alpha.c:4559
 msgid "%B: tp-relative relocation against dynamic symbol %s"
 msgstr ""
 
-#: elf64-hppa.c:2040
+#: elf64-hppa.c:2066
 #, c-format
 msgid "stub entry for %s cannot load .plt, dp offset = %ld"
 msgstr ""
@@ -2054,89 +2082,85 @@
 "register is $%ld."
 msgstr ""
 
-#: elf64-mmix.c:2202
+#: elf64-mmix.c:2201
 #, c-format
 msgid ""
 "%s: Error: multiple definition of `%s'; start of %s is set in a earlier "
 "linked file\n"
 msgstr ""
 
-#: elf64-mmix.c:2260
+#: elf64-mmix.c:2259
 msgid "Register section has contents\n"
 msgstr ""
 
-#: elf64-mmix.c:2452
+#: elf64-mmix.c:2451
 #, c-format
 msgid ""
 "Internal inconsistency: remaining %u != max %u.\n"
 "  Please report this bug."
 msgstr ""
 
-#: elf64-ppc.c:2573 libbfd.c:950
+#: elf64-ppc.c:2561 libbfd.c:978
 msgid "%B: compiled for a big endian system and target is little endian"
 msgstr ""
 
-#: elf64-ppc.c:2576 libbfd.c:952
+#: elf64-ppc.c:2564 libbfd.c:980
 msgid "%B: compiled for a little endian system and target is big endian"
 msgstr ""
 
-#: elf64-ppc.c:5896
+#: elf64-ppc.c:5892
 #, c-format
 msgid ""
 "copy reloc against `%s' requires lazy plt linking; avoid setting "
 "LD_BIND_NOW=1 or upgrade gcc"
 msgstr ""
 
-#: elf64-ppc.c:6324
+#: elf64-ppc.c:6320
 msgid "dynreloc miscount for %B, section %A"
 msgstr ""
 
-#: elf64-ppc.c:6428
+#: elf64-ppc.c:6404
 msgid "%B: .opd is not a regular array of opd entries"
 msgstr ""
 
-#: elf64-ppc.c:6437
+#: elf64-ppc.c:6413
 msgid "%B: unexpected reloc type %u in .opd section"
 msgstr ""
 
-#: elf64-ppc.c:6458
+#: elf64-ppc.c:6434
 msgid "%B: undefined sym `%s' in .opd section"
 msgstr ""
 
-#: elf64-ppc.c:7165 elf64-ppc.c:7545
+#: elf64-ppc.c:7211 elf64-ppc.c:7591
 #, c-format
 msgid "%s defined in removed toc entry"
 msgstr ""
 
-#: elf64-ppc.c:8299
+#: elf64-ppc.c:8349
 #, c-format
 msgid "long branch stub `%s' offset overflow"
 msgstr ""
 
-#: elf64-ppc.c:8374
+#: elf64-ppc.c:8425
 #, c-format
 msgid "can't find branch stub `%s'"
 msgstr ""
 
-#: elf64-ppc.c:8440 elf64-ppc.c:8538
+#: elf64-ppc.c:8500 elf64-ppc.c:8598
 #, c-format
 msgid "linkage table error against `%s'"
 msgstr ""
 
-#: elf64-ppc.c:8676
+#: elf64-ppc.c:8736
 #, c-format
 msgid "can't build branch stub `%s'"
 msgstr ""
 
-#: elf64-ppc.c:9147
+#: elf64-ppc.c:9206
 msgid "%B section %A exceeds stub group size"
 msgstr ""
 
-#: elf64-ppc.c:9759
-msgid "stubs don't match calculated size"
-msgstr ""
-
-#: elf64-ppc.c:9771
+#: elf64-ppc.c:9830
 #, c-format
 msgid ""
 "linker stubs in %u group%s\n"
@@ -2147,24 +2171,24 @@
 "  plt call     %lu"
 msgstr ""
 
-#: elf64-ppc.c:10455
+#: elf64-ppc.c:10494
 msgid ""
 "%B(%A+0x%lx): automatic multiple TOCs not supported using your crt files; "
 "recompile with -mminimal-toc or upgrade gcc"
 msgstr ""
 
-#: elf64-ppc.c:10463
+#: elf64-ppc.c:10502
 msgid ""
 "%B(%A+0x%lx): sibling call optimization to `%s' does not allow automatic "
 "multiple TOCs; recompile with -mminimal-toc or -fno-optimize-sibling-calls, "
 "or make `%s' extern"
 msgstr ""
 
-#: elf64-ppc.c:11114
+#: elf64-ppc.c:11153
 msgid "%B: relocation %s is not supported for symbol %s."
 msgstr ""
 
-#: elf64-ppc.c:11196
+#: elf64-ppc.c:11235
 msgid "%B: error: relocation %s not a multiple of %d"
 msgstr ""
 
@@ -2193,23 +2217,23 @@
 msgid "%B: linking UltraSPARC specific with HAL specific code"
 msgstr ""
 
-#: elf64-x86-64.c:1042 elf64-x86-64.c:1202 elf64-x86-64.c:2609
+#: elf64-x86-64.c:1043 elf64-x86-64.c:1203 elf64-x86-64.c:2617
 msgid ""
 "%B: relocation %s against `%s' can not be used when making a shared object; "
 "recompile with -fPIC"
 msgstr ""
 
-#: elf64-x86-64.c:1133
-msgid "%B: %s' accessed both as normal and thread local symbol"
+#: elf64-x86-64.c:1134
+msgid "%B: '%s' accessed both as normal and thread local symbol"
 msgstr ""
 
-#: elf64-x86-64.c:2521
+#: elf64-x86-64.c:2529
 msgid ""
 "%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be "
 "used when making a shared object"
 msgstr ""
 
-#: elf64-x86-64.c:2605
+#: elf64-x86-64.c:2613
 msgid ""
 "%B: relocation R_X86_64_PC32 against protected function `%s' can not be used "
 "when making a shared object"
@@ -2223,170 +2247,170 @@
 msgid "ERROR: %B: Incompatible object tag '%s':%d"
 msgstr ""
 
-#: elf.c:314
+#: elf.c:324
 msgid "%B: invalid string offset %u >= %lu for section `%s'"
 msgstr ""
 
-#: elf.c:416
+#: elf.c:431
 msgid "%B symbol number %lu references nonexistent SHT_SYMTAB_SHNDX section"
 msgstr ""
 
-#: elf.c:569
+#: elf.c:584
 msgid "%B: Corrupt size field in group section header: 0x%lx"
 msgstr ""
 
-#: elf.c:605
+#: elf.c:620
 msgid "%B: invalid SHT_GROUP entry"
 msgstr ""
 
-#: elf.c:675
+#: elf.c:690
 msgid "%B: no group info for section %A"
 msgstr ""
 
-#: elf.c:705 elf.c:2941 elflink.c:9858
+#: elf.c:720 elf.c:2958 elflink.c:9726
 msgid "%B: warning: sh_link not set for section `%A'"
 msgstr ""
 
-#: elf.c:721
+#: elf.c:736
 msgid "%B: sh_link [%d] in section `%A' is incorrect"
 msgstr ""
 
-#: elf.c:756
+#: elf.c:771
 msgid "%B: unknown [%d] section `%s' in group [%s]"
 msgstr ""
 
-#: elf.c:1132
+#: elf.c:1147
 #, c-format
 msgid ""
 "\n"
 "Program Header:\n"
 msgstr ""
 
-#: elf.c:1174
+#: elf.c:1189
 #, c-format
 msgid ""
 "\n"
 "Dynamic Section:\n"
 msgstr ""
 
-#: elf.c:1300
+#: elf.c:1315
 #, c-format
 msgid ""
 "\n"
 "Version definitions:\n"
 msgstr ""
 
-#: elf.c:1325
+#: elf.c:1340
 #, c-format
 msgid ""
 "\n"
 "Version References:\n"
 msgstr ""
 
-#: elf.c:1330
+#: elf.c:1345
 #, c-format
 msgid "  required from %s:\n"
 msgstr ""
 
-#: elf.c:1714
+#: elf.c:1729
 msgid "%B: invalid link %lu for reloc section %s (index %u)"
 msgstr ""
 
-#: elf.c:1882
+#: elf.c:1899
 msgid ""
 "%B: don't know how to handle allocated, application specific section `%s' [0x"
 "%8x]"
 msgstr ""
 
-#: elf.c:1894
+#: elf.c:1911
 msgid "%B: don't know how to handle processor specific section `%s' [0x%8x]"
 msgstr ""
 
-#: elf.c:1905
+#: elf.c:1922
 msgid "%B: don't know how to handle OS specific section `%s' [0x%8x]"
 msgstr ""
 
-#: elf.c:1915
+#: elf.c:1932
 msgid "%B: don't know how to handle section `%s' [0x%8x]"
 msgstr ""
 
-#: elf.c:2498
+#: elf.c:2515
 #, c-format
-msgid "section `%A' type changed to PROGBITS"
+msgid "warning: section `%A' type changed to PROGBITS"
 msgstr ""
 
-#: elf.c:2898
+#: elf.c:2915
 msgid "%B: sh_link of section `%A' points to discarded section `%A' of `%B'"
 msgstr ""
 
-#: elf.c:2921
+#: elf.c:2938
 msgid "%B: sh_link of section `%A' points to removed section `%A' of `%B'"
 msgstr ""
 
-#: elf.c:4226
+#: elf.c:4282
 msgid ""
 "%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"
 msgstr ""
 
-#: elf.c:4249
+#: elf.c:4309
 msgid "%B: Not enough room for program headers, try linking with -N"
 msgstr ""
 
-#: elf.c:4327
+#: elf.c:4387
 msgid "%B: section %A lma 0x%lx overlaps previous sections"
 msgstr ""
 
-#: elf.c:4425
+#: elf.c:4483
 msgid "%B: section `%A' can't be allocated in segment %d"
 msgstr ""
 
-#: elf.c:4475
+#: elf.c:4533
 msgid "%B: warning: allocated section `%s' not in segment"
 msgstr ""
 
-#: elf.c:4971
+#: elf.c:5064
 msgid "%B: symbol `%s' required but not present"
 msgstr ""
 
-#: elf.c:5284
+#: elf.c:5388
 msgid "%B: warning: Empty loadable segment detected, is this intentional ?\n"
 msgstr ""
 
-#: elf.c:6190
+#: elf.c:6334
 #, c-format
 msgid ""
 "Unable to find equivalent output section for symbol '%s' from section '%s'"
 msgstr ""
 
-#: elf.c:7164
+#: elf.c:7316
 msgid "%B: unsupported relocation type %s"
 msgstr ""
 
-#: elfcode.h:813
+#: elfcode.h:819
 #, c-format
 msgid "warning: %s has a corrupt string table index - ignoring"
 msgstr ""
 
-#: elfcode.h:1226
+#: elfcode.h:1232
 #, c-format
 msgid "%s: version count (%ld) does not match symbol count (%ld)"
 msgstr ""
 
-#: elfcode.h:1459
+#: elfcode.h:1469
 #, c-format
 msgid "%s(%s): relocation %d has invalid symbol index %ld"
 msgstr ""
 
-#: elf-eh-frame.c:823
+#: elf-eh-frame.c:866
+msgid "%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"
+msgstr ""
+
+#: elf-eh-frame.c:1098
 msgid ""
 "%P: fde encoding in %B(%A) prevents .eh_frame_hdr table being created.\n"
 msgstr ""
 
-#: elf-eh-frame.c:974
-msgid "%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"
-msgstr ""
-
-#: elf-hppa.h:2219 elf-hppa.h:2233
+#: elf-hppa.h:2226 elf-hppa.h:2240
 msgid "%B(%A): warning: unresolvable relocation against symbol `%s'"
 msgstr ""
 
@@ -2412,284 +2436,292 @@
 msgid "%B: unexpected redefinition of indirect versioned symbol `%s'"
 msgstr ""
 
-#: elflink.c:1974
+#: elflink.c:1982
 msgid "%B: version node not found for symbol %s"
 msgstr ""
 
-#: elflink.c:2122
+#: elflink.c:2130
 msgid ""
 "%B: bad reloc symbol index (0x%lx >= 0x%lx) for offset 0x%lx in section `%A'"
 msgstr ""
 
-#: elflink.c:2314
+#: elflink.c:2322
 msgid "%B: relocation size mismatch in %B section %A"
 msgstr ""
 
-#: elflink.c:2616
+#: elflink.c:2624
 #, c-format
 msgid "warning: type and size of dynamic symbol `%s' are not defined"
 msgstr ""
 
-#: elflink.c:3910
+#: elflink.c:3952
 msgid "%B: %s: invalid version %u (max %d)"
 msgstr ""
 
-#: elflink.c:3946
+#: elflink.c:3988
 msgid "%B: %s: invalid needed version %d"
 msgstr ""
 
-#: elflink.c:4129
+#: elflink.c:4171
 msgid ""
 "Warning: alignment %u of common symbol `%s' in %B is greater than the "
 "alignment (%u) of its section %A"
 msgstr ""
 
-#: elflink.c:4135
+#: elflink.c:4177
 msgid "Warning: alignment %u of symbol `%s' in %B is smaller than %u in %B"
 msgstr ""
 
-#: elflink.c:4150
+#: elflink.c:4192
 msgid "Warning: size of symbol `%s' changed from %lu in %B to %lu in %B"
 msgstr ""
 
-#: elflink.c:4326
+#: elflink.c:4370
 #, c-format
 msgid "%s: invalid DSO for symbol `%s' definition"
 msgstr ""
 
-#: elflink.c:5552
+#: elflink.c:5616
 #, c-format
 msgid "%s: undefined version: %s"
 msgstr ""
 
-#: elflink.c:5620
+#: elflink.c:5684
 msgid "%B: .preinit_array section is not allowed in DSO"
 msgstr ""
 
-#: elflink.c:7359
+#: elflink.c:7401
 #, c-format
 msgid "undefined %s reference in complex symbol: %s"
 msgstr ""
 
-#: elflink.c:7514
+#: elflink.c:7555
 #, c-format
 msgid "unknown operator '%c' in complex symbol"
 msgstr ""
 
-#: elflink.c:8053 elflink.c:8070 elflink.c:8107 elflink.c:8124
+#: elflink.c:7891 elflink.c:7908 elflink.c:7945 elflink.c:7962
 msgid "%B: Unable to sort relocs - they are in more than one size"
 msgstr ""
 
-#: elflink.c:8084 elflink.c:8138
+#: elflink.c:7922 elflink.c:7976
 msgid "%B: Unable to sort relocs - they are of an unknown size"
 msgstr ""
 
-#: elflink.c:8187
+#: elflink.c:8025
 msgid "Not enough memory to sort relocations"
 msgstr ""
 
-#: elflink.c:8374
+#: elflink.c:8213
 msgid "%B: Too many sections: %d (>= %d)"
 msgstr ""
 
-#: elflink.c:8608
+#: elflink.c:8447
 msgid "%B: %s symbol `%s' in %B is referenced by DSO"
 msgstr ""
 
-#: elflink.c:8691
+#: elflink.c:8530
 msgid "%B: could not find output section %A for input section %A"
 msgstr ""
 
-#: elflink.c:8788
+#: elflink.c:8632
 msgid "%B: %s symbol `%s' isn't defined"
 msgstr ""
 
-#: elflink.c:9284
+#: elflink.c:9121
 msgid ""
 "error: %B contains a reloc (0x%s) for section %A that references a non-"
 "existent global symbol"
 msgstr ""
 
-#: elflink.c:9318
+#: elflink.c:9185
 msgid ""
 "%X`%s' referenced in section `%A' of %B: defined in discarded section `%A' "
 "of %B\n"
 msgstr ""
 
-#: elflink.c:9936
+#: elflink.c:9804
 msgid "%A has both ordered [`%A' in %B] and unordered [`%A' in %B] sections"
 msgstr ""
 
-#: elflink.c:9941
+#: elflink.c:9809
 #, c-format
 msgid "%A has both ordered and unordered sections"
 msgstr ""
 
-#: elflink.c:10828 elflink.c:10872
+#: elflink.c:10698 elflink.c:10742
 msgid "%B: could not find output section %s"
 msgstr ""
 
-#: elflink.c:10833
+#: elflink.c:10703
 #, c-format
 msgid "warning: %s section has zero size"
 msgstr ""
 
-#: elflink.c:10937
+#: elflink.c:10807
 msgid "%P: warning: creating a DT_TEXTREL in a shared object.\n"
 msgstr ""
 
-#: elflink.c:11305
-msgid "Removing unused section '%s' in file '%B'"
-msgstr ""
-
-#: elflink.c:11496
-msgid "Warning: gc-sections option ignored"
-msgstr ""
-
-#: elflink.c:11987
+#: elflink.c:10989
 msgid "%P%X: can not read symbols: %E\n"
 msgstr ""
 
-#: elflink.c:12129
+#: elflink.c:11296
+msgid "Removing unused section '%s' in file '%B'"
+msgstr ""
+
+#: elflink.c:11508
+msgid "Warning: gc-sections option ignored"
+msgstr ""
+
+#: elflink.c:12042
 msgid "%B: ignoring duplicate section `%A'"
 msgstr ""
 
-#: elflink.c:12136 elflink.c:12143
+#: elflink.c:12049 elflink.c:12056
 msgid "%B: duplicate section `%A' has different size"
 msgstr ""
 
-#: elflink.c:12151 elflink.c:12156
+#: elflink.c:12064 elflink.c:12069
 msgid "%B: warning: could not read contents of section `%A'"
 msgstr ""
 
-#: elflink.c:12160
+#: elflink.c:12073
 msgid "%B: warning: duplicate section `%A' has different contents"
 msgstr ""
 
-#: elflink.c:12239 linker.c:3081
+#: elflink.c:12152 linker.c:3080
 msgid "%F%P: already_linked_table: %E"
 msgstr ""
 
-#: elf-m10300.c:1532
+#: elf-m10300.c:1618
 msgid ""
 "error: inappropriate relocation type for shared library (did you forget -"
 "fpic?)"
 msgstr ""
 
-#: elf-m10300.c:1535
+#: elf-m10300.c:1621
 msgid "internal error: suspicious relocation type used in shared library"
 msgstr ""
 
-#: elfxx-mips.c:992
+#: elfxx-mips.c:1018
 msgid "static procedure (no name)"
 msgstr ""
 
-#: elfxx-mips.c:4669
+#: elfxx-mips.c:4877
 msgid "%B: %A+0x%lx: jump to stub routine which is not jal"
 msgstr ""
 
-#: elfxx-mips.c:5332 elfxx-mips.c:5552
+#: elfxx-mips.c:5549 elfxx-mips.c:5769
 msgid "%B: Warning: bad `%s' option size %u smaller than its header"
 msgstr ""
 
-#: elfxx-mips.c:6411
+#: elfxx-mips.c:6761
 msgid "%B: Malformed reloc detected for section %s"
 msgstr ""
 
-#: elfxx-mips.c:6453
+#: elfxx-mips.c:6803
 msgid "%B: GOT reloc at 0x%lx not expected in executables"
 msgstr ""
 
-#: elfxx-mips.c:6523
+#: elfxx-mips.c:6873
 msgid "%B: CALL16 reloc at 0x%lx not against global symbol"
 msgstr ""
 
-#: elfxx-mips.c:7887
+#: elfxx-mips.c:8207
 msgid ""
 "%B: Can't find matching LO16 reloc against `%s' for %s at 0x%lx in section `%"
 "A'"
 msgstr ""
 
-#: elfxx-mips.c:8053
+#: elfxx-mips.c:8347
 msgid ""
 "small-data section exceeds 64KB; lower small-data size limit (see option -G)"
 msgstr ""
 
-#: elfxx-mips.c:10681
+#: elfxx-mips.c:10998
 #, c-format
 msgid "%s: illegal section name `%s'"
 msgstr ""
 
-#: elfxx-mips.c:11051 elfxx-mips.c:11070
+#: elfxx-mips.c:11373 elfxx-mips.c:11399
 msgid "Warning: %B uses -msingle-float, %B uses -mdouble-float"
 msgstr ""
 
-#: elfxx-mips.c:11126
+#: elfxx-mips.c:11385 elfxx-mips.c:11441
+msgid "Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64"
+msgstr ""
+
+#: elfxx-mips.c:11411 elfxx-mips.c:11447
+msgid "Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64"
+msgstr ""
+
+#: elfxx-mips.c:11489
 msgid "%B: endianness incompatible with that of the selected emulation"
 msgstr ""
 
-#: elfxx-mips.c:11138
+#: elfxx-mips.c:11501
 msgid "%B: ABI is incompatible with that of the selected emulation"
 msgstr ""
 
-#: elfxx-mips.c:11238
+#: elfxx-mips.c:11601
 msgid "%B: linking 32-bit code with 64-bit code"
 msgstr ""
 
-#: elfxx-mips.c:11266
+#: elfxx-mips.c:11629
 msgid "%B: linking %s module with previous %s modules"
 msgstr ""
 
-#: elfxx-mips.c:11289
+#: elfxx-mips.c:11652
 msgid "%B: ABI mismatch: linking %s module with previous %s modules"
 msgstr ""
 
-#: elfxx-mips.c:11354
+#: elfxx-mips.c:11717
 #, c-format
 msgid " [abi=O32]"
 msgstr ""
 
-#: elfxx-mips.c:11356
+#: elfxx-mips.c:11719
 #, c-format
 msgid " [abi=O64]"
 msgstr ""
 
-#: elfxx-mips.c:11358
+#: elfxx-mips.c:11721
 #, c-format
 msgid " [abi=EABI32]"
 msgstr ""
 
-#: elfxx-mips.c:11360
+#: elfxx-mips.c:11723
 #, c-format
 msgid " [abi=EABI64]"
 msgstr ""
 
-#: elfxx-mips.c:11362
+#: elfxx-mips.c:11725
 #, c-format
 msgid " [abi unknown]"
 msgstr ""
 
-#: elfxx-mips.c:11364
+#: elfxx-mips.c:11727
 #, c-format
 msgid " [abi=N32]"
 msgstr ""
 
-#: elfxx-mips.c:11366
+#: elfxx-mips.c:11729
 #, c-format
 msgid " [abi=64]"
 msgstr ""
 
-#: elfxx-mips.c:11368
+#: elfxx-mips.c:11731
 #, c-format
 msgid " [no abi set]"
 msgstr ""
 
-#: elfxx-mips.c:11389
+#: elfxx-mips.c:11752
 #, c-format
 msgid " [unknown ISA]"
 msgstr ""
 
-#: elfxx-mips.c:11400
+#: elfxx-mips.c:11763
 #, c-format
 msgid " [not 32bitmode]"
 msgstr ""
@@ -2699,7 +2731,7 @@
 msgid "invalid relocation type %d"
 msgstr ""
 
-#: elfxx-sparc.c:2901
+#: elfxx-sparc.c:2913
 msgid "%B: probably compiled without -fPIC?"
 msgstr ""
 
@@ -2786,34 +2818,34 @@
 msgid "%s: address 0x%s out of range for Intel Hex file"
 msgstr ""
 
-#: libbfd.c:980
+#: libbfd.c:1008
 #, c-format
 msgid "Deprecated %s called at %s line %d in %s\n"
 msgstr ""
 
-#: libbfd.c:983
+#: libbfd.c:1011
 #, c-format
 msgid "Deprecated %s called\n"
 msgstr ""
 
-#: linker.c:1875
+#: linker.c:1874
 msgid "%B: indirect symbol `%s' to `%s' is a loop"
 msgstr ""
 
-#: linker.c:2741
+#: linker.c:2740
 #, c-format
 msgid "Attempt to do relocatable link with %s input and %s output"
 msgstr ""
 
-#: linker.c:3048
+#: linker.c:3047
 msgid "%B: warning: ignoring duplicate section `%A'\n"
 msgstr ""
 
-#: linker.c:3062
+#: linker.c:3061
 msgid "%B: warning: duplicate section `%A' has different size\n"
 msgstr ""
 
-#: merge.c:820
+#: merge.c:828
 #, c-format
 msgid "%s: access beyond end of merged section (%ld)"
 msgstr ""
@@ -3070,14 +3102,14 @@
 msgid "Partition[%d] length = 0x%.8lx (%ld)\n"
 msgstr ""
 
-#: som.c:5088
+#: som.c:5116
 #, c-format
 msgid ""
 "\n"
 "Exec Auxiliary Header\n"
 msgstr ""
 
-#: som.c:5349
+#: som.c:5419
 msgid "som_sizeof_headers unimplemented"
 msgstr ""
 
@@ -3085,11 +3117,15 @@
 msgid "%B:%d: Unexpected character `%s' in S-record file\n"
 msgstr ""
 
+#: srec.c:567 srec.c:600
+msgid "%B:%d: Bad checksum in S-record file\n"
+msgstr ""
+
 #: stabs.c:279
 msgid "%B(%A+0x%lx): Stabs entry has invalid string index."
 msgstr ""
 
-#: syms.c:1057
+#: syms.c:1064
 msgid "Unsupported .stab relocation"
 msgstr ""
 
@@ -3126,20 +3162,20 @@
 msgid "Stack underflow in _bfd_vms_pop"
 msgstr ""
 
-#: vms-misc.c:803
+#: vms-misc.c:808
 msgid "_bfd_vms_output_counted called with zero bytes"
 msgstr ""
 
-#: vms-misc.c:808
+#: vms-misc.c:813
 msgid "_bfd_vms_output_counted called with too many bytes"
 msgstr ""
 
-#: vms-misc.c:926
+#: vms-misc.c:931
 #, c-format
 msgid "Symbol %s replaced by %s\n"
 msgstr ""
 
-#: vms-misc.c:985
+#: vms-misc.c:990
 #, c-format
 msgid "failed to enter %s"
 msgstr ""
@@ -3379,33 +3415,33 @@
 msgid "%B: @pcrel relocation against dynamic symbol %s"
 msgstr ""
 
-#: elf32-ia64.c:5072 elf64-ia64.c:5072
+#: elf32-ia64.c:5059 elf64-ia64.c:5059
 msgid "unsupported reloc"
 msgstr ""
 
-#: elf32-ia64.c:5105 elf64-ia64.c:5105
+#: elf32-ia64.c:5092 elf64-ia64.c:5092
 msgid ""
 "%B: Can't relax br (%s) to `%s' at 0x%lx in section `%A' with size 0x%lx (> "
 "0x1000000)."
 msgstr ""
 
-#: elf32-ia64.c:5361 elf64-ia64.c:5361
+#: elf32-ia64.c:5348 elf64-ia64.c:5348
 msgid "%B: linking trap-on-NULL-dereference with non-trapping files"
 msgstr ""
 
-#: elf32-ia64.c:5370 elf64-ia64.c:5370
+#: elf32-ia64.c:5357 elf64-ia64.c:5357
 msgid "%B: linking big-endian files with little-endian files"
 msgstr ""
 
-#: elf32-ia64.c:5379 elf64-ia64.c:5379
+#: elf32-ia64.c:5366 elf64-ia64.c:5366
 msgid "%B: linking 64-bit files with 32-bit files"
 msgstr ""
 
-#: elf32-ia64.c:5388 elf64-ia64.c:5388
+#: elf32-ia64.c:5375 elf64-ia64.c:5375
 msgid "%B: linking constant-gp files with non-constant-gp files"
 msgstr ""
 
-#: elf32-ia64.c:5398 elf64-ia64.c:5398
+#: elf32-ia64.c:5385 elf64-ia64.c:5385
 msgid "%B: linking auto-pic files with non-auto-pic files"
 msgstr ""
 
@@ -3724,24 +3760,24 @@
 "Characteristics 0x%x\n"
 msgstr ""
 
-#: peigen.c:2088 pepigen.c:2088 pex64igen.c:2088
+#: peigen.c:2097 pepigen.c:2097 pex64igen.c:2097
 msgid "%B: unable to fill in DataDictionary[1] because .idata$2 is missing"
 msgstr ""
 
-#: peigen.c:2106 pepigen.c:2106 pex64igen.c:2106
+#: peigen.c:2115 pepigen.c:2115 pex64igen.c:2115
 msgid "%B: unable to fill in DataDictionary[1] because .idata$4 is missing"
 msgstr ""
 
-#: peigen.c:2125 pepigen.c:2125 pex64igen.c:2125
+#: peigen.c:2134 pepigen.c:2134 pex64igen.c:2134
 msgid "%B: unable to fill in DataDictionary[12] because .idata$5 is missing"
 msgstr ""
 
-#: peigen.c:2143 pepigen.c:2143 pex64igen.c:2143
+#: peigen.c:2152 pepigen.c:2152 pex64igen.c:2152
 msgid ""
 "%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because ."
 "idata$6 is missing"
 msgstr ""
 
-#: peigen.c:2163 pepigen.c:2163 pex64igen.c:2163
+#: peigen.c:2172 pepigen.c:2172 pex64igen.c:2172
 msgid "%B: unable to fill in DataDictionary[9] because __tls_used is missing"
 msgstr ""
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 8e1dee5..b5e635e 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -3183,13 +3183,13 @@
   BFD_RELOC_ARC_S21H_PCREL
 ENUMDOC
   ARCompact 21 bit pc-relative branch.  The lowest bit must be zero and is
-  not stored in the instruction.  The remaining 20 bits are installed in 
-  2 groups of 10 bits each.  The high 10 bits are installed in bits 26 
+  not stored in the instruction.  The remaining 20 bits are installed in
+  2 groups of 10 bits each.  The high 10 bits are installed in bits 26
   through 17 and the remaining 10 bits in bits 15 through 6.
 ENUM
   BFD_RELOC_ARC_S21W_PCREL
 ENUMDOC
-  ARCompact 21 bit pc-relative branch. The lowest two bits must be zero and 
+  ARCompact 21 bit pc-relative branch. The lowest two bits must be zero and
   are not stored in the instruction.  The remaining 19 bits are installed in
   2 groups of 9 and 10 bits each.  The high 9 bits are installed in bits 26
   through 18 and the remaining 10 bits in bits 15 through 6.
@@ -3197,9 +3197,9 @@
   BFD_RELOC_ARC_S25H_PCREL
 ENUMDOC
   ARCompact 25 bit pc-relative branch. The lowest bit must be zero and is
-  not stored in the instruction.  The remaining 24 bits are installed in 
+  not stored in the instruction.  The remaining 24 bits are installed in
   3 groups of 10 bits, 10 bits and 4 bits each.  The high 10 bits are
-  installed in bits 26 through 17, next 10 bits in bits 15 through 6 and the 
+  installed in bits 26 through 17, next 10 bits in bits 15 through 6 and the
   remaining 4 bits in bits 3 through 0.
 ENUM
   BFD_RELOC_ARC_S25W_PCREL
@@ -3218,99 +3218,56 @@
 ENUM
   BFD_RELOC_ARC_32_ME
 ENUMDOC
-  ARCompact Middle-endian 32 bit word relocation
+  ARCompact Middle-endian 32 bit word relocation.
 ENUM
-  BFD_RELOC_ARC_PC32 
+  BFD_RELOC_ARC_PC32
 ENUMDOC
-  ARCompact PC Relative 32 bit relocation.
-ENUM 
+  ARCompact PC Relative 32 bit relocation. 
+ENUM
   BFD_RELOC_ARC_GOTPC32
 ENUMDOC
-  ARC 700 GOT specific relocation. This computes the distance from the current 
-pcl to the symbol's global offset table entry. 
+  ARC 700 GOT specific relocation. This computes the distance from the current
+  pcl value to the symbol's global offset table entry. 
 ENUM
-  BFD_RELOC_ARC_PLT32 
-ENUMDOC 
-  ARC 700 PLT specific relocation. This computes the distance from the base 
-of the PLT to the symbols PLT entry. 
+  BFD_RELOC_ARC_PLT32
+ENUMDOC
+  ARC 700 PLT specific relocation. This computes the distance from the base
+  of the PLT to the symbols PLT entry.
 ENUM
   BFD_RELOC_ARC_COPY
 ENUMDOC
-  ARC 700 Copy relocation. This refers to a location in the writable segment 
-and during execution the dynamic linker copies data associated with the shared
-objects symbol to the location specified by the offset. Created for 
-dynamic linking by the linker . 
-ENUM 
-BFD_RELOC_ARC_GLOB_DAT
+  ARC 700 Copy relocation. This refers to a location in the writable segment
+  and during execution the dynamic linker copies data associated with the shared
+  objects symbol to the location specified by the offset. Created for
+  dynamic linking by the linker.
+ENUM
+  BFD_RELOC_ARC_GLOB_DAT
 ENUMDOC
   ARC 700 Global Data relocaton.This is to set a GOT entry to the address
-of the specified symbol . This allows one to determine the correspondence
-between symbols and GOT entries. 
+  of the specified symbol . This allows one to determine the correspondence
+  between symbols and GOT entries.
 ENUM
-BFD_RELOC_ARC_JMP_SLOT
-ENUMDOC 
-  This gives the location of a PLT entrys GOT entry. The dynamic linker 
-modifies the GOT entry so that the PLT will transfer control to the designated
-symbols address. Created by the linker. 
-ENUM
-BFD_RELOC_ARC_RELATIVE
+  BFD_RELOC_ARC_JMP_SLOT
 ENUMDOC
- This gives the location of a value representing a relative address. 
-The dynamic linker adds the load address of the shared library to 
-the relative address to compute the final address. 
+  This gives the location of a PLT entrys GOT entry. The dynamic linker
+  modifies the GOT entry so that the PLT will transfer control to the designated
+  symbols address. Created by the linker. 
 ENUM
-BFD_RELOC_ARC_GOTOFF
+  BFD_RELOC_ARC_RELATIVE
 ENUMDOC
-This gives the difference between a symbols value and the address of the 
-Global Offset Table This causes the linker to build the GOT. 
+  This gives the location of a value representing a relative address.
+  The dynamic linker adds the load address of the shared library to
+  the relative address to compute the final address.
 ENUM
-BFD_RELOC_ARC_GOTPC
+  BFD_RELOC_ARC_GOTOFF
 ENUMDOC
-This gives the difference between the address of the GOT base and the 
-current PC. The symbol referenced is _GLOBAL_OFFSET_TABLE .
+  This gives the difference between a symbols value and the address of the
+  Global Offset Table This causes the linker to build the GOT.
 ENUM
-BFD_RELOC_ARC_GOT32
+  BFD_RELOC_ARC_GOTPC
 ENUMDOC
-ARC 700 GOT specific relocation. This computes the distance from the base
-of the GOT to the symbol's global offset table entry.
-ENUM
-BFD_RELOC_ARC_SDA
-ENUMDOC
-small data reloc 1
-ENUM
-BFD_RELOC_ARC_SDA32
-ENUMDOC
-small data reloc 2
-ENUM
-BFD_RELOC_ARC_SDA_LDST
-ENUMDOC
-small data reloc 3
-ENUM
-BFD_RELOC_ARC_SDA_LDST1
-ENUMDOC
-small data reloc 4
-ENUM
-BFD_RELOC_ARC_SDA_LDST2
-ENUMDOC
-small data reloc 5
-ENUM
-BFD_RELOC_ARC_SDA16_LD
-ENUMDOC
-small data reloc 6
-ENUM
-BFD_RELOC_ARC_SDA16_LD1
-ENUMDOC
-small data reloc 7
-ENUM
-BFD_RELOC_ARC_SDA16_LD2
-ENUMDOC
-small data reloc 8
-ENUM
-BFD_RELOC_ARC_SDA32_ME
-ENUMDOC
-small data reloc 9
-COMMENT
-
+  This gives the difference between the address of the GOT base and the
+  current PC. The symbol referenced is _GLOBAL_OFFSET_TABLE.
 ENUM
   BFD_RELOC_BFIN_16_IMM
 ENUMDOC
diff --git a/gdb/JTAG_aps_driver.c b/gdb/JTAG_aps_driver.c
new file mode 100644
index 0000000..1118948
--- /dev/null
+++ b/gdb/JTAG_aps_driver.c
@@ -0,0 +1,560 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module contains a test driver for the JTAG actionpoints module of */
+/*     the ARC port of gdb.                                                   */
+/*                                                                            */
+/* Usage:                                                                     */
+/*         <driver>  [ -c ] [ -d ] [ -s ] [ -r <count> ]  [ -a N ]            */
+/*                                                                            */
+/*         where -c specifies target connection & disconnection only          */
+/*               -d switches on JTAG operation debuggging                     */
+/*               -s simulates the JTAG target                                 */
+/*               -r specifies the JTAG operation retry count                  */
+/*               -a 2 | 4 | 8 specifies the number of simulated actionpoints  */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "breakpoint.h"
+
+/* ARC header files */
+#include "arc-jtag.h"
+#include "arc-jtag-ops.h"
+#include "arc-jtag-actionpoints.h"
+#include "arc-registers.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+// complete the type here
+struct aux_register_definition
+{
+    const char*        name;
+    ARC_RegisterNumber number;
+};
+
+
+typedef enum
+{
+    CLEAR_USER_BIT,
+    RESTORE_USER_BIT
+} Status32Action;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* global debug flag */
+Boolean arc_debug_target;
+
+ARC_RegisterNumber arc_debug_regnum = ARC_HW_DEBUG_REGNUM;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define SUCCESS          0
+#define FAILURE        (-1)
+
+// what should this be?
+#define DATA_AREA            0x00001000
+#define DATA_AREA_LENGTH           1024
+
+#define BP_ADDRESS     (DATA_AREA + 0x0400)
+
+#define MAX_ACTION_POINTS        8
+
+#define WRITE_WATCHPOINT         0
+#define READ_WATCHPOINT          1
+#define ACCESS_WATCHPOINT        2
+
+#define AP_BUILD              0x76
+
+
+static Boolean           test     = TRUE;
+static Boolean           simulate = FALSE;
+static unsigned int      num_actionpoints = 2;
+static struct target_ops operations;
+
+static const ARC_AuxRegisterDefinition registers[] =
+{
+    { "DEBUG",    ARC_HW_DEBUG_REGNUM    },
+    { "IDENTITY", ARC_HW_IDENTITY_REGNUM },
+    { "PC",       ARC_HW_PC_REGNUM       },
+    { "STATUS32", ARC_HW_STATUS32_REGNUM },
+    { "AP_BUILD", ARC_HW_AP_BUILD_REGNUM },
+    { "AMV0",     ARC_HW_AMV0_REGNUM     },
+    { "AMM0",     ARC_HW_AMM0_REGNUM     },
+    { "AC0",      ARC_HW_AC0_REGNUM      }
+};
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define CHECK(status, expected) \
+{ \
+    if ((status) != (expected)) \
+    { \
+        failed("%d line: status %d != %d", __LINE__, status, expected); \
+    } \
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+static void failed(const char* fmt, ...)
+{
+    va_list ap;
+
+    fprintf(stderr, "*** FAILED: ");
+    va_start(ap, fmt);
+    vfprintf(stderr, fmt, ap);
+    va_end(ap);
+    fprintf(stderr, "\n");
+
+//  exit(EXIT_FAILURE);
+}
+
+
+static void run_tests(Boolean before_reset)
+{
+static struct bp_target_info bpt[MAX_ACTION_POINTS + 1];
+
+    int          status;
+    int          result;
+    CORE_ADDR    addr;
+    unsigned int i;
+    unsigned int max_actionpoints;
+
+    if (before_reset)
+    {
+        memset(&bpt, sizeof(bpt), 0);
+
+        for (i = 0; i <= MAX_ACTION_POINTS; i++)
+            bpt[i].placed_address = BP_ADDRESS + 4 * i;
+    }
+    else
+    {
+        arc_dump_actionpoints("after reset");
+
+        /* remove the actionpoints that were set before the reset */
+        status = operations.to_remove_hw_breakpoint(&bpt[0]);    CHECK(status, SUCCESS);
+        status = operations.to_remove_hw_breakpoint(&bpt[1]);    CHECK(status, SUCCESS);
+    }
+
+
+    if (operations.to_can_use_hw_breakpoint(bp_hardware_breakpoint, 8, 0) == 1)
+        max_actionpoints = 8;
+    else if (operations.to_can_use_hw_breakpoint(bp_hardware_breakpoint, 4, 0) == 1)
+        max_actionpoints = 4;
+    else if (operations.to_can_use_hw_breakpoint(bp_hardware_breakpoint, 2, 0) == 1)
+        max_actionpoints = 2;
+    else
+    {
+        printf("can not use h/w breakpoints\n");
+        return;
+    }
+
+    printf("target supports %d actionpoints\n", max_actionpoints);
+
+
+    /* N breakpoints that each require 1 actionpoint can be set */
+    for (i = 0; i < max_actionpoints + 1; i++)
+    {
+        status = operations.to_insert_hw_breakpoint(&bpt[i]);
+        CHECK(status, (i < max_actionpoints) ? SUCCESS : FAILURE);
+    }
+    for (i = 0; i < max_actionpoints + 1; i++)
+    {
+        status = operations.to_remove_hw_breakpoint(&bpt[i]);
+        CHECK(status, (i < max_actionpoints) ? SUCCESS : FAILURE);
+    }
+
+
+    if (operations.to_region_ok_for_hw_watchpoint(DATA_AREA, DATA_AREA_LENGTH))
+    {
+        /* N watchpoints that each require 1 actionpoint can be set */
+        for (i = 0; i < max_actionpoints + 1; i++)
+        {
+            status = operations.to_insert_watchpoint(DATA_AREA, 4, WRITE_WATCHPOINT);
+            CHECK(status, (i < max_actionpoints) ? SUCCESS : FAILURE);
+        }
+        for (i = 0; i < max_actionpoints + 1; i++)
+        {
+            status = operations.to_remove_watchpoint(DATA_AREA, 4, WRITE_WATCHPOINT);
+            CHECK(status, (i < max_actionpoints) ? SUCCESS : FAILURE);
+        }
+
+        if (max_actionpoints == 8)
+        {
+            /* this requires 2 actionpoints (a pair) */
+            status = operations.to_insert_watchpoint(DATA_AREA,  6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            arc_display_actionpoints();
+            status = operations.to_remove_watchpoint(DATA_AREA,  6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this requires 3 actionpoints (a quad) */
+            status = operations.to_insert_watchpoint(DATA_AREA,  5, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            arc_display_actionpoints();
+            status = operations.to_remove_watchpoint(DATA_AREA,  5, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this requires 4 actionpoints (a quad) */
+            status = operations.to_insert_watchpoint(DATA_AREA,  9, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this requires another 4 actionpoints (another quad) */
+            status = operations.to_insert_watchpoint(DATA_AREA, 25, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            status = operations.to_remove_watchpoint(DATA_AREA,  9, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            status = operations.to_remove_watchpoint(DATA_AREA, 25, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this would require 5 actionpoints! */
+            status = operations.to_insert_watchpoint(DATA_AREA, 17, ACCESS_WATCHPOINT);    CHECK(status, FAILURE);
+
+            /* this will tie up actionpoints 0, 2 and 6 */
+            status = operations.to_insert_hw_breakpoint(&bpt[0]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[1]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[2]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[3]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[4]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[5]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[6]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[1]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[3]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[4]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[5]);    CHECK(status, SUCCESS);
+
+            arc_display_actionpoints();
+
+            arc_dump_actionpoints("before quad shuffle");
+
+            /* this requires 4 actionpoints (a quad) - this should cause the
+             * actionpoints to be shuffled so that a quad is available
+             */
+            status = operations.to_insert_watchpoint(DATA_AREA, 9, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            arc_dump_actionpoints("after quad shuffle");
+
+            arc_display_actionpoints();
+
+            /* release the tied-up actionpoints */
+            status = operations.to_remove_hw_breakpoint(&bpt[0]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[2]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[6]);    CHECK(status, SUCCESS);
+
+            arc_dump_actionpoints("before quad shuffle");
+
+            /* this requires another 4 actionpoints (a quad) - this should
+             * cause the actionpoints to be shuffled so that the other quad is
+             * available
+             */
+            status = operations.to_insert_watchpoint(DATA_AREA, 36, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            arc_dump_actionpoints("after quad shuffle");
+
+            /* release the two quads */
+            status = operations.to_remove_watchpoint(DATA_AREA,  9, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            status = operations.to_remove_watchpoint(DATA_AREA, 36, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+        }
+        else if (max_actionpoints == 4)
+        {
+            /* this requires 2 actionpoints (a pair) */
+            status = operations.to_insert_watchpoint(DATA_AREA, 6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            status = operations.to_remove_watchpoint(DATA_AREA, 6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this requires 3 actionpoints (a quad) */
+            status = operations.to_insert_watchpoint(DATA_AREA, 5, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            status = operations.to_remove_watchpoint(DATA_AREA, 5, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this requires 4 actionpoints (a quad) */
+            status = operations.to_insert_watchpoint(DATA_AREA, 9, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            status = operations.to_remove_watchpoint(DATA_AREA, 9, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this would require 5 actionpoints! */
+            status = operations.to_insert_watchpoint(DATA_AREA, 17, ACCESS_WATCHPOINT);    CHECK(status, FAILURE);
+
+            /* this will tie up actionpoints 0 and 2 */
+            status = operations.to_insert_hw_breakpoint(&bpt[0]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[1]);    CHECK(status, SUCCESS);
+            status = operations.to_insert_hw_breakpoint(&bpt[2]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[1]);    CHECK(status, SUCCESS);
+
+            arc_dump_actionpoints("before quad shuffle");
+
+            /* this requires 2 actionpoints (a pair) - this should cause the
+             * actionpoints to be shuffled so that a pair is available
+             */
+            status = operations.to_insert_watchpoint(DATA_AREA, 6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            status = operations.to_remove_watchpoint(DATA_AREA, 6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            arc_dump_actionpoints("after quad shuffle");
+
+            status = operations.to_remove_hw_breakpoint(&bpt[0]);    CHECK(status, SUCCESS);
+            status = operations.to_remove_hw_breakpoint(&bpt[2]);    CHECK(status, SUCCESS);
+        }
+        else if (max_actionpoints == 2)
+        {
+            /* this requires 2 actionpoints (a pair) */
+            status = operations.to_insert_watchpoint(DATA_AREA, 6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+            status = operations.to_remove_watchpoint(DATA_AREA, 6, ACCESS_WATCHPOINT);    CHECK(status, SUCCESS);
+
+            /* this would require 3 actionpoints! */
+            status = operations.to_insert_watchpoint(DATA_AREA, 5, ACCESS_WATCHPOINT);    CHECK(status, FAILURE);
+        }
+
+        result = operations.to_stopped_by_watchpoint();
+        printf("%sstopped by watchpoint\n", (result) ? "" : "not ");
+
+        result = operations.to_stopped_data_address(&operations, &addr);
+        if (result)
+            printf("stopped by data access at address 0x%08X\n", (unsigned int) addr);
+    }
+    else
+        printf("area %0x08X .. %0x08X does not allow watchpoints\n", DATA_AREA, DATA_AREA + DATA_AREA_LENGTH - 1);
+
+    arc_dump_actionpoints("before reset");
+
+    /* leave some actionpoints set to ensure that there are some to re-establish
+     * after target board reset
+     */
+    if (before_reset)
+    {
+        status = operations.to_insert_hw_breakpoint(&bpt[0]);    CHECK(status, SUCCESS);
+        status = operations.to_insert_hw_breakpoint(&bpt[1]);    CHECK(status, SUCCESS);
+    }
+}
+
+
+static void process_options(int argc, char** argv)
+{
+    int c;
+
+    while ((c = getopt (argc, argv, "sdcr:a:")) != -1)
+    {
+        switch (c)
+        {
+            case 'd':
+                arc_jtag_ops.state_machine_debug = TRUE;
+                break;
+            case 'r':
+                arc_jtag_ops.retry_count = atoi(optarg);
+                break;
+            case 'a':
+                num_actionpoints = atoi(optarg);
+                if (!(num_actionpoints == 2 || num_actionpoints == 4 || num_actionpoints == 8))
+                {
+                   fprintf(stderr, "Usage: %s [ -d ]\n", argv[0]);
+                   exit(EXIT_FAILURE);
+                }
+                break;
+            case 'c':
+                test = FALSE;
+                break;
+            case 's':
+                simulate = TRUE;
+                break;
+            default:
+                fprintf(stderr, "Usage: %s [ -dcs ] [ -r <count> ] [ -a <actionpoints> ]\n", argv[0]);
+                exit(EXIT_FAILURE);
+        }
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+extern void _initialize_arc_jtag_ops(void);
+
+
+int main(int argc, char** argv)
+{
+    Boolean opened;
+
+    printf("Starting test of ARC JTAG actionpoints...\n");
+
+    _initialize_arc_jtag_ops();
+
+    process_options(argc, argv);
+
+    opened = ((simulate) ? TRUE : arc_jtag_ops.open());
+
+    if (opened)
+    {
+        printf("ARC processor is connected\n");
+
+        /* this can be done only after connection */
+        if (arc_initialize_actionpoint_ops(&operations))
+        {
+            if (test)
+            {
+                run_tests(TRUE);
+                printf("resetting board...\n");
+                if (!simulate)
+                    arc_jtag_ops.reset_board();
+                printf("board reset\n");
+                if (!arc_restore_actionpoints_after_reset())
+                    failed("could not restore actionpoints after reset");
+                run_tests(FALSE);
+            }
+        }
+        else
+            printf("processor does not support actionpoints\n");
+
+        if (!simulate)
+            arc_jtag_ops.close();
+    }
+
+    printf("Finished test of ARC JTAG actionpoints\n");
+
+    return 0;
+}
+
+
+/* N.B. these functions are found in arc-jtag.c and arc-registers.c, but are
+ *      included here in order to avoid including that module in the built test
+ *      driver, as that would also pull in a lot of the gdb modules!
+ *
+ *      Also, this allows the AUX register read/write operations to be simulated,
+ *      thus making it possible to test much of the logic of the arc-jtag-actionpoints
+ *      module without a real JTAG target.
+ */
+
+void arc_change_status32(Status32Action action)
+{
+    static ARC_RegisterContents status32;
+
+    if (action == CLEAR_USER_BIT)
+    {
+        /* Get processor out of user mode. */
+
+        if (arc_read_jtag_aux_register(ARC_HW_STATUS32_REGNUM, &status32, FALSE))
+        {
+            /* if the User bit is actually set */
+            if (status32 & STATUS32_USER)
+                if (!arc_write_jtag_aux_register(ARC_HW_STATUS32_REGNUM,
+                                                 status32 & ~STATUS32_USER, FALSE))
+                    warning(_("Can not clear User bit in STATUS32 register"));
+        }
+        else
+            warning(_("Can not read STATUS32 register"));
+    }
+    else
+    {
+        /* if the User bit was actually cleared */
+        if (status32 & STATUS32_USER)
+            if (!arc_write_jtag_aux_register(ARC_HW_STATUS32_REGNUM, status32, FALSE))
+                warning(_("Can not restore User bit in STATUS32 register"));
+    }
+}
+
+
+Boolean arc_read_jtag_aux_register (ARC_RegisterNumber    hwregno,
+                                    ARC_RegisterContents* contents,
+                                    Boolean               warn_on_failure)
+{
+    if (simulate)
+    {
+        if (hwregno == AP_BUILD)
+        {
+            if (num_actionpoints == 2)
+                *contents = 0x00000004;
+            else if (num_actionpoints == 4)
+                *contents = 0x00000104;
+            else
+                *contents = 0x00000204;
+        }
+        else
+            *contents = 0;
+        return TRUE;
+    }
+
+    return (arc_jtag_ops.read_aux_reg(hwregno, contents) == JTAG_SUCCESS);
+}
+
+
+Boolean arc_write_jtag_aux_register (ARC_RegisterNumber   hwregno,
+                                     ARC_RegisterContents contents,
+                                     Boolean              warn_on_failure)
+{
+    if (simulate)
+    {
+//      printf("AUX: hwregno = %d, contents = 0x%08X\n", hwregno, contents);
+        return TRUE;
+    }
+
+    return (arc_jtag_ops.write_aux_reg(hwregno, contents) == JTAG_SUCCESS);
+}
+
+
+ARC_AuxRegisterDefinition*
+arc_find_aux_register_by_name(const char* name)
+{
+    unsigned int i;
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(registers); i++)
+    {
+        const ARC_AuxRegisterDefinition* def = &registers[i];
+
+        if (strcmp(name, def->name) == 0)
+            return (ARC_AuxRegisterDefinition*) def;
+    }
+
+    return NULL;
+}
+
+
+ARC_RegisterNumber arc_aux_hw_register_number(ARC_AuxRegisterDefinition* def)
+{
+    return def->number;
+}
+
+
+ARC_RegisterNumber arc_aux_find_register_number(const char*        name,
+                                                ARC_RegisterNumber defaultNumber)
+{
+    ARC_AuxRegisterDefinition* def = arc_find_aux_register_by_name(name);
+
+    return (def) ? def->number : defaultNumber;
+}
+
+/******************************************************************************/
diff --git a/gdb/JTAG_download.c b/gdb/JTAG_download.c
new file mode 100755
index 0000000..d3f0626
--- /dev/null
+++ b/gdb/JTAG_download.c
@@ -0,0 +1,208 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module contains a test driver for the JTAG operations module of   */
+/*     the ARC port of gdb.  It measures the speed at which data can be       */
+/*     downloaded to the target.                                              */
+/*                                                                            */
+/* Usage:                                                                     */
+/*           <driver>  [ -c ] [ -d ] [ -r <count> ]                           */
+/*                                                                            */
+/*           where -c specifies target connection & disconnection only        */
+/*                 -d switches on JTAG operation debuggging                   */
+/*                 -r specifies the JTAG operation retry count                */
+/*                                                                            */
+/******************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include "arc-jtag-ops.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define MB                       1024 * 1024
+#define DATA_AREA                0x00001000
+#define DATA_AREA_SIZE           1 * MB
+
+
+static ARC_Byte data[DATA_AREA_SIZE];
+
+
+static Boolean test = TRUE;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* global debug flag */
+Boolean arc_debug_target;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+static void failed(const char* fmt, ...)
+{
+    va_list ap;
+
+    printf("*** FAILED: ");
+    va_start(ap, fmt);
+    vprintf(fmt, ap);
+    va_end(ap);
+    printf("\n");
+
+//  exit(EXIT_FAILURE);
+}
+
+
+static void run_test(void)
+{
+    unsigned int   i;
+    unsigned int   bytes;
+    struct timeval start_time, end_time;
+    long long int  time_count;
+
+    for (i = 0; i < DATA_AREA_SIZE; i++)
+        data[i] = (ARC_Byte) i;
+
+    gettimeofday (&start_time, NULL);
+
+    bytes = arc_jtag_ops.memory_write_chunk(DATA_AREA, data, DATA_AREA_SIZE);
+
+    gettimeofday (&end_time, NULL);
+
+    if (bytes != DATA_AREA_SIZE)
+        failed("memory write: %d", bytes);
+
+    /* Compute the elapsed time in milliseconds, as a tradeoff between
+       accuracy and overflow.  */
+    time_count =  (end_time.tv_sec  - start_time.tv_sec)  * 1000;
+    time_count += (end_time.tv_usec - start_time.tv_usec) / 1000;
+
+    if (time_count > 0)
+    {
+        unsigned long rate = (bytes * 1000) / time_count;
+
+        printf("0x%x bytes downloaded in %lld milliseconds\n", bytes, time_count);
+        printf("transfer rate: %lu bytes/sec\n", rate);
+    }
+
+
+    gettimeofday (&start_time, NULL);
+
+    bytes = arc_jtag_ops.memory_write_pattern(DATA_AREA, 0, DATA_AREA_SIZE);
+
+    gettimeofday (&end_time, NULL);
+
+    if (bytes != DATA_AREA_SIZE)
+        failed("memory fill zero: %d", bytes);
+
+    /* Compute the elapsed time in milliseconds, as a tradeoff between
+       accuracy and overflow.  */
+    time_count =  (end_time.tv_sec  - start_time.tv_sec)  * 1000;
+    time_count += (end_time.tv_usec - start_time.tv_usec) / 1000;
+
+    if (time_count > 0)
+    {
+        unsigned long rate = (bytes * 1000) / time_count;
+
+        printf("0x%x bytes zeroed in %lld milliseconds\n", bytes, time_count);
+        printf("zero rate: %lu bytes/sec\n", rate);
+    }
+
+}
+
+
+static void process_options(int argc, char** argv)
+{
+    int c;
+
+    while ((c = getopt (argc, argv, "dcr:")) != -1)
+    {
+        switch (c)
+        {
+            case 'd':
+                arc_jtag_ops.state_machine_debug = TRUE;
+                break;
+            case 'r':
+                arc_jtag_ops.retry_count = atoi(optarg);
+                break;
+            case 'c':
+                test = FALSE;
+                break;
+            default:
+                fprintf(stderr, "Usage: %s [ -d ]\n", argv[0]);
+                exit(EXIT_FAILURE);
+        }
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+extern void _initialize_arc_jtag_ops(void);
+
+
+int main(int argc, char** argv)
+{
+    Boolean opened;
+
+    printf("Starting test of ARC JTAG download...\n");
+
+    _initialize_arc_jtag_ops();
+
+    process_options(argc, argv);
+
+    opened = arc_jtag_ops.open();
+
+    if (opened)
+    {
+        printf("ARC processor is connected\n");
+
+        if (test)
+            run_test();
+
+        arc_jtag_ops.close();
+    }
+
+    printf("Finished test of ARC JTAG download\n");
+
+    return 0;
+}
+
+/******************************************************************************/
diff --git a/gdb/JTAG_ops_driver.c b/gdb/JTAG_ops_driver.c
new file mode 100644
index 0000000..8ae8776
--- /dev/null
+++ b/gdb/JTAG_ops_driver.c
@@ -0,0 +1,904 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module contains a test driver for the JTAG operations module of   */
+/*     the ARC port of gdb.                                                   */
+/*                                                                            */
+/* Usage:                                                                     */
+/*           <driver>  [ -c ] [ -d ] [ -r <count> ] [ -m ]                    */
+/*                                                                            */
+/*           where -c specifies target connection & disconnection only        */
+/*                 -d switches on JTAG operation debuggging                   */
+/*                 -r specifies the JTAG operation retry count                */
+/*                 -m specifies testing memory operations only                */
+/*                                                                            */
+/******************************************************************************/
+
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "arc-jtag-ops.h"
+#include "arc-memory.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef enum
+{
+    RO,    // read-only
+    RW,    // read/write
+    WO,    // write-only
+    UU
+} RegisterMode;
+
+
+typedef struct
+{
+   const char*          name;
+   ARC_RegisterNumber   regno;
+   ARC_RegisterContents mask;
+   RegisterMode         mode;
+} RegisterInfo;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+// what should this be?
+#define DATA_AREA      0x00001000
+#define BUFFER_LENGTH         128
+
+#define ARC_NR_CORE_REGS       32
+
+
+#undef  RBCR
+#define RAUX(name, hwregno, desc, gdbregno, mask, mode, version) { #name, hwregno, mask, mode },
+static const RegisterInfo aux[] =
+{
+   #include "arc-regnums-defs.h"
+};
+
+#undef  RAUX
+#define RBCR(name, hwregno, desc, gdbregno, mask, mode, version) { #name, hwregno, mask, mode },
+static const RegisterInfo bcr[] =
+{
+    #include "arc-regnums-defs.h"
+};
+
+
+static Boolean          test        = TRUE;
+static Boolean          memory_only = FALSE;
+static TargetOperations operations;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* global debug flag */
+Boolean arc_debug_target;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+static void failed(const char* fmt, ...)
+{
+    va_list ap;
+
+    fprintf(stderr, "*** FAILED: ");
+    va_start(ap, fmt);
+    vfprintf(stderr, fmt, ap);
+    va_end(ap);
+    fprintf(stderr, "\n");
+
+//  exit(EXIT_FAILURE);
+}
+
+
+static void read_core_registers(void)
+{
+    ARC_RegisterNumber r;
+
+    for (r = 0; r < ARC_NR_CORE_REGS; r++)
+    {
+        ARC_RegisterContents contents;
+        JTAG_OperationStatus status = arc_jtag_ops.read_core_reg(r, &contents);
+
+        if (status == JTAG_SUCCESS)
+            printf("core register %02d: 0x%08X\n", r, contents);
+        else
+            failed("could not read core register %02d: %d", r, (int) status);
+    }
+}
+
+
+static void write_core_registers(void)
+{
+    ARC_RegisterNumber r;
+
+    for (r = 0; r < ARC_NR_CORE_REGS; r++)
+    {
+        ARC_RegisterContents contents = 0xDEADBEEF + r;
+        JTAG_OperationStatus status   = arc_jtag_ops.write_core_reg(r, contents);
+
+        if (status == JTAG_SUCCESS)
+        {
+            ARC_RegisterContents new_contents;
+
+            status = arc_jtag_ops.read_core_reg(r, &new_contents);
+
+            if (status == JTAG_SUCCESS)
+            {
+                if (new_contents != contents)
+                    failed("discrepancy in core register %02d contents: 0x%08X != 0x%08X", r, contents, new_contents);
+            }
+            else
+               failed("could not read back core register %02d: %d", r, (int) status);
+        }
+        else
+            failed("could not write core register %02d: %d", r, (int) status);
+    }
+}
+
+
+static void read_auxiliary_registers(void)
+{
+    unsigned int i;
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(aux); i++)
+    {
+        const RegisterInfo* info = &aux[i];
+
+        if (info->mode != WO)
+        {
+            ARC_RegisterContents contents;
+            JTAG_OperationStatus status = arc_jtag_ops.read_aux_reg(info->regno, &contents);
+
+            if (status == JTAG_SUCCESS)
+                printf("aux register 0x%03x (%-15s): 0x%08X\n", info->regno, info->name, contents);
+            else
+                failed("could not read aux register 0x%03x (%s): %d", info->regno, info->name, (int) status);
+        }
+    }
+}
+
+
+static void write_auxiliary_registers(void)
+{
+    unsigned int i;
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(aux); i++)
+    {
+  const RegisterInfo* info = &aux[i];
+
+        if (info->mode != RO)
+        {
+            ARC_RegisterContents contents = 0xFFFFFFFF;
+            JTAG_OperationStatus status   = arc_jtag_ops.write_aux_reg(info->regno, contents);
+
+            if (status == JTAG_SUCCESS)
+            {
+                if (info->mode != WO)
+                {
+                    ARC_RegisterContents new_contents;
+
+                    status = arc_jtag_ops.read_aux_reg(info->regno, &new_contents);
+
+                    if (status == JTAG_SUCCESS)
+                    {
+                        ARC_RegisterContents masked_contents     = contents     & info->mask;
+                        ARC_RegisterContents masked_new_contents = new_contents & info->mask;
+
+                        if (masked_new_contents != masked_contents)
+                            failed("discrepancy in aux register %03x (%s) contents: 0x%08X != 0x%08X",
+                                   info->regno, info->name, masked_contents, masked_new_contents);
+                    }
+                    else
+                       failed("could not read back aux register 0x%03x (%s): %d", info->regno, info->name, (int) status);
+                }
+            }
+            else
+                failed("could not write aux register 0x%03x (%s): %d", info->regno, info->name, (int) status);
+        }
+    }
+}
+
+
+static void read_build_configuration_registers(void)
+{
+    unsigned int i;
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(bcr); i++)
+    {
+        const RegisterInfo* info = &bcr[i];
+
+        /* if the register is not unused */
+        if (info->mode != UU)
+        {
+            ARC_RegisterContents contents;
+            JTAG_OperationStatus status = arc_jtag_ops.read_aux_reg(info->regno, &contents);
+
+            if (status == JTAG_SUCCESS)
+                printf("BCR 0x%02x (%-16s): 0x%08X\n", info->regno, info->name, contents);
+            else
+                failed("could not read BCR 0x%02x (%s): %d", info->regno, info->name, (int) status);
+        }
+    }
+}
+
+
+/* these functions should NOT be used within this module: they are intended
+ * purely for use by the arc-memory module for reading/writing multiple words
+ * of data at word-aligned addresses
+ */
+
+static unsigned int read_jtag_words(ARC_Address  address,
+                                    ARC_Byte*    data,
+                                    unsigned int words)
+{
+    DEBUG("reading %u words from 0x%08X in xISS\n", words, address);
+
+    assert(IS_WORD_ALIGNED(address));
+
+    return arc_jtag_ops.memory_read_chunk(address, data, words);
+}
+
+
+static unsigned int write_jtag_words(ARC_Address  address,
+                                     ARC_Byte*    data,
+                                     unsigned int words)
+{
+    assert(IS_WORD_ALIGNED(address));
+
+    DEBUG("writing %u words to 0x%08X in xISS\n", words, address);
+
+    return arc_jtag_ops.memory_write_chunk(address, data, words);
+}
+
+
+static unsigned int write_jtag_pattern(ARC_Address  address,
+                                       ARC_Word     pattern,
+                                       unsigned int words)
+{
+    assert(IS_WORD_ALIGNED(address));
+
+    DEBUG("writing pattern 0x%08X repeated %u times to 0x%08X in xISS\n", pattern, words, address);
+
+    return arc_jtag_ops.memory_write_pattern(address, pattern, words);
+}
+
+
+/* these functions should be used within this module for all memory accesses */
+static unsigned int read_chunk(ARC_Address addr, ARC_Byte* data, unsigned int bytes)
+{
+    unsigned int total_read;
+
+    ENTERARGS("addr 0x%08X, bytes %u", addr, bytes);
+
+    total_read = arc_read_memory(&operations, addr, data, bytes);
+
+    DEBUG("read %u bytes\n", total_read);
+
+    return total_read;
+}
+
+
+static unsigned int write_chunk(ARC_Address addr, ARC_Byte* data, unsigned int bytes)
+{
+    unsigned int total_written;
+
+    ENTERARGS("addr 0x%08X, bytes %u", addr, bytes);
+
+    total_written = arc_write_memory(&operations, addr, data, bytes);
+
+    DEBUG("written %u bytes\n", total_written);
+
+    return total_written;
+}
+
+
+/* write a repeated pattern of data to memory;
+ * the start of each pattern is always word-aligned, so if the given address is
+ * not word-aligned, the first partial word written will contain trailing bytes
+ * of the pattern
+ */
+static unsigned int write_pattern(ARC_Address addr, ARC_Word pattern, unsigned int bytes)
+{
+    unsigned int total_written;
+
+    ENTERARGS("addr 0x%08X, pattern 0x%08X, bytes %u", addr, pattern, bytes);
+
+    total_written = arc_write_pattern(&operations, addr, pattern, bytes);
+
+    DEBUG("written %u bytes\n", total_written);
+
+    return total_written;
+}
+
+
+/* test word read/write operations - write several words to different
+ * addresses to ensure that JTAG Data Register does not still hold first
+ * word; use both contiguous and non-contiguous words to check that
+ * JTAG Address Register is loaded correctly
+ */
+static void read_write_memory_words(void)
+{
+    const ARC_Word write1 = 0xCAFEBABE;
+    const ARC_Word write2 = 0xDEADBEEF;
+    const ARC_Word write3 = 0xBABEFACE;
+    const ARC_Word write4 = 0x12345678;
+    ARC_Word       read1  = 0;
+    ARC_Word       read2  = 0;
+    ARC_Word       read3  = 0;
+    ARC_Word       read4  = 0;
+    unsigned int   bytes;
+
+    bytes = arc_jtag_ops.memory_write_word(DATA_AREA, write1);
+    if (bytes != 4)
+        failed("memory word 1 write: %d", bytes);
+
+    bytes = arc_jtag_ops.memory_write_word(DATA_AREA + 4, write2);
+    if (bytes != 4)
+        failed("memory word 2 write: %d", bytes);
+
+    bytes = arc_jtag_ops.memory_write_word(DATA_AREA + 8, write3);
+    if (bytes != 4)
+        failed("memory word 3 write: %d", bytes);
+
+    bytes = arc_jtag_ops.memory_write_word(DATA_AREA + 20, write4);
+    if (bytes != 4)
+        failed("memory word 4 write: %d", bytes);
+
+    bytes = arc_jtag_ops.memory_read_word(DATA_AREA, &read1);
+    if (bytes != 4)
+        failed("memory word 1 read: %d", bytes);
+
+    bytes = arc_jtag_ops.memory_read_word(DATA_AREA + 4, &read2);
+    if (bytes != 4)
+        failed("memory word 2 read: %d", bytes);
+
+    bytes = arc_jtag_ops.memory_read_word(DATA_AREA + 8, &read3);
+    if (bytes != 4)
+        failed("memory word 3 read: %d", bytes);
+
+    bytes = arc_jtag_ops.memory_read_word(DATA_AREA + 20, &read4);
+    if (bytes != 4)
+        failed("memory word 4 read: %d", bytes);
+
+    if (read1 != write1)
+        failed("word 1: %08X != %08X", read1, write1);
+
+    if (read2 != write2)
+        failed("word 2: %08X != %08X", read2, write2);
+
+    if (read3 != write3)
+        failed("word 3: %08X != %08X", read3, write3);
+
+    if (read3 != write3)
+        failed("word 3: %08X != %08X", read3, write3);
+
+    if (read4 != write4)
+        failed("word 4: %08X != %08X", read4, write4);
+}
+
+
+/* test chunk read/write operations */
+static void read_write_memory_chunks(void)
+{
+    ARC_Byte     in [BUFFER_LENGTH];
+    ARC_Byte     out[BUFFER_LENGTH];
+    unsigned int bytes;
+    unsigned int i;
+    unsigned int offset;
+
+    /* initialize output buffer to 7 bit values */
+    for (i = 0; i < BUFFER_LENGTH; i++)
+        out[i] = (ARC_Byte) i;
+
+    /* ----------------------------------------------------------- */
+    /*                       initialize data area                  */
+    /* ----------------------------------------------------------- */
+
+    /* write series of complete words */
+
+    bytes = write_chunk(DATA_AREA, out, BUFFER_LENGTH);
+    if (bytes != BUFFER_LENGTH)
+        failed("memory chunk write: %d", bytes);
+
+    /* and read them back */
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (bytes != BUFFER_LENGTH)
+        failed("memory chunk read: %d", bytes);
+
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk read/write:");
+
+
+    /* ----------------------------------------------------------- */
+    /*                       read operations                       */
+    /* ----------------------------------------------------------- */
+
+    /* 0) read single word */
+
+    bytes = read_chunk(DATA_AREA, in, 4);
+    if (bytes != 4)
+        failed("memory chunk read word: %d", bytes);
+
+    if (memcmp(in, out, 4) != 0)
+        failed("memory chunk read word");
+
+    /* 1) read leading bytes */
+
+    for (i = 1; i <= 3; i++)
+    {
+        bytes = read_chunk(DATA_AREA + 4 - i, in, i);
+        if (bytes != i)
+            failed("memory chunk read leading bytes: %d", bytes);
+
+        if (memcmp(in, out + 4 - i, i) != 0)
+            failed("memory chunk read leading bytes");
+    }
+
+    /* 2) read trailing bytes */
+
+    for (i = 1; i <= 3; i++)
+    {
+        bytes = read_chunk(DATA_AREA, in, i);
+        if (bytes != i)
+            failed("memory chunk read trailing bytes: %d", bytes);
+
+        if (memcmp(in, out, i) != 0)
+            failed("memory chunk read trailing bytes");
+    }
+
+    /* 3) read leading bytes and series of complete words */
+
+    bytes = read_chunk(DATA_AREA + 1, in, 11);
+    if (bytes != 11)
+        failed("memory chunk read leading bytes and words: %d", bytes);
+
+    if (memcmp(in, out + 1, 11) != 0)
+        failed("memory chunk read leading bytes and words");
+
+    /* 4) read series of complete words and trailing bytes */
+
+    bytes = read_chunk(DATA_AREA, in, 11);
+    if (bytes != 11)
+        failed("memory chunk read words and trailing bytes: %d", bytes);
+
+    if (memcmp(in, out, 11) != 0)
+        failed("memory chunk read words and trailing bytes");
+
+    /* 5) read leading bytes and trailing bytes */
+
+    bytes = read_chunk(DATA_AREA + 1, in, 5);
+    if (bytes != 5)
+        failed("memory chunk read leading and trailing bytes: %d", bytes);
+
+    if (memcmp(in, out + 1, 5) != 0)
+        failed("memory chunk read leading and trailing bytes");
+
+    /* 6) read leading bytes, series of complete words and trailing bytes */
+
+    bytes = read_chunk(DATA_AREA + 2, in, 23);
+    if (bytes != 23)
+        failed("memory chunk read leading bytes, words and trailing bytes: %d", bytes);
+
+    if (memcmp(in, out + 2, 23) != 0)
+        failed("memory chunk read leading bytes, words and trailing bytes");
+
+    /* 7) pathological cases: bytes in middle of word */
+
+    bytes = read_chunk(DATA_AREA + 1, in, 1);
+    if (bytes != 1)
+        failed("memory chunk read bytes in middle (1) : %d", bytes);
+
+    if (memcmp(in, out + 1, 1) != 0)
+        failed("memory chunk read middle bytes (1)");
+
+    bytes = read_chunk(DATA_AREA + 2, in, 2);
+    if (bytes != 2)
+        failed("memory chunk read bytes in middle (2) : %d", bytes);
+
+    if (memcmp(in, out + 2, 2) != 0)
+        failed("memory chunk read middle bytes (2)");
+
+    bytes = read_chunk(DATA_AREA + 3, in, 1);
+    if (bytes != 1)
+        failed("memory chunk read bytes in middle (3) : %d", bytes);
+
+    if (memcmp(in, out + 3, 1) != 0)
+        failed("memory chunk read middle bytes (3)");
+
+
+    /* ----------------------------------------------------------- */
+    /*                       write operations                      */
+    /* ----------------------------------------------------------- */
+
+    /* on each test, read back the whole area: we must check that no other data
+     * in the area has been changed, hence the use of 8-bit values on the write
+     * to distinguish them from the 7-bit values used to initialise the area;
+     * also, a different section of the area is used for each test
+     */
+
+    /* 0) write single word */
+
+    out[0] = 45;
+    out[1] = 89;
+    out[2] = 66;
+    out[3] = 53;
+
+    bytes = write_chunk(DATA_AREA, out, 4);
+    if (bytes != 4)
+        failed("memory chunk write word: %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, 4);
+    if (memcmp(in, out, 4) != 0)
+        failed("memory chunk write word");
+
+    /* 1) write leading bytes */
+
+    for (i = 1; i <= 3; i++)
+    {
+       offset = 8 - i;
+
+        /* change data in output buffer to 8-bit values */
+        *(out + offset) = 128 + i;
+
+        bytes = write_chunk(DATA_AREA + offset, out + offset, i);
+        if (bytes != i)
+            failed("memory chunk write leading bytes: %d", bytes);
+
+        bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+        if (memcmp(in, out, BUFFER_LENGTH) != 0)
+            failed("memory chunk write leading bytes");
+    }
+
+    /* 2) write trailing bytes */
+
+    offset = 8;
+
+    for (i = 1; i <= 3; i++)
+    {
+        /* change data in output buffer to 8-bit values */
+        *(out + offset + i - 1) = 128 + i;
+
+        bytes = write_chunk(DATA_AREA + offset, out + offset, i);
+        if (bytes != i)
+            failed("memory chunk write trailing bytes: %d", bytes);
+
+        bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+        if (memcmp(in, out, BUFFER_LENGTH) != 0)
+            failed("memory chunk write trailing bytes");
+    }
+
+    /* 3) write leading bytes and series of complete words */
+
+    offset = 13;
+
+    for (i = 0; i < 11; i++)
+        *(out + offset + i) = 128 + i;
+
+    bytes = write_chunk(DATA_AREA + offset, out + offset, 11);
+    if (bytes != 11)
+        failed("memory chunk write leading bytes and words: %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write leading bytes and words");
+
+    /* 4) write series of complete words and trailing bytes */
+
+    offset = 28;
+
+    for (i = 0; i < 11; i++)
+        *(out + offset + i) = 128 + i;
+
+    bytes = write_chunk(DATA_AREA + offset, out + offset, 11);
+    if (bytes != 11)
+        failed("memory chunk write words and trailing bytes: %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write words and trailing bytes");
+
+    /* 5) write leading bytes and trailing bytes */
+
+    offset = 40;
+
+    for (i = 0; i < 5; i++)
+        *(out + offset + i) = 128 + i;
+
+    bytes = write_chunk(DATA_AREA + offset, out + offset, 5);
+    if (bytes != 5)
+        failed("memory chunk write leading and trailing bytes: %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write leading and trailing bytes");
+
+    /* 6) write leading bytes, series of complete words and trailing bytes */
+
+    offset = 48;
+
+    for (i = 0; i < 23; i++)
+        *(out + offset + i) = 128 + i;
+
+    bytes = write_chunk(DATA_AREA + offset, out + offset, 23);
+    if (bytes != 23)
+        failed("memory chunk write leading bytes, words and trailing bytes: %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write leading bytes, words and trailing bytes");
+
+    /* 7) pathological cases: bytes in middle of word */
+
+    offset = 85;
+    *(out + offset) = 128;
+
+    bytes = write_chunk(DATA_AREA + offset, out + offset, 1);
+    if (bytes != 1)
+        failed("memory chunk write bytes in middle (1) : %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write middle bytes (1)");
+
+    offset = 95;
+    *(out + offset)     = 129;
+    *(out + offset + 1) = 130;
+
+    bytes = write_chunk(DATA_AREA + offset, out + offset, 2);
+    if (bytes != 2)
+        failed("memory chunk write bytes in middle (2) : %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write middle bytes (2)");
+
+    offset = 106;
+    *(out + offset) = 131;
+
+    bytes = write_chunk(DATA_AREA + offset, out + offset, 1);
+    if (bytes != 1)
+        failed("memory chunk write bytes in middle (3) : %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write middle bytes (3)");
+
+
+    /* ----------------------------------------------------------- */
+    /*                       write zeroes operation                */
+    /* ----------------------------------------------------------- */
+
+    offset = 110;
+
+    for (i = 0; i < 15; i++)
+        *(out + offset + i) = 0;
+
+    bytes = write_pattern(DATA_AREA + offset, 0, 15);
+    if (bytes != 15)
+        failed("memory zero: %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory zero");
+
+
+    /* ----------------------------------------------------------- */
+    /*                       write pattern operation               */
+    /* ----------------------------------------------------------- */
+
+    offset = 38;
+
+    /* the pattern will be word-aligned */
+
+#ifdef TARGET_IS_BIG_ENDIAN
+    *(out + offset +  0) = 0xBE;   // leading bytes
+    *(out + offset +  1) = 0xEF;
+
+    *(out + offset +  2) = 0xDE;   // word 0
+    *(out + offset +  3) = 0xAD;
+    *(out + offset +  4) = 0xBE;
+    *(out + offset +  5) = 0xEF;
+
+    *(out + offset +  6) = 0xDE;   // word 1
+    *(out + offset +  7) = 0xAD;
+    *(out + offset +  8) = 0xBE;
+    *(out + offset +  9) = 0xEF;
+
+    *(out + offset + 10) = 0xDE;   // word 2
+    *(out + offset + 11) = 0xAD;
+    *(out + offset + 12) = 0xBE;
+    *(out + offset + 13) = 0xEF;
+
+    *(out + offset + 14) = 0xDE;   // word 3
+    *(out + offset + 15) = 0xAD;
+    *(out + offset + 16) = 0xBE;
+    *(out + offset + 17) = 0xEF;
+
+    *(out + offset + 18) = 0xDE;   // trailing bytes
+    *(out + offset + 19) = 0xAD;
+#else
+    *(out + offset +  0) = 0xAD;   // leading bytes
+    *(out + offset +  1) = 0xDE;
+
+    *(out + offset +  5) = 0xDE;   // word 0
+    *(out + offset +  4) = 0xAD;
+    *(out + offset +  3) = 0xBE;
+    *(out + offset +  2) = 0xEF;
+
+    *(out + offset +  9) = 0xDE;   // word 1
+    *(out + offset +  8) = 0xAD;
+    *(out + offset +  7) = 0xBE;
+    *(out + offset +  6) = 0xEF;
+
+    *(out + offset + 13) = 0xDE;   // word 2
+    *(out + offset + 12) = 0xAD;
+    *(out + offset + 11) = 0xBE;
+    *(out + offset + 10) = 0xEF;
+
+    *(out + offset + 17) = 0xDE;   // word 3
+    *(out + offset + 16) = 0xAD;
+    *(out + offset + 15) = 0xBE;
+    *(out + offset + 14) = 0xEF;
+
+    *(out + offset + 18) = 0xEF;   // trailing bytes
+    *(out + offset + 19) = 0xBE;
+#endif
+
+    bytes = write_pattern(DATA_AREA + offset, 0xDEADBEEF, 20);
+    if (bytes != 20)
+        failed("memory pattern: %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory pattern");
+
+    /* ----------------------------------------------------------- */
+    /*                       write repeated values operation       */
+    /* ----------------------------------------------------------- */
+
+    /* initialize output buffer to the same value */
+    for (i = 0; i < BUFFER_LENGTH; i++)
+        out[i] = 0xA;
+
+    bytes = write_chunk(DATA_AREA, out, BUFFER_LENGTH);
+    if (bytes != BUFFER_LENGTH)
+        failed("memory chunk write repeated values : %d", bytes);
+
+    bytes = read_chunk(DATA_AREA, in, BUFFER_LENGTH);
+    if (memcmp(in, out, BUFFER_LENGTH) != 0)
+        failed("memory chunk write repeated values");
+}
+
+
+static void run_tests(void)
+{
+    if (!memory_only)
+    {
+        read_core_registers();
+        read_auxiliary_registers();
+        read_build_configuration_registers();
+
+        write_core_registers();
+        write_auxiliary_registers();
+    }
+
+    read_write_memory_words();
+    read_write_memory_chunks();
+}
+
+
+static void process_options(int argc, char** argv)
+{
+    int c;
+
+    while ((c = getopt (argc, argv, "mdcr:")) != -1)
+    {
+        switch (c)
+        {
+            case 'd':
+                arc_jtag_ops.state_machine_debug = TRUE;
+                break;
+            case 'r':
+                arc_jtag_ops.retry_count = atoi(optarg);
+                break;
+            case 'c':
+                test = FALSE;
+                break;
+            case 'm':
+                memory_only = TRUE;
+                break;
+            default:
+                fprintf(stderr, "Usage: %s [ -d ]\n", argv[0]);
+                exit(EXIT_FAILURE);
+        }
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+extern void _initialize_arc_jtag_ops(void);
+
+
+int main(int argc, char** argv)
+{
+    Boolean opened;
+
+    printf("Starting test of ARC JTAG interface...\n");
+
+    _initialize_arc_jtag_ops();
+
+    process_options(argc, argv);
+
+    opened = arc_jtag_ops.open();
+
+    if (opened)
+    {
+        printf("ARC processor is connected\n");
+
+        if (test)
+        {
+            operations.read_core_register       = NULL;
+            operations.write_core_register      = NULL;
+            operations.read_auxiliary_register  = NULL;
+            operations.write_auxiliary_register = NULL;
+            operations.read_memory              = read_jtag_words;
+            operations.write_memory             = write_jtag_words;
+            operations.fill_memory              = write_jtag_pattern;
+
+            run_tests();
+            printf("resetting board...\n");
+            arc_jtag_ops.reset_board();
+            printf("board reset\n");
+            run_tests();
+        }
+
+        arc_jtag_ops.close();
+    }
+
+    printf("Finished test of ARC JTAG interface\n");
+
+    return 0;
+}
+
+/******************************************************************************/
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index f526073..20cce29 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1,5 +1,5 @@
 # Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-# 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
 # Free Software Foundation, Inc.
 
 # This file is part of GDB.
@@ -141,6 +141,9 @@
 # Where is expat?  This will be empty if expat was not available.
 LIBEXPAT = @LIBEXPAT@
 
+# Where are the ARC xISS header files?
+XISS_INCLUDES = @XISS_INCLUDES@
+
 WARN_CFLAGS = @WARN_CFLAGS@
 WERROR_CFLAGS = @WERROR_CFLAGS@
 GDB_WARN_CFLAGS = $(WARN_CFLAGS)
@@ -364,7 +367,8 @@
 	$(CFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \
 	$(GDB_CFLAGS) $(OPCODES_CFLAGS) $(READLINE_CFLAGS) \
 	$(BFD_CFLAGS) $(INCLUDE_CFLAGS) $(LIBDECNUMBER_CFLAGS) \
-	$(INTL_CFLAGS) $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS)
+	$(INTL_CFLAGS) $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) \
+        $(XISS_INCLUDES)
 INTERNAL_WARN_CFLAGS = $(INTERNAL_CFLAGS_BASE) $(GDB_WARN_CFLAGS)
 INTERNAL_CFLAGS = $(INTERNAL_WARN_CFLAGS) $(GDB_WERROR_CFLAGS)
 
@@ -392,7 +396,7 @@
 CLIBS = $(SIM) $(READLINE) $(OPCODES) $(BFD) $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \
 	$(XM_CLIBS) $(TM_CLIBS) $(NAT_CLIBS) $(GDBTKLIBS) @LIBS@ \
 	$(LIBICONV) $(LIBEXPAT) \
-	$(LIBIBERTY) $(WIN32LIBS)
+	$(LIBIBERTY) $(WIN32LIBS) -lz
 CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE_DEPS) \
 	$(OPCODES) $(INTL_DEPS) $(LIBIBERTY) $(CONFIG_DEPS)
 
@@ -411,7 +415,8 @@
 
 # XML files to build in to GDB.
 XMLFILES = $(srcdir)/features/gdb-target.dtd $(srcdir)/features/xinclude.dtd \
-	$(srcdir)/features/library-list.dtd
+	$(srcdir)/features/library-list.dtd \
+	$(srcdir)/features/arc-registers.dtd 
 
 # This is ser-unix.o for any system which supports a v7/BSD/SYSV/POSIX
 # interface to the serial port.  Hopefully if get ported to OS/2, VMS,
@@ -423,7 +428,7 @@
 
 # The `remote' debugging target is supported for most architectures,
 # but not all (e.g. 960)
-REMOTE_OBS = remote.o dcache.o tracepoint.o ax-general.o ax-gdb.o remote-fileio.o
+REMOTE_OBS = remote.o dcache.o tracepoint.o ax-general.o ax-gdb.o remote-fileio.o target-fileio.o
 
 # This is remote-sim.o if a simulator is to be linked in.
 SIM_OBS = @SIM_OBS@
@@ -624,7 +629,7 @@
 	solib.c solib-null.c source.c \
 	stabsread.c stack.c std-regs.c symfile.c symfile-mem.c symmisc.c \
 	symtab.c \
-	target.c target-descriptions.c target-memory.c \
+	target.c target-descriptions.c target-fileio.c target-memory.c \
 	thread.c top.c tracepoint.c \
 	trad-frame.c \
 	tramp-frame.c \
@@ -647,6 +652,7 @@
 getopt_h =	$(INCLUDE_DIR)/getopt.h
 floatformat_h =	$(INCLUDE_DIR)/floatformat.h
 bfd_h =		$(BFD_DIR)/bfd.h
+bfd_in2_h =		$(BFD_DIR)/bfd-in2.h
 coff_sym_h =	$(INCLUDE_DIR)/coff/sym.h
 coff_symconst_h =	$(INCLUDE_DIR)/coff/symconst.h
 coff_ecoff_h =	$(INCLUDE_DIR)/coff/ecoff.h
@@ -731,10 +737,25 @@
 arch_utils_h = arch-utils.h
 arm_linux_tdep_h = arm-linux-tdep.h
 arm_tdep_h = arm-tdep.h
+arc_board_h = arc-board.h
+arc_gpio_h = arc-gpio.h
 arc_tdep_h = arc-tdep.h
 arc_jtag_h = arc-jtag.h
+arc_xiss_h = arc-xiss.h
+arc_inst_tracing_h = arc-inst-tracing.h
+arc_memory_h = arc-memory.h
+arc_arguments_h = arc-arguments.h
+arc_elf32_tdep_h = arc-elf32-tdep.h
+arc_linux_tdep_h = arc-linux-tdep.h
 arc_jtag_ops_h = arc-jtag-ops.h
-arc_regnums_defs_h = arc-regnums-defs.h
+arc_tm_linux_h = config/arc/tm-linux.h
+arc_tm_embed_h = config/arc/tm-embed.h
+arc_sim_registers_h = ../sim/arc/arc-sim-registers.h
+arc_jtag_actionpoints_h = arc-jtag-actionpoints.h
+arc_registers_h = arc-registers.h
+arc_remote_fileio_h = arc-remote-fileio.h
+arc_architecture_h = arc-architecture.h
+arc_support_h = arc-support.h
 auxv_h = auxv.h
 ax_gdb_h = ax-gdb.h
 ax_h = ax.h $(doublest_h)
@@ -849,6 +870,8 @@
 objc_lang_h = objc-lang.h
 objfiles_h = objfiles.h $(gdb_obstack_h) $(symfile_h)
 obsd_tdep_h = obsd-tdep.h
+opcodes_arc_dis_h = $(OPCODES_DIR)/arc-dis.h
+opcodes_arcompact_dis_h = $(OPCODES_DIR)/arcompact-dis.h
 osabi_h = osabi.h
 parser_defs_h = parser-defs.h $(doublest_h)
 p_lang_h = p-lang.h
@@ -895,6 +918,7 @@
 symtab_h = symtab.h
 target_h = target.h $(bfd_h) $(symtab_h) $(dcache_h) $(memattr_h) $(vec_h)
 target_descriptions_h = target-descriptions.h
+target_fileio_h = target-fileio.h
 terminal_h = terminal.h
 top_h = top.h
 tracepoint_h = tracepoint.h
@@ -1535,8 +1559,11 @@
 	amd64obsd-nat.c amd64obsd-tdep.c \
 	amd64-linux-nat.c amd64-linux-tdep.c \
 	amd64-sol2-tdep.c \
-	arc-tdep.c arc-linux-tdep.c arc-jtag.c \
-	arc-jtag-ops.c arc-jtag.c \
+	arc-jtag-actionpoints.c arc-remote-fileio.c \
+	arc-tdep.c arc-linux-tdep.c arc-jtag.c arc-architecture.c \
+	arc-jtag-ops.c arc-jtag.c arc-registers.c arc-board.c \
+	arc-xiss.c arc-gpio.c arc-memory.c arc-arguments.c \
+	arc-inst-tracing.c \
 	arm-linux-nat.c arm-linux-tdep.c arm-tdep.c \
 	armnbsd-nat.c armbsd-tdep.c armnbsd-tdep.c armobsd-tdep.c \
 	avr-tdep.c \
@@ -1901,20 +1928,78 @@
 	$(gdbcmd_h) $(inferior_h) $(gdb_string_h) $(regcache_h) \
 	$(gdb_assert_h) $(sim_regno_h) $(gdbcore_h) $(osabi_h) $(version_h) \
 	$(floatformat_h) $(target_descriptions_h)
-arc-jtag.o:arc-jtag.c $(arc_jtag_h) $(defs_h) $(gdbcore_h) \
-	$(arc_regnums_defs_h) $(gdbcmd_h)
-arc-jtag-ops.o: arc-jtag-ops.c $(arc_jtag_ops_h) $(arc_tdep_h)
-arc-jtag-tdep.o:arc-jtag-tdep.c $(arc_tdep_h) $(arc_jtag_h) $(defs_h) \
-	$(osabi_h) $(frame_h) $(regcache_h) $(gdb_assert_h) $(inferior_h) \
-	$(arc_tdep_h) $(arc_jtag_h)
-arc-linux-tdep.o: arc-linux-tdep.c $(defs_h) $(osabi_h) $(frame_h) \
-	$(regcache_h) $(gdb_assert_h) $(inferior_h) $(reggroups_h) \
-	$(solib_svr4_h) $(symtab_h) $(objfiles_h) $(block_h) $(arc_tdep_h)
-arc-tdep.o: arc-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) $(inferior_h) \
-	$(gdbcmd_h) $(gdbcore_h) $(gdb_string_h) $(dis_asm_h) $(regcache_h) \
-	$(doublest_h) $(value_h)  $(frame_unwind_h) $(frame_base_h) \
-	$(trad_frame_h) $(arc_tdep_h)  $(elf_bfd_h) $(elf_arc_h) \
-	$(opcode_arc_h) $(gdb_assert_h) $(bfd_in2_h) $(observer_h)
+arc-architecture.o: arc-architecture.c \
+	$(arc_architecture_h) $(arc_registers_h) $(arch_utils_h) \
+	$(arc_elf32_tdep_h) $(arc_support_h) $(arc_tdep_h) $(bfd_in2_h) \
+	$(defs_h) $(gdbarch_h) $(gdb_events_h) $(objfiles_h) $(breakpoint_h) \
+	$(target_h) $(gdb_assert_h)
+	$(CC) -c $(INTERNAL_CFLAGS) -Wno-format-nonliteral $<
+arc-registers.o: arc-registers.c \
+	$(arc_architecture_h) $(arc_registers_h) $(arc_elf32_tdep_h) \
+	$(arc_sim_registers_h) $(arc_support_h) $(arc_tdep_h) \
+	$(arc_tm_embed_h) $(bfd_in2_h) $(defs_h) $(gdbarch_h) $(gdbcmd_h) \
+	$(inferior_h) $(objfiles_h) $(regcache_h) \
+	$(target_h) $(xml_support_h) $(breakpoint_h) $(gdb_assert_h)
+	$(CC) -c $(INTERNAL_CFLAGS) -Wno-format-nonliteral $<
+arc-board.o: arc-board.c $(arc_architecture_h) $(arc_registers_h) \
+	$(arc_board_h) $(arc_gpio_h) $(arc_jtag_h) $(arc_jtag_ops_h) \
+	$(arc_support_h) $(arc_tdep_h) $(bfd_in2_h) \
+	$(completer_h) $(defs_h) $(gdbarch_h) $(gdbcmd_h) $(objfiles_h)
+	$(CC) -c $(INTERNAL_CFLAGS) -Wno-format-nonliteral $<
+arc-gpio.o: arc-gpio.c \
+	$(arc_gpio_h) $(arc_support_h) $(defs_h)
+arc-jtag.o: arc-jtag.c \
+	$(arc_architecture_h) $(arc_registers_h) $(arc_board_h) \
+	$(arc_gpio_h) $(arc_jtag_actionpoints_h) $(arc_jtag_h) \
+	$(arc_jtag_ops_h) $(arc_elf32_tdep_h) $(arc_support_h) $(arc_tdep_h) \
+	$(arc_tm_embed_h) $(bfd_in2_h) $(breakpoint_h) $(defs_h) $(gdbarch_h) \
+	$(gdbcmd_h) $(inferior_h) $(libiberty_h) $(objfiles_h) $(target_h) \
+	$(gdb_assert_h)
+arc-arguments.o: arc-arguments.c $(arc_arguments_h) $(arc_support_h) \
+	$(arc_tdep_h) $(defs_h) $(objfiles_h) \
+	$(regcache_h) $(symtab_h) $(target_h)
+arc-memory.o: arc-memory.c \
+	$(arc_memory_h) $(arc_tdep_h) $(arc_support_h) $(defs_h)
+arc-inst-tracing.o: arc-inst-tracing.c \
+	$(arc_inst_tracing_h) $(arc_tdep_h) $(arc_support_h)
+arc-xiss.o: arc-xiss.c \
+	$(arc_architecture_h) $(arc_elf32_tdep_h) $(arc_registers_h) \
+	$(arc_support_h) $(arc_tdep_h) $(arc_tm_embed_h) $(arc_xiss_h) \
+	$(arc_inst_tracing_h) $(bfd_in2_h) $(breakpoint_h) $(defs_h) \
+	$(disasm_h) $(gdbarch_h) $(gdbcmd_h) $(inferior_h) $(libiberty_h) \
+	$(objfiles_h) $(completer_h) $(target_h) $(gdb_assert_h)
+arc-jtag-ops.o: arc-jtag-ops.c $(arc_gpio_h) $(arc_jtag_h) $(arc_jtag_ops_h) \
+	$(arc_support_h) $(defs_h) $(gdb_assert_h)
+arc-elf32-tdep.o:arc-elf32-tdep.c $(arc_architecture_h) $(arc_registers_h) \
+	$(arch_utils_h) $(arc_remote_fileio_h) $(arc_memory_h) \
+	$(arc_elf32_tdep_h) $(arc_support_h) $(arc_tdep_h) $(arc_tm_embed_h) \
+	$(arc_arguments_h) $(bfd_in2_h) $(defs_h) $(gdbarch_h) $(gdbcmd_h) \
+	$(gdb_events_h) $(inferior_h) $(objfiles_h) \
+	$(observer_h) $(exceptions_h) $(regcache_h) $(reggroups_h) \
+	$(gdbcore_h) $(breakpoint_h) $(target_h) $(gdb_assert_h)
+	$(CC) -c $(INTERNAL_CFLAGS) -Wno-format-nonliteral $<
+arc-linux-tdep.o: arc-linux-tdep.c $(arc_linux_tdep_h) $(arc_support_h) \
+	$(arc_tdep_h) $(arc_tm_linux_h) $(block_h) $(defs_h) $(dis_asm_h) \
+	$(gdbarch_h) $(inferior_h) $(opcode_arc_h) $(osabi_h) $(regcache_h) \
+	$(reggroups_h) $(regset_h) $(solib_svr4_h) $(gdb_assert_h)
+arc-tdep.o: arc-tdep.c $(arch_utils_h) $(arc_support_h) $(arc_tdep_h) \
+	$(arc_tm_linux_h) $(arc_tm_embed_h) \
+	$(block_h) $(defs_h) $(demangle_h) $(dictionary_h) $(dis_asm_h) \
+	$(dwarf2_frame_h) $(frame_h) $(frame_unwind_h) $(gdbcmd_h) \
+	$(gdbcore_h) $(inferior_h) $(language_h) \
+	$(objfiles_h) $(observer_h) $(opcode_arc_h) $(opcodes_arc_dis_h) \
+	$(opcodes_arcompact_dis_h) $(osabi_h) $(regcache_h) $(reggroups_h) \
+	$(trad_frame_h) $(gdb_assert_h)
+arc-jtag-actionpoints.o: arc-jtag-actionpoints.c $(arc_architecture_h) \
+	$(arc_registers_h) $(arc_jtag_actionpoints_h) $(arc_jtag_h) \
+	$(arc_jtag_ops_h) $(arc_support_h) $(arc_tdep_h) $(arc_elf32_tdep_h) \
+	$(bfd_in2_h) $(defs_h) $(gdbarch_h) $(gdb_assert_h) $(inferior_h) \
+	$(target_h) $(breakpoint_h)
+arc-remote-fileio.o:  arc-remote-fileio.c \
+	$(arc_remote_fileio_h) $(arc_support_h) $(arc_tm_embed_h) \
+	$(block_h) $(defs_h) $(frame_h) $(target_h) \
+	$(gdb_fileio_h) $(symtab_h) $(target_fileio_h) $(exceptions_h)
+	$(CC) -c $(INTERNAL_CFLAGS) -Wno-format-nonliteral $<
 arm-linux-nat.o: arm-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
 	$(gdb_string_h) $(regcache_h) $(arm_tdep_h) $(gregset_h) \
 	$(target_h) $(linux_nat_h) $(gdb_proc_service_h) $(arm_linux_tdep_h) \
@@ -2645,8 +2730,8 @@
 	$(cli_decode_h) $(cli_setshow_h) $(memory_map_h) \
 	$(target_descriptions_h) $(gdb_fileio_h)
 remote-fileio.o: remote-fileio.c $(defs_h) $(gdb_string_h) $(gdbcmd_h) \
-	$(remote_h) $(gdb_fileio_h) $(gdb_wait_h) $(gdb_stat_h) \
-	$(exceptions_h) $(remote_fileio_h)
+	$(remote_h) $(gdb_fileio_h) \
+	$(exceptions_h) $(remote_fileio_h) $(target_fileio_h)
 remote-m32r-sdi.o: remote-m32r-sdi.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
 	$(inferior_h) $(target_h) $(regcache_h) $(gdb_string_h) $(serial_h)
 remote-mips.o: remote-mips.c $(defs_h) $(inferior_h) $(bfd_h) $(symfile_h) \
@@ -2898,6 +2983,9 @@
 	$(target_h) $(target_descriptions_h) $(vec_h) $(xml_tdesc_h) \
 	$(gdbcmd_h) $(gdb_assert_h) $(gdbtypes_h) $(reggroups_h) \
 	$(xml_support_h) $(gdb_obstack_h) $(hashtab_h)
+target-fileio.o: target-fileio.c $(defs_h) $(exceptions_h) $(gdbcmd_h) \
+	$(gdb_fileio_h) $(gdb_stat_h) $(gdb_string_h) $(gdb_wait_h) \
+	$(target_fileio_h)
 target-memory.o: target-memory.c $(defs_h) $(vec_h) $(target_h) \
 	$(memory_map_h) $(gdb_assert_h)
 thread.o: thread.c $(defs_h) $(symtab_h) $(frame_h) $(inferior_h) \
diff --git a/gdb/arc-architecture.c b/gdb/arc-architecture.c
new file mode 100755
index 0000000..f520d61
--- /dev/null
+++ b/gdb/arc-architecture.c
@@ -0,0 +1,502 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Author:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module provides support for handling the architectural version of */
+/*     of the ARC target processor.                                           */
+/*                                                                            */
+/* Architectural Checks:                                                      */
+/*     Checks upon architectural consistency are (currently) performed at     */
+/*     these points:                                                          */
+/*                                                                            */
+/*        1) after connection to target                                       */
+/*        2) after reading (non-default) XML file                             */
+/*        3) after blasting JTAG target FPGA                                  */
+/*        4) after attaching to JTAG target                                   */
+/*        5) after selecting executable file                                  */
+/*        6) before downloading program to target                             */
+/*                                                                            */
+/******************************************************************************/
+
+/* gdb header files.  */
+#include "defs.h"
+#include "objfiles.h"
+#include "arch-utils.h"
+#include "gdb-events.h"
+#include "gdb_assert.h"
+
+/* ARC header files.  */
+#include "arc-architecture.h"
+#include "arc-elf32-tdep.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef enum
+{
+    DEFAULT_SIMULATOR_WITH_NO_AUXILIARY_REGISTERS,
+    DEFAULT_SIMULATOR_WITH_AUXILIARY_REGISTERS,
+    SELECTED_SIMULATOR_WITH_NO_AUXILIARY_REGISTERS,
+    SELECTED_SIMULATOR_WITH_AUXILIARY_REGISTERS,
+    TARGET_WITH_NO_AUXILIARY_REGISTERS,
+    TARGET_WITH_AUXILIARY_REGISTERS,
+    EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS,
+    EXECUTABLE_WITH_AUXILIARY_REGISTERS,
+    DEFAULT_SIMULATOR_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS,
+    DEFAULT_SIMULATOR_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS,
+    SELECTED_SIMULATOR_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS,
+    SELECTED_SIMULATOR_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS,
+    TARGET_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS,
+    TARGET_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS,
+    NO_ERROR
+} Diagnostic;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+/* N.B. the messages MUST correspond to the values in the Diagnostic enumeration
+        type above, as a value of that type is used to index the array.  */
+
+static const char *messages[] =
+{
+    "default simulator architecture is %s but auxiliary registers are not defined",
+    "default simulator architecture is %s but auxiliary registers are defined for %s",
+    "selected simulator architecture is %s but auxiliary registers are not defined",
+    "selected simulator architecture is %s but auxiliary registers are defined for %s",
+    "target architecture is %s but auxiliary registers are not defined",
+    "target architecture is %s but auxiliary registers are defined for %s",
+    "executable file %s is built for %s but auxiliary registers are not defined",
+    "executable file %s is built for %s but auxiliary registers are defined for %s",
+    "default simulator architecture is %s, executable file %s is built for %s but auxiliary registers are not defined",
+    "default simulator architecture is %s, executable file %s is built for %s and auxiliary registers are defined for %s",
+    "selected simulator is %s, executable file %s is built for %s but auxiliary registers are not defined",
+    "selected simulator is %s, executable file %s is built for %s and auxiliary registers are defined for %s",
+    "target architecture is %s, executable file %s is built for %s but auxiliary registers are not defined",
+    "target architecture is %s, executable file %s is built for %s and auxiliary registers are defined for %s"
+};
+
+
+/* This is the architecture of the current target.  */
+static ARC_ProcessorVersion ARC_processor = NO_ARCHITECTURE;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Map the BFD architerctural type onto the ARC processor type.  */
+
+static ARC_ProcessorVersion
+architecture (const bfd_arch_info_type *arch)
+{
+    switch (arch->mach)
+    {
+        case bfd_mach_arc_a5    : return A5;
+        case bfd_mach_arc_arc600: return ARC600;
+        case bfd_mach_arc_arc700: return ARC700;
+        default                 : return UNSUPPORTED_ARCHITECTURE;
+    }
+}
+
+
+/* This function performs the architectural consistency check.
+
+   Parameters:
+      target              : the architectural version of the target
+      auxregs             : the architectural version of the auxiliary registers
+      program             : the architectural version of the executable program
+      is_builtin_simulator: TRUE if the target is the built-in simulator
+      is_default          : TRUE if built-in simulator's version is the default
+      objfile_bfd         : a pointer to the BFD for the object file
+
+  If the check fails, an appropriate warning message is output.  */
+
+static void
+perform_check (ARC_ProcessorVersion target,
+               ARC_ProcessorVersion auxregs,
+               ARC_ProcessorVersion program,
+               Boolean              is_builtin_simulator,
+               bfd_boolean          is_default,
+               bfd                 *objfile_bfd)
+{
+    Diagnostic diagnostic = NO_ERROR;
+
+    /* If we do not yet have an object file (and hence we do not know the
+       program's architecture).  */
+    if (program == NO_ARCHITECTURE)
+    {
+        if (target != auxregs)
+        {
+            if (is_builtin_simulator)
+            {
+                if (is_default)
+                {
+                    if (auxregs == NO_ARCHITECTURE)
+                        diagnostic = DEFAULT_SIMULATOR_WITH_NO_AUXILIARY_REGISTERS;
+                    else
+                        diagnostic = DEFAULT_SIMULATOR_WITH_AUXILIARY_REGISTERS;
+                }
+                else
+                {
+                    if (auxregs == NO_ARCHITECTURE)
+                        diagnostic = SELECTED_SIMULATOR_WITH_NO_AUXILIARY_REGISTERS;
+                    else
+                        diagnostic = SELECTED_SIMULATOR_WITH_AUXILIARY_REGISTERS;
+                }
+            }
+            else
+                if (auxregs == NO_ARCHITECTURE)
+                    diagnostic = TARGET_WITH_NO_AUXILIARY_REGISTERS;
+                else
+                    diagnostic = TARGET_WITH_AUXILIARY_REGISTERS;
+        }
+    }
+    else
+    {
+        if (program != target || program != auxregs)
+        {
+            if (is_builtin_simulator)
+            {
+                if (target == program)
+                {
+                    if (auxregs == NO_ARCHITECTURE)
+                        diagnostic = EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS;
+                    else
+                        diagnostic = EXECUTABLE_WITH_AUXILIARY_REGISTERS;
+                }
+                else
+                {
+                    if (is_default)
+                    {
+                        if (auxregs == NO_ARCHITECTURE)
+                            diagnostic = DEFAULT_SIMULATOR_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS;
+                        else
+                            diagnostic = DEFAULT_SIMULATOR_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS;
+                    }
+                    else
+                    {
+                        if (auxregs == NO_ARCHITECTURE)
+                            diagnostic = SELECTED_SIMULATOR_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS;
+                        else
+                            diagnostic = SELECTED_SIMULATOR_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS;
+                    }
+                }
+            }
+            else
+                if (auxregs == NO_ARCHITECTURE)
+                    diagnostic = TARGET_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS;
+                else
+                    diagnostic = TARGET_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS;
+        }
+    }
+
+    if (diagnostic != NO_ERROR)
+    {
+        const char *message = messages[diagnostic];
+
+        switch (diagnostic)
+        {
+            case DEFAULT_SIMULATOR_WITH_NO_AUXILIARY_REGISTERS:
+            case SELECTED_SIMULATOR_WITH_NO_AUXILIARY_REGISTERS:
+            case TARGET_WITH_NO_AUXILIARY_REGISTERS:
+                warning(message, arc_version_image(target));
+                break;
+
+            case DEFAULT_SIMULATOR_WITH_AUXILIARY_REGISTERS:
+            case SELECTED_SIMULATOR_WITH_AUXILIARY_REGISTERS:
+            case TARGET_WITH_AUXILIARY_REGISTERS:
+                warning(message, arc_version_image(target), arc_version_image(auxregs));
+                break;
+
+            case EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS:
+                warning(message, objfile_bfd->filename, arc_version_image(program));
+                break;
+
+            case EXECUTABLE_WITH_AUXILIARY_REGISTERS:
+                warning(message, objfile_bfd->filename, arc_version_image(program), arc_version_image(auxregs));
+                break;
+
+            case DEFAULT_SIMULATOR_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS:
+            case SELECTED_SIMULATOR_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS:
+            case TARGET_AND_EXECUTABLE_WITH_NO_AUXILIARY_REGISTERS:
+                warning(message, arc_version_image(target), objfile_bfd->filename, arc_version_image(program));
+                break;
+
+            case DEFAULT_SIMULATOR_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS:
+            case SELECTED_SIMULATOR_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS:
+            case TARGET_AND_EXECUTABLE_WITH_AUXILIARY_REGISTERS:
+                warning(message, arc_version_image(target), objfile_bfd->filename, arc_version_image(program), arc_version_image(auxregs));
+                break;
+
+            default:
+                break;
+        }
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Set the architectural version of the target processor as being unknown.  */
+
+void
+arc_architecture_is_unknown (void)
+{
+    ARC_processor = NO_ARCHITECTURE;
+}
+
+
+/* Return the processor variant that is connected.  */
+
+ARC_ProcessorVersion
+arc_get_architecture (ReadRegisterFunction read_aux_register)
+{
+    ENTERMSG;
+
+    if (ARC_processor == NO_ARCHITECTURE)
+    {
+        ARC_RegisterNumber   identity_regnum = arc_aux_find_register_number("IDENTITY", ARC_HW_IDENTITY_REGNUM);
+        ARC_RegisterContents value;
+
+        if (read_aux_register(identity_regnum, &value, TRUE))
+        {
+            DEBUG("IDENTITY = 0x%X\n", value);
+
+            /* Get the processor version number.  */
+            value &= IDENTITY_ARCVER;
+
+            if ((value >= 0x30) && (value <= 0x3f))
+                ARC_processor = ARC700;
+            else if ((value >= 0x20) && (value <= 0x2f))
+                ARC_processor = ARC600;
+            else if ((value >= 0x10) && (value <= 0x1f))
+                ARC_processor = A5;
+            else if (value <= 0x0f)
+                ARC_processor = A4;
+            else
+                warning(_("unsupported processor version 0x%x"), value);
+
+            DEBUG("target (from IDENTITY) is %s\n", arc_version_image(ARC_processor));
+        }
+    }
+
+    return ARC_processor;
+}
+
+
+/* Get the target processor architecture, check that is it supported, and
+ * update any architecture-related information that gdb requires.  */
+
+void
+arc_update_architecture (ReadRegisterFunction read_register)
+{
+    struct gdbarch_tdep *tdep    = gdbarch_tdep (current_gdbarch);
+    ARC_ProcessorVersion version = arc_get_architecture(read_register);
+
+    /* Record the target processor architecture in the targt-dependent
+     * variant information.  */
+    tdep->processor_variant_info->processor_version = version;
+
+    switch (version)
+    {
+        case NO_ARCHITECTURE:
+            break;
+        case ARC700:
+            set_gdbarch_decr_pc_after_break (current_gdbarch, 0);
+            break;
+        case ARC600:
+            set_gdbarch_decr_pc_after_break (current_gdbarch, 2);
+            break;
+        case A5:
+            warning(_("A5 debugging is unsupported and may be unreliable."));
+            break;
+        case A4:
+            /* N.B. this will not return.  */
+            error(_("A4 debugging is unsupported."));
+            break;
+        case UNSUPPORTED_ARCHITECTURE:
+            break;
+    }
+}
+
+
+/* This function checks for architectural consistency; there are three possible
+   architectures to be considered:
+
+    1) the architecture for which the program to be debugged has been built
+    2) the architecture of the target upon which the program is to be debugged
+    3) the architecture for which we have a description of the auxiliary registers
+
+   The 'gdbarch' parameter to this function corresponds to 2).
+
+   A hardware target (such as an ARCangel) has a fixed architecture (e.g. that
+   defined by the XBF file used to configure it; and the xISS simulator's
+   architecture is defined by the simulator definition (.xis) file; however,
+   if the target is the built-in simulator, the architecture depends upon how
+   the simulator instance is created: if the instance is created by use of the
+   commands
+
+       file <program_file>
+       target sim
+
+   then the simulator architecture is taken from the program file; if it is
+   created by the commands
+
+       set endian big | little
+       set architecture <name>
+       target sim
+
+   then the architecture is the named one; if it is created by the commands
+
+       set endian big | little
+       target sim
+
+   the architecture is the default ARC architecture as defined in bfd/cpu-arc.c,
+   and this is indicated by the 'the_default' flag in the 'bfd_arch_info' struct
+   being TRUE.  */
+
+void
+arc_check_architecture (struct gdbarch *gdbarch, bfd *objfile_bfd,
+                        const char* file, const char* function)
+{
+    ARC_ProcessorVersion target               = gdbarch_tdep (gdbarch)->processor_variant_info->processor_version;
+    ARC_ProcessorVersion auxregs              = arc_aux_architecture(gdbarch);
+    ARC_ProcessorVersion program              = NO_ARCHITECTURE;
+    bfd_boolean          is_default           = FALSE;
+    Boolean              is_builtin_simulator = FALSE;
+
+    ENTERARGS("current target = %s (%sconnected), objfile = %s",
+              current_target.to_shortname,
+              (arc_target_is_connected) ? "" : "not ",
+              (objfile_bfd) ? bfd_get_filename(objfile_bfd) : "<none>");
+
+    DEBUG("architectural check in function '%s' in file '%s'\n", function, file);
+
+    /* If the target is the built-in simulator.  */
+    if (strcmp(current_target.to_shortname, "sim") == 0)
+    {
+        const char               *name = selected_architecture_name();
+        const bfd_arch_info_type *arch;
+
+        if (name)
+            arch = bfd_scan_arch(name);
+        else
+            arch = gdbarch_bfd_arch_info(gdbarch);
+
+        is_default           = arch->the_default;
+        is_builtin_simulator = TRUE;
+    }
+
+    if (objfile_bfd)
+        program = architecture(objfile_bfd->arch_info);
+    else
+        program = NO_ARCHITECTURE;
+
+    DEBUG("target  = %s\n", arc_version_image(target));
+    DEBUG("auxregs = %s\n", arc_version_image(auxregs));
+    DEBUG("program = %s\n", arc_version_image(program));
+
+    /* If we are connected to a target, we should know its architecture; if we
+       are not connected, if we don't know both the program and aux registers
+       architectures then there is no point in checking anything (this situation
+       could occur if a 'file <program>' or 'arc-reg-read-file <xmlfile>'
+       command has been issued before the connection is made).  */
+    if (arc_target_is_connected)
+        gdb_assert(target != NO_ARCHITECTURE);
+    else
+        if (program == NO_ARCHITECTURE || auxregs == NO_ARCHITECTURE)
+            return;
+
+    /* Check that the architectures are the same.  */
+    perform_check(target,
+                  auxregs,
+                  program,
+                  is_builtin_simulator,
+                  is_default,
+                  objfile_bfd);
+
+    /* Unfortunately, this event can not be sent at the point that it is known
+       that the register architecture has changed, as at that point the global
+       variable current_gdbarch may have the value NULL, and that could cause
+       an error elsewhere where gdbarch_num_regs or gdbarch_num_pseudo_regs is
+       used (e.g. in setup_architecture_data in gdbtk/generic/gdbtk-register.c).  */
+    if (arc_pending_register_architecture_change_event)
+    {
+        DEBUG("sending register architecture changed event\n");
+        arc_pending_register_architecture_change_event = FALSE;
+        reg_architecture_changed_event();
+    }
+}
+
+
+/* Get the ARC architectural version from a string.  */
+
+ARC_ProcessorVersion
+arc_version (const char *arch)
+{
+    ARC_ProcessorVersion version;
+
+#define ARCH_IS(ident)    (strcmp(arch, ident) == 0)
+
+    if (ARCH_IS("ARC700"))
+        version = ARC700;
+    else if (ARCH_IS("ARC600"))
+        version = ARC600;
+    else if (ARCH_IS("A5"))
+        version = A5;
+    else if (ARCH_IS("A4"))
+        version = A4;
+    else
+        version = UNSUPPORTED_ARCHITECTURE;
+
+    return version;
+}
+
+
+/* Return a string representation of the ARC architectural version.  */
+
+const char*
+arc_version_image (ARC_ProcessorVersion version)
+{
+    switch (version)
+    {
+        case NO_ARCHITECTURE         : return _("NONE");
+        case ARC700                  : return _("ARC700");
+        case ARC600                  : return _("ARC600");
+        case A5                      : return _("A5");
+        case A4                      : return _("A4");
+        case UNSUPPORTED_ARCHITECTURE: return _("UNSUPPORTED");
+        default                      : return _("???");
+    }
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-architecture.h b/gdb/arc-architecture.h
new file mode 100644
index 0000000..f7a2751
--- /dev/null
+++ b/gdb/arc-architecture.h
@@ -0,0 +1,74 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines an enumeration type for representing the      */
+/*     architectural version of an ARC processor, and associated functions.   */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_ARCHITECTURE_H
+#define ARC_ARCHITECTURE_H
+
+/* gdb header files */
+#include "defs.h"
+#include "gdbarch.h"
+#include "bfd/bfd-in2.h"
+
+/* ARC header files */
+#include "arc-support.h"
+
+
+typedef enum arc_processor_version
+{
+    NO_ARCHITECTURE,
+    ARC700,
+    ARC600,
+    A5,
+    A4,
+    UNSUPPORTED_ARCHITECTURE
+} ARC_ProcessorVersion;
+
+
+#define ARCHITECTURE_CHECK(arch, bfd)      arc_check_architecture (arch, bfd, __FILE__, __FUNCTION__)
+
+
+void arc_architecture_is_unknown (void);
+
+ARC_ProcessorVersion arc_get_architecture (ReadRegisterFunction read_aux_register);
+
+void arc_update_architecture (ReadRegisterFunction read_register);
+
+void arc_check_architecture (struct gdbarch *gdbarch, bfd *objfile_bfd,
+                             const char* file, const char* function);
+
+ARC_ProcessorVersion arc_version (const char *arch);
+
+const char* arc_version_image (ARC_ProcessorVersion version);
+
+
+#endif /* ARC_ARCHITECTURE_H */
+/******************************************************************************/
diff --git a/gdb/arc-arguments.c b/gdb/arc-arguments.c
new file mode 100644
index 0000000..bd3404a
--- /dev/null
+++ b/gdb/arc-arguments.c
@@ -0,0 +1,427 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey      <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements operations for setting up the command line      */
+/*     arguments to the program which is being debugged.                      */
+/*                                                                            */
+/*     E.g. if we are passing 4 arguments to the program's 'main' function,   */
+/*          we must place them on the stack in the layout:                    */
+/*                                                                            */
+/*        .                                                                   */
+/*        .                                                                   */
+/*     stack[top + A3] <== <arg_3>                                            */
+/*        .                                                                   */
+/*        .                                                                   */
+/*     stack[top + A2] <== <arg_2>                                            */
+/*        .                                                                   */
+/*        .                                                                   */
+/*     stack[top + A1] <== <arg_1>                                            */
+/*        .                                                                   */
+/*        .                                                                   */
+/*     stack[top + A0] <== <arg_0>                                            */
+/*     stack[top + 24] <== 0x0           # ? NULL terminator                  */
+/*     stack[top + 20] <== 0x0           # envp NULL terminator               */
+/*     stack[top + 16] <== 0x0           # argv NULL terminator               */
+/*     stack[top + 12] <== TOP + A3      # argv[3]                            */
+/*     stack[top +  8] <== TOP + A2      # argv[2]                            */
+/*     stack[top +  4] <== TOP + A1      # argv[1]                            */
+/*     stack[top +  0] <== TOP + A0      # argv[0]                            */
+/*                                                                            */
+/*     where TOP = &stack[top]                                                */
+/*       and A0 .. A3 are the offsets of the stored arguments from the stack  */
+/*                    top.                                                    */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <byteswap.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "target.h"
+#include "symtab.h"
+#include "regcache.h"
+#include "objfiles.h"
+
+/* ARC header files */
+#include "arc-arguments.h"
+#include "arc-support.h"
+#include "arc-tdep.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define MINIMUM_INSTRUCTION_SIZE       2
+#define MOV_SP_INSTRUCTION_LE          0x3F80240A
+#define MOV_SP_INSTRUCTION_BE          0x803F0A24
+
+
+/* The address of the top of the target program's stack before the program
+   arguments were pushed onto the stack.  */
+static CORE_ADDR old_stack_top;
+
+/* The address in the target program code of the instructions which set up the
+   stack pointer (SP) at program start-up.  */
+static CORE_ADDR stack_pointer_setup_code_operand_address;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define TARGET_IS_BIG_ENDIAN  (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
+
+#define TARGET_ENDIAN(word)   ((TARGET_IS_BIG_ENDIAN) ? __bswap_32(word) : (word))
+
+#define MK_OPERAND_LE(x)      (ARC_Word) ((((x) & 0xffff0000) >> 16) | \
+                                          (((x) & 0x0000ffff) << 16))
+
+#define MK_OPERAND_BE(x)      (ARC_Word) (__bswap_32(x))
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Find the address in the target program code of the given label.
+   Return 0 if the label is not found.  */
+
+static CORE_ADDR
+find_label (const char *label)
+{
+    struct minimal_symbol *msymbol = lookup_minimal_symbol(label, NULL, symfile_objfile);
+    CORE_ADDR              address = 0;
+
+    if (msymbol != NULL)
+        address = SYMBOL_VALUE_ADDRESS (msymbol);
+
+    DEBUG("%s = %x\n", label, (unsigned int) address);
+
+    return address;
+}
+
+
+/* Write a word of data to target memory.
+
+   Parameters:
+       address : the address in memory to write the data
+       word    : the data to be written
+
+   Returns TRUE if the data is written. FALSE otherwise.
+
+   If the data is written, the given address is incremented to reference the
+   next word in target memory.  */
+
+static Boolean
+write_word (CORE_ADDR *address, ARC_Word word)
+{
+    word = TARGET_ENDIAN(word);
+
+    if (target_write_memory(*address, (gdb_byte*) &word, BYTES_IN_WORD) == 0)
+    {
+        *address += BYTES_IN_WORD;
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/* Try to find the address in the target program code of the instructions which
+   set up the program stack pointer (SP).
+
+   Parameter:
+       stack_top: the address which is loaded into SP by the setup code
+
+   Return TRUE if the code is found.
+
+   If the setup code is found, the variable stack_pointer_setup_code_operand_address
+   is set to the code's address.  */
+
+static Boolean
+find_stack_top_setup_code (CORE_ADDR stack_top)
+{
+    /* Try to find the start address in the target program.  */
+    CORE_ADDR code_start = find_label("__start");
+
+    if (code_start != 0)
+    {
+        CORE_ADDR code = (ARC_Address) code_start;
+        ARC_Word  set_sp_insn[2];
+        ARC_Byte  buffer[16 * BYTES_IN_WORD];
+
+        DEBUG("setting up arguments: stack_top = %x, code_start = %x\n",
+              (unsigned int) stack_top, (unsigned int) code_start);
+
+        if (TARGET_IS_BIG_ENDIAN)
+        {
+            set_sp_insn[0] = MOV_SP_INSTRUCTION_BE;
+            set_sp_insn[1] = MK_OPERAND_BE(stack_top);
+        }
+        else
+        {
+            set_sp_insn[0] = MOV_SP_INSTRUCTION_LE;
+            set_sp_insn[1] = MK_OPERAND_LE(stack_top);
+        }
+
+        /* Scan through the start code of the program, looking for the code that
+           sets up the program's stack pointer; we recognize this as a 32-bit
+           'mov sp' instruction followed by a 32-bit operand which is the
+           address of the stack top (which we obtained from the executable file).  */
+        while (TRUE)
+        {
+            int result = target_read_memory(code, (gdb_byte*) buffer, (int) sizeof(buffer));
+
+            if (result == 0)
+            {
+                size_t offset = 0;
+
+                while (offset <= sizeof(buffer) - sizeof(set_sp_insn))
+                {
+                    if (memcmp(buffer + offset, set_sp_insn, sizeof(set_sp_insn)) == 0)
+                    {
+                        stack_pointer_setup_code_operand_address = code + (CORE_ADDR) offset + BYTES_IN_WORD;
+
+                        DEBUG("found 'mov sp, <stacktop>' instruction operand at address 0x%x\n",
+                              (unsigned int) stack_pointer_setup_code_operand_address);
+                        return TRUE;
+                    }
+
+                    offset += MINIMUM_INSTRUCTION_SIZE;
+                }
+            }
+            else
+            {
+                warning(_("can not find read target program start code"));
+                break;
+            }
+
+            code += (CORE_ADDR) (sizeof(buffer) - sizeof(set_sp_insn));
+
+            /* If we haven't found it in the first 100 bytes.  */
+            if (code - code_start > 100)
+            {
+                warning(_("can not find 'mov sp, <stacktop>' instruction in start code"));
+                break;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+
+/* Try to change the setup code in the program so that SP is loaded with a
+   given address.
+
+   Parameters:
+       old_stack_top: the address which is currently loaded into SP by the code
+       new_stack_top: the address which we wish to be loaded into SP by the code
+
+   Return TRUE if the setup code is changed.  */
+
+static Boolean
+set_stack_top (CORE_ADDR old_stack_top, CORE_ADDR new_stack_top)
+{
+    ARC_Word operand = (TARGET_IS_BIG_ENDIAN) ? MK_OPERAND_BE(new_stack_top)
+                                              : MK_OPERAND_LE(new_stack_top);
+
+    /* If we do not yet know the address in the program code at which the
+       program's stack pointer is set up.  */
+    if (stack_pointer_setup_code_operand_address == 0)
+    {
+        /* Try to find it.  */
+        if (!find_stack_top_setup_code(old_stack_top))
+            return FALSE;
+    }
+
+    DEBUG("set stack top @ 0x%08X to 0x%08X (0x%08X)\n",
+          (unsigned int) stack_pointer_setup_code_operand_address,
+          (unsigned int) new_stack_top,
+          operand);
+
+    return (target_write_memory(stack_pointer_setup_code_operand_address,
+                                (gdb_byte*) &operand,
+                                BYTES_IN_WORD) == 0);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* This is called when a program is downloaded to the debug target. */
+
+void
+arc_program_loaded (void)
+{
+    /* The program has just been loaded, so we do not yet know the address in
+       the program code at which the program's stack pointer is set up.  */
+    stack_pointer_setup_code_operand_address = 0;
+}
+
+
+/* Store the program's arguments on the stack.
+   Return TRUE if they are stored successfully.  */
+
+Boolean
+arc_setup_arguments (char *args)
+{
+    Boolean done = FALSE;
+
+    /* Try to find the top of stack in the target program.  */
+    old_stack_top = find_label("__stack_top");
+
+    if (old_stack_top != 0)
+    {
+        char       **argv = buildargv (args);
+        char       **argp;
+        size_t       string_length = 0;
+        unsigned int argc          = 0;
+        unsigned int num_pointers;
+        unsigned int total_size;
+        CORE_ADDR    new_stack_top;
+
+        if (argv == NULL)
+            nomem (0);
+
+        /* Calculate the space required to hold the args.  */
+
+        for (argp = argv; *argp != NULL; argp++)
+        {
+            string_length += strlen (*argp) + 1;
+            argc++;
+        }
+
+        DEBUG("%d arguments\n", argc);
+
+        num_pointers = argc + 3;
+
+        total_size = (unsigned int) string_length + num_pointers * BYTES_IN_WORD;
+
+        /* Round up to a multiple of 32: strlen expects memory to come in chunks
+         * that are at least cache-line (32 bytes) sized.  */
+        total_size +=  31;
+        total_size &= -32;
+
+        DEBUG("total size: %d\n", total_size);
+
+        new_stack_top = old_stack_top - total_size;
+
+        DEBUG("new stack top: 0x%08x\n", (unsigned int) new_stack_top);
+
+        /* Adjust the setting of the top of the stack in the object code.  */
+        if (set_stack_top(old_stack_top, new_stack_top))
+        {
+            struct regcache *regcache   = get_current_regcache();
+            CORE_ADDR        data_space = new_stack_top + num_pointers * BYTES_IN_WORD;
+            CORE_ADDR        stack_top  = new_stack_top;
+            unsigned int i;
+
+            DEBUG("data space: 0x%08x\n", (unsigned int) data_space);
+
+            done = TRUE;
+
+            /* Write the args onto the top of the stack.  */
+
+            for (i = 0; i < argc; i++)
+            {
+                char  *parameter = argv[i];
+                size_t length    = strlen(parameter) + 1;
+                int    result    = target_write_memory(data_space, (gdb_byte*) parameter, (int) length);
+
+                if (result == 0)
+                {
+                    DEBUG("written argv[%d] to 0x%08x: \"%s\"\n",
+                          i, (unsigned int) data_space, parameter);
+                }
+                else
+                    done = FALSE;
+
+                /* Write a pointer to the argument onto the stack.  */
+                if (!write_word(&stack_top, (ARC_Word) data_space))
+                    done = FALSE;
+
+                data_space += length;
+            }
+
+            /* Try to write the NULLs.  */
+            if (!write_word(&stack_top, 0) ||
+                !write_word(&stack_top, 0) ||
+                !write_word(&stack_top, 0))
+                done = FALSE;
+
+            /* Set up the R0 and R1 parameter registers.  */
+
+            /* Convert to target byte order if necessary.  */
+            if (HOST_AND_TARGET_ENDIANNESS_DIFFER(current_gdbarch))
+            {
+                 argc          = __bswap_32(argc);
+                 new_stack_top = __bswap_32(new_stack_top);
+            }
+
+            regcache_raw_supply   (regcache, 0, &argc);
+            regcache_raw_supply   (regcache, 1, &new_stack_top);
+            target_store_registers(regcache, 0);
+            target_store_registers(regcache, 1);
+        }
+
+        freeargv(argv);
+    }
+
+    return done;
+}
+
+
+/* This function is called just before disconnection from the debug target.  */
+
+void
+arc_restore_stack_top_address (void)
+{
+    /* If we know the address in the program start-up code at which the stack
+       pointer is set up, it must be because we changed the stack top address
+       in the code - so change it back to the original address as read from the
+       excutable file.
+
+       This is done so that if the user disconnects from the target, then
+       reconnects to it in a subsequent debugging session but does NOT download
+       the program to the target again (as it is still in target memory), the
+       mechanism for altering the stack top will still work.
+
+       Note that this has no effect if the target is allowed to resume execution
+       (i.e. a 'detach' is being performed) as we are changing code that has
+       already been executed.
+
+       0 is passed as the "old" stack top as it is not used in this situation.  */
+
+    if (stack_pointer_setup_code_operand_address != 0)
+        (void) set_stack_top(0, old_stack_top);
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-arguments.h b/gdb/arc-arguments.h
new file mode 100644
index 0000000..d0d79ed
--- /dev/null
+++ b/gdb/arc-arguments.h
@@ -0,0 +1,48 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines operations for setting up the command line    */
+/*     arguments to the program which is being debugged.                      */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_ARGUMENTS
+#define ARC_ARGUMENTS
+
+/* ARC header files */
+#include "arc-support.h"
+
+
+void arc_program_loaded (void);
+
+Boolean arc_setup_arguments (char *args);
+
+void arc_restore_stack_top_address (void);
+
+
+#endif /* ARC_ARGUMENTS */
+/******************************************************************************/
diff --git a/gdb/arc-board.c b/gdb/arc-board.c
new file mode 100644
index 0000000..6642220
--- /dev/null
+++ b/gdb/arc-board.c
@@ -0,0 +1,1996 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by  ARC International (www.arc.com)
+
+   Authors:
+      Tim Gore
+      Tom Pennello    <tom.pennello@arc.com>
+      Justin Wilde    <justin.wilde@arc.com>
+      Phil Barnard    <phil.barnard@arc.com>
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements operations for controlling an ARC target board. */
+/*                                                                            */
+/*     These operations are:                                                  */
+/*        1) configuring ("blasting") an FPGA target with the contents of an  */
+/*           XBF file;                                                        */
+/*        2) checking whether a target has been so configured;                */
+/*        3) setting the clock frequency of the target;                       */
+/*        4) setting the clock sources of the target.                         */
+/*                                                                            */
+/* Notes:                                                                     */
+/*     The blast_board function implements an ARC-specific command; hence its */
+/*     'args' parameter contains data entered by the debugger user, which     */
+/*     must be checked for validity.                                          */
+/*                                                                            */
+/* Target Board:                                                              */
+/*     It is assumed that the target board is actually an ARCangel 4 (AA4).   */
+/*                                                                            */
+/*     See                                                                    */
+/*                      ARCangel 4 Development System                         */
+/*                             User's Guide                                   */
+/*                              5801-001                                      */
+/*                                                                            */
+/*     for a full description of the target.                                  */
+/*                                                                            */
+/*     The AA4 contains a Configurable Programmable Logic Device (CPLD) which */
+/*     is used to control the system services on the board; this includes the */
+/*     configuration of the board's PLL (Phase Lock Loop) clock chip, and     */
+/*     clock routing.                                                         */
+/*                                                                            */
+/*     The AA4 also has a 48 MHz crystal oscillator module, and has a number  */
+/*     of DIP switches which may be set manually: these may be used to select */
+/*     a divisor (1, 2, 4 or 8) which may be applied to the crystal frequency */
+/*     to obtain a lower frequency.                                           */
+/*                                                                            */
+/*     The target FPGA has 4 global clock pins (GCLK0-3); a different clock   */
+/*     source may be routed to each of these by the CPLD.  The available      */
+/*     sources are:                                                           */
+/*                                                                            */
+/*       crystal  : the physical crystal                                      */
+/*       dips     : the physical crystal divided by the DIP switch divisors   */
+/*       highimp  : high impedance                                            */
+/*       host     : use the STR (strobe) input of the host interface          */
+/*       mclk     : use a clock provided by the PLL                           */
+/*       vclk     : use a clock provided by the PLL                           */
+/*                                                                            */
+/*     Note that "high impedance" (also referred to as "Tri-state") means, in */
+/*     effect, that the clock is switched off.                                */
+/*                                                                            */
+/*     It is also possible to specify that the PLL clock should be a Harvard  */
+/*     clock generator.                                                       */
+/*                                                                            */
+/*     The main clock for the target's ARC processor is provided by GLCK3.    */
+/*                                                                            */
+/*     The PLL is assumed to be a Cypress Semiconductor Corporation ICD2061A  */
+/*     Dual Programmable Graphics Clock Generator; the Data Sheet describing  */
+/*     this device may be readily found on the Web, and should be consulted   */
+/*     for an understanding of how the clock is programmed.                   */
+/*                                                                            */
+/*     The ICD2061A actually provides two independent clocks: MCLK (Memory or */
+/*     I/O Timing Clock) and VCLK (Video Clock).  It is recommended that the  */
+/*     frequency of one clock should not be an integer multiple of that of    */
+/*     other, in order to avoid clock signal degradation through jitter.      */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "completer.h"
+#include "objfiles.h"
+#include "gdbcmd.h"
+
+/* ARC header files */
+#include "arc-board.h"
+#include "arc-architecture.h"
+#include "arc-registers.h"
+#include "arc-gpio.h"
+#include "arc-jtag.h"
+#include "arc-jtag-ops.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef enum
+{
+    CLOCK_SOURCE_HIGH_IMPEDANCE,
+    CLOCK_SOURCE_PLL_MCLK,
+    CLOCK_SOURCE_PLL_VCLK,
+    CLOCK_SOURCE_CRYSTAL,
+    CLOCK_SOURCE_PLL_MCLK_HARVARD,
+    CLOCK_SOURCE_PLL_VCLK_HARVARD,
+    CLOCK_SOURCE_HOST_STROBE,
+    CLOCK_SOURCE_CRYSTAL_DIVIDED
+} ClockSource;
+
+typedef enum
+{
+    PLL_MCLK   = 0,
+    PLL_VCLK   = 1,
+    NO_PLL_CLK = 2
+} PLL_ClockId;
+
+typedef unsigned int GlobalClockId;   // 0 .. 3
+
+typedef double MegaHertz;
+
+typedef struct global_clock
+{
+    ClockSource source;
+    Boolean     set;
+    PLL_ClockId PLL_clock;
+} GlobalClock;
+
+typedef struct pll_clock
+{
+    MegaHertz requested_frequency;
+    MegaHertz actual_frequency;
+    Boolean   in_use;
+} PLL_Clock;
+
+typedef struct pll_clock_info
+{
+    const char  *name;
+    unsigned int PLL_register;
+    MegaHertz    MIN_VCO_FREQ;
+    MegaHertz    MAX_VCO_FREQ;
+} PLL_ClockInfo;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define ARC_SET_CLOCK_FREQUENCY_COMMAND    "arc-set-clock-frequency"
+#define ARC_SET_CLOCK_SOURCE_COMMAND       "arc-set-clock-source"
+#define ARC_CLOCK_SETTINGS_COMMAND         "arc-clock-settings"
+#define ARC_BLAST_BOARD_COMMAND            "arc-blast-board"
+#define ARC_FPGA_COMMAND                   "arc-fpga"
+
+#define ARC_SET_CLOCK_FREQUENCY_COMMAND_USAGE   "Usage: "      ARC_SET_CLOCK_FREQUENCY_COMMAND " [ <CLOCK> = ] <FREQUENCY> |\n" \
+                                                                                               "                              " \
+                                                                                               " <FREQUENCY> , <FREQUENCY>\n"
+
+#define ARC_SET_CLOCK_SOURCE_COMMAND_USAGE      "Usage: "      ARC_SET_CLOCK_SOURCE_COMMAND    " gclk[N] = <SOURCE>                |\n" \
+                                                                                               "                           "            \
+                                                                                               " gclks   = <SOURCE> { , <SOURCE> } |\n" \
+                                                                                               "                           "            \
+                                                                                               " harvard\n"
+#define ARC_CLOCK_SETTINGS_COMMAND_USAGE        "Usage: info " ARC_CLOCK_SETTINGS_COMMAND "\n"
+#define ARC_BLAST_BOARD_COMMAND_USAGE           "Usage: "      ARC_BLAST_BOARD_COMMAND    " <FILE>\n"
+#define ARC_FPGA_COMMAND_USAGE                  "Usage: info " ARC_FPGA_COMMAND           "\n"
+
+
+#define MAX_MAX_BURST     256
+
+#define S_XOR            (Byte) 0x80     /* XOR value with this to get all bits positive.  */
+#define C_XOR            (Byte) 0x0b     /* with respect to the signal values.             */
+
+/* Control bits in the masks for the Control port.  */
+#define STR              (Byte) 0x01     // strobe
+#define CNT              (Byte) 0x02
+#define SS0              (Byte) 0x04
+#define SS1              (Byte) 0x08
+#define BI               (Byte) 0x20     // bi-directional?
+
+/* Control bits in the masks for the Status port.  */
+#define OP               (Byte) 0x20
+#define ACK              (Byte) 0x40
+#define BUSY             (Byte) 0x80
+
+/* Special meanings of some of those bits.  */
+#define FPA_CFG_DONE     OP
+#define CFG_FROM_ROM     BUSY
+#define PAR_CFG_MODE     ACK
+
+
+/* Constants for the PLL.  */
+#define MREG_ADDRESS                          3
+#define VCLK_SETUP_REG_NO                     0   /* which of Reg0 .. Reg2 is used to set the VClock freq.  */
+#define MCLK_RESET_FREQUENCY   (MegaHertz) 25.0
+#define VCLK_RESET_FREQUENCY   (MegaHertz) 25.0
+
+#define NUM_GLOBAL_CLOCKS                     4
+#define NUM_PLL_CLOCKS                        2
+
+#define UNDEFINED_FREQUENCY  (MegaHertz) (-1.0)
+
+
+static const char *CLOCK_SOURCE_STRINGS[] =
+{
+    "High Impedance",
+    "PLL MCLK",
+    "PLL VCLK",
+    "Crystal",
+    "High Impedance",
+    "High Impedance",
+    "Host Strobe",
+    "Crystal With Division"
+};
+
+static const char *GCLOCK3_SOURCE_STRINGS[] =
+{
+    "High Impedance",
+    "PLL MCLK",
+    "PLL VCLK",
+    "Crystal",
+    "PLL MCLK (+Harvard)",
+    "PLL VCLK (+Harvard)",
+    "Host Strobe",
+    "Crystal With Division (+Harvard)"
+};
+
+
+static const ClockSource default_GCLK_sources[] =
+{
+    CLOCK_SOURCE_HIGH_IMPEDANCE,       // GCLK0
+    CLOCK_SOURCE_CRYSTAL,              // GCLK1
+    CLOCK_SOURCE_HOST_STROBE,          // GCLK2
+    CLOCK_SOURCE_CRYSTAL_DIVIDED       // GCLK3
+};
+
+
+static const MegaHertz VCO_PRESET_BOUNDARIES[] = {50.0, 51.0, 53.2, 58.5, 60.7,  64.4,  66.8,
+                                                  73.5, 75.6, 80.9, 83.2, 91.5, 100.0, 120.0};
+
+
+/* Unchanging information for the two PLL clocks.  */
+static const PLL_ClockInfo PLL_clock_fixed_info[NUM_PLL_CLOCKS] =
+{
+    { "MCLK", MREG_ADDRESS,      52.0, 120.0 },
+    { "VCLK", VCLK_SETUP_REG_NO, 65.0, 165.0 }
+};
+
+
+/* Data describing the 2 PLL clocks and the 4 global clock sources.  */
+static PLL_Clock   PLL_clocks   [NUM_PLL_CLOCKS];
+static GlobalClock global_clocks[NUM_GLOBAL_CLOCKS];
+static Boolean     harvard;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define IS_SET(bit, byte)     (((bit) & (byte)) == (bit))
+#define __MIN(X, Y)           ((X) < (Y) ? (X) : (Y))
+#define __MAX(X, Y)           ((X) < (Y) ? (Y) : (X))
+
+#define FREQUENCY(clock)        ((PLL_clocks[clock].in_use) ? PLL_clocks[clock].requested_frequency \
+                                                            : UNDEFINED_FREQUENCY)
+
+#define PLL_CLOCK_NAME(clock)   PLL_clock_fixed_info[clock].name
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Sleep for the given number of milliseconds.  */
+
+static void
+Sleep (unsigned int milliseconds)
+{
+    usleep((unsigned long) (1000 * milliseconds));
+}
+
+
+/* Read a byte of data from the Status port.  */
+
+static Byte
+read_status_port (void)
+{
+    return gpio_read(STATUS_PORT) ^ S_XOR;
+}
+
+
+/* Write a byte of data to the Control port, then sleep for the given delay.  */
+
+static void
+write_control_port (Byte data, unsigned int delay)
+{
+    Byte value = data ^ C_XOR;
+
+    gpio_write(CONTROL_PORT, value);
+    Sleep(delay);
+}
+
+
+/* Write a byte of data to the Data port.  */
+
+static void
+write_data_port (Byte value)
+{
+    gpio_write(DATA_PORT, value);
+}
+
+
+/* Extract the value from a string containing a name/value pair of the form
+
+     [ <name> = ] <value>
+
+   Return 0 if the string is not of the given form
+          1 if the string is of the form  <value>
+          2 if the string is of the form  <name> = <value>
+*/
+
+static int
+name_value_pair (char *args, char **value)
+{
+    char *equals = strchr(args, '=');
+
+    if (equals)
+    {
+        char *val = equals + 1;
+
+        /* If the key is missing from the argument string.  */
+        if (equals == args)
+            return 0;
+
+        equals--;
+        while (*equals == ' ') equals--;
+        equals[1] = '\0';
+
+        while (*val == ' ') val++;
+        if (*val == '\0')
+            return 0;
+
+        *value = val;
+        return 2;
+    }
+
+    return 1;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                        local functions for FPGA blasting                   */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the FPGA ready for blasting.
+   Return TRUE if the initialization is successful.  */
+
+static Boolean
+initialize_FPGA (void)
+{
+    Byte         status;
+    Byte         iOriginalState;
+    Byte         iControlState;
+    unsigned int cpld_rev;
+
+    ENTERMSG;
+
+    /* snapshot the control port.  */
+    iOriginalState = gpio_read(CONTROL_PORT);
+
+    /* Initialize FPGA by taking SS0 and SS1 low (all other ctrl's low as well).  */
+    iControlState = iOriginalState & (0xFFFFFFFF ^ (SS0 | SS1 | CNT | STR | BI));
+    write_control_port(iControlState, 51);
+
+    /* Tri-state port outputs so we can read CPLD revision number.  */
+    iControlState = iControlState | BI;
+    write_control_port(iControlState, 1);
+
+    // Read the CPLD revision number LSB.  */
+    cpld_rev = (unsigned int) gpio_read(DATA_PORT);
+
+    /* Set CNT high and read CPLD revision number MSB.  */
+    iControlState = iControlState | CNT;
+    write_control_port(iControlState, 1);
+
+    cpld_rev += (unsigned int) gpio_read(DATA_PORT) << 8;
+
+    /* Test the CPLD rev no; if it is 0xffff then this CPLD may not support
+       parallel blasting.  */
+    if ((cpld_rev & 0xffff) == 0xffff)
+    {
+        warning(_("old board type (AA2), not supported"));
+        gpio_close();
+        return FALSE;
+    }
+    else
+    {
+        char         rev_string[32];
+        unsigned int temp     = cpld_rev;
+        unsigned int char_pos = 0;
+        unsigned int i;
+
+        for (i = 0; i < 16; i++)
+        {
+            if (temp & 0x8000)
+                rev_string[char_pos++] = '1';
+            else
+                rev_string[char_pos++] = '0';
+
+            temp <<= 1;
+            if ((i % 4) == 3)
+                rev_string[char_pos++] = ' ';
+        }
+
+        rev_string[char_pos] = '\0';
+
+        printf_filtered(_("\nCPLD Revision = %20s\n"), rev_string);
+    }
+
+    /* Take CNT low.  */
+    iControlState = iControlState & (0xFFFFFFFF ^ (SS0 | SS1 | CNT | STR | BI));
+
+    /* Now take STR high, CNT low and SS0 high to enter FPGA download mode.  */
+    iControlState = iControlState | STR;
+    write_control_port(iControlState, 1);
+
+    iControlState = iControlState | SS0;
+    write_control_port(iControlState, 3);
+
+    /* Check that FPA_CFG_DONE=0.  */
+    status = read_status_port();
+
+    if (IS_SET(FPA_CFG_DONE, status))
+    {
+        warning(_("FPGA is not responding - status = 0x%08x"), status);
+        gpio_close();
+        return FALSE;
+    }
+
+    LEAVEMSG;
+
+    return TRUE;
+}
+
+
+/* Try to send data to the target in a parallel stream.
+   Return TRUE if it is sent.  */
+
+static Boolean
+parallel_send_data (Byte *buffer, unsigned int count)
+{
+    GPIO_Pair arr[MAX_MAX_BURST * 3 + 1];
+
+    /* Work out how many bytes we can send in one PIO program.  */
+    unsigned const int bytes_per_burst = 127;
+
+    /* Initialize offsets into config data buffer.  */
+    unsigned int burst_start = 0;
+    unsigned int burst_end   = bytes_per_burst - 1;
+
+    /* Snapshot the control port.  */
+    Byte iOriginalState = gpio_read(CONTROL_PORT);
+    Byte iControlState  = (iOriginalState | SS0) & (0xFFFFFFFF ^ (SS1 | CNT | STR | BI));
+
+    while (TRUE)
+    {
+        GPIO_Pair   *gpio = arr;
+        unsigned int i;
+
+        /* Do not try to write more data than is in the buffer.  */
+        if (burst_end > (count - 1))
+            burst_end = count - 1;
+
+        /* Initialize the gpio driver instruction stream.  */
+        for (i = burst_start; i <= burst_end; i++)
+        {
+            gpio->port = DATA_PORT;
+            gpio->data = buffer[i];
+            gpio++;
+            gpio->port = CONTROL_PORT;
+            gpio->data = iControlState ^ C_XOR;
+            gpio++;
+            gpio->port = CONTROL_PORT;
+            gpio->data = (iControlState | STR) ^ C_XOR;
+            gpio++;
+        }
+
+        gpio_write_array(arr, gpio - arr);
+
+        /* Last block of data written.  */
+        if (burst_end == count - 1)
+            break;
+
+        burst_start = burst_end + 1;
+        burst_end   = burst_start + bytes_per_burst - 1;
+    }
+
+    return TRUE;
+}
+
+
+/* Try to send data to the target in a serial stream.
+   Return TRUE if it is sent.  */
+
+static Boolean
+serial_send_data (Byte *buff, unsigned int count)
+{
+    /* There is code which implements serial blasting in the SeeCode debugger
+       file os/arc/connect/par/arc/aa3blast.cpp, which is intended to work with
+       either Win95 or WinNT. If serial blasting is required for Linux, this
+       code would have to be re-written to use Linux O/S operations. However,
+       there is currently no requirement for that.  */
+    warning(_("sorry, serial download is not supported"));
+    return FALSE;
+}
+
+
+
+/* Try to blast the target board FPGA with the contents of an XBF file.
+   Return TRUE if the blast is succcessful.  */
+
+static Boolean
+blast_FPGA (FILE *xbf)
+{
+    Boolean       parallel_cfg;
+    unsigned long file_size;
+    unsigned long five_percent;
+    unsigned long bytes_sent          = 0;
+    unsigned long twentieths_complete = 0;
+    Byte          status;
+
+    ENTERMSG;
+
+    /* Get parallel port status, and see whether the board is expecting parallel
+       or serial blast.  */
+    status = read_status_port();
+
+    if ((status & CFG_FROM_ROM) == CFG_FROM_ROM)
+    {
+        /* Oops - FPGA is configured from ROM!  */
+        if (IS_SET(FPA_CFG_DONE, status))
+            printf_filtered(_("FPGA is configured from ROM"));
+        else
+            warning(_("FPGA should be configured from ROM - BUT IT IS NOT!"));
+        return FALSE;
+    }
+
+    parallel_cfg = ((status & PAR_CFG_MODE) == PAR_CFG_MODE);
+
+    /* Find the length of the file (could use fstat instead here).  */
+    (void) fseek(xbf, 0, SEEK_END);
+    file_size = (unsigned long) ftell(xbf);
+    (void) fseek(xbf, 0, SEEK_SET);
+
+    five_percent = file_size / 20;
+
+    /* Read file and blast.  */
+
+    while (TRUE)
+    {
+        Byte   data_buffer[1024];
+        size_t n_bytes = fread(data_buffer, 1, sizeof(data_buffer), xbf);
+
+        if (gpio_port_error)
+            error(_("Error in accessing JTAG port (device " GPIO_DEVICE ")"));
+
+        /* End of file reached? (fread returns 0 for both EOF and error!).  */
+        if (n_bytes == 0)
+        {
+            if (!feof(xbf))
+            {
+                warning(_("error in reading XBF file"));
+                return FALSE;
+            }
+            break;
+        }
+
+        if (!(((parallel_cfg) ? parallel_send_data
+                              : serial_send_data) (data_buffer, (unsigned int) n_bytes)))
+            break;
+
+        bytes_sent += n_bytes;
+        if (bytes_sent == file_size)
+            break;
+
+        if ((bytes_sent / five_percent) > twentieths_complete)
+        {
+            twentieths_complete++;
+            printf_filtered(_("*"));
+            gdb_flush (gdb_stdout);
+        }
+    }
+
+    printf_filtered(_("\n"));
+
+    /* Check for the ConfigDone signal.  */
+    status = read_status_port();
+
+    if (!IS_SET(FPA_CFG_DONE, status))
+    {
+        warning(_("FPGA configuration failed"));
+        return FALSE;
+    }
+
+    printf_filtered(_("FPGA configured\n"));
+
+    /* Set SS0 and SS1 high to take board out of reset.  */
+    {
+        Byte iControlState = (gpio_read(CONTROL_PORT) | SS0 | SS1 | STR) & (0xFFFFFFFF ^ (CNT | BI));
+
+        write_control_port(iControlState, 1);
+    }
+
+    LEAVEMSG;
+
+    return TRUE;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                      local functions for setting clocks                    */
+/* -------------------------------------------------------------------------- */
+
+/* Reset the clock configuration information to its default values (i.e. the
+   values that the h/w has after a hard reset of the target.  */
+
+static void
+reset_clock_configuration (void)
+{
+    unsigned int i;
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(PLL_clocks); i++)
+    {
+        PLL_clocks[i].requested_frequency = MCLK_RESET_FREQUENCY;
+        PLL_clocks[i].actual_frequency    = VCLK_RESET_FREQUENCY;
+        PLL_clocks[i].in_use              = FALSE;
+    }
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(global_clocks); i++)
+    {
+        global_clocks[i].source    = default_GCLK_sources[i];
+        global_clocks[i].set       = FALSE;
+        global_clocks[i].PLL_clock = NO_PLL_CLK;
+    }
+
+    harvard = FALSE;
+}
+
+
+/* Calculate the control word required to set a PLL clock to a particular frequency.
+
+   Parameters:
+      requested_frequency : the frequency we want
+      min_vco_frequency   : the minimum VCO frequency for this clock
+      max_vco_frequency   : the maximum VCO frequency for this clock
+      actual_frequency    : the frequency we actually get
+
+   Result: the control word; 0 if no frequency can be set
+
+   The PLL consists of a VCO and 3 counters that divide by p, q and 2^d. The
+   VCO runs at 2*RefClk*p/q. This is divided by 2^d to give the PLL output.
+
+   There are several contraints on the various values:
+      4 <= p <= 130
+      3 <= q <= 129
+      0 <= d <=   7
+      0.2 <= ref_clk / q <= 1.0    (200kHz .. 1MHz)
+
+   This method is a bit of a palaver - very procedural. Basically it uses
+   trial and error to find the best values for d, p and q, within the given
+   contraints.  */
+
+static unsigned int
+calculate_ctrl_word (const MegaHertz requested_frequency,
+                     const MegaHertz min_vco_frequency,
+                     const MegaHertz max_vco_frequency,
+                     MegaHertz      *actual_frequency)
+{
+    const unsigned int MIN_P =   4;
+    const unsigned int MAX_P = 130;
+    const unsigned int MIN_Q =   3;
+    const unsigned int MAX_Q = 129;
+    const unsigned int MIN_D =   0;
+    const unsigned int MAX_D =   7;
+    const MegaHertz    MIN_REF_CLK_OVER_Q = 0.2;
+    const MegaHertz    MAX_REF_CLK_OVER_Q = 1.0;
+    const MegaHertz    REF_CLK            = 14.31818;    // input to PLL
+
+#define NUM_PRESETS    ELEMENTS_IN_ARRAY(VCO_PRESET_BOUNDARIES)
+
+    unsigned int index, p = 0, q = 0, d = MIN_D;  /* PLL parameters (see ICD2061A Data Sheet).  */
+    unsigned int trial_p, trial_q;                /* Temp vars for p & q values that we are trying out.  */
+    unsigned int first_q, last_q;
+    unsigned int ctrl_word;
+    double       min_delta     = 1.0;                  /* Smallest error so far.  */
+    MegaHertz    vco_frequency = requested_frequency;  /* Freq at which the VCO will run.  */
+    double       p_over_q;
+
+    /* Find a value of d which gives a VCO frequency that is within limits (VCO
+       output is divided by 2^d).  */
+    while ((vco_frequency < min_vco_frequency) && (d < MAX_D))
+    {
+        vco_frequency *= 2;
+        d++;
+    }
+
+    DEBUG("request = %g, vco = %g, min = %g, max = %g, d = %d\n",
+          requested_frequency, vco_frequency, min_vco_frequency, max_vco_frequency, d);
+
+    /* Check that we have found a suitable value for d.  */
+    if ((vco_frequency < min_vco_frequency) || (vco_frequency > max_vco_frequency))
+    {
+        DEBUG("frequency is out of range\n");
+        return 0;
+    }
+
+    /* Calculate the ratio needed for p/q, to get vco_frequency from ref_clk.  */
+    p_over_q = vco_frequency / (2.0 * REF_CLK);
+
+    /* Now use some brute force and ignorance to find the best values for p & q:
+       we look for p & q such that p / q is the best approximation to p_over_q.  */
+
+    /* Calculate range of values allowed for q.  */
+    first_q = __MAX((unsigned int) (REF_CLK / MAX_REF_CLK_OVER_Q + 0.999999), MIN_Q);
+    last_q  = __MIN((unsigned int) (REF_CLK / MIN_REF_CLK_OVER_Q),            MAX_Q);
+
+    /* Look at each possible value of q.  */
+    for (trial_q = first_q; trial_q <= last_q; trial_q++)
+    {
+        /* Calculate the value of p needed with this q value.  */
+        double raw_p = p_over_q * (double) trial_q;
+        double delta;
+
+        /* Round the raw value for p to the nearest integer.  */
+        trial_p = (unsigned int) (raw_p + 0.5);
+
+        /* Range check the required p value: note that because trial_q is
+           increasing, trial_p is also increasing, so if it is less than MIN_P
+           we may find a suitable value in a later iteration, whereas if it is
+           greater than MAX_P we will never find a suitable value in a later
+           iteration.  */
+        if (trial_p < MIN_P)
+            continue;
+        if (trial_p > MAX_P)
+            break;
+
+        /* See how much error is caused by p being an integer.  */
+        delta = fabs (1.0 - ((double) trial_p / raw_p));
+
+        /* If this is the most accurate so far, then keep track of it.  */
+        if (delta < min_delta)
+        {
+            p = trial_p;
+            q = trial_q;
+
+            /* If it is exact then quit (we won't be able to find a better approximation!).  */
+            if (min_delta == 0.0)
+                break;
+
+            min_delta = delta;
+        }
+    }
+
+    /* Just in case.  */
+    if (p == 0)
+    {
+        DEBUG("loop failed to find p & q!");
+        return 0;
+    }
+
+    /* Have sorted out values for p, q & d - now form them into a control word.  */
+
+    /* First, look up the value for Index (VCO preset).  */
+    for (index = 0; index < NUM_PRESETS; index++)
+    {
+        if (VCO_PRESET_BOUNDARIES[index] > vco_frequency)
+            break;
+    }
+
+    // make sure we have found a suitable value for I
+    if ((index == 0) || (index == NUM_PRESETS))
+    {
+        DEBUG("can not find preset for %g\n", vco_frequency);
+        return 0;
+    }
+
+    /* The index must now be in the range 1 .. 13; so subtract 1, to change the
+       range to 0 .. 12 as required by the encoding.  */
+    index--;
+
+    /* Return the frequency calculated as best approximation to the one requested.  */
+    *actual_frequency = (2.0 * REF_CLK * p / q) / (1 << d);
+
+    DEBUG("p = %d, q = %d, d = %d, I = %d\n", p, q, d, index);
+
+    /* The ranges for p, q & d are:
+
+          I : 0 ..  12
+          p : 4 .. 130
+          d : 0 ..   7
+          q : 3 .. 129
+
+       Subtracting a bias of 3 from p and 2 from q converts these to:
+
+          I : 0 ..  12     which can be held in 4 bits
+          p : 1 .. 127     which can be held in 7 bits
+          d : 0 ..   7     which can be held in 3 bits
+          q : 1 .. 126     which can be held in 7 bits
+
+       which gives a control word with bitfields:
+
+                00000000000IIIIPPPPPPPDDDQQQQQQQ
+
+       Note that 0 is not a valid value for the control word, which is why
+       it is safe to return 0 from this function in the error cases.  */
+
+    ctrl_word = (index & 0xf);
+    ctrl_word = (ctrl_word << 7) | ((p - 3) & 0x7f);
+    ctrl_word = (ctrl_word << 3) | (d       & 0x7);
+    ctrl_word = (ctrl_word << 7) | ((q - 2) & 0x7f);
+
+    return ctrl_word;
+}
+
+
+/* Write a control word to the PLL clock control register whose address is given.
+   Return TRUE if the write is successful.  */
+
+static Boolean
+write_PLL_register (unsigned int address, unsigned int ctrl_word)
+{
+    const Byte   S0S1_FINAL_STATE[] = {(Byte) 0x0, (Byte) 0x1, (Byte) 0x2};
+    const Byte   PLL_CLK_BIT        = (Byte) 0x08;
+    const Byte   PLL_DATA_BIT       = (Byte) 0x10;
+    unsigned int i;
+    Byte         data;
+    Byte         iControlState;
+    Byte         iOriginalState;
+    int          manchester_bitstream[64];
+
+    DEBUG("writing 0x%08X to PLL register %d\n", ctrl_word, address);
+
+    /* Add the address in the MSBs of the ctrl_word: this gives us a 24-bit value
+       with the fields AAAIIIIPPPPPPPDDDQQQQQQQ  */
+
+    ctrl_word = ((address & 0x7) << 21) | (ctrl_word & 0x1fffff);
+
+    /* Create a bit stream at twice the data rate that incorporates the pseudo
+       Manchester encoding for the data and also the unlock sequence.  */
+    for (i = 0; i < 11; i++)
+        manchester_bitstream[i] = 1;
+
+    /* The start bit.  */
+    manchester_bitstream[11] = 0;
+    manchester_bitstream[12] = 0;
+    manchester_bitstream[13] = 0;
+
+    i = 14;
+    while (i < 62)
+    {
+        if ((ctrl_word & 0x1) == 0)
+        {
+            manchester_bitstream[i++] = 1;
+            manchester_bitstream[i++] = 0;
+        }
+        else
+        {
+            manchester_bitstream[i++] = 0;
+            manchester_bitstream[i++] = 1;
+        }
+
+        ctrl_word >>= 1;
+    }
+
+    /* The stop bit.  */
+    manchester_bitstream[62] = 1;
+    manchester_bitstream[63] = 1;
+
+    /* Snapshot the control port state.  */
+    iOriginalState = gpio_read(CONTROL_PORT);
+
+    /* Set the parallel port data to 0, in preparation for sending config data.  */
+    write_data_port((Byte) 0);
+    Sleep(2);
+
+    /* Set CPLD into config mode.  */
+
+    /* Set SS0=1, SS1=1, CNT=1, BIDir=0.  */
+    iControlState = (iOriginalState | SS0 | SS1 | CNT | BI) ^ BI;
+    write_control_port(iControlState, 2);
+
+    /* Ensure STROBE is high.  */
+    iControlState = iControlState | STR;
+    write_control_port(iControlState, 2);
+
+    /* Set CPLD into config mode by setting SS0=1, SS1=0, CNT=1.  */
+    iControlState = iControlState ^ SS1;
+    write_control_port(iControlState, 2);
+
+    /* Now send the double rate data stream.  */
+
+    // Set the clock high and data low.  */
+    data = PLL_CLK_BIT & ~PLL_DATA_BIT;
+    write_data_port(data);
+    //Sleep(1);
+
+    for (i = 0; i < 64; i++)
+    {
+        /* Put the next Manchester code bit out.  */
+        if (manchester_bitstream[i] == 1)
+            data = data |  PLL_DATA_BIT;
+        else
+            data = data & ~PLL_DATA_BIT;
+
+        write_data_port(data);
+        //Sleep(1);
+
+        /* Toggle the clock bit.  */
+        data  = data ^ PLL_CLK_BIT;
+        write_data_port(data);
+        //Sleep(1);
+    }
+
+    /* Set data/clock (alias s1/s0) to select the programmed divisor register
+       for the video clock.  */
+    write_data_port(S0S1_FINAL_STATE[VCLK_SETUP_REG_NO]);
+    //Sleep(1);
+
+    /* Set CPLD into ARC-Run Host-Read mode.  */
+    iControlState = iControlState | SS1 | BI;
+    write_control_port(iControlState, 2);
+
+    return TRUE;
+}
+
+
+/* Configure the target board's CPLD.  */
+
+static void
+configure_CPLD (void)
+{
+    const Byte         CPLD_CLK_BIT         = (Byte) 0x01;
+    const Byte         CPLD_DATA_BIT        = (Byte) 0x02;
+    const Byte         CPLD_SET_BIT         = (Byte) 0x04;
+    const unsigned int NUM_OF_CPLD_CFG_BITS = 16;
+    unsigned int       cpldConfigData       = 0;
+    Byte               iControlState;
+    unsigned int       i;
+
+    /* Snapshot the control port.  */
+    Byte iOriginalState = gpio_read(CONTROL_PORT);
+
+    /* Set the parallel port data to 0, in preparation for sending config data.  */
+    write_data_port((Byte) 0);
+    Sleep(1);
+
+    /* Set CPLD into configuration mode.  */
+
+    /* Set SS0=1, SS1=1, CNT=1, BIDir=0.  */
+    iControlState = (iOriginalState | SS0 | SS1 | CNT | BI) ^ BI;
+    write_control_port(iControlState, 2);
+
+    /* Ensure STROBE is high.  */
+    iControlState = iControlState | STR;
+    write_control_port(iControlState, 2);
+
+    /* Set CPLD into config mode by setting SS0=1, SS1=0, CNT=1.  */
+    iControlState = iControlState ^ SS1;
+    write_control_port(iControlState, 2);
+
+    /* Now send the config data stream with set low.  */
+
+    /* Set clock high and data low.  */
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(global_clocks); i++)
+        cpldConfigData += (unsigned int) global_clocks[i].source << (3 * i);
+
+    for (i = 0; i < NUM_OF_CPLD_CFG_BITS; i++)
+    {
+        Byte value;
+
+        /* See if the next cfg bit is 0 or 1.  */
+        if ((cpldConfigData & 0x1) == 0x1)
+            value = CPLD_DATA_BIT;
+        else
+            value = (Byte) 0;
+
+        /* Put data bit out to parallel port.  */
+        write_data_port(value);
+
+        /* And toggle the clock line.  */
+        value |= CPLD_CLK_BIT;
+        write_data_port(value);
+
+        value &= ~CPLD_CLK_BIT;
+        write_data_port(value);
+
+        cpldConfigData >>= 1;
+    }
+
+    /* Now take the clock and set bits high.  */
+    write_data_port(CPLD_CLK_BIT | CPLD_SET_BIT);
+
+    /* Finally, take the clock low.  */
+    write_data_port(CPLD_SET_BIT);
+
+    /* And put the CPLD into ARC run mode, SS0=1, SS1= 1, CNT=x.  */
+    iControlState = iControlState | SS1 | BI;
+    write_control_port(iControlState, 2);
+}
+
+
+/* Try to set the frequency of a PLL clock.
+
+    Parameters:
+        clock              : the identity of the clock (MCLK or VCLK)
+        requested_frequency: the desired frequency fro the clock
+        inform             : TRUE if a message should be output if the clock is set
+        emit_warning       : TRUE if a warning should be output if the clock is not set
+
+    Returns TRUE if the clock is set.
+*/
+
+static Boolean
+set_PLL_clock_frequency (PLL_ClockId clock,
+                         MegaHertz   requested_frequency,
+                         Boolean     inform,
+                         Boolean     emit_warning)
+{
+    /* First need to work out the control words for the frequencies set.  */
+    MegaHertz    actual_frequency = UNDEFINED_FREQUENCY;
+    unsigned int ctrl_word = calculate_ctrl_word (requested_frequency,
+                                                  PLL_clock_fixed_info[clock].MIN_VCO_FREQ,
+                                                  PLL_clock_fixed_info[clock].MAX_VCO_FREQ,
+                                                  &actual_frequency);
+    Boolean set;
+
+    DEBUG("set_PLL_clock_frequency: %s ctrl_word = %08X, freq = %.2lf MHz\n",
+          PLL_CLOCK_NAME(clock), ctrl_word, requested_frequency);
+
+    if (ctrl_word == 0)
+    {
+        if (emit_warning)
+            warning(_("it is not possible to set %s to %.2lf"),
+                    PLL_CLOCK_NAME(clock), requested_frequency);
+        return FALSE;
+    }
+
+    DEBUG("set_PLL_clock_frequency: %s %.2lf, %.2lf, %.2lf\n",
+          PLL_CLOCK_NAME(clock),
+          requested_frequency,
+          actual_frequency,
+          PLL_clocks[clock].actual_frequency);
+
+    if (actual_frequency != PLL_clocks[clock].actual_frequency)
+    {
+        /* Set up the PLL chip. We program the MREG, the REG0/1/2 - whichever
+           is selected to control VCLK.  */
+        set = write_PLL_register (PLL_clock_fixed_info[clock].PLL_register, ctrl_word);
+
+        if (set)
+        {
+            PLL_clocks[clock].requested_frequency = requested_frequency;
+            PLL_clocks[clock].actual_frequency    = actual_frequency;
+        }
+        else
+            if (emit_warning)
+                warning(_("PLL programming failed"));
+    }
+    else
+        set = TRUE;
+
+    if (set && inform)
+        printf_filtered(_("PLL clock %s set to %.2lf MHz.\n"), PLL_CLOCK_NAME(clock), actual_frequency);
+
+    return set;
+}
+
+
+/* Check the frequencies of the two PLL clocks, and emit a warning if necessary.
+
+   The ICD2061A Data Sheet recommends that the two clocks should not be set to
+   frequencies such that one is an integer multiple of the other, in order to
+   avoid jitter.  */
+
+static void
+check_PLL_clock_frequencies (void)
+{
+    DEBUG("check_PLL_clock_frequencies\n");
+
+    /* If both clocks are in use.  */
+    if (PLL_clocks[PLL_MCLK].in_use && PLL_clocks[PLL_VCLK].in_use)
+    {
+        /* Check whether the two chosen clocks are divisible by one another, in
+           which case print a warning.  */
+        double multiplier = PLL_clocks[PLL_VCLK].actual_frequency /
+                            PLL_clocks[PLL_MCLK].actual_frequency;
+        double modulus;
+
+        if (multiplier < 1.00)
+            multiplier = 1 / multiplier;
+
+        modulus = multiplier - ((int) multiplier);
+
+        /* Check also for near multiples.  */
+        if ((modulus < 0.02) || (modulus > 0.98))
+            warning(_("PLL MCLK and PLL VCLK frequencies are (near) multiples of each other.\n"
+                      "This may lead to clock degradation."));
+    }
+    else if (PLL_clocks[PLL_MCLK].in_use || PLL_clocks[PLL_VCLK].in_use)
+    {
+        MegaHertz   requested_frequency;
+        MegaHertz   actual_frequency;
+        PLL_ClockId clock;
+
+        /* If we now are only using one PLL clock then ensure that the second
+           clock's frequency is not a multiple of the first's (M == V is OK).  */
+        if (PLL_clocks[PLL_MCLK].in_use)
+        {
+            clock            = PLL_VCLK;
+            actual_frequency = PLL_clocks[PLL_MCLK].actual_frequency;
+        }
+        else
+        {
+            clock            = PLL_MCLK;
+            actual_frequency = PLL_clocks[PLL_VCLK].actual_frequency;
+        }
+
+        if (actual_frequency < VCO_PRESET_BOUNDARIES[0])
+            requested_frequency = actual_frequency * 1.43;
+        else
+            requested_frequency = actual_frequency;
+
+        if (!set_PLL_clock_frequency(clock, requested_frequency, TRUE, FALSE))
+            (void) set_PLL_clock_frequency(clock, actual_frequency, TRUE, TRUE);
+    }
+}
+
+
+/* Try to set the source of the given global clock to be a PLL clock set to the
+   given frequency.
+
+   If one of the PLL clocks is already set to the given frequency, we use that
+   as the source; otherwise, if the global clock's source is a PLL clock, and
+   no other global clock is using that PLL clock as its source, we change its
+   frequency to the required frequency; otherwise, if the other PLL clock is not
+   already in use, we set that other clock to the required frequency and use it
+   as the source; otherwise (both PLL clocks are in use), we find the clock
+   whose frequency is closest to the required frequency and use that clock as
+   the source.  */
+
+static void
+use_PLL_clock (GlobalClockId clockId, MegaHertz clockValue)
+{
+    PLL_ClockId  PLL_clock_id      = NO_PLL_CLK;
+    PLL_ClockId  free_PLL_clock_id = NO_PLL_CLK;
+    unsigned int i;
+
+    /* Is this global clock not already using a PLL clock?  */
+    if (global_clocks[clockId].PLL_clock == NO_PLL_CLK)
+    {
+        /* Has this frequency already been assigned to a PLL clock?  */
+        for (i = 0; i < ELEMENTS_IN_ARRAY(PLL_clocks); i++)
+        {
+             PLL_Clock* clock = &PLL_clocks[i];
+
+            if (clock->in_use)
+            {
+                /* The actual frequency to which the clock is set may differ
+                   slightly from the frequency that was requested - so check
+                   both.  */
+                if (clockValue == clock->requested_frequency ||
+                    clockValue == clock->actual_frequency)
+                {
+                   PLL_clock_id = (PLL_ClockId) i;
+                   break;
+                }
+            }
+            else
+            {
+                /* Use MCLK (first in array) in preference to VCLK.  */
+                if (free_PLL_clock_id == NO_PLL_CLK)
+                    free_PLL_clock_id = (PLL_ClockId) i;
+            }
+        }
+    }
+    else
+    {
+        PLL_ClockId this_clock = global_clocks[clockId].PLL_clock;
+        int         users      = 0;
+
+        /* How many global clocks are using this PLL clock?  */
+        for (i = 0; i < ELEMENTS_IN_ARRAY(global_clocks); i++)
+        {
+            if (global_clocks[i].PLL_clock == this_clock)
+                users++;
+        }
+
+        if (users == 1)
+        {
+            /* Just this one - so we can change its frequency without affecting
+               any other global clocks.  */
+            free_PLL_clock_id = this_clock;
+        }
+        else
+        {
+            /* Look at the other clock - if it is not already in use, we can use it.  */
+            PLL_ClockId other_clock = (this_clock == PLL_MCLK) ? PLL_VCLK : PLL_MCLK;
+
+            if (!PLL_clocks[other_clock].in_use)
+                free_PLL_clock_id = other_clock;
+        }
+    }
+
+    /* Do we need another PLL clock?  */
+    if (PLL_clock_id == NO_PLL_CLK)
+    {
+        /* If so, and there aren't any which are not in use.  */
+        if (free_PLL_clock_id == NO_PLL_CLK)
+        {
+            MegaHertz M_delta = fabs(PLL_clocks[PLL_MCLK].actual_frequency - clockValue);
+            MegaHertz V_delta = fabs(PLL_clocks[PLL_VCLK].actual_frequency - clockValue);
+
+            /* Which clock has the closet frequency to what we want?  */
+            PLL_clock_id = (M_delta <= V_delta) ? PLL_MCLK : PLL_VCLK;
+
+            warning(_("can not set GCLK%d to %.2lf MHz - "
+                      "there are no more PLL clocks available.\n"
+                      "Using closest match instead (%s @ %.2lf MHz)."),
+                    clockId, clockValue,
+                    PLL_CLOCK_NAME(PLL_clock_id),
+                    PLL_clocks[PLL_clock_id].actual_frequency);
+        }
+        else
+        {
+            /* Otherwise, use a free PLL clock.  */
+            PLL_clock_id = free_PLL_clock_id;
+
+            if (set_PLL_clock_frequency(PLL_clock_id, clockValue, TRUE, TRUE))
+            {
+                PLL_clocks[PLL_clock_id].in_use = TRUE;
+                check_PLL_clock_frequencies();
+            }
+        }
+    }
+
+    global_clocks[clockId].PLL_clock = PLL_clock_id;
+    global_clocks[clockId].source    = (PLL_clock_id == PLL_MCLK) ? CLOCK_SOURCE_PLL_MCLK : CLOCK_SOURCE_PLL_VCLK;
+    global_clocks[clockId].set       = TRUE;
+}
+
+
+/* Set the source of the given global clock as specified.
+   This may be one of: crystal, dips, highimp, host, mclk, vclk or <frequency>.
+   Specifying an explicit frequency means that the source should be a PLL clock
+   set to that frequency.  */
+
+static void
+set_global_clock (GlobalClockId clockId, const char *clockData)
+{
+   static const struct table_entry
+   {
+       ClockSource source;
+       PLL_ClockId clock;
+       const char *name;
+       Boolean     harvard;
+   } table[] =
+   { { CLOCK_SOURCE_CRYSTAL,          NO_PLL_CLK, "crystal", FALSE },
+     { CLOCK_SOURCE_CRYSTAL_DIVIDED,  NO_PLL_CLK, "dips",    FALSE },
+     { CLOCK_SOURCE_HIGH_IMPEDANCE,   NO_PLL_CLK, "highimp", FALSE },
+     { CLOCK_SOURCE_HOST_STROBE,      NO_PLL_CLK, "host",    FALSE },
+     { CLOCK_SOURCE_PLL_MCLK_HARVARD, PLL_MCLK,   "mclk",    TRUE  },
+     { CLOCK_SOURCE_PLL_VCLK_HARVARD, PLL_MCLK,   "vclk",    TRUE  },
+     { CLOCK_SOURCE_PLL_MCLK,         PLL_MCLK,   "mclk",    FALSE },
+     { CLOCK_SOURCE_PLL_VCLK,         PLL_VCLK,   "vclk",    FALSE } };
+
+    MegaHertz    clockValue;
+    unsigned int i;
+
+    /* Look at each possible clock source in the table.  */
+    for (i = 0; i < ELEMENTS_IN_ARRAY(table); i++)
+    {
+        const struct table_entry *entry = &table[i];
+
+        if (strcasecmp(clockData, entry->name) == 0)
+        {
+            /* N.B. the order of the entries in the table is important!  */
+            if (entry->harvard && !harvard)
+                continue;
+
+            global_clocks[clockId].source    = entry->source;
+            global_clocks[clockId].PLL_clock = entry->clock;
+            global_clocks[clockId].set       = TRUE;
+
+            /* N.B. "high impedance" effectively means "off".  */
+            if ((clockId == 3) && (entry->source == CLOCK_SOURCE_HIGH_IMPEDANCE))
+            {
+                warning(_("GCLK3 must be valid in order for the ARC processor's debug interface to interact with the processor."));
+            }
+            else if ((clockId == 2) && (entry->source != CLOCK_SOURCE_HOST_STROBE))
+            {
+                warning(_("GCLK2 must be %s for the JTAG clock to be connected to the ARC processor's debug interface."),
+                        CLOCK_SOURCE_STRINGS[CLOCK_SOURCE_HOST_STROBE]);
+            }
+
+            return;
+        }
+    }
+
+    /* We did not find a match in the table - so the given source may be a frequency.  */
+    if (sscanf(clockData, "%lf", &clockValue) == 1)
+    {
+        if (clockId == 2)
+        {
+            warning(_("GCLK2 must be %s for the JTAG clock to be connected to the ARC processor's debug interface."),
+                    CLOCK_SOURCE_STRINGS[CLOCK_SOURCE_HOST_STROBE]);
+        }
+
+        use_PLL_clock(clockId, clockValue);
+    }
+    else
+        warning(_("'%s' is not a valid source for clock %d\n"), clockData, clockId);
+}
+
+
+/* Enable Harvard clock to drive global clock GLK3.  */
+
+static void
+enable_Harvard_clock (void)
+{
+    /* Does GCLK3 come from the PLL?  */
+    if (global_clocks[3].PLL_clock != NO_PLL_CLK)
+    {
+        /* Save existing settings.  */
+        const PLL_ClockId saved_clock[] = {global_clocks[0].PLL_clock,
+                                           global_clocks[1].PLL_clock,
+                                           global_clocks[2].PLL_clock,
+                                           global_clocks[3].PLL_clock};
+        const MegaHertz   saved_value[] = {PLL_clocks[PLL_MCLK].actual_frequency,
+                                           PLL_clocks[PLL_VCLK].actual_frequency};
+        GlobalClockId     clockId;
+
+        printf_filtered(_("Configuring clocks to drive Harvard Ctl_Clk.\n"));
+
+        reset_clock_configuration();
+        harvard = TRUE;
+
+        /* Now re-assign the Harvard inputs and double the requested frequency.  */
+        use_PLL_clock(3, 2 * saved_value[saved_clock[3]]);
+
+        /* Now ensure GCLK3 is configured as a Harvard generator.  */
+        if (saved_clock[3] == PLL_MCLK)
+            global_clocks[3].source = CLOCK_SOURCE_PLL_MCLK_HARVARD;
+        else
+            global_clocks[3].source = CLOCK_SOURCE_PLL_VCLK_HARVARD;
+
+        /* Re-assign any existing PLL clocks.  */
+        for (clockId = 0; clockId < 3; clockId++)
+        {
+            if (saved_clock[clockId] != NO_PLL_CLK)
+                use_PLL_clock(saved_clock[clockId], saved_value[saved_clock[clockId]]);
+        }
+    }
+}
+
+
+/* Print out the settings of the PLL clocks and the global clock sources.
+
+   Parameters:
+      with_PLL_clocks              : if TRUE, print the settings of the PLL clocks
+      with_global_only_if_using_PLL: if TRUE, print the sources of the global
+                                     clocks only if at least one of those sources
+                                     is a PLL clock
+  */
+
+static void
+print_clock_settings (Boolean with_PLL_clocks, Boolean with_global_only_if_using_PLL)
+{
+    Boolean      with_global_clocks = TRUE;
+    unsigned int i;
+
+    if (with_global_only_if_using_PLL)
+    {
+        with_global_clocks = FALSE;
+
+        for (i = 0; i < ELEMENTS_IN_ARRAY(global_clocks); i++)
+        {
+            if (global_clocks[i].PLL_clock != NO_PLL_CLK)
+            {
+                with_global_clocks = TRUE;
+                break;
+            }
+        }
+    }
+
+    if (with_PLL_clocks)
+    {
+        printf_filtered(_("PLL clock %s : %.2lf MHz.\n"), PLL_CLOCK_NAME(PLL_MCLK), PLL_clocks[PLL_MCLK].actual_frequency);
+        printf_filtered(_("PLL clock %s : %.2lf MHz.\n"), PLL_CLOCK_NAME(PLL_VCLK), PLL_clocks[PLL_VCLK].actual_frequency);
+    }
+
+    if (with_global_clocks)
+    {
+        for (i = 0; i < ELEMENTS_IN_ARRAY(global_clocks); i++)
+        {
+            GlobalClock clock  = global_clocks[i];
+            const char *format = "GCLK%d   <<   %s @ %.2lf MHz\n";
+            const char *source;
+            MegaHertz   value;
+
+            switch (clock.source)
+            {
+                case CLOCK_SOURCE_PLL_MCLK:
+                    source = CLOCK_SOURCE_STRINGS[clock.source];
+                    value  = PLL_clocks[PLL_MCLK].actual_frequency;
+                    break;
+
+                case CLOCK_SOURCE_PLL_VCLK:
+                    source = CLOCK_SOURCE_STRINGS[clock.source];
+                    value  = PLL_clocks[PLL_VCLK].actual_frequency;
+                    break;
+
+                case CLOCK_SOURCE_PLL_MCLK_HARVARD:
+                    source = GCLOCK3_SOURCE_STRINGS[clock.source];
+                    value  = PLL_clocks[PLL_MCLK].actual_frequency / 2.0;
+                    break;
+
+                case CLOCK_SOURCE_PLL_VCLK_HARVARD:
+                    source = GCLOCK3_SOURCE_STRINGS[clock.source];
+                    value  = PLL_clocks[PLL_VCLK].actual_frequency / 2.0;
+                    break;
+
+                default:
+                    format = "GCLK%d   <<   %s\n";
+                    source = ((i == 3) ? GCLOCK3_SOURCE_STRINGS : CLOCK_SOURCE_STRINGS)[clock.source];
+                    value  = 0.0;
+                    break;
+            }
+
+            printf_filtered(format, i, source, value);
+        }
+    }
+}
+
+
+/* Set the two PLL clocks to the given frequencies.  */
+
+static void
+set_PLL_clocks (MegaHertz requested_MCLK_frequency,
+                MegaHertz requested_VCLK_frequency)
+{
+    DEBUG("set_PLL_clocks: MCLK = %.2lf MHz, VCLK = %.2lf MHz\n",
+          requested_MCLK_frequency, requested_VCLK_frequency);
+
+    /* Configure PLL clocks.  */
+
+    if (requested_MCLK_frequency != UNDEFINED_FREQUENCY)
+    {
+        if (set_PLL_clock_frequency(PLL_MCLK, requested_MCLK_frequency, TRUE, TRUE))
+            PLL_clocks[PLL_MCLK].in_use = TRUE;
+    }
+
+    if (requested_VCLK_frequency != UNDEFINED_FREQUENCY)
+    {
+        if (set_PLL_clock_frequency(PLL_VCLK, requested_VCLK_frequency, TRUE, TRUE))
+            PLL_clocks[PLL_VCLK].in_use = TRUE;
+    }
+}
+
+
+/* Set the clock settings.
+
+   The PLL clocks are set only if this is being done after the target board
+   FPGA has been blasted.
+   If any of the global clock sources needs to be set, the target CPLD is
+   configured, and the given message is printed out.  */
+
+static void
+program_clock_settings (const char *message, Boolean after_blast)
+{
+    unsigned int i;
+
+    /* If the FPGA has been blasted, configure the PLL clocks.  */
+    if (after_blast)
+        set_PLL_clocks(FREQUENCY(PLL_MCLK), FREQUENCY(PLL_VCLK));
+
+    /* Do any of the global clocks need to be set?  */
+    for (i = 0; i < ELEMENTS_IN_ARRAY(global_clocks); i++)
+    {
+        if (global_clocks[i].set)
+        {
+            /* Print status message only if there is something to be done.  */
+            printf_filtered("%s\n", message);
+
+            if (harvard)
+                enable_Harvard_clock();
+
+            configure_CPLD();
+
+            print_clock_settings(after_blast, FALSE);
+            break;
+        }
+    }
+
+    /* Reset the JTAG Test Access Port Controller.  */
+    arc_jtag_ops.reset();
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                      local functions for blasting the FPGA                 */
+/* -------------------------------------------------------------------------- */
+
+/* Try to blast the target board FPGA.
+   Return TRUE if blasting is done.  */
+
+static Boolean
+blast_board (char *args, int from_tty)
+{
+    /* Check that a file name has been given.  */
+    if (args == NULL)
+        printf_filtered (_(ARC_BLAST_BOARD_COMMAND_USAGE));
+    else
+    {
+        char *suffix = strrchr(args, '.');
+
+        /* Check the file is an .xbf file.  */
+        if ((suffix != NULL) && (strcasecmp(suffix, ".xbf") == 0))
+        {
+            FILE *fp;
+
+            /* Check that the JTAG interface (which opens the GPIO driver) is open
+               (do this before opening the file, as this function does not return
+               here if the interface is not open).  */
+            arc_jtag_ops.check_open();
+
+            fp = fopen(args, "rb");
+
+            if (fp)
+            {
+                char *message = NULL;
+
+                if (initialize_FPGA())
+                {
+                    if (blast_FPGA(fp))
+                    {
+                        /* Reset the JTAG Test Access Port Controller.  */
+                        arc_jtag_ops.reset();
+
+                        program_clock_settings(_("Reconfiguring clock settings after FPGA blast."), TRUE);
+
+                        return TRUE;
+                    }
+                    else
+                        message = _("Can not blast FPGA");
+                }
+                else
+                    message = _("Can not initialize FPGA for blasting");
+
+                (void) fclose(fp);
+
+                if (message)
+                    error("%s", message);
+            }
+            else
+                error(_("Can not open file '%s': %s"), args, strerror(errno));
+        }
+        else
+            error(_("Filename does not have suffix .xbf, so is presumably not an XBF file"));
+    }
+
+    return FALSE;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                      local functions implementing commands                 */
+/* -------------------------------------------------------------------------- */
+
+/* Command: <command> <XBF_file>
+
+   Blast the target board's FPGA with an XBF file.  */
+
+static void
+arc_blast_board_FPGA (char *args, int from_tty)
+{
+    if (blast_board(args, from_tty))
+    {
+        /* We no longer know what the target processor is.  */
+        arc_architecture_is_unknown();
+
+        /* So find it out again.  */
+        arc_update_architecture(arc_read_jtag_aux_register);
+
+        /* And check that it matches the aux registers and the executable file.  */
+        ARCHITECTURE_CHECK(current_gdbarch,
+                           (current_objfile) ? current_objfile->obfd : NULL);
+    }
+}
+
+
+/* Command: <command> [ <clock> = ] <frequency> [ , <frequency> ]
+
+   Set the frequency of one or both PLL clocks.  */
+
+static void
+arc_set_clock_frequency (char *args, int from_tty)
+{
+    MegaHertz MCLK_frequency = UNDEFINED_FREQUENCY;
+    MegaHertz VCLK_frequency = UNDEFINED_FREQUENCY;
+    int       result;
+    char     *value;
+
+    if (args == NULL)
+    {
+        printf_filtered (_(ARC_SET_CLOCK_FREQUENCY_COMMAND_USAGE));
+        return;
+    }
+
+    result = name_value_pair(args, &value);
+
+    if (result == 0)
+    {
+        printf_filtered (_(ARC_SET_CLOCK_FREQUENCY_COMMAND_USAGE));
+        return;
+    }
+
+    if (result == 1)
+    {
+        char *comma = strchr(args, ',');
+
+        if (comma)
+        {
+            *comma = '\0';
+            MCLK_frequency = strtod(args,      NULL);
+            VCLK_frequency = strtod(comma + 1, NULL);
+        }
+        else
+            MCLK_frequency = strtod(args, NULL);
+
+    }
+    else if (result == 2)
+    {
+        char *comma = strchr(value, ',');
+
+        if (comma)
+        {
+            printf_filtered (_(ARC_SET_CLOCK_FREQUENCY_COMMAND_USAGE));
+            return;
+        }
+
+        if (strcasecmp(args, "mclk") == 0)
+            MCLK_frequency = strtod(value, NULL);
+        else if (strcasecmp(args, "vclk") == 0)
+            VCLK_frequency = strtod(value, NULL);
+        else
+        {
+            warning(_("invalid PLL clock '%s'"), args);
+            return;
+        }
+    }
+
+    /* strtod returns 0 for an invalid argument - and 0 is not a valid clock
+       frequency anyway!  */
+    if (MCLK_frequency == 0.0 || VCLK_frequency == 0.0)
+    {
+        warning(_("invalid clock frequency"));
+    }
+    else
+    {
+        DEBUG(_("MCLK : %.2lf MHz.\n"), MCLK_frequency);
+        DEBUG(_("VCLK : %.2lf MHz.\n"), VCLK_frequency);
+
+        /* Check that the JTAG interface (which opens the GPIO driver) is open.  */
+        arc_jtag_ops.check_open();
+
+        set_PLL_clocks(MCLK_frequency, VCLK_frequency);
+        check_PLL_clock_frequencies();
+        print_clock_settings(FALSE, TRUE);
+
+        /* Reset the JTAG Test Access Port Controller.  */
+        arc_jtag_ops.reset();
+    }
+}
+
+
+/* Command: <command> gclk<N> = <source>
+                      gclk    = <source>
+                      gclks   = <source> , { <source> }
+                      harvard
+
+   Set the source of one or more global clocks.  */
+
+static void
+arc_set_clock_source (char *args, int from_tty)
+{
+    Boolean invalid = FALSE;
+
+    if (args)
+    {
+        int   result;
+        char *value;
+
+        /* Check that the JTAG interface (which opens the GPIO driver) is open.  */
+        arc_jtag_ops.check_open();
+
+        result = name_value_pair(args, &value);
+
+        if (result == 1)
+        {
+            if (strcasecmp(args, "harvard") == 0)
+                harvard = TRUE;
+            else
+                invalid = TRUE;
+        }
+        else if (result == 2)
+        {
+            char *key = args;
+
+            DEBUG("key = %s, value = %s\n", key, value);
+
+            if (strncasecmp(key, "gclk", 4) == 0)
+            {
+                size_t keylength = strlen(key);
+
+                if (keylength == 4)
+                    set_global_clock(3, value);
+                else if (keylength == 5)
+                {
+                    if (key[4] == 's' || key[4] == 'S')
+                    {
+                        GlobalClockId clockId   = 0;
+                        char         *clockData = strtok(value, " ,");
+
+                        do
+                        {
+                            if (clockId == NUM_GLOBAL_CLOCKS)
+                            {
+                                warning(_("too many clock sources specified"));
+                                return;
+                            }
+
+                            set_global_clock(clockId++, clockData);
+                            clockData = strtok(NULL, " ,");
+                        } while (clockData != NULL);
+                    }
+                    else if ('0' <= key[4] && key[4] < '0' + (char) NUM_GLOBAL_CLOCKS)
+                    {
+                        DEBUG("gclkN found\n");
+                        set_global_clock((GlobalClockId) (key[4] - (char) '0'), value);
+                    }
+                    else
+                    {
+                        warning(_("'%c' is not a valid clock number"), key[4]);
+                        return;
+                    }
+                }
+                else
+                    invalid = TRUE;
+            }
+            else
+                invalid = TRUE;
+        }
+        else
+            invalid = TRUE;
+    }
+    else
+        invalid = TRUE;
+
+    if (invalid)
+        printf_filtered (_(ARC_SET_CLOCK_SOURCE_COMMAND_USAGE));
+    else
+        program_clock_settings(_("Attempting to set clocks."), FALSE);
+}
+
+
+/* Command: <command>
+
+   Show the current clock settings.  */
+
+static void
+arc_print_clock_settings (char *args, int from_tty)
+{
+    if (args)
+    {
+        printf_filtered (_(ARC_CLOCK_SETTINGS_COMMAND_USAGE));
+        return;
+    }
+
+    /* Check that the JTAG interface (which opens the GPIO driver) is open.  */
+    arc_jtag_ops.check_open();
+
+    print_clock_settings(TRUE, FALSE);
+}
+
+
+/* Command: <command>
+
+   Show the current target board FPGA status.  */
+
+static void
+arc_check_FPGA_configuration (char *args, int from_tty)
+{
+    if (args)
+    {
+        printf_filtered (_(ARC_FPGA_COMMAND_USAGE));
+        return;
+    }
+
+    switch (arc_is_FPGA_configured())
+    {
+        case INACCESSIBLE:
+            break;
+        case CONFIGURED:
+            printf_filtered(_("FPGA is configured.\n"));
+            break;
+        case UNCONFIGURED:
+            printf_filtered(_("FPGA is not configured.\n"));
+            break;
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Blast the target board FPGA.  */
+
+void
+arc_blast_board (char *args, int from_tty)
+{
+    (void) blast_board(args, from_tty);
+}
+
+
+/* Reset the target board.  */
+
+void
+arc_reset_board (void)
+{
+    /* Toggle the SS1 line - this should do a soft reset.  */
+
+    write_control_port(SS1 | SS0 | CNT, 0);
+    write_control_port(      SS0 | CNT, 200);   /* TBH 18 JUN 2003 delay needed by slower simulations.  */
+    write_control_port(SS1 | SS0 | CNT, 0);
+
+    /* Reset the PLL clocks and the global clock sources - this should be done
+       by the soft reset, but that does not appear to happen!  */
+    reset_clock_configuration();
+
+    (void) set_PLL_clock_frequency(PLL_MCLK, MCLK_RESET_FREQUENCY, FALSE, FALSE);
+    (void) set_PLL_clock_frequency(PLL_VCLK, VCLK_RESET_FREQUENCY, FALSE, FALSE);
+
+    configure_CPLD();
+}
+
+
+/* Check whether the FPGA has been configured (i.e. blasted with an XBF).  */
+
+FPGA_Status
+arc_is_FPGA_configured (void)
+{
+    FPGA_Status result;
+
+    ENTERMSG;
+
+    /* Try to open the JTAG interface (which opens the GPIO driver).  */
+    if (arc_jtag_ops.open(arc_aux_find_register_number("MEMSUBSYS", ARC_HW_MEMSUBSYS_REGNUM)))
+    {
+        /* Get the current state of the control register.  */
+        Byte origCTRL = gpio_read(CONTROL_PORT) ^ C_XOR;
+        Byte newCTRL;
+        Byte status;
+
+        /* If SS0 is low, bring this high first (to protect against reset).  */
+        if (SS0 != (origCTRL & SS0))
+        {
+            /* Output new control state.  */
+            newCTRL = (origCTRL | SS0);
+            write_control_port(newCTRL, 1);
+        }
+
+        /* Ensure that SS0 is high, and SS1 and CNT are low.  */
+        newCTRL = (origCTRL | SS0) & 0xF5; // 11110101
+        newCTRL = newCTRL | BI;
+        write_control_port(newCTRL, 1);
+
+        /* Read the OP input.  */
+        status = read_status_port();
+
+        /* If SS1 was originally high then bring high now (to protect against reset).  */
+        if (SS1 == (origCTRL & SS1))
+        {
+            /* Output new control state (Gray code transition).  */
+            newCTRL = (origCTRL | SS1);
+            write_control_port(newCTRL, 1);
+        }
+
+        /* Restore the control register.  */
+        write_control_port(origCTRL, 1);
+
+        /* Reset the JTAG Test Access Port Controller.  */
+        arc_jtag_ops.reset();
+
+        result = IS_SET(FPA_CFG_DONE, status) ? CONFIGURED : UNCONFIGURED;
+    }
+    else
+        result = INACCESSIBLE;
+
+    LEAVEMSG;
+    return result;
+}
+
+
+/* Initialize the module. This function is called from the gdb core on start-up.  */
+
+void
+_initialize_arc_board (void)
+{
+    struct cmd_list_element* c;
+
+    /* Reset the configuration info to its default state.  */
+    reset_clock_configuration();
+
+    /* Add support for blasting an FPGA board (ARCangel).  */
+    c = add_cmd (ARC_BLAST_BOARD_COMMAND,
+                 class_obscure,
+                 arc_blast_board_FPGA,
+                 _("Blast the ARC board FPGA.\n"
+                   ARC_BLAST_BOARD_COMMAND_USAGE
+                   "<FILE> is the filepath of an XBF (eXtended Binary Format) file.\n"),
+                 &cmdlist);
+    set_cmd_completer (c, filename_completer);
+
+    /* Add support for setting the CPU clock frequency.  */
+    (void) add_cmd (ARC_SET_CLOCK_FREQUENCY_COMMAND,
+                    class_obscure,
+                    arc_set_clock_frequency,
+                    _("Set the PLL frequency on the ARC board.\n"
+                      ARC_SET_CLOCK_FREQUENCY_COMMAND_USAGE
+                      "<CLOCK> is 'mclk' or 'vclk'; if omitted, and only one frequency is given, it defaults to 'mclk'.\n"
+                      "<FREQUENCY> is a number (interpreted as MegaHertz).\n"),
+                    &cmdlist);
+
+    /* Add support for setting the CPU clock sources.  */
+    (void) add_cmd (ARC_SET_CLOCK_SOURCE_COMMAND,
+                    class_obscure,
+                    arc_set_clock_source,
+                    _("Set the clock sources on the ARC board.\n"
+                      ARC_SET_CLOCK_SOURCE_COMMAND_USAGE
+                      "N is in the range 0 .. 3; if omitted, it defaults to 3.\n"
+                      "<SOURCE> is 'crystal', 'dips', 'highimp', 'host', 'mclk', 'vclk' or a number (interpreted as MegaHertz). \n"),
+                    &cmdlist);
+
+    /* Add support for showing the clock settings.  */
+    (void) add_cmd (ARC_CLOCK_SETTINGS_COMMAND,
+                    class_info,
+                    arc_print_clock_settings,
+                    _("Show the clock settings on the ARC board.\n"
+                      ARC_CLOCK_SETTINGS_COMMAND_USAGE),
+                    &infolist);
+
+    /* Add support for checking whether the FPGA board has been configured.  */
+    (void) add_cmd (ARC_FPGA_COMMAND,
+                    class_info,
+                    arc_check_FPGA_configuration,
+                    _("Check ARC board FPGA configuration.\n"
+                      ARC_FPGA_COMMAND_USAGE),
+                    &infolist);
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-board.h b/gdb/arc-board.h
new file mode 100644
index 0000000..3683b5b
--- /dev/null
+++ b/gdb/arc-board.h
@@ -0,0 +1,65 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by  ARC International (www.arc.com)
+
+   Authors:
+      Phil Barnard    <phil.barnard@arc.com>
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines operations for controlling an ARC target      */
+/*     board.                                                                 */
+/*                                                                            */
+/*     These operations are:                                                  */
+/*        1) configuring ("blasting") an FPGA target with the contents of an  */
+/*           XBF file;                                                        */
+/*        2) checking whether a target has been so configured; and            */
+/*        3) setting the clock frequency of the target.                       */
+/*                                                                            */
+/* Notes:                                                                     */
+/*     The arc_blast_board function implements an ARC-specific command; hence */
+/*     its 'args' parameter contains data entered by the debugger user, which */
+/*     must be checked for validity.                                          */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_BOARD_H
+#define ARC_BOARD_H
+
+
+typedef enum
+{
+    INACCESSIBLE,
+    CONFIGURED,
+    UNCONFIGURED
+} FPGA_Status;
+
+
+void arc_blast_board (char *args, int from_tty);
+
+void arc_reset_board (void);
+
+FPGA_Status arc_is_FPGA_configured (void);
+
+
+#endif /* ARC_BOARD_H */
+/******************************************************************************/
diff --git a/gdb/arc-dummy-gpio.c b/gdb/arc-dummy-gpio.c
new file mode 100644
index 0000000..8297408
--- /dev/null
+++ b/gdb/arc-dummy-gpio.c
@@ -0,0 +1,94 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey      <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements a dummy set of operations for reading data from */
+/*     / writing data to a parallel port using a GPIO (General Purpose Input/ */
+/*     Output) driver.                                                        */
+/*                                                                            */
+/*     It is useful for testing when no hardware target is available.         */
+/*                                                                            */
+/******************************************************************************/
+
+#include "arc-gpio.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* This is set to TRUE if an I/O error occurs in accessing the port.
+   (This never happens in this dummy module).  */
+Boolean gpio_port_error;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialization of the GPIO interface.  */
+
+Boolean
+gpio_open (void)
+{
+    gpio_port_error = FALSE;
+    return TRUE;
+}
+
+
+/* Close the GPIO interface.  */
+
+void
+gpio_close (void)
+{
+}
+
+
+/* Write a byte of data to the given port.  */
+
+void
+gpio_write (ParallelPort port, Byte data)
+{
+}
+
+
+/* Read a byte of data from the given port.  */
+
+Byte
+gpio_read (ParallelPort port)
+{
+    return 0;
+}
+
+
+/* Write a series of bytes of data to the ports.  */
+
+void
+gpio_write_array (GPIO_Pair array[], unsigned int num_elements)
+{
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-dummy-jtag-ops.c b/gdb/arc-dummy-jtag-ops.c
new file mode 100644
index 0000000..257330b
--- /dev/null
+++ b/gdb/arc-dummy-jtag-ops.c
@@ -0,0 +1,274 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Author:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements a dummy set of operations for debug access to   */
+/*     an ARC processor via its JTAG interface.                               */
+/*                                                                            */
+/*     It is useful for testing when no hardware target is available.         */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <stdio.h>
+
+/* ARC header files */
+#include "arc-jtag-ops.h"
+#include "arc-registers.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define AMV1_REG        (ARC_HW_AMV0_REGNUM + 3)
+
+
+/* The number of actionpoints supported by the target. Set this to different
+   values (2, 4 or 8) when testing.  */
+static unsigned int num_actionpoints = 8;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+JTAG_Operations arc_jtag_ops;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               main operations                              */
+/* -------------------------------------------------------------------------- */
+
+/* These are the functions that are called from outside this module via the
+   pointers in the arc_jtag_ops global object.
+
+   N.B. none of these functions are called from within this module.  */
+
+
+/* Read a processor core register.  */
+
+static JTAG_OperationStatus
+jtag_read_core_reg (ARC_RegisterNumber regnum, ARC_RegisterContents *contents)
+{
+    return JTAG_SUCCESS;
+}
+
+
+/* Write a processor core register.  */
+
+static JTAG_OperationStatus
+jtag_write_core_reg (ARC_RegisterNumber regnum, ARC_RegisterContents contents)
+{
+    return JTAG_SUCCESS;
+}
+
+
+/* Read a processor auxiliary register.  */
+
+static JTAG_OperationStatus
+jtag_read_aux_reg (ARC_RegisterNumber regnum, ARC_RegisterContents *contents)
+{
+    /* Return a "useful" value for some specific registers.  */
+
+    if (regnum == ARC_HW_PC_REGNUM)
+        *contents = 0x00001008;
+    else if (regnum == ARC_HW_AP_BUILD_REGNUM)
+    {
+        if (num_actionpoints == 2)
+            *contents = 0x00000004;
+        else if (num_actionpoints == 4)
+            *contents = 0x00000104;
+        else
+            *contents = 0x00000204;
+    }
+    else if (regnum == ARC_HW_DEBUG_REGNUM)
+    {
+        /* Fake trigger of AP 1.  */
+        *contents = DEBUG_ACTIONPOINT_HALT |
+                    (1 << (DEBUG_ACTIONPOINT_STATUS_SHIFT + 1));
+    }
+    else if (regnum == AMV1_REG)
+    {
+        *contents = 0x4008;
+    }
+    else if (regnum == ARC_HW_IDENTITY_REGNUM)
+    {
+        *contents = 0x31;
+    }
+    else if (regnum == ARC_HW_STATUS32_REGNUM)
+    {
+        *contents = STATUS32_HALT;
+    }
+    else
+        *contents = 0;
+
+//  DEBUG("regnum = %x, contents = 0x%08X", regnum, *contents);
+
+    return JTAG_SUCCESS;
+}
+
+
+/* Write a processor auxiliary register.  */
+
+static JTAG_OperationStatus
+jtag_write_aux_reg (ARC_RegisterNumber regnum, ARC_RegisterContents contents)
+{
+//  printf(_("AUX: regnum = %d, contents = 0x%08X\n"), regnum, contents);
+    return JTAG_SUCCESS;
+}
+
+
+/* Read a word of data from memory; the given address must be word-aligned.
+   Returns number of bytes read.  */
+
+static unsigned int
+jtag_read_word (ARC_Address addr, ARC_Word *data)
+{
+    *data = 0;
+    return BYTES_IN_WORD;
+}
+
+
+/* Write a word of data to memory; the given address must be word-aligned.
+   Returns number of bytes written.  */
+
+static unsigned int
+jtag_write_word (ARC_Address addr, ARC_Word data)
+{
+    return BYTES_IN_WORD;
+}
+
+
+/* Read a number of words of data from target memory starting at the given address.
+   Returns number of bytes read.  */
+
+static unsigned int
+jtag_read_chunk (ARC_Address addr, ARC_Byte *data, unsigned int words)
+{
+    return words * BYTES_IN_WORD;
+}
+
+
+/* Write a number of words of data to target memory starting at the given address.
+   Returns number of bytes written.  */
+
+static unsigned int
+jtag_write_chunk (ARC_Address addr, ARC_Byte *data, unsigned int words)
+{
+    return words * BYTES_IN_WORD;
+}
+
+
+/* Write a number of copies of a word-sized pattern of data to memory starting
+   at the given address.
+   Returns number of bytes written.  */
+
+static unsigned int
+jtag_write_pattern (ARC_Address addr, ARC_Word pattern, unsigned int words)
+{
+    return words * BYTES_IN_WORD;
+}
+
+
+/* Open the JTAG interface.
+   Returns TRUE for success.  */
+
+static Boolean
+jtag_open (void)
+{
+    arc_jtag_ops.status = JTAG_OPENED;
+    return TRUE;
+}
+
+
+/* Close the JTAG interface.  */
+
+static void
+jtag_close (void)
+{
+    arc_jtag_ops.status = JTAG_CLOSED;
+}
+
+
+/* Reset the target JTAG controller.  */
+
+static void
+jtag_reset (void)
+{
+}
+
+
+/* Reset the target board.  */
+
+static void
+jtag_reset_board (void)
+{
+}
+
+
+/* Check that the JTAG interface is open.
+   If it is closed, 'error' is called.  */
+
+static void
+jtag_check_open (void)
+{
+    if (arc_jtag_ops.status == JTAG_CLOSED)
+        error(_("JTAG connection is closed. "
+                "Use command 'target " ARC_TARGET_NAME "' first."));
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the module. This function is called from the gdb core on start-up.  */
+
+void
+_initialize_arc_jtag_ops (void)
+{
+    arc_jtag_ops.status              = JTAG_CLOSED;
+    arc_jtag_ops.state_machine_debug = FALSE;
+    arc_jtag_ops.retry_count         = 50;
+
+    arc_jtag_ops.open                 = jtag_open;
+    arc_jtag_ops.close                = jtag_close;
+    arc_jtag_ops.check_open           = jtag_check_open;
+    arc_jtag_ops.reset_board          = jtag_reset_board;
+    arc_jtag_ops.reset                = jtag_reset;
+    arc_jtag_ops.memory_read_word     = jtag_read_word;
+    arc_jtag_ops.memory_write_word    = jtag_write_word;
+    arc_jtag_ops.memory_read_chunk    = jtag_read_chunk;
+    arc_jtag_ops.memory_write_chunk   = jtag_write_chunk;
+    arc_jtag_ops.memory_write_pattern = jtag_write_pattern;
+    arc_jtag_ops.read_aux_reg         = jtag_read_aux_reg;
+    arc_jtag_ops.write_aux_reg        = jtag_write_aux_reg;
+    arc_jtag_ops.read_core_reg        = jtag_read_core_reg;
+    arc_jtag_ops.write_core_reg       = jtag_write_core_reg;
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-elf32-tdep.c b/gdb/arc-elf32-tdep.c
new file mode 100755
index 0000000..2c7de60
--- /dev/null
+++ b/gdb/arc-elf32-tdep.c
@@ -0,0 +1,2064 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors:
+      Soam Vasani          <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+      Richard Stuckey      <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module provides support for the ARC processor family's target     */
+/*     dependencies which are specific to the arc-elf32 configuration of the  */
+/*     ARC gdb.                                                               */
+/*                                                                            */
+/*                                                                            */
+/* Functionality:                                                             */
+/*     This module provides a number of operations:                           */
+/*                                                                            */
+/*     1) a function which returns the name of a register, given its number   */
+/*                                                                            */
+/*     2) a function which determines whether a given register belongs to a   */
+/*        particular group (e.g. the group of registers which should be saved */
+/*        and restored across a function call)                                */
+/*                                                                            */
+/*     3) a function which prints out registers                               */
+/*                                                                            */
+/*     4) functions which implement the gdb extended commands                 */
+/*                                                                            */
+/*        arc-watch-range <start> [<kind>]  for setting a watchpoint range    */
+/*        arc-break-range <start> <length>  for setting a breakpoint range    */
+/*        arc-fill-memory <start> <length> [<pattern>] for filling memory     */
+/*                                                                            */
+/*     5) functions for various operations (such as program loading) which    */
+/*        are common to the different arc-elf32 targets supported             */
+/*                                                                            */
+/*                                                                            */
+/* Usage:                                                                     */
+/*     The module exports a function _initialize_arc_elf32_tdep: the call to  */
+/*     this function is generated by the gdb build mechanism, so this function*/
+/*     should not be explicitly called.                                       */
+/*                                                                            */
+/*     This module exports a function arc_elf32_initialize which creates the  */
+/*     user commands which use those command-implementing functions; it also  */
+/*     stores pointers to the other functions in a data structure so that     */
+/*     they may be called from outside this module.                           */
+/*                                                                            */
+/*     Some of the operations provided by this module are registered with gdb */
+/*     during initialization; gdb then calls them via function pointers,      */
+/*     rather than by name (this allows gdb to handle multiple target         */
+/*     architectures):                                                        */
+/*                                                                            */
+/*          set_gdbarch_XXX (gdbarch, <function>);                            */
+/*                                                                            */
+/*                                                                            */
+/* Register Numbering Scheme:                                                 */
+/*     The N target processor registers are assigned gdb numbers which form a */
+/*     contiguous range starting at 0.  The scheme used is:                   */
+/*                                                                            */
+/*         0    .. n1   :  core registers R0 .. R31                           */
+/*         n1+1 .. n2   :  extension core registers R32 .. R59 (if any)       */
+/*         n2+1         :  r60 (LP_COUNT)                                     */
+/*         n2+2         :  r63 (PCL)                                          */
+/*         n2+3         :  IDENTITY auxiliary register                        */
+/*         n2+4 .. n3   :  non-BCR auxiliary registers in address order       */
+/*         n3+1 .. N-1  :  Build Configuration Registers in address order     */
+/*                                                                            */
+/*     N.B. 1) core registers R61 and R62 are not included in the scheme, as  */
+/*             R61 is reserved, and R62 is not a real register;               */
+/*                                                                            */
+/*          2) the set of non-BCR auxiliary registers, and the set of BCRs,   */
+/*             are each ordered by increasing register address in the ARC     */
+/*             auxiliary register space;                                      */
+/*                                                                            */
+/*          3) the IDENTITY auxiliary register comes before all the other     */
+/*             auxiliary registers, even though it does not come first in the */
+/*             address space: this is so that the debugger can always get the */
+/*             contents of the register, and so determine the architectural   */
+/*             version of the target processor, regardless of what that       */
+/*             version may be (and hence what the processor's auxiliary       */
+/*             register set is) - this is vital when the debug target is a    */
+/*             remote target, as the position of the register contents in the */
+/*             'g' RSP response packet (or the number to be specified in the  */
+/*             'p' query packet) depends upon the target processor version;   */
+/*             otherwise, we would have the problem that the debugger could   */
+/*             not determine the target processor version without already     */
+/*             knowing it!                                                    */
+/*                                                                            */
+/*     The numbers are assigned to the registers by the arc-registers module, */
+/*     after the XML definitions of the auxiliary registers and any extension */
+/*     core registers defined for the target processor have been read and     */
+/*     processed.                                                             */
+/*                                                                            */
+/*                                                                            */
+/* Auxiliary Registers Definition:                                            */
+/*     The ARC processor is configurable, and the set of auxiliary registers  */
+/*     that a target processor may possess depends upon the configuration. It */
+/*     is therefore not possible to hard-code descriptions of this register   */
+/*     set into the debugger. Instead, the descriptions of the registers are  */
+/*     read from an XML file (or files).                                      */
+/*                                                                            */
+/*     The arc-elf32-gdb debugger provides commands which allow the user to   */
+/*     instruct it to read an XML file and use the register definitions in    */
+/*     that file; these definitions either completely replace, or are added   */
+/*     to (depending upon which command is used), any existing set of         */
+/*     definitions the debugger has; this allows processor architecture       */
+/*     variants to be described by groups of files (e.g. a common main file   */
+/*     describing the base configuration, plus additional files describing    */
+/*     cache-related registers, or MMU-related registers, which are specific  */
+/*     to different variants).                                                */
+/*                                                                            */
+/*     Note that this scheme may also be used to define the set of extension  */
+/*     core registers (if any) possessed by the target processor.             */
+/*                                                                            */
+/*     If no register set is defined by use of the commands, the debugger     */
+/*     attempts to read the register definitions from a default file; it will */
+/*     look for this file first in the user's current working directory, then */
+/*     in the user's home directory. In order to provide maximum flexibility, */
+/*     the debugger delays the attempt to read the default file until it is   */
+/*     necessary, e.g. when connection to a target is being attempted, or a   */
+/*     check is made that the executable file to be debugged has been built   */
+/*     for the same architectural version (e.g. ARC600, ARC700, etc.) as the  */
+/*     version of the target processor.                                       */
+/*                                                                            */
+/*     The arc-elf32 specific code makes as few assumptions as possible about */
+/*     the auxiliary register set: it will always try to get the number (i.e. */
+/*     the hardware number, the offset in the auxiliary register space) of an */
+/*     auxiliary register from the definition of that register, even in the   */
+/*     case that the register is defined in the base ARC architecture, and    */
+/*     hence should be present in all processor variants.                     */
+/*                                                                            */
+/*     In particular, no assumption is made about the PC; so, to guarantee    */
+/*     that the debugger has read a definition of the PC by the time that it  */
+/*     is needed (as the complete set of auxiliary register definitions may   */
+/*     be read from a number of files, there is no requirement for the PC's   */
+/*     definition to be in any given file), a "guard" is set upon the PC such */
+/*     that any attempt to read/write the PC by gdb will result in a check    */
+/*     that the PC is defined: if the PC is defined, the guard is removed,    */
+/*     and the read/write operation performed - otherwise, an error message   */
+/*     is reported, and the operation aborted.                                */
+/*                                                                            */
+/* Register Byte Order:                                                       */
+/*     The target register contents are held in gdb's register cache (i.e. in */
+/*     a regcache struct) in target byte order; however, when values are      */
+/*     read/written to/from the xISS target (i.e. the dynamically loaded xISS */
+/*     simulator) or the ARCangel4 target those values must be in host byte   */
+/*     order.                                                                 */
+/*                                                                            */
+/*     The ARC debugger is currently built only to run on an X86 Linux host,  */
+/*     so the assumption is made that the host is little-endian.              */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <string.h>
+#include <signal.h>
+#include <byteswap.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "inferior.h"
+#include "gdbcore.h"
+#include "gdbcmd.h"
+#include "regcache.h"
+#include "exceptions.h"
+#include "reggroups.h"
+#include "observer.h"
+#include "objfiles.h"
+#include "arch-utils.h"
+#include "gdb-events.h"
+#include "gdb_assert.h"
+
+/* ARC header files */
+#include "config/arc/tm-embed.h"
+#include "arc-tdep.h"
+#include "arc-memory.h"
+#include "arc-arguments.h"
+#include "arc-elf32-tdep.h"
+#include "arc-registers.h"
+#include "arc-remote-fileio.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef struct
+{
+    struct gdbarch    *gdbarch;
+    struct ui_file    *file;
+    struct frame_info *frame;
+} PrintData;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define INVALID_REGISTER_NUMBER        (ARC_RegisterNumber) 0xFFFFFFFFU
+
+#define WATCH_MEMORY_COMMAND        "arc-watch-range"
+#define BREAK_MEMORY_COMMAND        "arc-break-range"
+#define FILL_MEMORY_COMMAND         "arc-fill-memory"
+
+#define WATCH_MEMORY_COMMAND_USAGE  "Usage: " WATCH_MEMORY_COMMAND  " <START> <LENGTH> [ read | write | access ]\n"
+#define BREAK_MEMORY_COMMAND_USAGE  "Usage: " BREAK_MEMORY_COMMAND  " <START> <LENGTH>\n"
+#define FILL_MEMORY_COMMAND_USAGE   "Usage: " FILL_MEMORY_COMMAND   " <START> <LENGTH> [ <PATTERN> ]\n"
+
+
+
+/* ARC 700 brk_s instruction.  */
+static const unsigned char le_breakpoint_instruction[] = { 0xff, 0x7f };
+static const unsigned char be_breakpoint_instruction[] = { 0x7f, 0xff };
+
+
+/* N.B. the array size is specified in the declaration so that the compiler
+        will warn of "excess elements in array initializer" if there is a
+        mismatch (but not of too few elements, unfortunately!).  */
+static const char *register_names[ARC_MAX_CORE_REGS] =
+{
+    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",
+    "r7",  "r8",  "r9",  "r10", "r11", "r12", "r13",
+    "r14", "r15", "r16", "r17", "r18", "r19", "r20",
+    "r21", "r22", "r23", "r24", "r25", "r26",
+
+    "fp",      // r27
+    "sp",      // r28
+    "ilink1",  // r29
+    "ilink2",  // r30
+    "blink",   // r31
+
+    /* Extension core registers are 32 .. 59 inclusive.  */
+    "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
+    "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", "r48", "r49",
+    "r50", "r51", "r52", "r53", "r54", "r55", "r56", "r57", "r58", "r59",
+
+    "lp_count",
+
+    /* 61 is reserved, 62 is not a real register.  */
+    "r61",
+    "r62",
+
+    "pcl"
+};
+
+
+/* For the Ctrl-C signal handler.  */
+static void (*old_signal_handler) (int);
+
+/* This flag is used by the Ctrl-C interrupt mechanism: it is set by an
+   interrupt handler and tested by non-interrupt code, so must be declared
+   as volatile to avoid possible optimisation problems.  */
+static volatile Boolean interrupt_processor;
+
+/* A pointer to the remote target's register store function.  */
+static void (*remote_register_store)(struct regcache *regcache, int regno);
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* These are the h/w register numbers of the DEBUG, PC and STATUS32 registers.  */
+ARC_RegisterNumber arc_debug_regnum;
+ARC_RegisterNumber arc_pc_regnum;
+ARC_RegisterNumber arc_status32_regnum;
+
+/* Whether a program has been loaded to the target.  */
+Boolean arc_program_is_loaded;
+
+/* Whether a target is connected.  */
+Boolean arc_target_is_connected;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define PRINT(regnum) \
+    default_print_registers_info (gdbarch, file, frame, regnum, all)
+
+#define PRINT_HW(hw_regnum)  PRINT(arc_core_register_gdb_number(hw_regnum))
+
+#define PRINT_BY_NAME(regname)                                               \
+{                                                                            \
+    ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_name(regname); \
+                                                                             \
+    if (def)                                                                 \
+        PRINT(arc_aux_gdb_register_number(def));                             \
+} while (0)
+
+
+#define EXTRACT(argument, type, result)                                    \
+{                                                                          \
+    struct expression *expr  = parse_expression(argument);                 \
+    struct value      *val   = evaluate_expression(expr);                  \
+    struct cleanup    *chain = make_cleanup(free_current_contents, &expr); \
+                                                                           \
+    result = *(type*) (value_contents (val));                              \
+    do_cleanups (chain);                                                   \
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* This function creates the processor-specific information for the arc-elf32-gdb
+   variant of the the ARC gdb deubbger.  */
+
+static void
+create_variant_info (struct gdbarch_tdep *tdep)
+{
+    tdep->processor_variant_info = xmalloc(sizeof(ARC_VariantsInfo));
+    tdep->processor_variant_info->processor_version = NO_ARCHITECTURE;
+
+    arc_initialize_aux_reg_info(&tdep->processor_variant_info->registers);
+}
+
+
+/* This function is used to read an auxiliary register on the target.  */
+
+static Boolean
+read_target_aux_register (ARC_RegisterNumber    hw_regno,
+                          ARC_RegisterContents *contents,
+                          Boolean               warn_on_failure)
+{
+    struct regcache           *regcache  = get_current_regcache();
+    ARC_AuxRegisterDefinition *def       = arc_find_aux_register_by_hw_number(hw_regno);
+    int                        gdb_regno = arc_aux_gdb_register_number(def);
+
+    /* Read the register contents from the target to the register cache,
+       then collect the register value from the cache.  */
+    target_fetch_registers(regcache, gdb_regno);
+    regcache_raw_collect (regcache, gdb_regno, contents);
+
+    /* The register cache holds the contents in target byte order, so convert to
+       host byte order if the target and host orders are different.  */
+    if (HOST_AND_TARGET_ENDIANNESS_DIFFER(current_gdbarch))
+        *contents = __bswap_32(*contents);
+
+    /* Unfortunately, we can not tell whether the read succeeded or failed.  */
+    return TRUE;
+}
+
+
+/* This function returns a pointer to a function which may be used to read an
+   auxiliary register on the target.  The register contents returned by that
+   function are in host byte order.  */
+
+static ReadRegisterFunction
+read_aux_register (struct target_ops *target)
+{
+    /* If we have a function which can read an aux register on the target,
+       and return a success/failure result, use it instead.  */
+    if ((strcmp(target->to_shortname, "arcxiss") == 0) ||
+        (strcmp(target->to_shortname, "arcjtag") == 0))
+    {
+        TargetOperations *operations  = (TargetOperations*) target->to_data;
+        return operations->read_auxiliary_register;
+    }
+
+    return read_target_aux_register;
+}
+
+
+/* Convert the contents of the given register in the given cache so that it can
+   be written to the target (i.e. if there are any fields in the register which
+   are required by the ARC processor architectural definition to have particular
+   values on write, set those fields to those values).  */
+
+static void convert_register(int              gdb_regno,
+                             struct regcache *regcache)
+{
+    ARC_RegisterContents contents;
+
+    regcache_raw_collect     (regcache, gdb_regno, &contents);
+    arc_convert_aux_contents_for_write (gdb_regno, &contents);
+    regcache_raw_supply      (regcache, gdb_regno, &contents);
+}
+
+
+/* This function is called when a remote target calls its 'to_store_registers'
+   operation: we intercept that call, and convert the register contents as
+   required, before calling the real operation.  */
+
+static void
+intercept_remote_register_store (struct regcache *regcache, int gdb_regno)
+{
+    struct gdbarch  *gdbarch    = get_regcache_arch(regcache);
+    struct regcache *savedcache = regcache_xmalloc(gdbarch);
+
+    ENTERARGS("gdb_regno: %d", gdb_regno);
+
+    /* Save the register cache.  */
+    regcache_cpy(savedcache, regcache);
+
+    /* Convert the value of the register(s) for writing.  */
+    if (gdb_regno >= 0)
+        convert_register(gdb_regno, regcache);
+    else
+    {
+        int num_regs = gdbarch_num_regs (gdbarch);
+
+        for (gdb_regno = 0; gdb_regno < num_regs; gdb_regno++)
+            convert_register(gdb_regno, regcache);
+    }
+
+    /* Now use the real remote target 'store registers' operation to store the
+       converted cache.  */
+    remote_register_store(regcache, gdb_regno);
+
+    /* Restore the register cache.  */
+    regcache_cpy(regcache, savedcache);
+    regcache_xfree(savedcache);
+}
+
+
+/* This is a callback function which gets called by gdb whenever the current
+   object file changes.  */
+
+static void
+new_object_file (struct objfile *objfile)
+{
+    if (objfile)
+        ARCHITECTURE_CHECK(current_gdbarch, objfile->obfd);
+}
+
+
+/* This is a callback function which gets called by gdb just before connection
+ * to a target is attempted.  */
+
+static void
+pre_target_connection (struct target_ops *target)
+{
+    DEBUG("pre_target_connect : %s\n", target->to_shortname);
+
+    /* We do not yet know the version of the target processor.  */
+    arc_architecture_is_unknown();
+
+    /* If we have not read yet any aux register definitions for this architecture,
+     * try to read the default file now.  */
+    if (!arc_aux_regs_defined(current_gdbarch))
+        arc_read_default_aux_registers(current_gdbarch);
+}
+
+
+/* This is a callback function which gets called by gdb just after connection
+   to a target is completed.  */
+
+static void
+post_target_connection (struct target_ops *target)
+{
+    DEBUG("post_target_connect : %s\n", target->to_shortname);
+
+    arc_target_is_connected = TRUE;
+
+    arc_update_architecture(read_aux_register(target));
+
+    ARCHITECTURE_CHECK(current_gdbarch,
+                       (current_objfile) ? current_objfile->obfd : NULL);
+}
+
+
+/* This is a callback function which gets called by gdb just after disconnection
+   from a target has been completed.  */
+
+static void
+post_target_disconnection (struct target_ops *target)
+{
+    DEBUG("post_target_disconnect : %s\n", target->to_shortname);
+
+    arc_target_is_connected = FALSE;
+}
+
+
+/* This is a callback function which gets called by gdb after a target has been updated.  */
+
+static void
+target_updated (struct target_ops *target)
+{
+    DEBUG("target_updated : %s\n", target->to_shortname);
+
+    if (strcmp(target->to_shortname, "remote") == 0)
+    {
+        DEBUG("remote target register store interception is in force\n");
+
+        /* We must intercept the remote target's register store operation: we
+           need to convert register contents before they are written to the
+           target (we can not do that in remote.c as that is generic gdb code).  */
+        if (target->to_store_registers != intercept_remote_register_store)
+        {
+            remote_register_store      = target->to_store_registers;
+            target->to_store_registers = intercept_remote_register_store;
+        }
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 1)                  local functions for handling Ctrl-C                    */
+/* -------------------------------------------------------------------------- */
+
+/* The command line interface's stop routines.  The interrupted_by_user function
+   is installed as a signal handler for SIGINT (it gets called when the user
+   types Ctrl-C).
+
+   The first time a user requests a stop, we set the interrupt_processor flag.
+   If this does not work, and the user tries a second time, we ask the user if
+   he'd like to detach from the target.  */
+
+
+static void
+interrupted_twice (int signo);
+
+
+/* This function is called when the user types Ctrl-C.  */
+
+static void
+interrupted_by_user (int signo)
+{
+    /* Change the signal handler for Ctrl-C to the second level handler so that
+       if we get the signal again whilst waiting for the program to halt, we do
+       something more drastic.  */
+    (void) signal (SIGINT, interrupted_twice);
+
+    /* This flag is checked in each iteration of the loop that polls the target
+       processor to see whether it has halted (e.g. at a breakpoint); if the
+       flag is set, an attempt will be made to force the processor to halt.
+
+       N.B. once the polling loop is running, this flag is set only by this
+            handler, and is read only by the polling loop - so there is no
+            mutual exclusion problem to be worried about here; this is a MUCH
+            cleaner and more reliable method than trying to have this handler
+            force the halt itself, e.g. by calling target_stop.  */
+    interrupt_processor = TRUE;
+
+    DEBUG("Attempting to interrupt...\n");
+}
+
+
+/* This function is called when the user types Ctrl-C twice.  */
+
+static void
+interrupted_twice (int signo)
+{
+    if (query(_("Interrupted while waiting for the program to halt.\n"
+                "Give up (and stop debugging it)?")))
+    {
+        struct gdb_exception exception = {RETURN_QUIT,
+                                          GDB_NO_ERROR,
+                                          _("Interrupted by user")};
+
+        /* Put the old signal handler back.  */
+        (void) signal (signo, old_signal_handler);
+
+        target_mourn_inferior();
+        DEBUG("interrupted_twice: throwing exception\n");
+        throw_exception (exception);
+
+        /* Control does not return here!  */
+    }
+
+    /* Change the signal handler for Ctrl-C back to the first level handler.  */
+    (void) signal (SIGINT, interrupted_by_user);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 2)                functions for reading/writing registers                  */
+/* -------------------------------------------------------------------------- */
+
+/* This function maps a gdb internal register number to the hardware number
+   (i.e. core register number or number in the auxiliary register space).  */
+
+static ARC_RegisterNumber
+get_hw_regnum_mapping (int gdb_regno)
+{
+    ARC_AuxRegisterDefinition *def;
+
+    if (arc_is_core_register(gdb_regno))
+        return arc_core_register_number(gdb_regno);
+
+    def = arc_find_aux_register_by_gdb_number(gdb_regno);
+
+    if (def)
+        return arc_aux_hw_register_number(def);
+
+    /* Not found.  */
+    return INVALID_REGISTER_NUMBER;
+}
+
+
+/* This function fetches one register from the target and saves its contents in
+   the given register cache.  The register is identified both by its gdb number
+   and its ARC hardware number.  */
+
+static void
+debug_fetch_one_register (struct regcache *  regcache,
+                          ARC_RegisterNumber hw_regno,
+                          int                gdb_regno)
+{
+    TargetOperations    *operations = (TargetOperations*) current_target.to_data;
+    ARC_RegisterContents contents;
+    Boolean              register_read = FALSE;
+
+    ENTERARGS("gdb = %d, h/w = %d", gdb_regno, hw_regno);
+
+    gdb_assert(gdb_regno >= 0);
+
+    /* N.B. do not give a warning message if the register is write-only, as gdb
+            may be reading all registers, and it is best to quietly ignore the
+            ones that can not be read!  */
+    if (arc_is_core_register(gdb_regno))
+    {
+        if (arc_core_register_access(hw_regno) != WRITE_ONLY)
+            register_read = operations->read_core_register(hw_regno, &contents, TRUE);
+    }
+    else
+    {
+        ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_hw_number(hw_regno);
+
+        if (arc_aux_register_access(def) != WRITE_ONLY)
+            register_read = operations->read_auxiliary_register (hw_regno, &contents, TRUE);
+    }
+
+    if (register_read)
+    {
+        DEBUG("read 0x%08X from target\n", contents);
+
+        /* The read_<type>_register functions return the register contents in
+           host order, but the register cache holds them in target byte order,
+           so swap the bytes if necessary before supplying the contents to the
+           cache.  */
+        if (HOST_AND_TARGET_ENDIANNESS_DIFFER(get_regcache_arch(regcache)))
+        {
+            contents = __bswap_32(contents);
+            DEBUG("byte-swapped to 0x%08X\n", contents);
+        }
+
+        regcache_raw_supply (regcache, (int) gdb_regno, &contents);
+    }
+
+    LEAVEMSG;
+}
+
+
+/* This function is passed to the arc_all_aux_registers iterator.
+   It fetches one auxiliary register from the target.  */
+
+static void
+debug_fetch_reg (ARC_AuxRegisterDefinition *def, void *data)
+{
+    debug_fetch_one_register((struct regcache*) data,
+                             arc_aux_hw_register_number (def),
+                             arc_aux_gdb_register_number(def));
+}
+
+
+/* This function gets a register from the given register cache and stores it
+   to the target.  The register is identified both by its gdb number and its
+   ARC hardware number.  */
+
+static void
+debug_store_one_register (struct regcache   *regcache,
+                          ARC_RegisterNumber hw_regno,
+                          int                gdb_regno)
+{
+    TargetOperations    *operations = (TargetOperations*) current_target.to_data;
+    ARC_RegisterContents contents;
+
+    ENTERARGS("gdb = %d, h/w = %d", gdb_regno, hw_regno);
+
+    gdb_assert(gdb_regno >= 0);
+
+    regcache_raw_collect(regcache, gdb_regno, &contents);
+
+    DEBUG("collected 0x%08X from cache\n", contents);
+
+    /* The write_<type>_register functions take the register contents in
+       host order, but the register cache holds them in target byte order,
+       so swap the bytes if necessary after collecting the contents from the
+       functions.  */
+    if (HOST_AND_TARGET_ENDIANNESS_DIFFER(get_regcache_arch(regcache)))
+    {
+        contents = __bswap_32(contents);
+        DEBUG("byte-swapped to 0x%08X\n", contents);
+    }
+
+    if (arc_is_core_register(gdb_regno))
+    {
+        if (arc_core_register_access(hw_regno) == READ_ONLY)
+            arc_elf32_core_warning(REGISTER_IS_READ_ONLY, hw_regno);
+        else
+            (void) operations->write_core_register(hw_regno, contents, TRUE);
+    }
+    else
+    {
+        ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_hw_number(hw_regno);
+
+        if (arc_aux_register_access(def) == READ_ONLY)
+            arc_elf32_aux_warning(REGISTER_IS_READ_ONLY, hw_regno);
+        else
+            (void) operations->write_auxiliary_register (hw_regno, contents, TRUE);
+    }
+
+    LEAVEMSG;
+}
+
+
+/* This function is passed to the arc_all_aux_registers iterator.
+   It stores one auxiliary register to the target.  */
+
+static void
+debug_store_reg (ARC_AuxRegisterDefinition *def, void *data)
+{
+    debug_store_one_register ((struct regcache*) data,
+                              arc_aux_hw_register_number (def),
+                              arc_aux_gdb_register_number(def));
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 3)                functions for reading/writing mmeory                     */
+/* -------------------------------------------------------------------------- */
+
+static unsigned int
+read_bytes (ARC_Address  address,
+            ARC_Byte    *data,    /* May be not word-aligned.  */
+            unsigned int bytes)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+
+    return arc_read_memory(operations, address, data, bytes);
+}
+
+
+static unsigned int
+write_bytes (ARC_Address  address,
+             ARC_Byte    *data,   /* May be not word-aligned.  */
+             unsigned int bytes)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+
+    return arc_write_memory(operations, address, data, bytes);
+}
+
+
+static unsigned int
+write_pattern (ARC_Address  address,
+               ARC_Word     pattern,
+               unsigned int bytes)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+
+    return arc_write_pattern(operations, address, 0, bytes);
+}
+
+
+static unsigned int
+write_zeros (ARC_Address  address,
+             unsigned int bytes)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+
+    return arc_write_pattern(operations, address, 0, bytes);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 4)                  local functions for processor control                  */
+/* -------------------------------------------------------------------------- */
+
+/* This function is called when execution on the target has halted for some
+   reason (such as a breakpoint trigger).  It determines whether the halt should
+   be reported to gdb, or execution resumed.
+
+   Parameters:
+       status             : a pointer to the target status information
+       debug              : the contents of the target processor DEBUG register
+       read_core_register : a function which can read a target core register
+
+   Result: TRUE if the halt is to be reported, FALSE if execution is to resume.  */
+
+static Boolean
+report_processor_halt (struct target_waitstatus *status,
+                       ARC_RegisterContents      debug,
+                       ReadRegisterFunction      read_core_register)
+{
+    /* Test BH bit of DEBUG register.  */
+    if (debug & DEBUG_BH)
+    {
+        DEBUG("s/w breakpoint instruction was executed\n");
+
+        /* If the breakpoint is on an intercepted function entrypoint.  */
+        switch (arc_check_interception_breakpoint(&status->value.integer))
+        {
+            case INTERCEPTION_RESUME:
+                /* If the user has typed a Ctrl-C since target execution was
+                   last started.  */
+                if (interrupt_processor)
+                {
+                    /* The interception is complete, so honour the interrupt
+                       request by making it appear that the target was stopped
+                       by a SIGINT signal; the PC has been set to the return
+                       address of the intercepted function, so it will look to
+                       the user as though the program was interrupted at that
+                       point.  */
+                    status->kind      = TARGET_WAITKIND_STOPPED;
+                    status->value.sig = TARGET_SIGNAL_INT;
+                }
+                else
+                {
+                    /* This is the only case in which we return FALSE.  */
+                    return FALSE;
+                }
+                break;
+
+            case INTERCEPTION_HALT:
+                /* Some other breakpoint has triggered.  */
+                status->kind      = TARGET_WAITKIND_STOPPED;
+                status->value.sig = TARGET_SIGNAL_TRAP;
+                break;
+
+            case INTERCEPTION_EXIT:
+                /* The program called the 'exit' routine (its exit status has
+                   been read by the interception mechanism and returned to us in
+                   status->value.integer).  */
+                status->kind = TARGET_WAITKIND_EXITED;
+                break;
+
+            case INTERCEPTION_INTERRUPT:
+                DEBUG("*** interception was interrupted!\n");
+                status->kind      = TARGET_WAITKIND_STOPPED;
+                status->value.sig = TARGET_SIGNAL_INT;
+                break;
+        }
+    }
+    /* Test SH bit of DEBUG register.  */
+    else if (debug & DEBUG_SH)
+    {
+        ARC_RegisterContents exit_code = 0;
+
+        /* If the DEBUG.SH ("self halt") bit is set, we stopped because of the
+           flag instruction, which is used by programs to exit.  */
+        status->kind = TARGET_WAITKIND_EXITED;
+
+        /* Get the exit code of the program (held in R0).  */
+        if (read_core_register(0, &exit_code, TRUE))
+        {
+            DEBUG("exit code = %d\n", exit_code);
+        }
+        else
+            warning(_("assuming exit code = 0"));
+
+        status->value.integer = (int) exit_code;
+    }
+    else
+    {
+        /* We stopped for some other reason: if the user had tried to interrupt
+           with a Ctrl-C, return the event as a SIGINT, otherwise as a SIGTRAP
+           (and let gdb work out what happened).  */
+        status->kind      = TARGET_WAITKIND_STOPPED;
+        status->value.sig = (interrupt_processor) ? TARGET_SIGNAL_INT
+                                                  : TARGET_SIGNAL_TRAP;
+    }
+
+    return TRUE;
+}
+
+
+/* Determine whether the given register is a member of the given group.
+
+   Returns 0, 1, or -1:
+      0 means the register is not in the group.
+      1 means the register is in the group.
+     -1 means the tdep has nothing to say about this register and group.  */
+
+static int
+register_reggroup_p (int regnum, struct reggroup *group)
+{
+    gdb_assert(regnum >= 0);
+
+    /* Save/restore:
+          1. all standard core regs, except PCL (PCL is not writable)
+          2. those extension core regs which are read/write
+          3. aux regs LP_START  .. LP_END (IDENTITY is not writable)
+          4. aux regs PC_REGNUM .. STATUS32_L2
+          5. aux regs ERET      .. EFA */
+
+    if (arc_is_core_register(regnum))
+    {
+        ARC_RegisterNumber hw_num = arc_core_register_number(regnum);
+
+        /* R61 and R62 are reserved; they are not in any reggroup.  */
+        if (hw_num == 61 || hw_num == 62)
+              return 0;
+
+        if ((group == save_reggroup || group == restore_reggroup))
+        {
+            if (IS_EXTENSION_CORE_REGISTER(hw_num))
+                return (arc_core_register_access(hw_num) == READ_WRITE) ? 1 : 0;
+
+            return (hw_num == ARC_PCL_REGNUM) ? 0 : 1;
+        }
+
+        if (group == general_reggroup)
+            return 1;
+    }
+    else
+    {
+#define REGISTER_NAME_IS(ident)    (strcasecmp(name, ident) == 0)
+
+        ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_gdb_number(regnum);
+
+        if (def)
+        {
+            const char *name = arc_aux_register_name(def);
+
+            if (arc_aux_is_unused(def))
+                return 0;
+
+            if ((group == save_reggroup || group == restore_reggroup))
+            {
+                if (arc_aux_register_access(def) != READ_WRITE)
+                    return 0;
+            }
+
+            /* Which regs to save/restore?  */
+            if ((group == save_reggroup || group == restore_reggroup))
+            {
+                return (REGISTER_NAME_IS("LP_START")    ||
+                        REGISTER_NAME_IS("LP_END")      ||
+                        REGISTER_NAME_IS("PC")          ||
+                        REGISTER_NAME_IS("STATUS32")    ||
+                        REGISTER_NAME_IS("STATUS32_L1") ||
+                        REGISTER_NAME_IS("STATUS32_L2") ||
+                        REGISTER_NAME_IS("ERET")        ||
+                        REGISTER_NAME_IS("ERBTA")       ||
+                        REGISTER_NAME_IS("ERSTATUS")    ||
+                        REGISTER_NAME_IS("ECR")         ||
+                        REGISTER_NAME_IS("EFA")) ? 1 : 0;
+            }
+
+            if (group == general_reggroup)
+                return (REGISTER_NAME_IS("STATUS32")) ? 0 : 1;
+
+            if (group == system_reggroup)
+            {
+                return (REGISTER_NAME_IS("SEMAPHORE")            ||
+		        REGISTER_NAME_IS("STATUS32_L1")          ||
+		        REGISTER_NAME_IS("STATUS32_L2")          ||
+                        REGISTER_NAME_IS("AUX_IRQ_LV12")         ||
+                        REGISTER_NAME_IS("AUX_IRQ_LEV")          ||
+                        REGISTER_NAME_IS("AUX_IRQ_HINT")         ||
+                        REGISTER_NAME_IS("ERET")                 ||
+                        REGISTER_NAME_IS("ERBTA")                ||
+                        REGISTER_NAME_IS("ERSTATUS")             ||
+                        REGISTER_NAME_IS("ECR")                  ||
+                        REGISTER_NAME_IS("EFA")                  ||
+                        REGISTER_NAME_IS("ICAUSE1")              ||
+                        REGISTER_NAME_IS("ICAUSE2")              ||
+                        REGISTER_NAME_IS("AUX_IENABLE")          ||
+                        REGISTER_NAME_IS("AUX_ITRIGGER")         ||
+                        REGISTER_NAME_IS("BTA_L1")               ||
+                        REGISTER_NAME_IS("BTA_L2")               ||
+                        REGISTER_NAME_IS("AUX_IRQ_PULSE_CANCEL") ||
+                        REGISTER_NAME_IS("AUX_IRQ_PENDING")) ? 1 : 0;
+            }
+        }
+    }
+
+    /* Let the caller sort it out!  */
+    return -1;
+}
+
+
+/* This function is passed to the arc_all_aux_registers iterator.
+   It prints the value of one auxiliary register.  */
+
+static void
+print_one_aux_register (ARC_AuxRegisterDefinition *def, void *data)
+{
+    if (!arc_aux_is_unused(def))
+    {
+        PrintData *p      = (PrintData*) data;
+        int        regnum = arc_aux_gdb_register_number(def);
+
+        default_print_registers_info (p->gdbarch, p->file, p->frame, regnum, TRUE);
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 5)                     local functions called from gdb                     */
+/* -------------------------------------------------------------------------- */
+
+/* Mapping from binutils/gcc register number to gdb register number ("regnum").
+
+   N.B. registers such as ARC_FP_REGNUM, ARC_SP_REGNUM, etc., actually have
+        different gdb register numbers in the arc-elf32 and arc-linux-uclibc
+        configurations of the ARC gdb.  */
+
+static int
+arc_elf32_binutils_reg_to_regnum (struct gdbarch *gdbarch, int reg)
+{
+    return arc_core_register_gdb_number((ARC_RegisterNumber) reg);
+}
+
+
+/* Print the contents of one, some or all registers.  */
+
+static void
+arc_elf32_print_registers_info (struct gdbarch    *gdbarch,
+                                struct ui_file    *file,
+                                struct frame_info *frame,
+                                int                regnum,
+                                int                all)
+{
+    if (regnum >= 0)
+        PRINT(regnum);
+    else
+    /* If regnum < 0, print registers.  */
+    {
+        /* R32 .. R59 are the extension core registers, R61 and R62 are reserved.  */
+
+        /* R0 .. R26 */
+        for (regnum = 0; regnum <= 26; regnum++)
+            PRINT_HW ((ARC_RegisterNumber) regnum);
+
+        PRINT_HW (ARC_FP_REGNUM      );    // r27
+        PRINT_HW (ARC_SP_REGNUM      );    // r28
+        PRINT_HW (ARC_ILINK1_REGNUM  );    // r29
+        PRINT_HW (ARC_ILINK2_REGNUM  );    // r30
+        PRINT_HW (ARC_BLINK_REGNUM   );    // r31
+        PRINT_HW (ARC_LP_COUNT_REGNUM);    // r60
+        PRINT_HW (ARC_PCL_REGNUM     );    // r63
+
+        if (all)
+        {
+            PrintData data = {gdbarch, file, frame};
+
+            /* Print all of the aux registers.  */
+            arc_all_aux_registers(print_one_aux_register, &data);
+        }
+        else
+        {
+            /* Print just a selection of the aux registers.  */
+            PRINT_BY_NAME ("LP_START"   );
+            PRINT_BY_NAME ("LP_END"     );
+            PRINT_BY_NAME ("STATUS32"   );
+            PRINT_BY_NAME ("BTA"        );
+            PRINT_BY_NAME ("EFA"        );
+            PRINT_BY_NAME ("ERET"       );
+            PRINT_BY_NAME ("STATUS32_L1");
+            PRINT_BY_NAME ("STATUS32_L2");
+            PRINT_BY_NAME ("ERSTATUS"   );
+            PRINT_BY_NAME ("PC"         );
+        }
+    }
+}
+
+
+/* Return the name of the given register.  */
+
+static const char*
+arc_elf32_register_name (struct gdbarch *gdbarch, int gdb_regno)
+{
+    if (gdb_regno >= 0)
+    {
+        if (arc_is_core_register(gdb_regno))
+        {
+            ARC_RegisterNumber hw_num = arc_core_register_number(gdb_regno);
+
+            if (hw_num < ELEMENTS_IN_ARRAY(register_names))
+                return register_names[hw_num];
+        }
+        else
+        {
+            ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_gdb_number(gdb_regno);
+
+            /* If it is an auxiliary register.  */
+            if (def)
+                return arc_aux_register_name(def);
+        }
+    }
+
+    internal_error(__FILE__, __LINE__, _("invalid register number: %d"), gdb_regno);
+}
+
+
+/* Determine whether the given register is read-only.  */
+
+static int
+arc_elf32_cannot_store_register (struct gdbarch *gdbarch, int gdb_regno)
+{
+    ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_gdb_number(gdb_regno);
+
+   /* No warning should be printed.  arc_cannot_store_register being
+      called does not imply that someone is actually writing to regnum.  */
+
+    /* If it is an auxiliary register.  */
+    if (def)
+        return (arc_aux_register_access(def) == READ_ONLY) ? 1 : 0;
+
+    /* It is writable.  */
+    return 0;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 6)                  local functions implementing commands                  */
+/* -------------------------------------------------------------------------- */
+
+/* This function handles seeting a hardware breakpoint or watchpoint across a
+   range of memory address (rather than at a single location).
+
+   Parameters:
+      args          : the user arguments to the command
+      from_tty      : non-zero if the command was issued at the command-line
+      is_watchpoint : TRUE if a watchpoint to to be set, FALSE if a breakpoint
+      command       : the name of the command
+      usage         : the usage message for the command
+*/
+
+static void
+memory_range_command (char       *args,
+                      int         from_tty,
+                      Boolean     is_watchpoint,
+                      const char *command,
+                      const char *usage)
+{
+    char                  *length_arg;
+    unsigned int           start;
+    int                    length;
+    enum target_hw_bp_type type;
+
+    if (!args)
+    {
+        printf_filtered (_("%s"), usage);
+        return;
+    }
+
+    length_arg = strchr(args, ' ');
+
+    if (!length_arg)
+    {
+        printf_filtered (_("%s : no second argument\n%s"), command, usage);
+        return;
+    }
+
+    /* Split up the input string.  */
+    length_arg[0] = (char) 0;
+    length_arg++;
+    while (*length_arg == ' ') length_arg++;
+
+    if (is_watchpoint)
+    {
+        char *access_arg = strchr(length_arg, ' ');
+
+        if (access_arg)
+        {
+            /* Split up the input string.  */
+            access_arg[0] = (char) 0;
+            access_arg++;
+            while (*access_arg == ' ') access_arg++;
+
+            if (strcmp(access_arg, "read") == 0)
+                type = hw_read;
+            else if (strcmp(access_arg, "write") == 0)
+                type = hw_write;
+            else if (strcmp(access_arg, "access") == 0)
+                type = hw_access;
+            else
+            {
+                printf_filtered (_("%s: invalid type '%s'\n%s"), command, access_arg, usage);
+                return;
+            }
+        }
+        else
+            /* Access is write by default.  */
+            type = hw_write;
+    }
+    else
+        type = hw_execute;
+
+    /* The address expression.  */
+    EXTRACT(args, unsigned int, start)
+
+    /* The length expression.  */
+    EXTRACT(length_arg, int, length)
+
+    if (length <= 0)
+    {
+        warning(_("%s: %s <= 0"), command, length_arg);
+        return;
+    }
+
+    DEBUG("try to set %u breakpoint at 0x%08X length %d bytes\n",
+          type, start, length);
+
+    watch_range_command(start, (unsigned int) length, type, from_tty);
+
+    /* Although the call to insert_breakpoints would result in an error message
+       if the range breakpoint could not be set, the breakpoint would still be
+       entered into gdb's breakpoint table, and displayed by the 'info break'
+       command - that would be even more confusing to the user!  */
+#if 0
+    /* gdb manages breakpoints by deleting them from the target as soon as it
+       has halted, then re-inserting them again immediately before execution is
+       resumed (no, I don't know why either, unless it is to make generating a
+       disassembly display easier by removing all the s/w b/ps from the code) -
+       so in order to display what actionpoints are currently in use, we must
+       temporarily re-insert the breakpoints!  */
+    insert_breakpoints();
+    arc_display_actionpoints();
+    (void) remove_breakpoints();
+#endif
+}
+
+
+/* arc-break-range <start> <length>
+   Set hardware breakpoint at address START covering LENGTH bytes.  */
+
+static void
+arc_elf32_break_memory_command (char *arg, int from_tty)
+{
+    memory_range_command(arg, from_tty, FALSE, BREAK_MEMORY_COMMAND, BREAK_MEMORY_COMMAND_USAGE);
+}
+
+
+/* arc-watch-range <start> <length> [read|write|access]
+   Set hardware watchpoint at address START covering LENGTH bytes.  */
+
+static void
+arc_elf32_watch_memory_command (char *arg, int from_tty)
+{
+    memory_range_command(arg, from_tty, TRUE, WATCH_MEMORY_COMMAND, WATCH_MEMORY_COMMAND_USAGE);
+}
+
+
+/* arc-fill-memory <start> <length> [<pattern>]
+   Write repeated copies of PATTERN at address START covering LENGTH bytes.  */
+
+static void
+arc_elf32_fill_memory_command (char *arg, int from_tty)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+    char             *length_arg;
+    char             *pattern_arg;
+    ARC_Address       start;
+    ARC_Word          pattern;
+    int               length;
+
+    gdb_assert(operations != NULL);
+
+    if (!arg)
+    {
+        printf_filtered ("%s", _(FILL_MEMORY_COMMAND_USAGE));
+        return;
+    }
+
+    length_arg = strchr(arg, ' ');
+
+    if (!length_arg)
+    {
+        printf_filtered (_(FILL_MEMORY_COMMAND " : no second argument\n" FILL_MEMORY_COMMAND_USAGE));
+        return;
+    }
+
+    /* Split up the input string.  */
+    length_arg[0] = (char) 0;
+    length_arg++;
+    while (*length_arg == ' ') length_arg++;
+
+    pattern_arg = strchr(length_arg, ' ');
+    if (pattern_arg)
+    {
+        /* Split up the input string.  */
+        pattern_arg[0] = (char) 0;
+        pattern_arg++;
+    }
+
+    /* The address expression.  */
+    EXTRACT(arg, ARC_Address, start)
+
+    /* The length expression.  */
+    EXTRACT(length_arg, int, length)
+
+    if (length <= 0)
+    {
+        warning(_(FILL_MEMORY_COMMAND ": %s <= 0"), length_arg);
+        return;
+    }
+
+    if (pattern_arg)
+    {
+        /* The pattern expression.  */
+        EXTRACT(pattern_arg, ARC_Word, pattern)
+    }
+    else
+        pattern = 0;
+
+    if (operations)
+    {
+        unsigned int written = write_pattern(start, pattern, (unsigned int) length);
+
+        if (written != (unsigned int) length)
+            warning (_(FILL_MEMORY_COMMAND ": only %u bytes written to target memory"), written);
+    }
+    else
+        error(_(FILL_MEMORY_COMMAND " is not available for this target"));
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Perform arc-elf32-gdb specific initialization.  */
+
+struct gdbarch*
+arc_elf32_initialize (struct gdbarch      *gdbarch,
+                      struct gdbarch_list *arches)
+{
+    struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+    /* Set up a guard on the PC: if any attempt is made by gdb to read or write
+       the PC before an XML definition of the PC aux register has been read this
+       will cause an error message to be output.  */
+    arc_aux_pc_guard(gdbarch, TRUE);
+
+    /* N.B. this function may be called twice: once when gdb is started, then again
+            when the 'target' command is issued; do not try to read the aux
+            registers definitions the first time (when 'arches' is NULL) as that
+            results in an error message (if the XML file is not found) which is
+            output too early in the start-up process (before gdb has identified
+            itself).  */
+    if (arches == NULL)
+        create_variant_info(tdep);
+    else
+    {
+        /* This is the arch that was created earlier.  */
+        struct gdbarch      *gdbarch0 = arches[0].gdbarch;
+        struct gdbarch_tdep *tdep0    = gdbarch_tdep(gdbarch0);
+
+        /* Have auxiliary registers been defined for that arch?  */
+        if (arc_aux_regs_defined(gdbarch0))
+        {
+            /* Share the variant info.  */
+            tdep->processor_variant_info = tdep0->processor_variant_info;
+        }
+        else
+            create_variant_info(tdep);
+    }
+
+    /* Fill in target-dependent info in ARC-private structure.  */
+
+    tdep->is_sigtramp             = NULL;
+    tdep->sigcontext_addr         = NULL;
+    tdep->sc_reg_offset           = NULL;
+    tdep->sc_num_regs             = 0;
+    tdep->pc_regnum_in_sigcontext = 0;
+
+    tdep->le_breakpoint_instruction = le_breakpoint_instruction;
+    tdep->be_breakpoint_instruction = be_breakpoint_instruction;
+    tdep->breakpoint_size        = (unsigned int) sizeof(le_breakpoint_instruction);
+
+    tdep->register_reggroup_p = register_reggroup_p;
+    tdep->lowest_pc = 0;
+
+    /* Pass target-dependent info to gdb.  */
+
+    DEBUG("setting PC      %d\n", arc_aux_pc_number(gdbarch));
+    DEBUG("setting #regs   %d\n", ARC_NR_REGS);
+    DEBUG("setting #pseudo %d\n", ARC_NR_PSEUDO_REGS);
+
+    /* ARC_NR_REGS and ARC_NR_PSEUDO_REGS are defined in the tm-embed.h configuration file.  */
+    set_gdbarch_pc_regnum             (gdbarch, arc_aux_pc_number(gdbarch));
+    set_gdbarch_num_regs              (gdbarch, ARC_NR_REGS);
+    set_gdbarch_num_pseudo_regs       (gdbarch, ARC_NR_PSEUDO_REGS);
+    set_gdbarch_print_registers_info  (gdbarch, arc_elf32_print_registers_info);
+    set_gdbarch_register_name         (gdbarch, arc_elf32_register_name);
+    set_gdbarch_cannot_store_register (gdbarch, arc_elf32_cannot_store_register);
+    set_gdbarch_dwarf2_reg_to_regnum  (gdbarch, arc_elf32_binutils_reg_to_regnum);
+
+    /* See ARC Bug #96650: disable the use of the 'P' and 'p' RSP packets, so
+       forcing gdb to use the 'G' and 'g' packets instead, in case the arc-elf32
+       debug target is the xISS being used as a remote target.   */
+    {
+        static Boolean packets_disabled = FALSE;
+
+        /* N.B. this is something of a kluge: if execution of the target program
+                is restarted (e.g. a 'start' command is followed by a 'run'
+                command) this function is called again - but if execute_command
+                is called again, an assertion fails way down in the regcache code
+                because the target appears to have a stack, but current_gdbarch
+                is set to NULL!  So do this only once.  */
+        if (!packets_disabled)
+        {
+            execute_command("set remote set-register-packet   off", 0);
+            execute_command("set remote fetch-register-packet off", 0);
+
+           packets_disabled = TRUE;
+        }
+    }
+
+    return gdbarch;
+}
+
+
+/* This is the module initialization function that is called from gdb.  */
+
+void
+_initialize_arc_elf32_tdep (void)
+{
+    (void) add_cmd (BREAK_MEMORY_COMMAND,
+                    class_breakpoint,
+                    arc_elf32_break_memory_command,
+                    _("Set a breakpoint on a memory address range.\n"
+                      BREAK_MEMORY_COMMAND_USAGE
+                      "<START> and <LENGTH> can be any expressions that evaluate to integers.\n"),
+                    &cmdlist);
+
+    (void) add_cmd (WATCH_MEMORY_COMMAND,
+                    class_breakpoint,
+                    arc_elf32_watch_memory_command,
+                    _("Set a watchpoint on a memory address range.\n"
+                      WATCH_MEMORY_COMMAND_USAGE
+                      "<START> and <LENGTH> can be any expressions that evaluate to integers.\n"
+                      "If the watchpoint mode is omitted, it defaults to 'access'.\n"),
+                    &cmdlist);
+
+    (void) add_cmd (FILL_MEMORY_COMMAND,
+                    class_obscure,
+                    arc_elf32_fill_memory_command,
+                    _("Fill a memory address range with a repeated pattern.\n"
+                      FILL_MEMORY_COMMAND_USAGE
+                      "<START>, <LENGTH> and <PATTERN> can be any expressions that evaluate to integers.\n"
+                      "If <PATTERN> is omitted, it defaults to 0.\n"),
+                    &cmdlist);
+
+    (void) observer_attach_new_objfile           (new_object_file);
+    (void) observer_attach_target_pre_connect    (pre_target_connection);
+    (void) observer_attach_target_post_connect   (post_target_connection);
+    (void) observer_attach_target_post_disconnect(post_target_disconnection);
+    (void) observer_attach_target_updated        (target_updated);
+}
+
+
+/* Find the ARC hardware numbers of the DEBUG, POC and STATUS32 aux registers: this
+  is the minimal set of registers required for controlling program execution on a
+  h/w target.  */
+
+void arc_elf32_find_register_numbers (void)
+{
+    arc_debug_regnum    = arc_aux_find_register_number("DEBUG",    ARC_HW_DEBUG_REGNUM);
+    arc_pc_regnum       = arc_aux_find_register_number("PC",       ARC_HW_PC_REGNUM);
+    arc_status32_regnum = arc_aux_find_register_number("STATUS32", ARC_HW_STATUS32_REGNUM);
+}
+
+
+/* Check that an XML definition of the PC aux register has been read: 'error'
+   is called if that is not the case.
+
+   This function is simply a wrapper for a call to arc_aux_check_pc_defined;
+   there is a function of the same name in the arc-linux-tdep module (which does
+   nothing) so that it may be called from the arc-tdep module in either of the
+   builds of the ARC debugger (as the arc-registers module is present only in
+   the arc-elf32-gdb build).  */
+
+void
+arc_check_pc_defined (struct gdbarch *gdbarch)
+{
+    arc_aux_check_pc_defined(gdbarch);
+}
+
+
+/* Load the program to be debugged to the tarrget.
+
+   Parameters:
+      filename : the executable file
+      from_tty : non-zero if the command was issued at the command-line
+*/
+
+void
+arc_elf32_load_program (char *filename, int from_tty)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+    asection         *bss_section;
+
+    ENTERARGS("%s", filename);
+
+    if (exec_bfd == NULL)
+        error(_("Must use 'file' command before 'load' command"));
+
+    arc_aux_check_pc_defined(NULL);
+
+    /* Now that we know the program file as well as the target (since we can be
+       loading only if the target is connected), check that the program has been
+       built for the processor version that is in the target.  */
+    ARCHITECTURE_CHECK(current_gdbarch, exec_bfd);
+
+    if (filename == NULL || *filename == '\0')
+        filename = bfd_get_filename(exec_bfd);
+
+    /* Check that the file has been compiled for the endianness of the target.  */
+    {
+        ARC_RegisterNumber   memsubsys = arc_aux_find_register_number("MEMSUBSYS", ARC_HW_MEMSUBSYS_REGNUM);
+        ARC_RegisterContents contents;
+
+        if (read_aux_register(&current_target)(memsubsys, &contents, TRUE))
+        {
+            Boolean big_endian_target = ((contents & 4) != 0);
+
+            DEBUG("MEMSUBSYS BCR: 0x%08X\n", contents);
+
+            if (big_endian_target && bfd_little_endian(exec_bfd))
+                warning(_("target is big-endian but file %s is little-endian"), filename);
+
+            if (!big_endian_target && bfd_big_endian(exec_bfd))
+                warning(_("target is little-endian but file %s is big-endian"), filename);
+        }
+    }
+
+    /* In case anything was previously loaded.  */
+    arc_set_IO_interception(operations, INTERCEPTION_RESET);
+
+    /* Let gdb do all the real work of loading.  */
+    generic_load(filename, from_tty);
+
+    /* Zero the BSS section in memory, if it exists.  */
+    bss_section = bfd_get_section_by_name (exec_bfd, ".bss");
+
+    if (bss_section)
+    {
+        CORE_ADDR     bss_addr = bfd_section_lma (exec_bfd, bss_section);
+        bfd_size_type bss_size = bfd_get_section_size (bss_section);
+        unsigned int  bytes;
+
+        printf_filtered(_("Zeroing section .bss, size 0x%0x lma 0x%0x\n"),
+                        (unsigned int) bss_size, (unsigned int) bss_addr);
+
+        bytes = write_zeros((ARC_Address) bss_addr, (unsigned int) bss_size);
+
+        if (bytes != (unsigned int) bss_size)
+            warning(_("load: error zeroing BSS section - only %u bytes zeroed"), bytes);
+    }
+    else
+    {
+        DEBUG("%s: no BSS section\n", __FUNCTION__);
+    }
+
+
+    /* We now have a program ready for execution on the target; inform the
+       program arguments module that we have a newly-loaded program (so any
+       information that it had about any program loaded before is now invalid).  */
+    arc_program_is_loaded = TRUE;
+    arc_program_loaded();
+
+    /* But the program has not yet been executed.  */
+    current_target.to_has_execution = 0;
+}
+
+
+/* Create the inferior, ready for execution on the target to start.
+
+   Parameters:
+      exec_file  : the executable file from which the loaded program was read
+      args       : the arguments to be passed to the program in argc/argv
+      env        : the environment (name/value pairs) for program execution
+      target_ops : the target operations structure for the target
+*/
+
+void
+arc_elf32_create_inferior (char              *exec_file,
+                           char              *args,
+                           char             **env,
+                           struct target_ops *target_ops)
+{
+    TargetOperations *operations  = (TargetOperations*) target_ops->to_data;
+    Boolean           set_no_args = TRUE;
+    char             *all_args    = NULL;
+    CORE_ADDR         start_address;
+
+    ENTERARGS("exec_file = \"%s\", args = \"%s\"", exec_file, args);
+
+    /* If no exec file handed to us, get it from the exec-file command -
+       with a good, common error message if none is specified.  */
+    if (exec_file == NULL)
+        exec_file = get_exec_file (1);
+
+    /* Include the exec file name as arg[0].  */
+    if (exec_file != NULL || args != NULL)
+    {
+        size_t length = 10;    /* Safety margin.  */
+
+        if (exec_file != NULL)
+            length += strlen(exec_file) + 1;
+
+        if (args != NULL)
+            length += strlen(args) + 1;
+
+        all_args = xmalloc(length);
+
+        all_args[0] = '\0';
+
+        if (exec_file != NULL)
+            (void) strcat(all_args, exec_file);
+
+        if (args != NULL)
+        {
+            (void) strcat(all_args, " ");
+            (void) strcat(all_args, args);
+        }
+    }
+
+    /* Check that we do know which register is the PC.  */
+    arc_aux_check_pc_defined(NULL);
+
+    if (!arc_program_is_loaded)
+        error(_("No program loaded"));
+
+    /* We don't really have a PID or anything, but GDB uses this value to check
+       if the program is running.  */
+    inferior_ptid.pid = 42;
+
+    /* Must set the PC to the program start address.  */
+    start_address = bfd_get_start_address (exec_bfd);
+
+    DEBUG("setting PC to 0x%x\n", (unsigned int) start_address);
+
+    write_pc (start_address);
+
+    /* This sets the target's to_has_execution flag to 1.  */
+    target_mark_running(target_ops);
+
+    /* Do we have arguments to pass to the program?  */
+    if (all_args != NULL)
+    {
+        if (arc_setup_arguments(all_args))
+            set_no_args = FALSE;
+        else
+            warning(_("can not set up arguments to program"));
+
+        xfree(all_args);
+    }
+
+    /* If there are no arguments to be passed to the program, or we failed to
+       set them up, at least try to set R0 and R1 to indicate that are no
+       arguments!  */
+    if (set_no_args)
+    {
+        /* N.B. we do not use the target_store_registers operation here, as that
+                does not give us an indication of success or failure.  */
+        if (!operations->write_core_register(0, 0, TRUE))
+            warning(_("can not set parameter register R0 to 0 - main parameter 'argc' will be undefined"));
+
+        if (!operations->write_core_register(1, 0, TRUE))
+            warning(_("can not set parameter register R1 to 0 - main parameter 'argv' will be undefined"));
+    }
+
+    /* Set I/O interception on, so that any I/O operations performed by the program
+       when it is executed will be trapped and handled by the debugger.  */
+    arc_set_IO_interception(operations, INTERCEPTION_ON);
+}
+
+
+/* There are two ways in which the target processor may be executed:
+
+   1) once started, the processor will run asynchronously until an explicit
+      attempt to stop it is made (e.g. real h/w);
+
+   2) the processor may be run synchronously until it has executed a certain
+      'chunk' of instructions (e.g. the xISS).
+
+   So, this function gets either 1) a 'run' operation, or 2) 'start' and 'stop'
+   operations - but not all three of them!
+
+   If an attempt is made (by the user typing Ctrl-C) to interrupt the processor
+   whilst it is running, in case 1) we must wait until the 'run' operation has
+   completed before checking the 'interrupt_processor' flag; whereas in case 2),
+   we can attempt to force the processor to stop.  */
+
+void
+arc_elf32_execute (struct target_waitstatus *status,
+                   ProcessorControlFunction  run_processor,
+                   ProcessorControlFunction  start_processor,
+                   ProcessorControlFunction  stop_processor)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+
+    /* This flag will be set if the user types Ctrl-C.  */
+    interrupt_processor = FALSE;
+
+    /* Set up a signal handler for Ctrl-C.  */
+    old_signal_handler = signal (SIGINT, interrupted_by_user);
+
+    /* Wait until the processor has *really* halted.  */
+    while (TRUE)
+    {
+        /* Set to 0 in case we leave inner loop without reading DEBUG register.  */
+        ARC_RegisterContents debug = 0;
+
+        /* Wait until the processor has *apparently* halted.  */
+        while (TRUE)
+        {
+            ARC_RegisterContents status32;
+
+            /* Are we running the processor synchronously?  */
+            if (run_processor)
+            {
+                /* If the user has typed a Ctrl-C since the last chunk of
+                   instructions were executed, exit from this inner loop.  */
+                if (interrupt_processor)
+                    break;
+
+                DEBUG("running processor...\n");
+
+                /* Otherwise, run the processor to execute another chunk.  */
+                run_processor();
+            }
+            else
+            {
+                /* If the user has typed a Ctrl-C since target execution was
+                   last started, try to force the processor to halt; it does not
+                   matter if we do not succeed, as we will simply try again on
+                   the next iteration of the loop.  */
+                if (interrupt_processor)
+                    stop_processor();
+            }
+
+            /* Now try to read the STATUS32 register, and check whether its H
+               bit is set, indicating that the processor has really halted (as
+               opposed to having simply finished executing a chunk); again, it
+               does not matter if we do not succeed, as we will simply try again
+               on the next iteration of the loop.  */
+            if (operations->read_auxiliary_register(arc_status32_regnum, &status32, TRUE))
+            {
+#if 0
+                ARC_RegisterContents PC;
+
+                printf_filtered(_("STATUS32: %08X\n"), status32);
+
+                if (operations->read_auxiliary_register(arc_pc_regnum, &PC, TRUE))
+                    printf_filtered(_("PC: %08X\n"), PC);
+#endif
+
+                if (status32 & STATUS32_HALT)
+                {
+                    DEBUG("halted: STATUS32 = %08X\n", status32);
+
+                    /* Perform a polling wait for any delayed load to complete.
+
+                       N.B. this is necessary for real hardware, though the xISS
+                            currently does not simulate pending loads, although
+                            it will do so at some future date - however, it is
+                            not an error to check the flag!  */
+                    while (TRUE)
+                    {
+                        if (operations->read_auxiliary_register(arc_debug_regnum, &debug, TRUE))
+                        {
+                            if (!(debug & DEBUG_LOAD_PENDING))
+                                break;
+                        }
+                    }
+
+                    break;
+                }
+            }
+        }
+
+        /* The processor is now halted in a reliable state, but it might need to
+           be re-started...  */
+        if (report_processor_halt(status, debug, operations->read_core_register))
+            break;
+
+        DEBUG("*** resuming execution\n");
+
+        /* If we are running the processor asynchronously, we must explicitly
+           start it again - otherwise, we simply execute another chunk in the
+           next iteration of this loop.  */
+        if (start_processor)
+            start_processor();
+    }
+
+    /* Put the old signal handler back.  */
+    (void) signal (SIGINT, old_signal_handler);
+
+    DEBUG("processor has halted\n");
+}
+
+
+/* Close the connection to the target.  */
+
+void
+arc_elf32_close (Boolean resume)
+{
+    TargetOperations *operations = (TargetOperations*) current_target.to_data;
+
+    /* Do this while the target is halted.  */
+    arc_restore_stack_top_address();
+
+    /* We will no longer intercept any I/O operations.  */
+    arc_set_IO_interception(operations, INTERCEPTION_OFF);
+
+    /* Let the target continue.  */
+    if (resume)
+        target_resume (inferior_ptid, 0, 0);
+
+    current_target.to_has_execution = 0;
+
+    arc_architecture_is_unknown();
+}
+
+
+/* Fetch one or all registers from the target.
+
+   Parameters:
+      regcache : cache to write register to
+      gdb_regno: register number (-1 means 'all registers')
+*/
+
+void
+arc_elf32_fetch_registers (struct regcache *regcache, int gdb_regno)
+{
+    ENTERARGS("%d", gdb_regno);
+
+    /* All registers.  */
+    if (gdb_regno == -1)
+    {
+        int num_core_registers = (int) arc_core_register_count(get_regcache_arch(regcache));
+
+        /* Core registers.  */
+        for (gdb_regno = 0; gdb_regno < num_core_registers; gdb_regno++)
+            debug_fetch_one_register(regcache, (ARC_RegisterNumber) gdb_regno, gdb_regno);
+
+        /* Auxiliary registers (incl. build configuration registers).  */
+        arc_all_aux_registers(debug_fetch_reg, regcache);
+    }
+    else
+    {
+        ARC_RegisterNumber hw_regno = get_hw_regnum_mapping (gdb_regno);
+
+        if (hw_regno == INVALID_REGISTER_NUMBER)
+            error(_("Invalid register number: %d"), gdb_regno);
+        else
+            debug_fetch_one_register(regcache, hw_regno, gdb_regno);
+    }
+
+    LEAVEMSG;
+}
+
+
+/* Store one or all registers to the target.
+
+   Parameters :
+      regcache : cache to read register from
+      gdb_regno: register number (-1 means 'all registers')
+*/
+
+void
+arc_elf32_store_registers (struct regcache *regcache, int gdb_regno)
+{
+    ENTERARGS("%d", gdb_regno);
+
+    /* All registers.  */
+    if (gdb_regno == -1)
+    {
+        int num_core_registers = (int) arc_core_register_count(get_regcache_arch(regcache));
+
+        /* Core registers.  */
+        for (gdb_regno = 0; gdb_regno < num_core_registers; gdb_regno++)
+            debug_store_one_register(regcache, (ARC_RegisterNumber) gdb_regno, gdb_regno);
+
+        /* Auxiliary registers (excl. build configuration registers, which are not writable). */
+        arc_all_aux_registers(debug_store_reg, regcache);
+    }
+    else
+    {
+        ARC_RegisterNumber hw_regno = get_hw_regnum_mapping (gdb_regno);
+
+        if (hw_regno == INVALID_REGISTER_NUMBER)
+            error(_("Invalid register number: %d"), gdb_regno);
+        else
+            debug_store_one_register(regcache, hw_regno, gdb_regno);
+    }
+
+    LEAVEMSG;
+}
+
+
+/* Read or write data to/from target memory.
+
+     if 'object' is TARGET_OBJECT_MEMORY then
+         if 'writebuf' is NULL
+             read 'len' bytes of data from target memory starting at address 'offset' to 'readbuf'
+         else
+             write 'len' bytes of data from 'writebuf' to target memory starting at address 'offset'
+
+      Returns number of bytes of memory read/written.
+
+      Returns -1 for all other operations (i.e. object != TARGET_OBJECT_MEMORY).  */
+
+LONGEST
+arc_elf32_xfer_partial (struct target_ops *ops,        // unused
+                        enum target_object object,
+                        const char        *annex,      // unused
+                        gdb_byte          *readbuf,
+                        const gdb_byte    *writebuf,
+                        ULONGEST           offset,
+                        LONGEST            len)
+{
+    ENTERARGS("object %d offset 0x%x len %lld", (unsigned int) object, (unsigned int) offset, len);
+
+    /* Handle memory access.  */
+    if (object == TARGET_OBJECT_MEMORY)
+    {
+        TargetOperations *operations = (TargetOperations*) current_target.to_data;
+        unsigned int      xfered;
+
+        /* No need to worry about the alignment of the address 'offset', or the number
+           of bytes to be transffered - the memory read/write operations handle that.  */
+        if (writebuf != NULL)
+            xfered = write_bytes((ARC_Address)  offset,
+                                 (ARC_Byte*)    writebuf,
+                                 (unsigned int) len);
+        else
+            xfered = read_bytes((ARC_Address)   offset,
+                                (ARC_Byte*)     readbuf,
+                                (unsigned int)  len);
+
+        DEBUG("...leaving %s(memory %s) with return value %d\n",
+              __FUNCTION__, (writebuf == NULL) ? "read" : "write", xfered);
+
+        return (LONGEST) xfered;
+    }
+
+    if (object == TARGET_OBJECT_AVAILABLE_FEATURES)
+    {
+        /* We should create and return an XML string here.  */
+        return -1;
+    }
+
+    printf_filtered(_("\nRequested target_object %d not yet supported with target %s\n"),
+                    (int) object, current_target.to_shortname);
+    return -1;
+}
+
+
+/* Insert a software breakpoint in the program code on the target.
+
+   Parameters:
+      bpt: information defining the breakpoint.
+
+   Returns: 0 for success, 1 for failure.  */
+
+int
+arc_elf32_insert_breakpoint (struct bp_target_info *bpt)
+{
+    TargetOperations    *operations = (TargetOperations*) current_target.to_data;
+    const unsigned char *breakpt_instruction;
+    unsigned int         bytes;
+
+    ENTERARGS("0x%08X", (unsigned int) bpt->placed_address);
+
+    /* Get the breakpoint instruction code, and its size in bytes.  */
+    breakpt_instruction = gdbarch_breakpoint_from_pc (current_gdbarch,
+                                                      &bpt->placed_address,
+                                                      &bpt->placed_size);
+
+    /* FIXME: alignment of breakpt_instruction data!  */
+    DEBUG("breakpoint size = %d and breakpoint instruction = 0x%x\n",
+          bpt->placed_size, *(unsigned int *) breakpt_instruction);
+
+    /* Save the existing instruction at the given address as the shadow contents.  */
+    bytes = read_bytes((ARC_Address)  bpt->placed_address,
+                       (ARC_Byte*)    bpt->shadow_contents,
+                       (unsigned int) bpt->placed_size);
+
+    if (bytes == (unsigned int) bpt->placed_size)
+        /* Overwrite the instruction with the breakpoint instruction.  */
+        bytes = write_bytes((ARC_Address)  bpt->placed_address,
+                            (ARC_Byte*)    breakpt_instruction,
+                            (unsigned int) bpt->placed_size);
+
+    return (bytes == (unsigned int) bpt->placed_size) ? 0 : 1;
+}
+
+
+/* Remove a software breakpoint from the program code on the target.
+
+   Parameters:
+      bpt: information defining breakpoint.
+
+   Returns: 0 for success, 1 for failure.  */
+
+int
+arc_elf32_remove_breakpoint (struct bp_target_info *bpt)
+{
+    unsigned int bytes;
+
+    /* FIXME: alignment of shadow_contents data!  */
+    ENTERARGS("0x%08X, 0x%lx", (unsigned int)     bpt->placed_address,
+                               *(unsigned long *) bpt->shadow_contents);
+
+    /* Write the old code back.  */
+    bytes = write_bytes((ARC_Address)  bpt->placed_address,
+                        (ARC_Byte*)    bpt->shadow_contents,
+                        (unsigned int) bpt->placed_size);
+
+    return (bytes == (unsigned int) bpt->placed_size) ? 0 : 1;
+}
+
+
+/* Output a warning message related to a core register.  */
+
+void
+arc_elf32_core_warning (RegisterError      error,
+                        ARC_RegisterNumber hw_regno)
+{
+    int gdb_regno = arc_core_register_gdb_number(hw_regno);
+
+    /* N.B. the supplied format string contains a %s specifier which
+            allows the string "extension " to be inserted into the message.   */
+    warning((error == REGISTER_IS_READ_ONLY)     ?  _("%score register %s is read-only")    :
+            (error == ERROR_ON_READING_REGISTER) ?  _("failure reading %score register %s") :
+                                                    _("failure writing %score register %s"),
+            IS_EXTENSION_CORE_REGISTER(hw_regno) ? _("extension ") : _(""),
+            gdbarch_register_name(current_gdbarch, gdb_regno));
+}
+
+
+/* Output a warning message related to an auxiliary register.  */
+
+void
+arc_elf32_aux_warning (RegisterError      error,
+                       ARC_RegisterNumber hw_regno)
+{
+    warning((error == REGISTER_IS_READ_ONLY)     ? _("auxiliary register %s (0x%x) is read-only")    :
+            (error == ERROR_ON_READING_REGISTER) ? _("failure reading auxiliary register %s (0x%x)") :
+                                                   _("failure writing auxiliary register %s (0x%x)"),
+            arc_aux_register_name_of(hw_regno), hw_regno);
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-elf32-tdep.h b/gdb/arc-elf32-tdep.h
new file mode 100644
index 0000000..eb7d3e9
--- /dev/null
+++ b/gdb/arc-elf32-tdep.h
@@ -0,0 +1,118 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines an initialization function for the arc_elf32  */
+/*     architecture, and various operations which are useful for the various  */
+/*     arc-elf32 targets supported.                                           */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_ELF32_TDEP_H
+#define ARC_ELF32_TDEP_H
+
+/* gdb header files */
+#include "defs.h"
+#include "gdbarch.h"
+#include "target.h"
+#include "breakpoint.h"
+
+/* ARC header files */
+#include "arc-registers.h"
+#include "arc-architecture.h"
+
+
+/* Complete the structure definition here.  */
+struct arc_variant_info
+{
+    ARC_ProcessorVersion processor_version;
+    ARC_RegisterInfo     registers;
+};
+
+
+typedef enum
+{
+    REGISTER_IS_READ_ONLY,
+    ERROR_ON_READING_REGISTER,
+    ERROR_ON_WRITING_REGISTER
+} RegisterError;
+
+
+typedef void (*ProcessorControlFunction)(void);
+
+
+struct gdbarch* arc_elf32_initialize (struct gdbarch      *gdbarch,
+                                      struct gdbarch_list *arches);
+
+void arc_check_pc_defined (struct gdbarch *gdbarch);
+
+void arc_elf32_find_register_numbers (void);
+
+void arc_elf32_load_program (char *filename, int from_tty);
+
+void arc_elf32_create_inferior (char              *exec_file,
+                                char              *args,
+                                char             **env,
+                                struct target_ops *target_ops);
+
+void arc_elf32_execute (struct target_waitstatus *status,
+                        ProcessorControlFunction  run_processor,
+                        ProcessorControlFunction  start_processor,
+                        ProcessorControlFunction  stop_processor);
+
+void arc_elf32_close (Boolean resume);
+
+void arc_elf32_fetch_registers (struct regcache *regcache, int gdb_regno);
+void arc_elf32_store_registers (struct regcache *regcache, int gdb_regno);
+
+int arc_elf32_insert_breakpoint (struct bp_target_info *bpt);
+int arc_elf32_remove_breakpoint (struct bp_target_info *bpt);
+
+LONGEST arc_elf32_xfer_partial (struct target_ops *ops,
+                                enum target_object object,
+                                const char        *annex,
+                                gdb_byte          *readbuf,
+                                const gdb_byte    *writebuf,
+                                ULONGEST           offset,
+                                LONGEST            len);
+
+void arc_elf32_core_warning (RegisterError      error,
+                             ARC_RegisterNumber hw_regno);
+
+void arc_elf32_aux_warning (RegisterError      error,
+                            ARC_RegisterNumber hw_regno);
+
+
+extern ARC_RegisterNumber arc_debug_regnum;
+extern ARC_RegisterNumber arc_pc_regnum;
+extern ARC_RegisterNumber arc_status32_regnum;
+
+extern Boolean arc_program_is_loaded;
+extern Boolean arc_target_is_connected;
+
+
+#endif /* ARC_ELF32_TDEP_H */
+/******************************************************************************/
diff --git a/gdb/arc-gpio.c b/gdb/arc-gpio.c
new file mode 100644
index 0000000..cc9f775
--- /dev/null
+++ b/gdb/arc-gpio.c
@@ -0,0 +1,251 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey      <richard.stuckey@arc.com>
+      A.N. Other           <unknown>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements operations for reading data from / writing data */
+/*     to a parallel port using a GPIO (General Purpose Input/Output) driver. */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <string.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <errno.h>
+
+/* gdb header files */
+#include "defs.h"
+
+/* ARC header files */
+#include "arc-gpio.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+// I/O control numbers.
+
+// Linux kernel uses 0x54XX for special purposes.  Avoid such.
+// We'll pick large numbers.
+// We don't use the linux convention of dividing the IOC into a bunch
+// of bit fields.  We can always switch to this later, as the
+// IOC 0 returns the driver version (which IOC value will never change).
+
+#define GPIO_IOC_VERSION 0              // returns version
+#define GPIO_IOC_BASE    0xaa3a0000UL   // Intended for use on ARCangel 3!
+
+
+// Switch base address of parallel port.  0x3f8 is assumed.
+// WARNING!  You can write on any port whatsoever with this driver.
+// BE CAREFUL!
+#define GPIO_IOC_SET_PORT_BASE  (GPIO_IOC_BASE + 1) // cmd, arg=port base
+
+// General input/output ioctl.  See GPIO_ioctl struct.
+#define GPIO_IOC_DO_IO          (GPIO_IOC_BASE + 2) // cmd, arg=GPIO_ioctl *
+
+// For emergency purposes in case the driver is goofed up.
+#define GPIO_IOC_HARD_RESET     (GPIO_IOC_BASE + 3) // cmd, no arg
+
+// Do you have an antiquated parallel port?  You might need to ask
+// the driver to use outb_p and inb_p (_p = pause).  Default is not to.
+#define GPIO_IOC_SET_PAUSE      (GPIO_IOC_BASE + 4) // arg = 1 => use pause; otherwise not.
+
+
+/* parallel port I/O addresses (LPT1) */
+#define PORT_BASE_ADDRESS     0x378
+#define DATA_PORT_ADDRESS     (PORT_BASE_ADDRESS + DATA_PORT)
+#define STATUS_PORT_ADDRESS   (PORT_BASE_ADDRESS + STATUS_PORT)
+#define CONTROL_PORT_ADDRESS  (PORT_BASE_ADDRESS + CONTROL_PORT)
+
+#define NULL_FILE_DESCRIPTOR    (-1)
+
+
+typedef struct
+{
+    // This is used for general input and output in the same ioctl.
+    // N.B. "input" is input TO the port, and "output" is output FROM the port.
+    //
+    // inlen is always even and represents a number of pairs:
+    //
+    //    [0|1|2, value]              : write value to   port_base+0|1|2.
+    //    [0x80|0x81|0x82, <ignored>] : read  value from port_base+0|1|2
+    //                                  and append result to outbuf.
+    //
+    // Thus one can intermix read and write in the same ioctl.
+
+    // inlen is replaced by the number of input bytes consumed.
+    unsigned inlen;
+    char    *inbuf;
+
+    // outlen is replaced by the number of output bytes written.
+    unsigned outlen;
+    char    *outbuf;
+} GPIO_ioctl;
+
+
+/* Buffers to hold data read from / written to ports; we generally read/write
+   only 1 byte of data at a time, so the buffers need hold only 1 byte pair each.  */
+static char       input_buffer [2];
+static char       output_buffer[2];
+static GPIO_ioctl ioctl_data  = { 0, input_buffer, 0, output_buffer };
+
+/* A file descriptor for the GPIO driver.  */
+static int        gpio_driver = NULL_FILE_DESCRIPTOR;
+
+/* Debug data.  */
+// static const char name[] = {'D', 'S', 'C'};
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* This is set to TRUE if an I/O error occurs in accessing the port.  */
+Boolean gpio_port_error;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialization of the GPIO interface.  */
+
+Boolean
+gpio_open (void)
+{
+    /* Open the driver, if not already open.  */
+    if (gpio_driver == NULL_FILE_DESCRIPTOR)
+    {
+        gpio_driver = open(GPIO_DEVICE, O_RDWR);
+
+        if ((gpio_driver == NULL_FILE_DESCRIPTOR)   ||
+            ioctl(gpio_driver, GPIO_IOC_HARD_RESET) ||
+            ioctl(gpio_driver, GPIO_IOC_SET_PORT_BASE, PORT_BASE_ADDRESS))
+        {
+            warning(_("unable to open JTAG port (device " GPIO_DEVICE "): %s"),
+                    strerror(errno));
+            return FALSE;
+        }
+
+        gpio_port_error = FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/* Close the GPIO interface.  */
+
+void
+gpio_close (void)
+{
+    /* Close the driver, if not already closed.  */
+    if (gpio_driver != NULL_FILE_DESCRIPTOR)
+    {
+        /* Close file descriptor opened for communication with gpio driver.  */
+        if (close(gpio_driver) == -1)
+            warning(_("unable to close JTAG port (device " GPIO_DEVICE "): %s"),
+                    strerror(errno));
+
+        gpio_driver = NULL_FILE_DESCRIPTOR;
+    }
+}
+
+
+/* Write a byte of data to the given port.  */
+
+void
+gpio_write (ParallelPort port, Byte data)
+{
+    ioctl_data.inlen    = 2;
+    ioctl_data.inbuf[0] = (char) port;
+    ioctl_data.inbuf[1] = (char) data;
+
+    if (ioctl(gpio_driver, GPIO_IOC_DO_IO, &ioctl_data))
+        error(_("Failure writing to port %d: %s"), port, strerror(errno));
+
+    /* If no data has been consumed by the port.  */
+    if (ioctl_data.inlen == 0)
+        gpio_port_error = TRUE;
+
+//  DEBUG("ioctl_data.inlen: %d\n", ioctl_data.inlen);
+//  DEBUG("GPIO write: %02x -> %c\n", data, name[port]);
+}
+
+
+/* Read a byte of data from the given port.  */
+
+Byte
+gpio_read (ParallelPort port)
+{
+    ioctl_data.inlen    = 2;
+    ioctl_data.inbuf[0] = (char) (port + 0x80);
+//  ioctl_data.inbuf[1] is ignored
+
+    /* N.B. outlen must be set!  */
+    ioctl_data.outlen    = 1;
+    ioctl_data.outbuf[0] = (char) 0; // in case the read fails
+
+    if (ioctl(gpio_driver, GPIO_IOC_DO_IO, &ioctl_data))
+        error(_("Failure reading from port %d: %s"), port, strerror(errno));
+
+    /* If no data has been provided by the port  */
+    if (ioctl_data.outlen == 0)
+        gpio_port_error = TRUE;
+
+//  DEBUG("ioctl_data.outlen: %d\n", ioctl_data.outlen);
+//  DEBUG("GPIO read : %02x <- %c\n", (Byte) ioctl_data.outbuf[0], name[port]);
+
+    return (Byte) ioctl_data.outbuf[0];
+}
+
+
+/* Write a series of bytes of data to the ports.  */
+
+void
+gpio_write_array (GPIO_Pair array[], unsigned int num_elements)
+{
+    char         buffer[num_elements * 2];
+    GPIO_ioctl   data = { 0, buffer, 0, NULL };
+    unsigned int i;
+
+    for (i = 0; i < num_elements; i++)
+    {
+        buffer[data.inlen++] = (char) array[i].port;
+        buffer[data.inlen++] = (char) array[i].data;
+    }
+
+    if (ioctl(gpio_driver, GPIO_IOC_DO_IO, &data))
+        error(_("Failure writing to port: %s"), strerror(errno));
+
+    /* If no data has been consumed by the port.  */
+    if (ioctl_data.inlen == 0)
+        gpio_port_error = TRUE;
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-gpio.h b/gdb/arc-gpio.h
new file mode 100755
index 0000000..914138c
--- /dev/null
+++ b/gdb/arc-gpio.h
@@ -0,0 +1,72 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey      <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines operations for reading data from / writing    */
+/*     data to a parallel port using a GPIO (General Purpose Input/Output)    */
+/*     driver.                                                                */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_GPIO_H
+#define ARC_GPIO_H
+
+/* ARC header files */
+#include "arc-support.h"
+
+
+#define GPIO_DEVICE         "/dev/gpio"
+
+
+typedef enum
+{
+    DATA_PORT    = 0,
+    STATUS_PORT  = 1,
+    CONTROL_PORT = 2
+} ParallelPort;
+
+typedef unsigned char Byte;
+
+typedef struct
+{
+    ParallelPort port;
+    Byte         data;
+} GPIO_Pair;
+
+
+Boolean gpio_open  (void);
+void    gpio_close (void);
+
+void gpio_write (ParallelPort port, Byte data);
+Byte gpio_read  (ParallelPort port);
+
+void gpio_write_array (GPIO_Pair array[], unsigned int num_elements);
+
+
+extern Boolean gpio_port_error;
+
+#endif /* ARC_GPIO_H */
+/******************************************************************************/
diff --git a/gdb/arc-inst-tracing.c b/gdb/arc-inst-tracing.c
new file mode 100644
index 0000000..c22ddb7
--- /dev/null
+++ b/gdb/arc-inst-tracing.c
@@ -0,0 +1,356 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements operations for recording an instruction trace   */
+/*     of successive PC values in a compressed binary format in a file.       */
+/*                                                                            */
+/*     The file is regarded as a linear sequence of bits, of the form:        */
+/*                                                                            */
+/*        <64-bit first instruction count>                                    */
+/*        <64-bit last  instruction count>                                    */
+/*        { <3-bit-code> [ <16-bit-data> | <31-bit-data> ] }                  */
+/*        [ <zero-pad-bits> ]                                                 */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <errno.h>
+
+/* gdb header files */
+#include "defs.h"
+
+/* ARC header files */
+#include "arc-inst-tracing.h"
+#include "arc-tdep.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define MAX_ORDINAL    0xFFFFFFFFFFFFFFFFULL
+
+/* The file that is currently open for read or write.  */
+static FILE *file;
+
+/* The byte of data that has been read from, or is about to be written to, the
+   currently open file; and the number of bits in that byte that have been used
+   (i.e. been consumed on input, or produced on output).  */
+static unsigned char byte;
+static unsigned int  bits_used;
+
+/* Set to TRUE if EOF occurs whilst trying to read from the file.  */
+static Boolean EOF_detected;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Write the N least-significant bits of the given value to the file.  */
+
+static void
+output_bits (unsigned int N, unsigned int value)
+{
+    unsigned int i;
+
+    for (i = 0; i < N; i++)
+    {
+        if (bits_used == BITS_IN_BYTE)
+        {
+            (void) putc((int) byte, file);
+            byte      = 0;
+            bits_used = 0;
+//          printf("byte = %02X\n", byte);
+        }
+
+        byte <<= 1;
+        byte |= (value >> (N - i - 1)) & 0x1;
+        bits_used++;
+    }
+}
+
+
+/* Read N bits from the file and return them as the least-significant bits of a value.  */
+
+static unsigned int
+input_bits (unsigned int N)
+{
+    unsigned int value = 0;
+    unsigned int i;
+
+    for (i = 0; i < N; i++)
+    {
+        unsigned int bit;
+
+        /* If all the bits in the current input byte have been used.  */
+        if (bits_used == BITS_IN_BYTE)
+        {
+            /* Read the next byte from the file.  */
+            int input = getc(file);
+
+            if (input == EOF)
+            {
+                EOF_detected = TRUE;
+                return 0;
+            }
+
+            byte      = (unsigned char) input;
+            bits_used = 0;
+//          printf("byte = %02X\n", byte);
+        }
+
+        bit = (unsigned int) ((byte & 0x80) >> 7);
+        value <<= 1;
+        value |= bit;
+        byte <<= 1;
+        bits_used++;
+    }
+
+    return value;
+}
+
+
+/* Write a 64-bit value to the file.  */
+
+static void
+output_ordinal (Ordinal value)
+{
+    output_bits(32, (unsigned int) (value >> 32));
+    output_bits(32, (unsigned int) (value &  0xFFFFFFFF));
+}
+
+
+/* Read a 64-bit value from the file.  */
+
+static Ordinal
+input_ordinal (void)
+{
+    unsigned int high = input_bits(32);
+    unsigned int low  = input_bits(32);
+
+    return ((Ordinal) high) << 32 | (Ordinal) low;
+}
+
+
+/* Open the named file with the given access mode.  */
+
+static Boolean
+open_file (const char *filename, const char *mode)
+{
+    file = fopen(filename, mode);
+
+    if (file == NULL)
+    {
+        fprintf(stderr, "Can not open file %s: %s\n", filename, strerror(errno));
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Start encoding trace data into the named file.  */
+
+Boolean
+arc_start_encoding (const char *filename,
+                    Ordinal     first_instr_count)
+{
+    ENTERARGS("filename = %s, first = %llu", filename, first_instr_count);
+
+    byte      = 0;
+    bits_used = 0;
+
+    if (open_file(filename, "wb"))
+    {
+        /* The second value will be fixed up later.  */
+        output_ordinal(first_instr_count);
+        output_ordinal(MAX_ORDINAL);
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/* Stop encoding trace data into the file.  */
+
+void
+arc_stop_encoding (Ordinal last_instr_count)
+{
+    ENTERARGS("last = %llu", last_instr_count);
+
+    if (file)
+    {
+        /* Make sure the last partial byte output is flushed to the file,
+           padded with 0 bits as necessary.  */
+        if (bits_used > 0)
+            output_bits(BITS_IN_BYTE, 0);
+
+         /* N.B. this is necessary!  */
+         (void) fflush(file);
+
+        /* Now fix up the second 8-byte value in tjhe file.  */
+
+        if (lseek(fileno(file), (off_t) sizeof(Ordinal), SEEK_SET) == -1)
+            warning(_("can not seek in file: %s"), strerror(errno));
+        else
+        {
+            bits_used = 0;
+            byte      = 0;
+            output_ordinal(last_instr_count);
+
+            /* Make sure the last byte is flushed.  */
+            output_bits(1, 0);
+         }
+
+        (void) fclose(file);
+        file = NULL;
+    }
+}
+
+
+/* Start decoding trace data from the named file.
+   Retrieve the first and last instruction ordinal positions.  */
+
+Boolean
+arc_start_decoding (const char *filename,
+                    Ordinal    *first_instr_count,
+                    Ordinal    *last_instr_count)
+{
+    ENTERARGS("filename = %s", filename);
+
+    /* The first attempt to input a bit will result in a read from the file.  */
+    bits_used    = BITS_IN_BYTE;
+    EOF_detected = FALSE;
+
+    if (open_file(filename, "r"))
+    {
+        *first_instr_count = input_ordinal();
+        *last_instr_count  = input_ordinal();
+
+        DEBUG("first = %llu, last = %llu\n", *first_instr_count, *last_instr_count);
+
+        return !EOF_detected;
+    }
+
+    return FALSE;
+}
+
+
+/* Stop decoding trace data from the file.  */
+
+void
+arc_stop_decoding (void)
+{
+    if (file)
+    {
+        if (bits_used < BITS_IN_BYTE)
+            fprintf(stderr, "all data not processed!\n");
+
+        (void) fclose(file);
+        file = NULL;
+    }
+}
+
+
+/* Write a PC value into the file with the specified encoding.  */
+
+void
+arc_encode_PC (ARC_ProgramCounterEncoding encoding, unsigned int value)
+{
+//  printf("%d:%x\n", encoding, value);
+
+    output_bits(3, (unsigned int) encoding);
+
+    switch (encoding)
+    {
+        case NO_CHANGE:
+        case PLUS_16_BITS:
+        case PLUS_32_BITS:
+        case PLUS_48_BITS:
+        case PLUS_64_BITS:
+            break;
+        case DELTA_16_BIT_POSITIVE:
+        case DELTA_16_BIT_NEGATIVE:
+            output_bits(16, value);
+            break;
+        case ABSOLUTE_31_BITS:
+            output_bits(31, value);
+            break;
+    }
+}
+
+
+/* Read a PC value and its encoding from the file.
+   Return TRUE if a value could be read, FALSE otherwise.  */
+
+Boolean
+arc_decode_PC (ARC_ProgramCounterEncoding *encoding, unsigned int *value)
+{
+    unsigned int code = input_bits(3);
+
+    if (EOF_detected)
+        return FALSE;
+
+    *encoding = (ARC_ProgramCounterEncoding) code;
+
+    switch (*encoding)
+    {
+        case NO_CHANGE:
+        case PLUS_16_BITS:
+        case PLUS_32_BITS:
+        case PLUS_48_BITS:
+        case PLUS_64_BITS:
+            *value = 0;
+            break;
+        case DELTA_16_BIT_POSITIVE:
+        case DELTA_16_BIT_NEGATIVE:
+            *value = input_bits(16);
+            break;
+        case ABSOLUTE_31_BITS:
+            *value = input_bits(31);
+            break;
+    }
+
+    if (EOF_detected)
+        return FALSE;
+
+//  printf("%d:%x\n", *encoding, *value);
+
+    return TRUE;
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-inst-tracing.h b/gdb/arc-inst-tracing.h
new file mode 100644
index 0000000..4dacad9
--- /dev/null
+++ b/gdb/arc-inst-tracing.h
@@ -0,0 +1,89 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines operations for recording an instruction trace */
+/*     of successive PC values in a compressed binary format in a file.       */
+/*                                                                            */
+/*     We use the fact that instructions are always 16-bit aligned to encode  */
+/*     17-bit deltas as 16-bit quantities.  We apply a 2-byte bias to the     */
+/*     delta (as the minimum delta could be -2, for a shortest distance       */
+/*     backward branch), so giving us                                         */
+/*                                                                            */
+/*         delta    range:  2 .. 2^17                                         */
+/*         encoding range:  0 .. 2^16 - 1                                     */
+/*                                                                            */
+/*     We could encode positive and negative deltas differently (since the    */
+/*     minimum positive delta is 10, given that 2, 4, 6 and 8 byte positive   */
+/*     deltas are handled diferently), but this hardly seems worthwhile.      */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_INSTRUCTION_TRACING_H
+#define ARC_INSTRUCTION_TRACING_H
+
+/* ARC header files */
+#include "arc-support.h"
+
+
+typedef enum
+{
+    NO_CHANGE,
+    PLUS_16_BITS,
+    PLUS_32_BITS,
+    PLUS_48_BITS,
+    PLUS_64_BITS,
+    DELTA_16_BIT_POSITIVE,
+    DELTA_16_BIT_NEGATIVE,
+    ABSOLUTE_31_BITS
+} ARC_ProgramCounterEncoding;
+
+
+typedef unsigned long long Ordinal;
+
+
+#define MAX_DELTA   (1 << 17)
+
+#define ENCODE_DELTA(delta)    (unsigned int) (((delta) - 2) / 2)
+#define DECODE_DELTA(value)                   (((value) * 2) + 2)
+
+
+Boolean arc_start_encoding (const char *filename,
+                            Ordinal     first_instr_count);
+
+void    arc_stop_encoding  (Ordinal last_instr_count);
+
+Boolean arc_start_decoding (const char *filename,
+                            Ordinal    *first_instr_count,
+                            Ordinal    *last_instr_count);
+
+void    arc_stop_decoding  (void);
+
+void    arc_encode_PC (ARC_ProgramCounterEncoding  encoding, unsigned int  value);
+Boolean arc_decode_PC (ARC_ProgramCounterEncoding *encoding, unsigned int *value);
+
+#endif /* ARC_INSTRUCTION_TRACING_H */
+/******************************************************************************/
diff --git a/gdb/arc-jtag-actionpoints.c b/gdb/arc-jtag-actionpoints.c
new file mode 100644
index 0000000..4c5d818
--- /dev/null
+++ b/gdb/arc-jtag-actionpoints.c
@@ -0,0 +1,1337 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Author:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements hardware breakpoints and watchpoints on the ARC */
+/*     processor using actionpoints.                                          */
+/*                                                                            */
+/*     See                                                                    */
+/*                    ARC 700 System Components Reference                     */
+/*                                 5126-016                                   */
+/*                                                                            */
+/*     for a full description of the processor actionpoints mechanism.        */
+/*                                                                            */
+/******************************************************************************/
+
+/* gdb header files */
+#include "defs.h"
+#include "inferior.h"
+#include "gdb_assert.h"
+
+/* ARC header files */
+#include "arc-jtag-actionpoints.h"
+#include "arc-registers.h"
+#include "arc-elf32-tdep.h"
+#include "arc-jtag.h"
+#include "arc-jtag-ops.h"
+#include "arc-support.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef enum
+{
+   NOT_IN_USE,
+   SINGLE,
+   PAIR_0,
+   PAIR_1,
+   QUAD_0,
+   QUAD_1,
+   QUAD_2,
+   QUAD_3
+} Actionpoint_Usage;
+
+
+/* This information describes an individual actionpoint.  */
+typedef struct arc_actionpoint
+{
+    Actionpoint_Usage    usage;
+    Boolean              triggered;
+    Boolean              is_exclude;
+    unsigned int         length;
+    ARC_RegisterContents match_value;
+    ARC_RegisterContents match_mask;
+    ARC_RegisterContents control;
+    ARC_RegisterContents point;
+} ARC_ActionPoint;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define SUCCESS          0
+#define FAILURE        (-1)
+
+#define MAX_ACTION_POINTS              8
+#define MAX_ACTION_POINTS_IN_GROUP     4
+#define HW_BP_SIZE                     1
+
+
+/* Bit masks for the Actionpoint Control Registers AP_ACx (10 low-order bits only).  */
+#define AP_TARGET_INSTRUCTION_ADDRESS      0x000
+#define AP_TARGET_INSTRUCTION_DATA         0x001
+#define AP_TARGET_LOAD_STORE_ADDRESS       0x002
+#define AP_TARGET_LOAD_STORE_DATA          0x003
+#define AP_TARGET_AUX_REGISTER_ADDRESS     0x004
+#define AP_TARGET_AUX_REGISTER_DATA        0x005
+#define AP_TARGET_EXTERNAL_PARAMETER_0     0x006
+#define AP_TARGET_EXTERNAL_PARAMETER_1     0x007
+#define AP_TARGET_MASK                     0x007
+#define AP_TARGET_SHIFT                    0
+
+#define AP_TRANSACTION_TYPE_DISABLED       0x000
+#define AP_TRANSACTION_TYPE_WRITE          0x010
+#define AP_TRANSACTION_TYPE_READ           0x020
+#define AP_TRANSACTION_TYPE_ACCESS         0x030
+#define AP_TRANSACTION_TYPE_MASK           0x030
+#define AP_TRANSACTION_TYPE_SHIFT          4
+
+#define AP_MODE_TRIGGER_IN_RANGE           0x000
+#define AP_MODE_TRIGGER_OUTSIDE_RANGE      0x040
+#define AP_MODE_MASK                       0x040
+
+#define AP_ACTION_BREAK                    0x000
+#define AP_ACTION_EXCEPTION                0x100
+#define AP_ACTION_MASK                     0x100
+
+#define AP_PAIR                            0x080
+#define AP_QUAD                            0x200
+
+
+/* Data defining the actionpoints.  */
+static unsigned int       num_actionpoints;
+static Boolean            full_target_actionpoints;
+static ARC_ActionPoint    actionpoints[MAX_ACTION_POINTS];
+
+/* The h/w numbers of the AMV0, AMM0 and AC0 auxiliary registers.  */
+static ARC_RegisterNumber amv0_regnum;
+static ARC_RegisterNumber amm0_regnum;
+static ARC_RegisterNumber ac0_regnum;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+/* The N actionpoint auxiliary registers (where N is 0 .. MAX_ACTION_POINTS - 1)
+   (fortunately, the numbers of the registers are one contiguous block, so
+   a simple addition is sufficient here).  */
+#define ARC_HW_AMV_REGNUM(n)     (ARC_RegisterNumber) (amv0_regnum + 3 * (n))
+#define ARC_HW_AMM_REGNUM(n)     (ARC_RegisterNumber) (amm0_regnum + 3 * (n))
+#define ARC_HW_AC_REGNUM(n)      (ARC_RegisterNumber) (ac0_regnum  + 3 * (n))
+
+/* This will give a value in range 0 .. MAX_ACTION_POINTS - 1.  */
+#define AP_INSTANCE(ap)          ((ap) - actionpoints)
+#define IN_USE(ap)               ((ap)->usage != NOT_IN_USE)
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+#if 0
+/* This function checks that a given number is a power of two, and, if so,
+   returns a bitmask corresponding to (2 ** number - 1).  */
+
+static Boolean
+is_power_of_two (int number, ARC_Word *mask)
+{
+    unsigned int power = 1;
+    unsigned int i;
+
+    *mask = 0;
+
+    for (i = 0; (i < BITS_IN_WORD) && (power <= (unsigned int) number); i++)
+    {
+        if (power == (unsigned int) number)
+            return TRUE;
+
+        power <<= 1;
+        *mask = (*mask << 1) + 1;
+    }
+
+    /* not a power */
+    return FALSE;
+}
+#endif
+
+
+/* This function determines whether the ARC processor in the connected target
+   provides support for actionpoints (that is a configuratiopn option).  */
+
+static Boolean
+target_has_actionpoints (void)
+{
+    ARC_RegisterNumber   ap_build_regnum;
+    ARC_RegisterContents ap_build;
+
+    ap_build_regnum = arc_aux_find_register_number("AP_BUILD", ARC_HW_AP_BUILD_REGNUM);
+    amv0_regnum     = arc_aux_find_register_number("AMV0",     ARC_HW_AMV0_REGNUM);
+    amm0_regnum     = arc_aux_find_register_number("AMM0",     ARC_HW_AMM0_REGNUM);
+    ac0_regnum      = arc_aux_find_register_number("AC0",      ARC_HW_AC0_REGNUM);
+
+    num_actionpoints = 0;
+
+    if (arc_read_jtag_aux_register(ap_build_regnum, &ap_build, TRUE))
+    {
+        DEBUG("AP_BUILD BCR: 0x%08X\n", ap_build);
+
+        /* AP_BUILD returns 0 if actionpoints are not selected in the
+           processor configuration.  */
+        if (ap_build != 0)
+        {
+            /* If the processor's implementation of the actionpoint mechanism is
+               the one we know about.  */
+            if ((ap_build & AP_BUILD_VERSION) == 0x4)
+            {
+                 unsigned int type = (ap_build & AP_BUILD_TYPE) >> AP_BUILD_TYPE_SHIFT;
+                 unsigned int i;
+
+                 /* The low-order two bits of the type field encode the number
+                    of actionpoints supported  by the processor.  */
+                 switch (type % 4)
+                 {
+                     case 0 : num_actionpoints = 2; break;
+                     case 1 : num_actionpoints = 4; break;
+                     case 2 : num_actionpoints = 8; break;
+                     default: internal_error (__FILE__, __LINE__, _("invalid AP_BUILD.TYPE: 0x%X"), type);
+                 }
+
+                 /* The next bit specifies whether the processor supports full
+                    or minimum targets for the actionpoints.  */
+                 full_target_actionpoints = ((type & 4) == 0);
+
+                 for (i = 0; i < MAX_ACTION_POINTS; i++)
+                 {
+                     actionpoints[i].usage      = NOT_IN_USE;
+                     actionpoints[i].triggered  = FALSE;
+                     actionpoints[i].is_exclude = FALSE;
+                 }
+
+                 DEBUG("ARC processor supports %u %s actionpoints\n",
+                       num_actionpoints, (full_target_actionpoints) ? "full" : "minimum");
+
+                 return TRUE;
+            }
+            else
+                warning(_("ARC processor actionpoint mechanism version (0x%x) is not supported."),
+                        ap_build & AP_BUILD_VERSION);
+        }
+    }
+
+    DEBUG("ARC processor supports no actionpoints\n");
+
+    return FALSE;
+}
+
+
+/* This function determines the set of actionpoints that would be required to
+   cover exactly the memory region specified by (addr,length), by using one
+   actionpoint with an inclusive range, and zero or more actionpoints with
+   exclusive ranges.
+
+   The set of values and masks for the actionpoint AMV and AMM registers are
+   returned in the actionpoint_value and actionpoint_mask arrays - these must
+   be able to hold 4 entries.  The value and mask for the inclusive actionpoint
+   are returned as the first elements in the arrays.  */
+
+static unsigned int
+map_actionpoints (ARC_Address  addr,
+                  unsigned int length,
+                  ARC_Address  actionpoint_value[],
+                  ARC_Word     actionpoint_mask[])
+{
+    ARC_Address  first_data = addr;
+    ARC_Address  last_data  = first_data + length - 1;
+    ARC_Address  include_start;
+    ARC_Address  include_end;
+    ARC_Word     mask;
+    unsigned int power_of_two;
+    unsigned int points;
+
+    ENTERARGS("addr 0x%08X, length %d", addr, length);
+//  DEBUG("range: %08X .. %08X\n", first_data, last_data);
+
+    /* If the range extends across the midpoint of the address space.  */
+    if (((first_data & 0x80000000) == 0) && ((last_data & 0x80000000) != 0))
+    {
+//      DEBUG("pathological case!\n");
+
+        /* Must cover entire address space.  */
+        include_start = 0x00000000;
+        include_end   = 0xFFFFFFFF;
+        mask          = 0xFFFFFFFF;   // Ignore all bits!
+    }
+    else
+    {
+        unsigned int i;
+
+        mask         = 0;
+        power_of_two = 1;
+
+        /* Determine what actionpoint would be required to include all of the given
+           memory region (this include range may have leading and trailing parts
+           that extend beyond the given region).  */
+        for (i = 0; i < 32; i++)
+        {
+            unsigned int include_size = power_of_two;
+
+            include_start = (first_data / include_size) * include_size;
+            include_end   = include_start + include_size - 1;
+
+            if (include_start <= first_data && include_end >= last_data)
+            {
+//              DEBUG("include: 0x%08X .. 0x%08X (mask 0x%08x)\n",
+//                     include_start, include_end, mask);
+                break;
+            }
+
+            mask = (mask << 1) + 1;
+            power_of_two <<= 1;
+        }
+    }
+
+    /* This is the first actionpoint in the list.  */
+    actionpoint_value[0] = include_start;
+    actionpoint_mask [0] = mask;
+    points = 1;
+
+
+    /* Determine what actionpoints would be required to mask out the leading part
+       of the include range.  */
+    {
+        unsigned int to_be_excluded = first_data - include_start;
+        ARC_Address  boundary       = include_start;
+
+        while (to_be_excluded > 0)
+        {
+            unsigned int j;
+
+            mask         = 0;
+            power_of_two = 1;
+
+            for (j = 0; j < 32; j++)
+            {
+                unsigned int exclude_size  = power_of_two;
+                ARC_Address  exclude_start = (first_data / exclude_size - 1) * exclude_size;
+                ARC_Address  exclude_end   = exclude_start + exclude_size - 1;
+
+                if (exclude_end < first_data && exclude_start <= boundary)
+                {
+//                  DEBUG("leading exclude: 0x%08X .. 0x%08X (mask 0x%08x)\n",
+//                        exclude_start, exclude_end, mask);
+
+                    to_be_excluded = first_data - exclude_end - 1;
+                    boundary       = exclude_end + 1;
+
+                    /* There is no point in returning the details of
+                       more than the maximum number of actionpoints that
+                       can be linked together (in a quad).  */
+                    if (points < MAX_ACTION_POINTS_IN_GROUP)
+                    {
+                        actionpoint_value[points] = exclude_start;
+                        actionpoint_mask [points] = mask;
+                    }
+                    points++;
+
+                    break;
+                }
+
+                mask = (mask << 1) + 1;
+                power_of_two <<= 1;
+            }
+        }
+    }
+
+    /* Determine what actionpoints would be required to mask out the trailing
+       part of the include range.  */
+    {
+        unsigned int to_be_excluded = include_end - last_data;
+        ARC_Address  boundary       = include_end;
+
+        while (to_be_excluded > 0)
+        {
+            unsigned int j;
+
+            mask         = 0;
+            power_of_two = 1;
+
+            for (j = 0; j < 32; j++)
+            {
+                unsigned int exclude_size  = power_of_two;
+                ARC_Address  exclude_start = (last_data / exclude_size + 1) * exclude_size;
+                ARC_Address  exclude_end   = exclude_start + exclude_size - 1;
+
+                if (exclude_start > last_data && exclude_end >= boundary)
+                {
+//                  DEBUG("trailing exclude: 0x%08X .. 0x%08X (mask 0x%08x)\n",
+//                        exclude_start, exclude_end, mask);
+
+                    to_be_excluded = exclude_start - last_data - 1;
+                    boundary       = exclude_start - 1;
+
+                    /* There is no point in returning the details of
+                       more than the maximum number of actionpoints that
+                       can be linked together (in a quad).  */
+                    if (points < MAX_ACTION_POINTS_IN_GROUP)
+                    {
+                        actionpoint_value[points] = exclude_start;
+                        actionpoint_mask [points] = mask;
+                    }
+                    points++;
+
+                    break;
+                }
+
+                mask = (mask << 1) + 1;
+                power_of_two <<= 1;
+            }
+        }
+    }
+
+    return points;
+}
+
+
+/* Set the given actionpoint on the target by writing to the corresponding set
+   of AMV, AMM and AC auxiliary registers.
+   Return TRUE if it is set successfully.  */
+
+static Boolean
+set_actionpoint_on_target (ARC_ActionPoint *actionpoint)
+{
+    unsigned int instance = AP_INSTANCE(actionpoint);
+
+    return arc_write_jtag_aux_register(ARC_HW_AMV_REGNUM(instance), actionpoint->match_value, TRUE) &&
+           arc_write_jtag_aux_register(ARC_HW_AMM_REGNUM(instance), actionpoint->match_mask,  TRUE) &&
+           arc_write_jtag_aux_register(ARC_HW_AC_REGNUM (instance), actionpoint->control,     TRUE);
+}
+
+
+/* Clear the given actionpoint on the target by writing 'DISABLED' to the
+   corresponding AC auxiliary register.
+   Return TRUE if it is cleared successfully.  */
+
+static Boolean
+clear_actionpoint_from_target (ARC_ActionPoint *actionpoint)
+{
+    return arc_write_jtag_aux_register(ARC_HW_AC_REGNUM (AP_INSTANCE(actionpoint)),
+                                       AP_TRANSACTION_TYPE_DISABLED,
+                                       TRUE);
+}
+
+
+/* Set the given actionpoint on the target, and update its data structure.
+   Return TRUE if it is set successfully.  */
+
+static Boolean
+set_actionpoint (ARC_ActionPoint *actionpoint)
+{
+    Boolean set = set_actionpoint_on_target(actionpoint);
+
+    if (set)
+    {
+        actionpoint->triggered = FALSE;
+        actionpoint->point     = 0;
+    }
+    else
+        actionpoint->usage = NOT_IN_USE;
+
+    return set;
+}
+
+
+/* Insert an actionpoint to cover a range of target memory.
+
+   Parameters:
+      bpt        : the information describing a breakpoint (NULL for a watchpoint)
+      length     : the length in bytes of the range
+      match_value: the value for the actionpoint value   (AMV) aux register
+      match_mask : the value for the actionpoint mask    (AMM) aux register
+      control    : the value for the actionpoint control (AC)  aux register
+
+   Returns 0 for success, -1 for failure.  */
+
+static int
+insert_actionpoint (struct bp_target_info *bpt,
+                    unsigned int           length,
+                    ARC_RegisterContents   match_value,
+                    ARC_RegisterContents   match_mask,
+                    ARC_RegisterContents   control)
+{
+    unsigned int i;
+
+    /* Look for an unused actionpoint.  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        /* Got one!  */
+        if (!IN_USE(actionpoint))
+        {
+            /* Record its data.  */
+            actionpoint->match_value = match_value;
+            actionpoint->match_mask  = match_mask;
+            actionpoint->control     = control;
+            actionpoint->is_exclude  = FALSE;
+            actionpoint->length      = length;
+
+            /* Try to set it on the target.  */
+            if (set_actionpoint(actionpoint))
+            {
+                 /* Now it is in use.  */
+                actionpoint->usage = SINGLE;
+
+                /* Is it a breakpoint?  */
+                if (bpt)
+                {
+                    /* We have not actually saved code from the target program.  */
+                    bpt->shadow_len  = 0;
+                    bpt->placed_size = (int) actionpoint->length;
+                }
+
+                return SUCCESS;
+            }
+        }
+    }
+
+    /* Failed: no free actionpoints.  */
+//  warning(_("no actionpoints available"));
+    return FAILURE;
+}
+
+
+/* Restore the actionpoints on the target according to their current settings.
+   If 'clear_unused' is TRUE, any actionpoints which are unused are explicitly
+   cleared on the target.
+
+   Returns 0 for success, -1 for failure.  */
+
+static int
+restore_actionpoints (Boolean clear_unused)
+{
+    unsigned int i;
+
+    /* Look at each of the actionpoints.  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        if (IN_USE(actionpoint))
+        {
+            if (!set_actionpoint_on_target(actionpoint))
+            {
+                actionpoint->usage = NOT_IN_USE;
+                return FAILURE;
+            }
+        }
+        else if (clear_unused)
+        {
+            if (!clear_actionpoint_from_target (actionpoint))
+                return FAILURE;
+        }
+    }
+
+    return SUCCESS;
+}
+
+
+/* Find a number of unused actionpoints whose numbers (0..7) lie in a contiguous
+   range (allowing for wraparound of the numbers, i.e. % 8).
+
+   Parameters:
+      required : the number of unused actionpoints required
+      from     : set to the number (0..7) of the first actionpoint
+      compacted: set to TRUE if the currently used set of actionpoints
+                 had to be compacted to give a contiguous range of unused
+                 actionpoints
+
+   Returns TRUE if the required number was found, FALSE otherwise.  */
+
+static Boolean
+find_unused_actionpoints (unsigned int  required,
+                          unsigned int *from,
+                          Boolean      *compacted)
+{
+    unsigned int unused        = 0;
+    unsigned int first_unused  = 0;
+    unsigned int i;
+
+    /* How many slots are not currently used?  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        if (!IN_USE(actionpoint))
+            unused++;
+    }
+
+    DEBUG("%u actionpoints unused, %u required\n", unused, required);
+
+    if (required > unused)
+        return FALSE;
+
+    /* When used in pairs or quads, the action points wrap around, e.g. a pair
+       might be actionpoints (3, 0), if the target has 4 actionpoints; and a
+       quad might be (6, 7, 0, 1), if the target has 8 actionpoints.  */
+
+    /* First try to find 'required' contiguous unused slots.  */
+    for (i = 0; i < num_actionpoints + required - 2; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i % num_actionpoints];
+
+        if (IN_USE(actionpoint))
+        {
+            /* The first unused one MAY be the next one after this one.  */
+            first_unused = i + 1;
+        }
+        else
+        {
+            DEBUG("%u: AP%u is unused\n", i, i % num_actionpoints);
+
+            if (i - first_unused + 1 >= required)
+            {
+                /* A sufficiently large sequence of unused actionpoints has been
+                   found.  */
+                *from = first_unused % num_actionpoints;
+                *compacted = FALSE;
+                return TRUE;
+            }
+        }
+    }
+
+    DEBUG("compacting array\n");
+
+    /* There are sufficient unused slots, but they are not contiguous - so move
+       all the used ones towards the start of the array so that all the unused
+       ones are contiguous at the end of the array.  */
+    first_unused = MAX_ACTION_POINTS;
+
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        if (IN_USE(actionpoint))
+        {
+            if (first_unused != MAX_ACTION_POINTS)
+            {
+                DEBUG("moving %u to %u\n", i, first_unused);
+
+                /* Move the used one into the unused slot.  */
+                actionpoints[first_unused] = *actionpoint;
+
+                actionpoint->usage = NOT_IN_USE;
+
+                /* The first unused entry in the array is now the next one after
+                   it - this is true whether that next one was the used one that
+                   has just been moved, or was the next in a sequence of unused
+                   entries.  */
+                first_unused++;
+            }
+        }
+        else if (first_unused == MAX_ACTION_POINTS)
+        {
+            /* This one really is the first unused one we have found.  */
+            first_unused = i;
+        }
+    }
+
+    *from = num_actionpoints - unused;
+
+    DEBUG("from = %u\n", *from);
+
+    *compacted = TRUE;
+    return TRUE;
+}
+
+
+/* Insert an actionpoint group to cover a range of target memory.
+
+   Parameters:
+      length     : the length in bytes of the range
+      number     : the number of actionpoints required
+      match_value: the values for the actionpoint value  (AMV) aux registers
+      match_mask : the values for the actionpoint mask   (AMM) aux registers
+      control    : the value for the actionpoint control (AC)  aux registers
+
+   Returns 0 for success, -1 for failure.  */
+
+static int
+insert_actionpoint_group (unsigned int         length,
+                          unsigned int         number,
+                          ARC_RegisterContents match_value[],
+                          ARC_RegisterContents match_mask[],
+                          ARC_RegisterContents control)
+{
+    /* For 2 actionpoints, we can use a pair; for 3 or 4, we must use a quad.  */
+    unsigned int required = (number == 2) ? 2 : 4;
+    unsigned int first_free;
+    Boolean      is_pair  = (required == 2);
+    Boolean      compacted;
+
+    gdb_assert(2 <= number && number <= 4);
+
+    /* Try to find the required number of unused actionpoints.  */
+    if (find_unused_actionpoints(required, &first_free, &compacted))
+    {
+        ARC_ActionPoint *actionpoint[MAX_ACTION_POINTS_IN_GROUP];
+        unsigned int     i;
+
+        /* Get an array of pointers to the data for those actionpoints.  */
+        for (i = 0; i < required; i++)
+            actionpoint[i] = &actionpoints[(first_free + i) % num_actionpoints];
+
+        actionpoint[0]->length     = length;
+        actionpoint[0]->is_exclude = FALSE;
+
+        /* The Control register for the first actionpoint in the group must be
+           set to indicate whether the group is a pair or a quad.  */
+        actionpoint[0]->usage       = (is_pair) ? PAIR_0 : QUAD_0;
+        actionpoint[0]->match_value = match_value[0];
+        actionpoint[0]->match_mask  = match_mask[0];
+        actionpoint[0]->control     = control | ((is_pair) ? AP_PAIR : AP_QUAD);
+
+        /* All subsequent actionpoints in the group have exclusive rather than
+           inclusive address ranges.  */
+        control &= ~AP_MODE_TRIGGER_IN_RANGE;
+        control |=  AP_MODE_TRIGGER_OUTSIDE_RANGE;
+
+        for (i = 1; i < number; i++)
+        {
+            actionpoint[i]->usage       = actionpoint[0]->usage + i;
+            actionpoint[i]->match_value = match_value[i];
+            actionpoint[i]->match_mask  = match_mask[i];
+            actionpoint[i]->control     = control;
+            actionpoint[i]->length      = 0;
+            actionpoint[i]->is_exclude  = TRUE;
+        }
+
+        /* If we are using only 3 of the 4 actionpoints in a quad, the 4th one
+           must be disabled (or we could just make it the same as one of the
+           other exclusive ones).  */
+        if (number == 3)
+        {
+            ARC_ActionPoint *disabled = actionpoint[3];
+
+            disabled->usage       = QUAD_3;
+            disabled->match_value = 0;
+            disabled->match_mask  = 0;
+            disabled->control     = AP_TRANSACTION_TYPE_DISABLED;
+            disabled->length      = 0;
+        }
+
+        /* If we had to compact the array of actionpoints in order to get a
+           long enough contiguous sequence of unused entries, then set ALL of
+           the actionpoints that are now in use, and explicitly clear all that
+           are not in use (this is simplest!).  */
+        if (compacted)
+            return restore_actionpoints(TRUE);
+
+        /* Otherwise, just set the ones for the group, which were previously
+           unused.  */
+        for (i = 0; i < required; i++)
+            if (!set_actionpoint(actionpoint[i]))
+                return FAILURE;
+
+        return SUCCESS;
+    }
+
+//  warning(_("insufficient actionpoints available"));
+    return FAILURE;
+}
+
+
+/* Insert a h/w breakpoint or watchpoint to cover a range of target memory.
+
+   Parameters:
+      address : the start address of the range
+      control : the value for the actionpoint control (AC) aux register
+      length  : the length in bytes of the range
+      bpt     : the information describing the breakpoint (NULL for a watchpoint)
+
+   Returns 0 for success, -1 for failure.  */
+
+static int
+insert_range (ARC_RegisterContents   address,
+              ARC_RegisterContents   control,
+              unsigned int           length,
+              struct bp_target_info *bpt)
+{
+    /* At most 4 actionpoints can be connected (as a quad).  */
+    ARC_Address  actionpoint_value[MAX_ACTION_POINTS_IN_GROUP];
+    ARC_Word     actionpoint_mask [MAX_ACTION_POINTS_IN_GROUP];
+    unsigned int actionpoints_needed;
+
+    /* Work out how many actionpoints would be required to exactly cover the
+       given memory range.  */
+    actionpoints_needed = map_actionpoints(address,
+                                           length,
+                                           actionpoint_value,
+                                           actionpoint_mask);
+
+    if (actionpoints_needed == 1)
+        return insert_actionpoint(bpt,
+                                  length,
+                                  actionpoint_value[0],
+                                  actionpoint_mask[0],
+                                  control);
+
+    if (actionpoints_needed <= MAX_ACTION_POINTS_IN_GROUP)
+        return insert_actionpoint_group(length,
+                                        actionpoints_needed,
+                                        actionpoint_value,
+                                        actionpoint_mask,
+                                        control);
+
+    warning (_("break/watchpoint would require %u linked actionpoints, "
+               "but at most %u actionpoints may be linked together"),
+             actionpoints_needed, MAX_ACTION_POINTS_IN_GROUP);
+
+    return FAILURE;
+}
+
+
+/* Remove an actionpoint from a range of target memory.
+
+   Parameters:
+      address : the start address of the range
+      length  : the length in bytes of the range
+
+   Returns -1 for failure, 0 for success.  */
+
+static int
+remove_actionpoint (CORE_ADDR address, unsigned int length)
+{
+    unsigned int i;
+
+    /* Look at all the actionpoints.  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        if (IN_USE(actionpoint) && !actionpoint->is_exclude)
+        {
+            if (actionpoint->match_value == (ARC_RegisterContents) address &&
+                actionpoint->length      == length)
+            {
+                unsigned int points;
+                unsigned int p;
+
+                /* Is this the first of a pair or quad?  */
+                if ((actionpoint->control & AP_PAIR) != 0)
+                    points = 2;
+                else if ((actionpoint->control & AP_QUAD) != 0)
+                    points = 4;
+                else
+                    points = 1;
+
+//              DEBUG("points = %u\n", points);
+
+                for (p = 1; p < points; p++)
+                {
+                    ARC_ActionPoint *next = &actionpoints[(i + p) % num_actionpoints];
+
+                    if (clear_actionpoint_from_target (next))
+                        next->usage = NOT_IN_USE;
+                    else
+                        return FAILURE;
+                }
+
+                if (clear_actionpoint_from_target (actionpoint))
+                {
+                    actionpoint->usage = NOT_IN_USE;
+                    return SUCCESS;
+                }
+
+                break;
+            }
+        }
+    }
+
+    /* Failed: could not find actionpoint, or could not clear it.  */
+    return FAILURE;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*               local functions called from outside this module              */
+/* -------------------------------------------------------------------------- */
+
+/* Check if we can set a hardware watchpoint of type TYPE.  TYPE is
+   one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint, or
+   bp_hardware_breakpoint.  COUNT is the number of such watchpoints used so far
+   (including this one).  OTHERTYPE is the total number of hardware breakpoints
+   and watchpoints of other types that are "already" set (0 if type == bp_hardware_breakpoint).
+
+   Result:   0 if hardware watchpoints are not supported
+            -1 if there are not enough hardware watchpoints
+             1 if there are enough hardware watchpoints
+
+   N.B. this is not what is stated in target.h, but it does conform to the use
+        made of this function's result in breakpoint.c!  */
+
+static int
+arc_debug_can_use_hw_breakpoint (int type, int count, int othertype)
+{
+    ENTERARGS("type %d, count %d", type, count);
+
+    if (num_actionpoints == 0)
+        return 0;
+
+    /* N.B. this will sometimes give a "false positive" result, i.e. that there
+            sufficient actionpoints available when in fact there are not: the
+            ARC processor actionpoints can be used for all of the types, but gdb
+            assumes that there are separate sets of resources for breakpoints
+            and watchpoints, and when asking for a breakpoint does not give the
+            number of watchpoints "already" set.
+
+            It is not possible simply to check how many actionpoints are currently
+            set, as gdb does not actually set the breakpoints and watchpoints
+            until program execution is started or resumed - so when this function
+            is called, none are actually set.
+
+            Also, the breakpoints and watchpoints may require pairs or quads of
+            actionpoints, rather than single actionpoints, and this will not be
+            known until they are set, and their addresses and ranges are known!  */
+    return ((int) num_actionpoints >= count + othertype) ? 1 : -1;
+}
+
+
+/* Insert a hardware breakpoint on the target.
+   Returns 0 for success, -1 for failure.  */
+
+static int
+arc_debug_insert_hw_breakpoint (struct bp_target_info *bpt)
+{
+    ARC_RegisterContents control = AP_TARGET_INSTRUCTION_ADDRESS |
+                                   AP_TRANSACTION_TYPE_READ      |
+                                   AP_MODE_TRIGGER_IN_RANGE      |
+                                   AP_ACTION_BREAK;
+
+    ENTERARGS("0x%x : %u", (unsigned int) bpt->placed_address, bpt->range);
+
+    /* Is it a range breakpoint?  */
+    if (bpt->range)
+        return insert_range((ARC_RegisterContents) bpt->placed_address,
+                            control,
+                            bpt->range,
+                            bpt);
+
+    /* No, just a single-instruction breakpoint?  */
+    return insert_actionpoint(bpt,
+                              HW_BP_SIZE,
+                              (ARC_RegisterContents) bpt->placed_address,
+                              0,    /* All bits of address.  */
+                              control);
+}
+
+
+/* Remove a hardware breakpoint from the target.
+   Returns 0 for success, non-zero for failure.  */
+
+static int
+arc_debug_remove_hw_breakpoint (struct bp_target_info *bpt)
+{
+    unsigned int range = (bpt->range) ? bpt->range : HW_BP_SIZE;
+
+    ENTERARGS("0x%x : %u", (unsigned int) bpt->placed_address, range);
+
+    return remove_actionpoint(bpt->placed_address, range);
+}
+
+
+/* Insert a hardware watchpoint on the target.
+
+   Parameters:
+      addr  : the start address of the region of memory to be watched
+      length: the length in bytes of the region of memory
+      type  : 0 => write, 1 => read, 2 => read/write
+
+   Returns 0 for success, -1 for failure.  */
+
+static int
+arc_debug_insert_watchpoint (CORE_ADDR addr, int length, int type)
+{
+    ARC_RegisterContents control = AP_TARGET_LOAD_STORE_ADDRESS |
+                                   AP_MODE_TRIGGER_IN_RANGE     |
+                                   AP_ACTION_BREAK;
+
+    ENTERARGS("0x%08X:%d %d", (unsigned int) addr, length, type);
+
+    gdb_assert(length > 0);
+
+    switch (type)
+    {
+        case 0:
+            control |= AP_TRANSACTION_TYPE_WRITE;  break;
+        case 1:
+            control |= AP_TRANSACTION_TYPE_READ;   break;
+        case 2:
+            control |= AP_TRANSACTION_TYPE_ACCESS; break;
+        default:
+            internal_error (__FILE__, __LINE__, _("invalid watchpoint type: %d"), type);
+    }
+
+    return insert_range((ARC_RegisterContents) addr,
+                        control,
+                        (unsigned int) length,
+                        NULL);
+}
+
+
+/* Remove a hardware watchpoint from the target.
+
+   Parameters:
+      addr  : the start address of the region of memory being watched
+      length: the length in bytes of the region of memory
+      type  : 0 => write, 1 => read, 2 => read/write
+
+   Returns 0 for success, non-zero for failure.  */
+
+static int
+arc_debug_remove_watchpoint (CORE_ADDR addr, int length, int type)
+{
+    ENTERARGS("0x%x:%d %d", (unsigned int) addr, length, type);
+
+    return remove_actionpoint(addr, (unsigned int) length);
+}
+
+
+/* Returns non-zero if the execution of the target program has been stopped by
+   the trigger of a hardware watchpoint (i.e. on memory read or write), zero
+   otherwise.  */
+
+static int
+arc_debug_stopped_by_watchpoint (void)
+{
+    unsigned int i;
+
+    ENTERMSG;
+
+    /* Look at all of the actionpoints.  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        if (IN_USE(actionpoint) && actionpoint->triggered)
+        {
+            /* Is it a memory read or write actionpoint?  */
+            if ((actionpoint->control & AP_TARGET_LOAD_STORE_ADDRESS) != 0)
+            {
+                DEBUG("actionpoint %d (load/store) triggered\n", i);
+                return 1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+
+/* Get the address of the data that was read/written causing a h/w watchpoint to
+   trigger; the address is returned in the '*addr' parameter.
+   Returns 0 for failure, non-zero for success.  */
+
+static int
+arc_debug_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr)
+{
+    unsigned int i;
+
+    ENTERMSG;
+
+    /* Look at each of the actionpoints.  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        DEBUG("AP%u: in use = %d, triggered = %d\n", i, IN_USE(actionpoint), actionpoint->triggered);
+
+        /* If this actionpoint has been triggered.  */
+        if (IN_USE(actionpoint) && actionpoint->triggered)
+        {
+            /* Is it a memory read or write actionpoint?  */
+            if ((actionpoint->control & AP_TARGET_LOAD_STORE_ADDRESS) != 0)
+            {
+                DEBUG("actionpoint %d (load/store) triggered by access at 0x%08X\n", i, actionpoint->point);
+
+                /* OK, got the data address!  */
+                *addr = (CORE_ADDR) actionpoint->point;
+                return 1;
+            }
+        }
+    }
+
+   DEBUG("no watchpoint triggered\n");
+
+    return 0;
+}
+
+
+/* Can a h/w watchpoint 'length' bytes long be set at address 'addr' in target memory?  */
+
+static int
+arc_debug_region_ok_for_hw_watchpoint (CORE_ADDR addr, int length)
+{
+    /* As far as we know, we can set a h/w watchpoint anywhere!  */
+    return 1;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* This function is called after a reset of the target has been performed (which
+   clears all the aux registers associated with actionpoints).  It attempts to
+   restore all actionpoints to their pre-reset settings.
+
+   Returns TRUE if the actionpoints are restored, FALSE otherwise.  */
+
+Boolean
+arc_restore_actionpoints_after_reset (void)
+{
+    return (restore_actionpoints(FALSE) == SUCCESS);
+}
+
+
+/* If the debug target supports actionpoints, set up the function pointers in
+   the given target operations structure to point to the functions which
+   implement the associated operations.
+
+   Returns TRUE if actionpoints are supported, FALSE otherwise.  */
+
+Boolean
+arc_initialize_actionpoint_ops (struct target_ops *debug_ops)
+{
+    if (target_has_actionpoints())
+    {
+        debug_ops->to_can_use_hw_breakpoint       = arc_debug_can_use_hw_breakpoint;
+        debug_ops->to_insert_hw_breakpoint        = arc_debug_insert_hw_breakpoint;
+        debug_ops->to_remove_hw_breakpoint        = arc_debug_remove_hw_breakpoint;
+        debug_ops->to_insert_watchpoint           = arc_debug_insert_watchpoint;
+        debug_ops->to_remove_watchpoint           = arc_debug_remove_watchpoint;
+        debug_ops->to_stopped_by_watchpoint       = arc_debug_stopped_by_watchpoint;
+        debug_ops->to_stopped_data_address        = arc_debug_stopped_data_address;
+        debug_ops->to_region_ok_for_hw_watchpoint = arc_debug_region_ok_for_hw_watchpoint;
+
+        /* This is the default, but just to make it clear that watchpoints must
+           be cleared before execution can resume.  */
+        debug_ops->to_have_continuable_watchpoint = 0;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/* Display all the target actionpoints.  */
+
+void
+arc_display_actionpoints (void)
+{
+    unsigned int i;
+
+    char *targets[8] =
+    {
+        _("Instruction Address"),
+        _("Instruction Data"),
+        _("Load/Store Address"),
+        _("Load/Store Data"),
+        _("Aux Register Address"),
+        _("Aux Register Data"),
+        _("Ext Parameter 0"),
+        _("Ext Parameter 1")
+    };
+
+    char *transactions[4] =
+    {
+        _("disabled"),
+        _("write"),
+        _("read"),
+        _("read/write")
+    };
+
+    char *explanations[8] =
+    {
+        _("execution of instruction at address"),
+        _("execution of instruction"),
+        _("load or store of data at address"),
+        _("load or store of data"),
+        _("read or write of auxiliary register"),
+        _("read or write of auxiliary register contents"),
+        _("value"),
+        _("value")
+    };
+
+
+    /* Look at each of the actionpoints in turn.  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        if (IN_USE(actionpoint))
+        {
+            ARC_RegisterContents control = actionpoint->control;
+            const unsigned int   targ    = (control & AP_TARGET_MASK          ) >> AP_TARGET_SHIFT;
+            const unsigned int   trans   = (control & AP_TRANSACTION_TYPE_MASK) >> AP_TRANSACTION_TYPE_SHIFT;
+            const char          *target  = targets     [targ];
+            const char          *type    = transactions[trans];
+            const char          *mode    = ((control & AP_MODE_MASK) ==
+                                             AP_MODE_TRIGGER_OUTSIDE_RANGE) ? _("outside range") : _("in range");
+            const char          *action  = ((control & AP_ACTION_MASK) ==
+                                             AP_ACTION_BREAK) ? _("break") : _("raise exception");
+            const char          *usage;
+
+            switch (actionpoint->usage)
+            {
+                case SINGLE: usage = _("         "); break;
+                case PAIR_0: usage = _(" (Pair 0)"); break;
+                case PAIR_1: usage = _(" (Pair 1)"); break;
+                case QUAD_0: usage = _(" (Quad 0)"); break;
+                case QUAD_1: usage = _(" (Quad 1)"); break;
+                case QUAD_2: usage = _(" (Quad 2)"); break;
+                case QUAD_3: usage = _(" (Quad 3)"); break;
+                default:
+                    internal_error (__FILE__, __LINE__, _("invalid AP usage: %u"), actionpoint->usage);
+                    return;
+            }
+
+            printf_filtered(_("AP %u%s :: "), i, usage);
+
+            printf_filtered(                     _("value    : %08X\n"),                 actionpoint->match_value);
+            printf_filtered(    _("                 mask     : %08X\n"),                 actionpoint->match_mask);
+            if ((control & AP_TRANSACTION_TYPE_MASK) == AP_TRANSACTION_TYPE_DISABLED)
+                printf_filtered(_("                 control  : %08X disabled\n"),        actionpoint->control);
+            else
+                printf_filtered(_("                 control  : %08X %s, %s on %s %s\n"), actionpoint->control, target, action, type, mode);
+            if (actionpoint->triggered)
+            {
+                const char *explain = explanations[targ];
+
+                printf_filtered(_("                 triggered by %s %08x\n"), explain,   actionpoint->point);
+            }
+        }
+        else
+        {
+            printf_filtered(_("AP %u          :: not in use\n"), i);
+        }
+    }
+}
+
+
+/* This function is called as soon as execution of the target program has halted.
+   It checks whether the halt is due to an actionpoint trigger, and, if so,
+   identifies the actionpoint that has been triggered and finds the address (code
+   or data) at which memory access (read, write or execute) has caused the trigger.  */
+
+void
+arc_target_halted (void)
+{
+    ARC_RegisterContents debug;
+
+    ENTERMSG;
+
+    if (arc_read_jtag_aux_register(arc_debug_regnum, &debug, TRUE))
+    {
+        /* If the bit indicating that an actionpoint has halted the processor is
+           set.  */
+        if ((debug & DEBUG_ACTIONPOINT_HALT) != 0)
+        {
+            /* Get the Actionpoints Status Register from the DEBUG register:
+               this contains one bit for each actionpoint in the processor
+               configuration.  */
+            unsigned int ASR = (debug & DEBUG_ACTIONPOINT_STATUS) >>
+                                DEBUG_ACTIONPOINT_STATUS_SHIFT;
+            unsigned int i;
+
+            /* Now look at each of the actionpoints.  */
+            for (i = 0; i < num_actionpoints; i++)
+            {
+                ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+                actionpoint->triggered = FALSE;
+
+                /* Is the ASR bit for this actionpoint set?  */
+                if ((ASR & 1) != 0)
+                {
+                    if (IN_USE(actionpoint))
+                    {
+                        actionpoint->triggered = TRUE;
+
+                        /* The AMV register for this action point has been
+                           updated with the address to which access has caused
+                           the actionpoint to trigger.  */
+                        (void) arc_read_jtag_aux_register(ARC_HW_AMV_REGNUM(AP_INSTANCE(actionpoint)),
+                                                          &actionpoint->point,
+                                                          TRUE);
+                    }
+                    else
+                        internal_error (__FILE__, __LINE__, _("actionpoint %u triggered but not set"), i);
+                }
+
+                ASR >>= 1;
+            }
+        }
+    }
+}
+
+
+/* For debugging - just give the values.  */
+
+void
+arc_dump_actionpoints (const char *message)
+{
+    unsigned int i;
+
+    DEBUG("%s\n", message);
+
+    /* Look at each of the actionpoints in turn.  */
+    for (i = 0; i < num_actionpoints; i++)
+    {
+        ARC_ActionPoint *actionpoint = &actionpoints[i];
+
+        DEBUG("slot %u:: ", i);
+
+        if (IN_USE(actionpoint))
+        {
+            DEBUG(         "value    : %08X\n", actionpoint->match_value);
+            DEBUG("         mask     : %08X\n", actionpoint->match_mask);
+            DEBUG("         control  : %08X\n", actionpoint->control);
+            DEBUG("         triggered: %u\n",   actionpoint->triggered);
+            DEBUG("         point    : %08x\n", actionpoint->point);
+        }
+        else
+        {
+            DEBUG("not in use\n");
+        }
+    }
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-jtag-actionpoints.h b/gdb/arc-jtag-actionpoints.h
new file mode 100644
index 0000000..741d869
--- /dev/null
+++ b/gdb/arc-jtag-actionpoints.h
@@ -0,0 +1,68 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines the interface to hardware actionpoints in the */
+/*     ARC processor.                                                         */
+/*                                                                            */
+/* Usage:                                                                     */
+/*     Once the connection to the target has been established, the function   */
+/*     arc_initialize_actionpoint_ops should be called: this will update the  */
+/*     debug_ops structure according to the support provided by the ARC       */
+/*     processor in the target for hardware breakpoints and watchpoints.      */
+/*                                                                            */
+/*     The function arc_restore_actionpoints_after_reset should be called     */
+/*     after the target board has been reset, in order to re-establish any    */
+/*     actionpoints that have been set, as they will have been cleared by     */
+/*     the reset; it returns TRUE if successful.                              */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_JTAG_ACTIONPOINTS_H
+#define ARC_JTAG_ACTIONPOINTS_H
+
+/* gdb header files */
+#include "defs.h"
+#include "target.h"
+
+/* ARC header files */
+#include "arc-support.h"
+
+
+Boolean arc_initialize_actionpoint_ops (struct target_ops *debug_ops);
+
+Boolean arc_restore_actionpoints_after_reset (void);
+
+void arc_target_halted (void);
+
+void arc_display_actionpoints (void);
+
+
+/* For debugging.  */
+void arc_dump_actionpoints (const char *message);
+
+#endif /* ARC_JTAG_ACTIONPOINTS_H */
+/******************************************************************************/
diff --git a/gdb/arc-jtag-ops.c b/gdb/arc-jtag-ops.c
index 0a237f6..54631b9 100644
--- a/gdb/arc-jtag-ops.c
+++ b/gdb/arc-jtag-ops.c
@@ -1,1229 +1,1496 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
-   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+   Contributed by ARC International (www.arc.com)
 
-   Authors: 
-      Sameer Dhavale <sameer.dhavale@codito.com>
-      Soam Vasani <soam.vasani@codito.com>
+   Author:
+      Sameer Dhavale  <sameer.dhavale@codito.com>
+      Soam Vasani     <soam.vasani@codito.com>
+      Richard Stuckey <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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.  
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements debug access to an ARC processor via its JTAG   */
+/*     interface.                                                             */
+/*                                                                            */
+/*     See                                                                    */
+/*           ARCompact Instruction Set Architecture                           */
+/*              Programmer's Reference    (5115-018)                          */
+/*                                                                            */
+/*           for a description of ARC processor architecture (in particular   */
+/*           the auxiliary registers and the halting procedure);              */
+/*                                                                            */
+/*           ARC 700 External Interfaces                                      */
+/*              Reference                 (5117-013)                          */
+/*                                                                            */
+/*           for a description of the JTAG interface (in particular the Test  */
+/*           Access Port Controller (TAPC) state machine).                    */
+/*                                                                            */
+/*     The JTAG interface is accessed by three parallel ports: control, data  */
+/*     and status.  Data is read from or written to these ports one byte at a */
+/*     at a time, using a GPIO (General Purpose Input/Output) driver.         */
+/*                                                                            */
+/*     The TDI and TMS signals are written to the data port.                  */
+/*     The TCK signal is written to the control port.                         */
+/*     The TDO signal is read from the status port.                           */
+/*                                                                            */
+/* Host/Target Byte Order:                                                    */
+/*     The core and auxiliary register contents read from or written to the   */
+/*     JTAG interface are ALWAYS in little-endian format, regardless of the   */
+/*     endianness of the target processor.                                    */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
 #include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
+#include <string.h>
 #include <errno.h>
-#include <sys/io.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <assert.h>
+#include <unistd.h>
+#include <byteswap.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "gdb_assert.h"
+
+/* ARC header files */
+#include "arc-gpio.h"
+#include "arc-jtag.h"
 #include "arc-jtag-ops.h"
-#include "gpio.h"
-#include <signal.h>
-#include <defs.h>
-#include <sys/ioctl.h>
-#include "arc-tdep.h"
-#define printf printf_filtered
+#include "arc-support.h"
 
 
-unsigned int arcjtag_retry_count = 50;
+/* -------------------------------------------------------------------------- */
+/*                        conditional compilation flags                       */
+/* -------------------------------------------------------------------------- */
+
+/* We would really like to optimise the use of the JTAG Data Register by
+   loading a word into it only if that word differs from the last word loaded;
+   but there seems to be undocumented behaviour of the JTAG mechanism in that
+   the Data Register is altered after a write operation! See ARC Bug #93814.  */
+#define JTAG_DATA_REGISTER_IS_CORRUPTED_BY_WRITE
+
+/* Define this if you wish to check the whether the contents of the JTAG Data
+   Register are corrupted by write operations. */
+//#define CHECK_JTAG_DATA_REGISTER
+
+/* Define this if you wish to perform low-level debugging of the JTAG state
+   machine emulated in this module (this should not be necessary).  */
+//#define STATE_MACHINE_DEBUG
 
 
-/* ------------------------------------ */
-/*         For ARC jtag Cable           */
-/*                                      */
-/* Pin no.  Signal           Word , Bit */
-/*                                      */
-/* - 	    TRST 	                */
-/* 8 	    TMS 	     Data 6     */
-/* 1 	    TCK 	     Control 0  */
-/* 9 	    TDI 	     Data 7     */
-/* 13 	    TDO 	     Status 4   */
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+/* Sizes of quantities.  */
+#define BITS_IN_COMMAND_CODE     4
+#define BITS_IN_REGISTER_CODE    4
 
 
-#define JTAG_TRST 0x00  /* not there */
-#define JTAG_TMS  0x40  /* data port */
-#define JTAG_TCK  0x01  /* control port. Driven Low. */
-
-#define JTAG_TDI  0x80  /* data port */
-#define JTAG_TDO  0x10  /* status port */
-
-/* ------------------------------------ */
-
-/* */
-#define A4_HALT_VALUE 0x02000000
-#define ARC700_HALT_VALUE 0x1
+typedef unsigned int Bit;    /* Only LSB of word is used.  */
+typedef unsigned int JTAG_RegisterContents;
 
 
-/* Parallel port i/o addr. (LPT1) */
-#define DATA_PORT    0x378
-#define STATUS_PORT  0x379
-#define CONTROL_PORT 0x37A
-
-
-unsigned char tapc_dataport=0, tapc_statusport=0, tapc_controlport=0x1;
-int fd;
-struct GPIO_ioctl jtag_ioctl;
-sigset_t block_mask;
-
-enum AA3SSPinState
-  {
-    READ_FROM_AA3 = 0,
-    WRITE_TO_AA3 = 1
-  };
-enum AA3SSPinState rw_flag; 
-
-
-
-struct jtag_ops arc_jtag_ops;
-static enum ARCProcessorVersion ARCProcessor = UNSUPPORTED;
-
-
-/* Sanity check to give error if jtag is not opened at all. */
-
-static void 
-check_and_raise_error_if_jtag_closed (void)
+typedef enum
 {
-  if( arc_jtag_ops.jtag_status == JTAG_CLOSED )
-    error ("JTAG connection is closed. Use target arcjtag first\n");
-}
+    MSB_FIRST,
+    MSB_LAST
+} Order;
 
 
-/* Initializations for GPIO interface */
-static int
-gpio_setup (void)
+typedef enum
 {
-  fd=open("//dev//gpio",O_RDWR);
-  ioctl(fd,GPIO_IOC_HARDRESET);
-  ioctl(fd,GPIO_IOC_SET_PORT_BASE,0x378);
-  jtag_ioctl.inlen=0;
-  jtag_ioctl.outlen=0;
-  jtag_ioctl.inbuf=(unsigned char *)xmalloc(2*sizeof(unsigned char));
-  jtag_ioctl.outbuf=(unsigned char *)xmalloc(2*sizeof(unsigned char));
-  return 0;
-}
+    Memory,
+    Register
+} JTAG_TransactionType;
 
-void gpio_write(unsigned int port, unsigned char *data)
+
+typedef enum
 {
-    jtag_ioctl.inlen=2;
-    jtag_ioctl.inbuf[1]=*data;
-    switch(port)
+    STALLED,
+    FAILURE,
+    READY,
+    NOT_READY
+} JTAG_TransactionStatus;
+
+
+/* Only these JTAG registers are currently used.  */
+typedef enum
+{
+    JTAG_STATUS_REGISTER              = 0x8,
+    JTAG_TRANSACTION_COMMAND_REGISTER = 0x9,
+    JTAG_ADDRESS_REGISTER             = 0xA,
+    JTAG_DATA_REGISTER                = 0xB,
+} JTAG_Register;
+
+
+#ifdef STATE_MACHINE_DEBUG
+typedef enum
+{
+    UNDEFINED,
+    TEST_LOGIC_RESET,
+    RUN_TEST_IDLE,
+    SELECT_DR_SCAN,
+    CAPTURE_DR,
+    SHIFT_DR,
+    EXIT1_DR,
+    PAUSE_DR,
+    EXIT2_DR,
+    UPDATE_DR,
+    SELECT_IR_SCAN,
+    CAPTURE_IR,
+    SHIFT_IR,
+    EXIT1_IR,
+    PAUSE_IR,
+    EXIT2_IR,
+    UPDATE_IR,
+    NUMBER_OF_STATES    /* An end-marker, not a state.  */
+} JTAG_ControllerState;
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+/* -------------------------------------- */
+/*         For ARC JTAG Cable             */
+/*                                        */
+/* Pin no.  Signal         Port       Bit */
+/*                                        */
+/* - 	    TRST 	                  */
+/* 8 	    TMS 	   Data       6   */
+/* 1 	    TCK 	   Control    0   */
+/* 9 	    TDI 	   Data       7   */
+/* 13 	    TDO 	   Status     4   */
+/* -------------------------------------- */
+
+/* Bit masks for signals written to parallel ports.  */
+
+#define JTAG_TRST 0          /* not there                    */
+#define JTAG_TMS  (1 << 6)   /* on Data port                 */
+#define JTAG_TCK  (1 << 0)   /* on Control port (driven low) */
+#define JTAG_TDI  (1 << 7)   /* on Data port                 */
+#define JTAG_TDO  (1 << 4)   /* on Status port               */
+
+
+/* Commands which can be written to the JTAG Transaction Command Register.  */
+#define WRITE_MEMORY_LOCATION   0x0
+#define WRITE_CORE_REGISTER     0x1
+#define WRITE_AUX_REGISTER      0x2
+#define NOP                     0x3
+#define READ_MEMORY_LOCATION    0x4
+#define READ_CORE_REGISTER      0x5
+#define READ_AUX_REGISTER       0x6
+
+
+/* Gives the endianness of the target processor.  */
+static Boolean target_is_big_endian;
+
+/* These accumulate the bit masks to be written to the data and control ports.  */
+static Byte data_port_value, control_port_value;
+
+/* Variables for tracking the contents of the JTAG Address and Transaction
+   Command registers.  */
+static JTAG_RegisterContents address_register_contents;
+static JTAG_RegisterContents command_register_contents;
+static Boolean               address_register_contents_known;
+static Boolean               command_register_contents_known;
+
+
+#ifdef STATE_MACHINE_DEBUG
+/* This table encodes all possible transitions of the JTAG Test Access Port
+   (TAP) Controller State Machine: for each state, the transition to one of two
+   possible next states is determined by whether a 0 bit or a 1 bit is written
+   as the JTAG TMS interface signal.  */
+static const JTAG_ControllerState transitions[NUMBER_OF_STATES][2] =
+{
+/*                              0              1           */
+/*  UNDEFINED         */  { UNDEFINED,     UNDEFINED        },
+/*  TEST_LOGIC_RESET  */  { RUN_TEST_IDLE, TEST_LOGIC_RESET },
+/*  RUN_TEST_IDLE     */  { RUN_TEST_IDLE, SELECT_DR_SCAN   },
+/*  SELECT_DR_SCAN    */  { CAPTURE_DR,    SELECT_IR_SCAN   },
+/*  CAPTURE_DR        */  { SHIFT_DR,      EXIT1_DR         },
+/*  SHIFT_DR          */  { SHIFT_DR,      EXIT1_DR         },
+/*  EXIT1_DR          */  { PAUSE_DR,      UPDATE_DR        },
+/*  PAUSE_DR          */  { PAUSE_DR,      EXIT2_DR         },
+/*  EXIT2_DR          */  { SHIFT_DR,      UPDATE_DR        },
+/*  UPDATE_DR         */  { RUN_TEST_IDLE, SELECT_DR_SCAN   },
+/*  SELECT_IR_SCAN    */  { CAPTURE_IR,    TEST_LOGIC_RESET },
+/*  CAPTURE_IR        */  { SHIFT_IR,      EXIT1_IR         },
+/*  SHIFT_IR          */  { SHIFT_IR,      EXIT1_IR         },
+/*  EXIT1_IR          */  { PAUSE_IR,      UPDATE_IR        },
+/*  PAUSE_IR          */  { PAUSE_IR,      EXIT2_IR         },
+/*  EXIT2_IR          */  { SHIFT_IR,      UPDATE_IR        },
+/*  UPDATE_IR         */  { RUN_TEST_IDLE, SELECT_DR_SCAN   },
+};
+
+/* The current state of the TAP Controller State Machine.  */
+static JTAG_ControllerState current_state = UNDEFINED;
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* This structure holds the operations and data exported by this module.  */
+JTAG_Operations arc_jtag_ops;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#ifdef DEBUG
+#undef DEBUG
+#endif
+
+#define DEBUG(...) \
+    if (arc_jtag_ops.state_machine_debug) fprintf_unfiltered(gdb_stdlog, __VA_ARGS__)
+
+
+#ifdef STATE_MACHINE_DEBUG
+#define SET_STATE(s)                  set_state(s)
+#define NEXT_STATE(b)                 next_state(b)
+#define CHANGE_STATE(x, s)            change_state(x, s)
+#define STATE_IS(s)                   gdb_assert(current_state == s)
+#define STATE_IS_EITHER(s1, s2)       gdb_assert(current_state == s1 || \
+                                                 current_state == s2)
+#define STATE_IS_ONE_OF(s1, s2, s3)   gdb_assert(current_state == s1 || \
+                                                 current_state == s2 || \
+                                                 current_state == s3)
+#else
+#define SET_STATE(s)
+#define NEXT_STATE(b)
+#define CHANGE_STATE(x, s)            tapc_TMS(x)
+#define STATE_IS(s)
+#define STATE_IS_EITHER(s1, s2)
+#define STATE_IS_ONE_OF(s1, s2, s3)
+#endif
+
+
+#define IS_WORD_ALIGNED(addr)         ((addr) % BYTES_IN_WORD == 0)
+#define BYTE(val)                     (Byte) ((val) & 0xFF)
+
+/* This is more efficient than memcpy(to, from, BYTES_IN_WORD).  */
+#define COPY_WORD(to, from)           { ((Byte*) to)[0] = ((Byte*) from)[0]; \
+                                        ((Byte*) to)[1] = ((Byte*) from)[1]; \
+                                        ((Byte*) to)[2] = ((Byte*) from)[2]; \
+                                        ((Byte*) to)[3] = ((Byte*) from)[3]; }
+
+
+/* -------------------------------------------------------------------------- */
+/*                               forward declarations                         */
+/* -------------------------------------------------------------------------- */
+
+static void tapc_TMS (Bit x);
+static void set_interface (JTAG_Status status);
+static void interface_is_closed (void);
+static JTAG_RegisterContents read_jtag_reg (JTAG_Register regnum,
+                                            unsigned int  num_data_bits);
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------------- */
+/* 1)                            debug functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Debug function.  */
+
+static const char*
+JTAG_register_name (JTAG_Register r)
+{
+    switch (r)
     {
-    case DATA_PORT:
-	jtag_ioctl.inbuf[0]=0;
-	break;
-
-    case STATUS_PORT:
-	jtag_ioctl.inbuf[0]=1;
-	break;
-
-    case CONTROL_PORT:
-	jtag_ioctl.inbuf[0]=2;
-	break;
-	    
-    default:
-	error("Invalid port\n");
+        case JTAG_STATUS_REGISTER              : return "Status";
+        case JTAG_TRANSACTION_COMMAND_REGISTER : return "Transaction Command";
+        case JTAG_ADDRESS_REGISTER             : return "Address";
+        case JTAG_DATA_REGISTER                : return "Data";
+        default: internal_error(__FILE__, __LINE__,  _("invalid JTAG register %d"), r);
     }
-
- 
-    if(ioctl(fd,GPIO_IOC_DO_IO,&jtag_ioctl))
-	error("Failure writing to port 0x%x\n",port);
-
 }
 
 
-unsigned char gpio_read(unsigned int port)
-{
-    //jtag_ioctl.inbuf[1]=tapc_statusport;
-    jtag_ioctl.inlen=2;
-    jtag_ioctl.outlen=1;
+/* Debug function.  */
 
-    switch(port)
+static const char*
+JTAG_TransactionStatus_Image (JTAG_TransactionStatus value)
+{
+    switch (value)
     {
-    case DATA_PORT:
-	jtag_ioctl.inbuf[0]=0x80;
-	break;
-
-    case STATUS_PORT:
-	jtag_ioctl.inbuf[0]=0x81;
-	break;
-
-    case CONTROL_PORT:
-	jtag_ioctl.inbuf[0]=0x82;
-	break;
-	    
-    default:
-	error("Invalid port\n");
+        case STALLED  : return "STALLED";
+        case FAILURE  : return "FAILURE";
+        case READY    : return "READY";
+        case NOT_READY: return "NOT READY";
+        default: internal_error(__FILE__, __LINE__,  _("invalid JTAG transaction status %d"), value);
     }
-    
-    if(ioctl(fd,GPIO_IOC_DO_IO,&jtag_ioctl))
-	error("Failure reading from port 0x%x\n",port);
-	  
-    return jtag_ioctl.outbuf[0];
-
-
-}
-
-/* Helper functions for setting
-   TMS / TCK / TDI. Valid inputs
-   are 1 and 0. The tapc_<tms/tck/tdi> 
-   functions set the internal values 
-   to be written out to the port. The 
-   final values are written only by doing 
-   the pulse.
- */
-
-static void
-tapc_set_tms (char x)
-{
-    if(x)
-	tapc_dataport |= JTAG_TMS;
-    else
-	tapc_dataport &= ~JTAG_TMS;
-
-    /* outb(tapc_dataport, DATA_PORT); */
-    gpio_write(DATA_PORT,&tapc_dataport);
 }
 
 
-/* Set TCK. */
-static void
-tapc_set_tck (char x)
+#ifdef STATE_MACHINE_DEBUG
+/* Debug function.  */
+
+static const char*
+JTAG_ControllerState_Image (JTAG_ControllerState state)
 {
-  /* active low. The clock is active low. */
-    if(!x) 
-  	tapc_controlport |= JTAG_TCK;
+    switch (state)
+    {
+        case UNDEFINED       : return "<undefined>     ";
+        case TEST_LOGIC_RESET: return "Test-Logic-Reset";
+        case RUN_TEST_IDLE   : return "Run-Test/Idle   ";
+        case SELECT_DR_SCAN  : return "Select-DR-Scan  ";
+        case CAPTURE_DR      : return "Capture-DR      ";
+        case SHIFT_DR        : return "Shift-DR        ";
+        case EXIT1_DR        : return "Exit1-DR        ";
+        case PAUSE_DR        : return "Pause-DR        ";
+        case EXIT2_DR        : return "Exit2-DR        ";
+        case UPDATE_DR       : return "Update-DR       ";
+        case SELECT_IR_SCAN  : return "Select-IR-Scan  ";
+        case CAPTURE_IR      : return "Capture-IR      ";
+        case SHIFT_IR        : return "Shift-IR        ";
+        case EXIT1_IR        : return "Exit1-IR        ";
+        case PAUSE_IR        : return "Pause-IR        ";
+        case EXIT2_IR        : return "Exit2-IR        ";
+        case UPDATE_IR       : return "Update-IR       ";
+        default              : return "<invalid>       ";
+    }
+}
+#endif
+
+
+#ifdef CHECK_JTAG_DATA_REGISTER
+/* Read back the contents of the JTAG Data Register, and check that the value
+   is what is expected, i.e. the last value that was written to that register.  */
+
+static void
+check_Data_Register (ARC_Word expected)
+{
+    /* Read the data from the JTAG Data Register.  */
+    ARC_Word actual = (ARC_Word) read_jtag_reg(JTAG_DATA_REGISTER, BITS_IN_WORD);
+
+    /* Is the data still in the register?  */
+    if (actual != expected)
+        warning(_("JTAG Data Register: expected = %08X, actual = %08X\n"), expected, actual);
     else
-	tapc_controlport &= ~JTAG_TCK;
-    
-    if(rw_flag == READ_FROM_AA3)
-      tapc_controlport |= 0x4; 
+        printf_unfiltered(_("word %08X is still in JTAG Data Register\n"), expected);
+}
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/* 2)            helper functions for setting TMS / TCK / TDI                 */
+/* -------------------------------------------------------------------------- */
+
+/* These functions set the accumulated values to be written out to the ports.
+   The final values are written only by doing the pulse, e.g. if TDI and TMS
+   are set/unset by subsequent calls, the last GPIO write operation performed
+   by those calls before the pulse writes the accumulated bit mask value to
+   the port (overwriting the values written by the preceding calls), and it
+   is this bit mask that is significant when the JTAG is clocked.  */
+
+static void
+tapc_set_TMS (Bit x)
+{
+    Byte current_value = data_port_value;
+
+    if (x)
+        data_port_value |=  JTAG_TMS;
     else
-      tapc_controlport &= ~(0x4); 
-      
-    /* outb(tapc_controlport, CONTROL_PORT); */
-    gpio_write(CONTROL_PORT,&tapc_controlport);
+        data_port_value &= ~JTAG_TMS;
+
+    if (data_port_value != current_value)
+        gpio_write(DATA_PORT, data_port_value);
 }
 
 
 static void
-tapc_set_tdi (char x)
+tapc_set_TDI (Bit x)
 {
-    if(x)
-	tapc_dataport |= JTAG_TDI;
+    Byte current_value = data_port_value;
+
+    if (x)
+        data_port_value |=  JTAG_TDI;
     else
-	tapc_dataport &= ~JTAG_TDI;
-    
-    /* outb(tapc_dataport, DATA_PORT); */
-    gpio_write(DATA_PORT,&tapc_dataport);
+        data_port_value &= ~JTAG_TDI;
+
+    if (data_port_value != current_value)
+        gpio_write(DATA_PORT, data_port_value);
 }
 
-/* Unused function clockdelay. Why not add a command
- that allows the user to set the clock delay ? */
 
 static void
-clockdelay (void)
+tapc_set_TCK (Bit x)
 {
-    int i;
-    //for (i=0; i<10; ++i)
-    
-    //   usleep(0);
+    /* The clock is active low.  */
+    if (x)
+        control_port_value &= ~JTAG_TCK;
+    else
+        control_port_value |=  JTAG_TCK;
+
+    gpio_write(CONTROL_PORT, control_port_value);
 }
 
-/* Clock the JTAG on the ARC platform. */
+
+/* -------------------------------------------------------------------------- */
+/* 3)                   JTAG state machine handlers                           */
+/* -------------------------------------------------------------------------- */
+
+#ifdef STATE_MACHINE_DEBUG
+/* Debug function. Perform a state change to the given state.  */
+
+static void
+set_state (JTAG_ControllerState new_state)
+{
+    DEBUG("TAPC state: %s ====> %s\n",
+           JTAG_ControllerState_Image(current_state),
+           JTAG_ControllerState_Image(new_state));
+
+    current_state = new_state;
+
+    gdb_assert(current_state != UNDEFINED);
+}
+
+
+/* Debug function. Perform a state change from the current state according to
+   the transition specified by the given bit.  */
+
+static void
+next_state (Bit x)
+{
+    current_state = (transitions[current_state][x]);
+}
+
+
+/* Debug function. Perform a state change from the current state according to
+   the transition specified by the given bit, and check that the new state is
+   as expected.  */
+
+static void
+change_state (Bit x, JTAG_ControllerState new_state)
+{
+    tapc_TMS(x);
+
+    gdb_assert(current_state == new_state);
+}
+#endif /* STATE_MACHINE_DEBUG */
+
+
+/* Clock the JTAG on the ARC platform.  */
+
 static void
 tapc_pulse (void)
 {
-    /* Control 0 bit is active low */
-    unsigned char temp;
-    assert( (tapc_controlport & JTAG_TCK) );  // clock should be zero on entry
-   
-    /* outb(tapc_controlport & ~JTAG_TCK, CONTROL_PORT); */
-    temp = tapc_controlport & ~JTAG_TCK;
-    gpio_write(CONTROL_PORT,&temp);
-   /*  outb(tapc_controlport, CONTROL_PORT); */
-    gpio_write(CONTROL_PORT,&tapc_controlport);
-    
+    /* TCK control bit is active low.  */
+    gdb_assert((control_port_value & JTAG_TCK) != (Byte) 0);  /* Clock should be zero on entry.  */
+
+    gpio_write(CONTROL_PORT, control_port_value & ~JTAG_TCK);
+    gpio_write(CONTROL_PORT, control_port_value);
 }
 
-/* All the JTAG state machine handlers.  */
 
-/* Reset the TAPC controller on the JTAG. 
- */
+/* Reset the TAP Controller on the JTAG. */
+
 static void
 tapc_reset (void)
 {
-    /* from any state, these many ones should get us into "test-logic reset" 
-     */
-    tapc_set_tms(1);
-    tapc_set_tck(0);  /* want rising edge */
+    ENTERMSG;
+
+    /* The Test Clock signal is active low (i.e. the signal is active when the
+       corresponding bit written to the control bit is 0; so initialize the bit
+       in the control port value to 1 so that the signal is initially not active.  */
+    control_port_value = (Byte) JTAG_TCK;
+    data_port_value    = (Byte) 0;
+
+    /* From any state, this many TCK pulses should get the controller into state
+       Test-Logic-Reset.  */
+    tapc_set_TMS(1);
+    tapc_set_TCK(0);  /* We want the rising edge.  */
     tapc_pulse();
     tapc_pulse();
     tapc_pulse();
     tapc_pulse();
     tapc_pulse();
     tapc_pulse();
+
+    SET_STATE(TEST_LOGIC_RESET);
+
+    DEBUG("TAPC has been reset\n");
+
+    /* The reset has re-initialized all the JTAG registers.  */
+    address_register_contents_known = FALSE;
+    command_register_contents_known = FALSE;
+
+    CHANGE_STATE(0, RUN_TEST_IDLE);
+
+    LEAVEMSG;
 }
 
-/* Set the tms to the value of the bit and 
-   clock the jtag. */
+
+/* Set the TMS to the value of the bit and clock the JTAG.
+   This will cause the TAP Controller State Machine to move to another state.  */
 
 static void
-tapc_tms (char x)
+tapc_TMS (Bit x)
 {
-    tapc_set_tms(x);
+    tapc_set_TMS(x);
     tapc_pulse();
-}
-
-/* Read bit from the TDO of the JTAG. */
-static char
-tapc_readbit (void)
-{
-    if(gpio_read(STATUS_PORT) & JTAG_TDO)
-	return 1; 
-    else
-	return 0;
+    NEXT_STATE(x);
 }
 
 
-/* Interface functions that use the below mentioned 
-   JTAG state machine handler functions. 
-*/
+/* Read a bit from the TDO of the JTAG.  */
 
-/* Shift one bit out on the JTAG TDI. */
-static char
-tapc_shiftbit (char x)
+static Bit
+tapc_readTDO (void)
 {
-    char read;
+    Byte byte = gpio_read(STATUS_PORT);
 
-    //printf("tapc_shiftbit: Shifted %d\n", x);
+    /* Read from the status port.  */
+    return ((byte & JTAG_TDO) != (Byte) 0) ? (Bit) 1 : (Bit) 0;
+}
 
-    read = tapc_readbit();    
-    tapc_set_tdi(x);
+
+/* -------------------------------------------------------------------------- */
+/* 4)  interface functions that use the JTAG state machine handler functions  */
+/* -------------------------------------------------------------------------- */
+
+/* Shift one bit out on the JTAG TDO and one bit in on the JTAG TDI.  */
+
+static Bit
+tapc_shift_bit (Bit out)
+{
+    Bit in = tapc_readTDO();
+
+    tapc_set_TDI(out);
     tapc_pulse();
 
-    return read;
+//  DEBUG("%u (out) >>> %u (in)\n", out, in);
+
+    return in;
 }
 
 
-/*
- * Shift N bits from to_write into TDI, and out from TDO into read.
- *
- * If msb_first=0, shift LSB first, starting from to_write[0], to_write[1],
- * etc.
- 
- * If msb_first=1, shift to_write[-1] MSB first, then to_write[-2] etc.
- *
- * Must be called in Shift DR/IR state.
- * Leaves in Exit1 DR/IR state.
- */ 
+/* Shift N bits from to_write into TDI, and out from TDO into to_read.
+
+   If order == MSB_LAST, shift LSB first, starting from to_write[0], to_write[1],
+   etc.
+
+   If order == MSB_FIRST, shift to_write[N-1] MSB first, then to_write[N-2] etc.
+
+   Must be called in Shift DR/IR state.
+   Leaves in Exit1-DR/IR state.  */
+
 static void
-tapc_shiftnbits (int n, 
-		unsigned char *to_write, 
-		unsigned char *read, 
-		char msb_first)
+tapc_shift_N_bits (unsigned int n,
+                   Byte        *to_write,
+                   Byte        *to_read,
+                   Order        order)
 {
-    unsigned char outbyte, inbyte;
-    int nbytes = (n-1)/8 + 1,limit=8;
-    int i, j;
+    unsigned int nbytes = (n - 1) / BITS_IN_BYTE + 1;
+    unsigned int nbits  = BITS_IN_BYTE;
+    unsigned int i, j;
 
-    for(i=0; i < nbytes; ++i)
+    ENTERARGS("shift %u bits", n);
+
+    STATE_IS_EITHER(SHIFT_DR, SHIFT_IR);
+
+    for (i = 0; i < nbytes; i++)
     {
-	if(msb_first)
-	    outbyte = to_write[-1-i];
-	else	   
-	    outbyte = to_write[i];
+        Boolean is_last_byte = (i == nbytes - 1);
+        Byte    inbyte       = (Byte) 0;
+        Byte    outbyte;
 
-	inbyte = 0;
-	/* should write a maximum of 8 bits */
-	if(i == nbytes-1)
-	    limit = ((n-1) % 8) + 1;  
-	
-	for(j = 0; j < limit; ++j)
-	{
-	    unsigned char outbit, inbit;
+        if (order == MSB_FIRST)
+            outbyte = to_write[nbytes - 1 - i];
+        else
+            outbyte = to_write[i];
 
-	    if(msb_first)
-		outbit = !!(outbyte & 0x80);
-	    else
-		outbit = outbyte & 1;
-	    /* the last bit of the last byte */
-	    /* transition to EXIT-1 state before last bit */
-	    if((i == nbytes-1)&&(j == limit-1)) 
-	      tapc_set_tms(1); 
-	    
-	    inbit = tapc_shiftbit(outbit);
+        if (is_last_byte)
+        {
+            /* How many significant bits are in this byte?  */
+            nbits = ((n - 1) % BITS_IN_BYTE) + 1;
+        }
 
-	    if(msb_first)
-	      {
-		inbyte |= (inbit << (7-j));
-		outbyte <<= 1;
-	      }
-	    else
-	      {
-		inbyte |= inbit << j;
-		outbyte >>= 1;
-	    }
-	}
+        /* gdb_assert (nbits <= BITS_IN_BYTE); */
 
-	//tapc_tms(1);
-	if(msb_first)
-	    read[-1-i] = inbyte;
-	else
-	    read[i] = inbyte;
+        for (j = 0; j < nbits; j++)
+        {
+            Bit outbit, inbit;
+
+//          DEBUG("byte %u, bit %u\n", i, j);
+
+            /* Get the next bit to be output from the current byte.  */
+            if (order == MSB_FIRST)
+            {
+                /* Get MSB from byte.  */
+                outbit = (Bit) ((outbyte >> BITS_IN_BYTE) & 1);
+                outbyte <<= 1;
+            }
+            else
+            {
+                /* Get LSB from byte.  */
+                outbit = (Bit) (outbyte & 1);
+                outbyte >>= 1;
+            }
+
+            /* The last bit of the last byte.  */
+            if (is_last_byte && (j == nbits - 1))
+            {
+                /* Change to Exit1-DR/IR state before the last bit is shifted:
+                   this is necessary because the TAP Controller performs the
+                   last sample of TDI when exiting the Shift-DR/IR state.  */
+                tapc_set_TMS(1);
+                NEXT_STATE(1);
+            }
+
+            /* Shift one bit in from the JTAG TDO and one bit out to the JTAG TDI.  */
+            inbit = tapc_shift_bit(outbit);
+
+            /* Add the bit read into the input byte.
+               N.B. the shift amount will always be positive, as 0 <= j < BITS_IN_BYTE */
+            if (order == MSB_FIRST)
+                inbyte |= (Byte) (inbit << (BITS_IN_BYTE - 1 - j));
+            else
+                inbyte |= (Byte) (inbit << j);
+        }
+
+        if (order == MSB_FIRST)
+            to_read[nbytes - 1 - i] = inbyte;
+        else
+            to_read[i] = inbyte;
     }
+
+    STATE_IS_EITHER(EXIT1_DR, EXIT1_IR);
+
+    LEAVEMSG;
 }
 
 
-/* Read the JTAG status register. This indicates
-   the status of the JTAG for the user. 
-*/
-static unsigned int
-read_jtag_status_reg (void)
+/* Read the JTAG Status Register.
+   This indicates the status of the JTAG transaction that has been attempted.  */
+
+static JTAG_TransactionStatus
+read_jtag_status_register( void)
 {
-    unsigned int wr, rd;
-    int x;
-    //rw_flag=0;
-    //tapc_tms(0); // runtest/idle
-    tapc_tms(1); // select dr
-    tapc_tms(1); // select ir
-    tapc_tms(0); // capture ir
-    tapc_tms(0); // shift ir
+    JTAG_RegisterContents rd, wr;
+    Bit                   bit;
 
-    wr = 0x8;    // IR = status register
+    ENTERMSG;
 
-    tapc_shiftnbits(4, (unsigned char *)&wr, (unsigned char*)&rd, 0);
+    STATE_IS_EITHER(RUN_TEST_IDLE, UPDATE_DR);
 
-    
-    
-    // goto shift DR
-    tapc_tms(1); // update ir
-    //tapc_tms(0); // runtest/idle
-    tapc_tms(1); // select dr
-    tapc_tms(0); // capture dr
-    tapc_tms(0); // shift dr
+    CHANGE_STATE(1, SELECT_DR_SCAN);
+    CHANGE_STATE(1, SELECT_IR_SCAN);
+    CHANGE_STATE(0, CAPTURE_IR);
+    CHANGE_STATE(0, SHIFT_IR);
 
-    rd = 0;
+    wr = JTAG_STATUS_REGISTER;
 
-    // read 1 bit, if it is zero then keep reading
-    rd = tapc_shiftbit(0);
-    if (rd)
-	return rd; 
+    tapc_shift_N_bits(BITS_IN_REGISTER_CODE, (Byte*) &wr, (Byte*) &rd, MSB_LAST);
 
-    rd |= tapc_shiftbit(0) << 1;
-    if (rd)
-	return rd;
-    
-    rd |= tapc_shiftbit(0) << 2;
+    CHANGE_STATE(1, UPDATE_IR);
+//  CHANGE_STATE(0, RUN_TEST_IDLE);
+    CHANGE_STATE(1, SELECT_DR_SCAN);
+    CHANGE_STATE(0, CAPTURE_DR);
+    CHANGE_STATE(0, SHIFT_DR);
 
-    /* the last bit is optional */
-    /*rd |= tapc_shiftbit(0) << 3;*/
-    
-    return rd;    
+    /* The JTAG Status Register is read-only, and any bits shifted in are
+       ignored - hence the parameter to tapc_shift_bit is irrelevant here.  */
+
+    /* Read Stalled bit; if it is zero then keep reading.  */
+    bit = tapc_shift_bit(0);
+    if (bit)
+        return STALLED;
+
+    /* Read Failed bit; if it is zero then keep reading.  */
+    bit = tapc_shift_bit(0);
+    if (bit)
+        return FAILURE;
+
+    /* Read Ready bit.  */
+    bit = tapc_shift_bit(0);
+    if (bit)
+        return READY;
+
+    /* The last bit (PC_SEL) is optional.  */
+
+    return NOT_READY;
 }
 
 
-/* Interpret the status message. */
+/* Write a value to a JTAG register.
+      enter in Update-DR/IR state or Run-Test/Idle.
+      exit  in Update-DR */
+
 static void
-print_jtag_status_reg_val (unsigned int status)
+write_jtag_reg (JTAG_Register         regnum,
+                JTAG_RegisterContents data,
+                unsigned int          num_data_bits)
 {
-    int i ;
-    char * messages [] = { "Stalled" , "Failure", "Ready", "PC Selected" };
-    for(i=0;i<=3;i++)
-    {
-	printf_filtered("%s %s \t",(status & 1)?"":"Not",messages[i]);
-	status = status >> 1;
-    }
-    printf_filtered("\n");
+    Byte                  num = (Byte) regnum;
+    JTAG_RegisterContents rd  = 0;
+
+    ENTERARGS("regnum %d <== 0x%08X (:%d)", regnum, data, num_data_bits);
+
+    STATE_IS_ONE_OF(UPDATE_DR, UPDATE_IR, RUN_TEST_IDLE);
+
+//  CHANGE_STATE(0, RUN_TEST_IDLE);
+    CHANGE_STATE(1, SELECT_DR_SCAN);
+    CHANGE_STATE(1, SELECT_IR_SCAN);
+    CHANGE_STATE(0, CAPTURE_IR);
+    CHANGE_STATE(0, SHIFT_IR);
+
+    tapc_shift_N_bits(BITS_IN_REGISTER_CODE, &num, (Byte*) &rd, MSB_LAST);
+
+    CHANGE_STATE(1, UPDATE_IR);
+    CHANGE_STATE(1, SELECT_DR_SCAN);
+    CHANGE_STATE(0, CAPTURE_DR);
+    CHANGE_STATE(0, SHIFT_DR);
+
+    tapc_shift_N_bits(num_data_bits, (Byte*) &data, (Byte*) &rd, MSB_LAST);
+
+    CHANGE_STATE(1, UPDATE_DR);
+
+    DEBUG("written 0x%08X to JTAG %s register\n", data, JTAG_register_name(regnum));
+
+    LEAVEMSG;
 }
 
 
+/* Read a value from a JTAG register.
+      enter in Update-DR/IR state
+      exit  in Update-DR */
 
-/* Write a JTAG Command to a JTAG register. 
-   enter in update dr/ir state
-   or Test-Logic-Reset.
-   exit in update dr
-*/
-static void
-write_jtag_reg (char regnum, unsigned int data, int ndatabits)
+static JTAG_RegisterContents
+read_jtag_reg (JTAG_Register regnum, unsigned int num_data_bits)
 {
-    unsigned int wr=0,rd=0;
-    rw_flag = WRITE_TO_AA3 ;
-    //    tapc_tms(0); // runtest/idle
-    tapc_tms(1); // select dr
-    tapc_tms(1); // select ir
-    tapc_tms(0); // capture ir
-    tapc_tms(0); // shift ir
+    Byte                  num = (Byte) regnum;
+    JTAG_RegisterContents wr  = 0, rd = 0;
 
-		
-    tapc_shiftnbits(4, (unsigned char *)&regnum, (unsigned char *)&rd, 0);
+    ENTERARGS("regnum %u, %u bits", regnum, num_data_bits);
 
-    
-    tapc_tms(1); // update ir
+    STATE_IS_EITHER(UPDATE_DR, UPDATE_IR);
 
-    tapc_tms(1); // select dr
-    tapc_tms(0); // capture dr
-    tapc_tms(0); // shift dr
+//  CHANGE_STATE(0, RUN_TEST_IDLE);
+    CHANGE_STATE(1, SELECT_DR_SCAN);
+    CHANGE_STATE(1, SELECT_IR_SCAN);
+    CHANGE_STATE(0, CAPTURE_IR);
+    CHANGE_STATE(0, SHIFT_IR);
 
-    tapc_shiftnbits(ndatabits, (unsigned char *)&data, 
-		    (unsigned char *)&rd, 0);
-    tapc_tms(1); // update dr
-}
-	    
+    tapc_shift_N_bits(BITS_IN_REGISTER_CODE, &num, (Byte*) &rd, MSB_LAST);
 
-// enter in update dr/ir state
-// exit in update dr
-static unsigned int
-read_jtag_reg (char regnum, int ndatabits)
-{
-    unsigned int wr=0x0,rd=0;
-    rw_flag = READ_FROM_AA3;
-    //    tapc_tms(0); // runtest/idle
-    tapc_tms(1); // select dr
-    tapc_tms(1); // select ir
-    tapc_tms(0); // capture ir
-    tapc_tms(0); // shift ir
+    CHANGE_STATE(1, UPDATE_IR);
 
-    tapc_shiftnbits(4, (unsigned char *)&regnum, (unsigned char *)&rd, 0);
-    tapc_tms(1); // update ir
+    /* JTAG registers can be read without going to Run-Test/Idle state.
 
-    /* JTAG registers can be read without going to run-test/idle state.
-       
-       Doing tapc_tms(0) will take us to run-test/idle state.
-       This will make JTAG perform the transaction as per TCR.
-       We dont want this. 
-    */
-    //    tapc_tms(0); // runtest/idle
-    tapc_tms(1); // select dr
-    tapc_tms(0); // capture dr
-    tapc_tms(0); // shift dr
+       Doing CHANGE_STATE(0) would take us to Run-Test/Idle state. This would
+       make JTAG perform the transaction in the Transaction Command Register.
+       We don't want that!  */
+//  CHANGE_STATE(0, RUN_TEST_IDLE);
+    CHANGE_STATE(1, SELECT_DR_SCAN);
+    CHANGE_STATE(0, CAPTURE_DR);
+    CHANGE_STATE(0, SHIFT_DR);
 
-    tapc_shiftnbits(ndatabits, (unsigned char *)&wr, (unsigned char *)&rd, 0);
-    tapc_tms(1); // update dr
+    tapc_shift_N_bits(num_data_bits, (Byte*) &wr, (Byte*) &rd, MSB_LAST);
 
+    CHANGE_STATE(1, UPDATE_DR);
+
+    DEBUG("read 0x%08X from JTAG %s register\n", rd, JTAG_register_name(regnum));
     return rd;
 }
 
 
+/* -------------------------------------------------------------------------- */
+/* 5)                        JTAG transaction functions                       */
+/* -------------------------------------------------------------------------- */
 
-    
-    
+/* Start a JTAG transaction.
 
-
-
-static int
-arc_jtag_read_core_reg (unsigned int regnum, unsigned int *readbuf)
-{
-    unsigned int rd, wr, data, i;
-    check_and_raise_error_if_jtag_closed();
-    tapc_reset();
-    tapc_tms(0);//run-test idle
-    write_jtag_reg(0xA, regnum, 32);//update dr
-
-    
-
-    // Setup instruction register to 0x9 indicating
-    // a JTAG instruction is being downloaded.
-    // jtag transaction command reg = 0x5 (read core reg)
-    write_jtag_reg(0x9, 0x5, 4);//update dr
-
-    /* Perform the transaction.
-     */
-    tapc_tms(0); // run-test idle
-    
-    // poll the status
-
-    for (i=0;i<arcjtag_retry_count;i++)
-    {
-	unsigned int status = read_jtag_status_reg();
-	//if( !(status & 1) && (status & 4) )
-	if(status == 4)
-	    break;
-	if(status == 2)
-	    return JTAG_READ_FAILURE;
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* Do not redo the transaction. Pause and re-try.
-	 */
-	//tapc_tms(0);//run-test-idle
-    }
-    if (i==arcjtag_retry_count)
-      return JTAG_READ_FAILURE;
-
-    /* JTAG status register leaves us in Shift DR */
-    tapc_tms(1); /* Move to Exit-1 DR */
-    tapc_tms(1); /* Move to Update DR */
-    
-    // data = jtag data reg
-    data = read_jtag_reg(0xB, 32);
-
-    *readbuf = data;
-    
-    return sizeof(data);
-}
-
-static int
-arc_jtag_write_core_reg (unsigned int regnum, unsigned int data)
-{
-    unsigned int rd, wr, i;
-
-    check_and_raise_error_if_jtag_closed();
-    tapc_reset();
-    tapc_tms(0);//run-test idle
-
-    // data = jtag data reg
-    write_jtag_reg(0xB, data, 32);//update dr
-
-    // jtag addr register = regnum:
-    write_jtag_reg(0xA, regnum, 32);//update dr
-    
-    
-
-    // jtag transaction command reg = 0x1(write core reg)
-    write_jtag_reg(0x9, 0x1, 4);//update dr
-
-    /* Perform the transaction.
-     */
-    tapc_tms(0); // run-test idle
-    
-    for (i=0;i<arcjtag_retry_count;i++)
-    {
-      unsigned int status = read_jtag_status_reg();
-      	if(status == 4)
-	    break;
-	if(status == 2)
-	    return JTAG_WRITE_FAILURE;
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* Do not redo the transaction. Pause and re-try.
-	 */
-	//tapc_tms(0);//run-test-idle
-    }
-    if (i==arcjtag_retry_count)
-      return JTAG_READ_FAILURE;
-
-    tapc_tms(1);//exit1-dr
-    tapc_tms(1);//update-dr
-    /* This should have been done earlier i.e. before
-       reading the JTAG status register.
-     */
-    //tapc_tms(0);//rn-test-idle
-    return sizeof(data);
-}
-
-static int
-arc_jtag_read_aux_reg (unsigned int regnum, unsigned int *readbuf)
-{
-    unsigned int rd, wr, data, i;
-    if(arc_jtag_ops.arc_jtag_state_machine_debug)
-      printf_filtered("\nEntered arc_jtag_read_aux_reg()\
-         \n Regnum:%d \n",regnum);
-    check_and_raise_error_if_jtag_closed();
-    check_and_raise_error_if_jtag_closed();
-    tapc_reset();
-    tapc_tms(0);//run-test idle
-    write_jtag_reg(0xA, regnum, 32);//update dr
-
-
-
-    // Setup instruction register to 0x9 indicating
-    // a JTAG instruction is being downloaded.
-    // jtag transaction command reg = 0x6 (read aux reg)
-    write_jtag_reg(0x9, 0x6, 4);//update dr
-
-    /* Perform the transaction.
-     */
-    tapc_tms(0); // run-test idle
-
-    // poll the status
-
-    for (i=0;i<arcjtag_retry_count;i++)
-    {
-	unsigned int status = read_jtag_status_reg();
-	
-	if(status == 4)
-	    break;
-	if(status == 2)
-	    return JTAG_READ_FAILURE;
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* Do not redo the transaction. Pause and re-try.
-	 */
-	//tapc_tms(0);//run-test-idle
-
-    }
-    if (i==arcjtag_retry_count)
-      return JTAG_READ_FAILURE;
-
-
-/*     JTAG status register leaves us in Shift DR */
-    tapc_tms(1); /* Move to Exit-1 IR */
-    tapc_tms(1); /* Move to Update IR */
-    
-    // data = jtag data reg
-    data = read_jtag_reg(0xB, 32);
-    *readbuf = data;
-    if(arc_jtag_ops.arc_jtag_state_machine_debug)
-      printf(" Data: %d\n",data);
-    return sizeof(data);
-}
-
-static int
-arc_jtag_write_aux_reg (unsigned int regnum, unsigned int data)
-{
-    unsigned int rd, wr, i;
-    if(arc_jtag_ops.arc_jtag_state_machine_debug)
-      printf_filtered("\nEntered arc_jtag_write_aux_reg()\n Regnum:%d\nData:%d\n",regnum,data);
-    check_and_raise_error_if_jtag_closed();
-    tapc_reset();
-    tapc_tms(0);//run-test idle
-    
-    // data = jtag data reg
-    write_jtag_reg(0xB, data, 32);//update dr
-
-    // jtag addr register = regnum:
-    write_jtag_reg(0xA, regnum, 32);//update dr
-    
-    
-
-    // jtag transaction command reg = 0x2 (write aux reg)
-    write_jtag_reg(0x9, 0x2, 4);//update dr
-
-    /* Perform the transaction.
-     */
-    tapc_tms(0); // run-test idle
-
-    for (i=0;i<arcjtag_retry_count;i++)
-    {
-	unsigned int status = read_jtag_status_reg();
-	if(status == 4)
-	    break;
-	if(status == 2)
-	    return JTAG_WRITE_FAILURE;
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* Do not redo the transaction. Pause and re-try.
-	 */
-	//tapc_tms(0);//run-test-idle
-    }
-    if (i==arcjtag_retry_count)
-      return JTAG_READ_FAILURE;
-
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* This should have been done earlier i.e. before
-	   reading the JTAG status register.
-	*/
-	//tapc_tms(0);//run-test-idle
-	return sizeof(data);
-}
-
-
-static int
-read_mem (unsigned int addr, unsigned int *readbuf)
-{
-    unsigned int rd, wr, data, i;
-
-    rw_flag = READ_FROM_AA3;
-    if(arc_jtag_ops.arc_jtag_state_machine_debug)
-      printf_filtered("\nEntered read_mem() 0x%x\n",addr);
-    // jtag addr register = regnum:
-    tapc_reset();
-    tapc_tms(0);//run-test idle
-    write_jtag_reg(0xA, addr, 32);//update dr
-
-    
-
-    // Setup instruction register to 0x9 indicating
-    // a JTAG instruction is being downloaded.
-    // jtag transaction command reg = 0x5 (read core reg)
-    write_jtag_reg(0x9, 0x4, 4);//update dr
-
-    /* Perform the transaction.
-     */
-    tapc_tms(0); // run-test idle
-
-    // poll the status
-
-    for (i=0;i<arcjtag_retry_count;i++)
-    {
-	unsigned int status = read_jtag_status_reg();
-	if(status == 4)
-	    break;
-	if(status == 2)
-	    return JTAG_READ_FAILURE;
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* Do not redo the transaction. Pause and re-try.
-	 */
-	//tapc_tms(0); // run-test-idle
-    }
-    if (i==arcjtag_retry_count)
-      return JTAG_READ_FAILURE;
-
-    /* JTAG status register leaves us in Shift DR */
-    tapc_tms(1); /* Move to Exit-1 DR */
-    tapc_tms(1); /* Move to Update DR */
-    
-    // data = jtag data reg
-    data = read_jtag_reg(0xB, 32);
-    *readbuf = data;
-    if(arc_jtag_ops.arc_jtag_state_machine_debug)
-    printf_filtered("\n Read rd =0x%x in read_mem",data);
-
-    return sizeof(data);
-}
-
-
-static int
-write_mem (unsigned int addr, unsigned int data)
-{
-    unsigned int rd, wr, i;
-    if(arc_jtag_ops.arc_jtag_state_machine_debug)
-      printf_filtered("\nEntered write_mem() to write 0x%x at 0x%x\n",data,addr);
-    tapc_reset();
-    tapc_tms(0);//run-test idle
-    
-    // data = jtag data reg
-    write_jtag_reg(0xB, data, 32);//update dr
-
-    // jtag addr register = regnum:
-    write_jtag_reg(0xA, addr, 32);//update dr
-    
-    
-
-    // jtag transaction command reg = 0x0(write mem)
-    write_jtag_reg(0x9, 0x0, 4);//update dr
-
-    /* Perform the transaction.
-     */
-    tapc_tms(0); // run-test idle
-
-    for (i=0;i<arcjtag_retry_count;i++)
-    {
-	unsigned int status = read_jtag_status_reg();
-	if(status == 4)
-	    break;
-	if(status == 2)
-	    return JTAG_WRITE_FAILURE;
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* Do not redo the transaction. Pause and re-try.
-	 */
-	//tapc_tms(0);//run-tes-idle
-    }
-    if (i==arcjtag_retry_count)
-      return JTAG_READ_FAILURE;
-
-    tapc_tms(1);//exit1-dr
-    tapc_tms(1);//update-dr
-    /* This should have been done earlier i.e. before
-       reading the JTAG status register.
-     */
-    //tapc_tms(0);//run-test-idle
-    return sizeof(data);
-}
-
-
-static int 
-arc_jtag_write_chunk (unsigned int addr, unsigned int *write_buf, int len)
-{
-  unsigned int rd, wr;
-  unsigned int status;
-  check_and_raise_error_if_jtag_closed();
-    
-  rw_flag = WRITE_TO_AA3 ;
-  int i = 0;
-  int len_mod = len % 4;
-  len = len - len_mod;
-  
-  tapc_reset();
-  if(arc_jtag_ops.arc_jtag_state_machine_debug)
-    printf_filtered("Entered arc_jtag_write_chunk()......0x%x\n",*write_buf);
-  tapc_tms(0);//run-test idle
-  
-  // jtag addr register = regnum:
-  write_jtag_reg(0xA, addr, 32);//update dr
-  
-  
-  
-  // jtag transaction command reg = 0x0(write mem)
-  write_jtag_reg(0x9, 0x0, 4);//update dr
-  
-  while(len)
-    {
-      
-      // data = jtag data reg
-      write_jtag_reg(0xB, write_buf[i++], 32);//update dr
-      
-      /* Perform the transaction.
-       */
-      tapc_tms(0); // run-test idle
-      
-      
-      while(1)
-	{
-	  status = read_jtag_status_reg();
-	  if(status == 4)
-	    break;
-	  if(status == 2)
-	    return (i-1) * 4;
-
-	  tapc_tms(1);//exit1-dr
-	  tapc_tms(1);//update-dr
-	  /* Do not redo the transaction. Pause and re-try.
-	   */
-	  //tapc_tms(0);//run-tes-idle
-	}
-      
-      tapc_tms(1);//exit1-dr
-      tapc_tms(1);//update-dr
-      /* This should have been done earlier i.e. before
-	 reading the JTAG status register.
-      */
-      //tapc_tms(0);//run-test idle
-      len = len - 4;
-    }
-
-  if(arc_jtag_ops.arc_jtag_state_machine_debug)
-    printf_filtered("leaving arc_jtag_write_chunk() with return value %d",i*4);
-  
-  // added support for writing no of bytes those are not exact mutiple of four
-  
-  if(!len_mod)
-    return i*4;
-  else
-    {
-      
-      addr=addr+(i*4);
-      if(read_mem(addr,&rd)==JTAG_READ_FAILURE)
-	  return i*4;
-      if(arc_jtag_ops.arc_jtag_state_machine_debug)
-      printf_filtered("\nrd=0x%x and wr=0x%x\n",rd,write_buf[i]);
-
-      switch(len_mod)
-	{
-	  
-	case 1:
-	  wr = (rd & 0xffffff00)|(write_buf[i] & 0xff);
-	  break;
-	  
-	case 2:
-	  wr = (rd & 0xffff0000)|(write_buf[i] & 0xffff);
-	  break;
-	  
-	case 3:
-	  wr = (rd & 0xff000000)|(write_buf[i] & 0xffffff);
-	  break;
-	  
-	}
-      if(arc_jtag_ops.arc_jtag_state_machine_debug)
-	printf_filtered("\nwrite_mem writing 0x%x at 0x%x",wr,addr);
-      arc_jtag_write_chunk(addr,&wr,4);
-      return (i*4 + len_mod);
-    }
-  
-  
-}
-
-static int 
-arc_jtag_read_chunk (unsigned int addr, unsigned int *read_buf, int len)
-{
-    unsigned int rd, wr, data;
-    int i=0;
-    rw_flag = READ_FROM_AA3 ;
-    int len_mod=len%4;
-    len=len-len_mod;
-    if(arc_jtag_ops.arc_jtag_state_machine_debug)
-      printf_filtered("\nEntered arc_jtag_read_chunk() 0x%x\n",addr);
-    check_and_raise_error_if_jtag_closed();
-
-    // jtag addr register = regnum:
-    tapc_reset();
-    tapc_tms(0);//run-test idle
-    
-    write_jtag_reg(0xA, addr, 32);//update dr
-
-    
-    while(len)
-    {
-    // Setup instruction register to 0x9 indicating
-    // a JTAG instruction is being downloaded.
-    // jtag transaction command reg = 0x5 (read core reg)
-    write_jtag_reg(0x9, 0x4, 4);//update dr
-
-    /* Perform the transaction.
-     */
-    tapc_tms(0); // run-test idle
-
-    // poll the status
-
-    while(1)
-    {
-	unsigned int status = read_jtag_status_reg();
-	if(status == 4)
-	    break;
-	if(status == 2)
-	    return (i-1)*4;
-	tapc_tms(1);//exit1-dr
-	tapc_tms(1);//update-dr
-	/* Do not redo the transaction. Pause and re-try.
-	 */
-	//tapc_tms(0);//run-test-idle
-
-    }
-
-    /* JTAG status register leaves us in Shift DR */
-    tapc_tms(1); /* Move to Exit-1 DR */
-    tapc_tms(1); /* Move to Update DR */
-    
-    // data = jtag data reg
-    read_buf[i++] = read_jtag_reg(0xB, 32);// exits in Update DR
-    len= len-4;
-    //tapc_tms(0);/* Move to run-test-idle */
-
-    }
-
-    // added support for reading no of bytes those are not exact mutiple of four
-
-    if(!len_mod)
-	return i*4;
-    else
-    {
-        char *ptr = (char *)read_buf + i*4;
-	addr=addr+(i*4);
-	if(read_mem(addr,&rd)==JTAG_READ_FAILURE)
-	    return i*4;
-
-	switch(len_mod)
-	{
-	case 1:
-	    ptr[0] = rd & 0xff;
-	    break;
-
-	case 2:
-	    ptr[0] = rd & 0xff;
-	    ptr[1] = (rd>>8) & 0xff;
-	    break;
-
-	case 3:
-	    ptr[0] = rd & 0xff;
-	    ptr[1] = (rd>>8) & 0xff;
-	    ptr[2] = (rd>>16) & 0xff;
-	    break;
-	}
-
-	return ((i*4)+len_mod);
-	
-    }
-
-
-}
-
-
-
-/*
- * Return the Processor Variant that is connected.
- */
-int
-arc_get_architecture() 
-{
-  if (ARCProcessor == UNSUPPORTED) {
-    unsigned int value;
-
-    /* Read the Identity Register. */
-    if (arc_jtag_read_aux_reg(4, &value) == JTAG_READ_FAILURE)
-      error("Failure reading from auxillary IDENTITY register");
-
-    /* Get Identity Mask. */
-    value &= 0xff ;
-
-    if((value >= 0x30) && (value <= 0x3f))
-      ARCProcessor = ARC700;
-    else if((value >= 0x20) && (value <= 0x2f))
-      ARCProcessor = ARC600;
-    else if((value >= 0x10) && (value <= 0x1f))
-      ARCProcessor = A5;
-    else if ((value >= 0x00) && (value <= 0x0f)) 
-      ARCProcessor = A4;
-    else 
-      error("Unsupported Processor Version 0x%x\n", value);
-  }
-
-  return ARCProcessor;
-}
-
-
-
-static void 
-arc_jtag_open (void)
-{
-  int retval;
-  unsigned int read_status = 0;
-  sigaddset(&block_mask,SIGINT);
-  retval = gpio_setup();
-  if(retval != 0)
-    {
-      error("Unable to open JTAG Port .%s \n",(retval == EINVAL)?
-	    "Invalid Params":"Permission Denied" );
-      arc_jtag_ops.jtag_status = JTAG_CLOSED;
-      return ;
-    }
-  arc_jtag_ops.jtag_status = JTAG_OPENED;
-
-  tapc_reset();
-  //Writing debug bit of debug register
-  
-  do
-    {
-      /* Note: Reading the status/status32 register here to
-         check if halt bit is set*/
-      if (IS_A4) {
-	if(arc_jtag_read_aux_reg( 0x0, &read_status) == JTAG_READ_FAILURE)
-	  error("Failure reading auxillary register 0xA\n");
-	if(read_status & A4_HALT_VALUE)
-	  break;
-      }
-      else {
-	if(arc_jtag_read_aux_reg( 0xA, &read_status) == JTAG_READ_FAILURE)
-	  error("Failure reading auxillary register 0xA\n");
-	if(read_status & ARC700_HALT_VALUE)
-	  break;
-      }
-      printf_filtered("Processor running. Trying to halt.....\n");
-      if(arc_jtag_write_aux_reg(0x5,0x2)==JTAG_WRITE_FAILURE)
-	error("Failure writing 0x2 to auxillary register 0x5:debug register\n");
-    }while(1);
-  if (arc_jtag_ops.arc_jtag_state_machine_debug)
-    printf_filtered("Processor halted.....\n");
-
-}
-
-static void 
-arc_jtag_close (void)
-{
-  ARCProcessor = UNSUPPORTED;
-
-  if(arc_jtag_ops.jtag_status != JTAG_CLOSED)
-    {
-      tapc_reset();
-      /* closing file descriptor opened for communication with gpio driver */
-      close(fd);
-      if(arc_jtag_ops.arc_jtag_state_machine_debug)
-	printf_filtered("arc-jtag closed\n");
-      arc_jtag_ops.jtag_status = JTAG_CLOSED;
-    }
-
-}
-
-static void 
-arc_jtag_wait(void)
-{
-  unsigned int read_status;
-  check_and_raise_error_if_jtag_closed();
-  do
-    {
-      sigprocmask(SIG_BLOCK,&block_mask, NULL);
-
-      if (IS_A4) {
-	if(arc_jtag_read_aux_reg( 0x0, &read_status) == JTAG_READ_FAILURE)
-	  error("Failure reading auxillary register 0x0\n");
-	//FIXMEA:    if(debug_arc_jtag_target_message)
-	//      printf_filtered ("\n Read Status: 0x%x,%d\n", read_status, read_status);
-
-	if(read_status & A4_HALT_VALUE)
-	  {
-	    sigprocmask(SIG_BLOCK,&block_mask, NULL);
-	    break;
-	  }
-      }
-      else {
-	if(arc_jtag_read_aux_reg( 0xA, &read_status) == JTAG_READ_FAILURE)
-	  error("Failure reading auxillary register 0xA\n");
-	if(read_status & ARC700_HALT_VALUE)
-	  {
-	    sigprocmask(SIG_BLOCK,&block_mask, NULL);
-	    break;
-
-	  }
-      }
-      sigprocmask(SIG_UNBLOCK,&block_mask, NULL);	
-    }while(1);
-
-  while (1)
-    {
-      if (arc_jtag_read_aux_reg (0x5,&read_status) == JTAG_READ_FAILURE)
-	error ("Failure reading Debug register \n");
-      if (!(read_status & 0x80000000))
-	break;
-    }
-}
+   Parameters:
+      command: the JTAG command to be performed
+      address: the address (memory address or register number) for the command
+*/
 
 static void
-arc_jtag_reset_board (void)
+start_jtag_transaction (JTAG_RegisterContents command,
+                        JTAG_RegisterContents address)
 {
-  char c = 5;
-  int  auxval = 2 ;
-  check_and_raise_error_if_jtag_closed ();
+    ENTERARGS("command = %d, address = 0x%x", command, address);
 
-  /*
-    Writing 9 did not work. But thats 
-    what the manual says. Hmmm. 
-  gpio_write (CONTROL_PORT, &c);
-  */
+    STATE_IS_ONE_OF(UPDATE_DR, UPDATE_IR, RUN_TEST_IDLE);
 
-  gpio_write ( CONTROL_PORT, &c);
-  c = 0xd;
-  gpio_write ( CONTROL_PORT, &c);
-  c = 5;
-  gpio_write ( CONTROL_PORT, &c);
+    /* N.B. do NOT reset the TAP Controller at the start of each transaction, as
+            that would re-initialize the JTAG registers to their default values
+            (whatever those might be), so invalidating the optimisation of the
+            use of the Address and Transaction Command registers performed by
+            this module.  */
 
-  if (arc_jtag_write_aux_reg(0x5 , 2) == JTAG_WRITE_FAILURE)
-    error ("Failure writing to auxiliary register Debug\n");
+    if (command == READ_MEMORY_LOCATION || command == WRITE_MEMORY_LOCATION)
+    {
+        gdb_assert(IS_WORD_ALIGNED(address));
+    }
 
-  c = 0;
-  gpio_write ( 0x378, &c);
-  c = 0x40;
-  gpio_write ( 0x378, &c);
-  c = 0;
-  gpio_write ( 0x378, &c);
-  
-  tapc_reset();
+    /* Load the command that is required into the JTAG Transaction Command
+       Register, and the address into the JTAG Address Register; by keeping
+       track of the values that these registers contain, we can avoid re-loading
+       them unnecessarily, which can save time when transferring a stream of data.  */
+
+    if (!command_register_contents_known ||
+        (command_register_contents != command))
+    {
+        write_jtag_reg(JTAG_TRANSACTION_COMMAND_REGISTER, command, BITS_IN_COMMAND_CODE);
+
+        command_register_contents_known = TRUE;
+        command_register_contents       = command;
+    }
+
+    if (!address_register_contents_known ||
+        (address_register_contents != address))
+    {
+        write_jtag_reg(JTAG_ADDRESS_REGISTER, address, BITS_IN_WORD);
+
+        address_register_contents_known = TRUE;
+        address_register_contents       = address;
+    }
+
+    LEAVEMSG;
 }
 
 
+/* Perform the given JTAG transaction (a mmeory or register operation).
+   If the transaction fails, this function returns the given error.  */
+
+static JTAG_OperationStatus
+perform_jtag_transaction (JTAG_TransactionType transaction,
+                          JTAG_OperationStatus error)
+{
+    JTAG_OperationStatus result = error;
+    unsigned int         tries  = 0;
+
+    ENTERARGS("transaction: %u", transaction);
+
+    /* This causes the TAP Controller to perform the transaction, according to
+       the contents of the JTAG Transaction Command, Address and Data registers.  */
+    CHANGE_STATE(0, RUN_TEST_IDLE);
+
+    /* Poll the JTAG Status Register.  */
+    do
+    {
+        JTAG_TransactionStatus status = read_jtag_status_register();
+
+        DEBUG("status: %s\n", JTAG_TransactionStatus_Image(status));
+
+        /* The read has left the TAP Controller FSM in state Shift-DR.  */
+        STATE_IS(SHIFT_DR);
+
+        CHANGE_STATE(1, EXIT1_DR);
+        CHANGE_STATE(1, UPDATE_DR);
+
+        /* If the transaction is complete.  */
+        if (status == READY)
+        {
+            /* The value in the JTAG Address Register is incremented by four
+               (a memory access) or one (a register access) when a read/write
+               transaction has completed.  */
+            address_register_contents += (transaction == Memory) ? BYTES_IN_WORD : 1;
+
+            result = JTAG_SUCCESS;
+            break;
+        }
+
+        if (status == FAILURE)
+            break;
+
+        /* Pause and re-try.  */
+        usleep(1);
+    }
+    while (++tries <= arc_jtag_ops.retry_count);
+
+    LEAVEMSG;
+    return result;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 6)                  read/write helper functions                            */
+/* -------------------------------------------------------------------------- */
+
+/* These functions aid in reading/writing registers/memory.  */
+
+/* Read a processor register (core or auxiliary).  */
+
+static JTAG_OperationStatus
+read_processor_register (ARC_RegisterNumber    regnum,
+                         JTAG_RegisterContents command,
+                         ARC_RegisterContents *contents)
+{
+    JTAG_OperationStatus status;
+
+    /* Load the number of the register that is to be read into the JTAG Address
+       Register.  */
+    start_jtag_transaction(command, regnum);
+
+    status = perform_jtag_transaction(Register, JTAG_READ_FAILURE);
+
+    if (status == JTAG_SUCCESS)
+    {
+        /* Read the register contents from the JTAG Data Register.  */
+        *contents = (ARC_RegisterContents) read_jtag_reg(JTAG_DATA_REGISTER, BITS_IN_REGISTER);
+    }
+
+    return status;
+}
+
+
+/* Write a processor register (core or auxiliary).  */
+
+static JTAG_OperationStatus
+write_processor_register (ARC_RegisterNumber    regnum,
+                          JTAG_RegisterContents command,
+                          ARC_RegisterContents  contents)
+{
+    /* Load the number of the register that is to be written into the JTAG
+       Address Register.  */
+    start_jtag_transaction(command, regnum);
+
+    /* Load the new register contents into the JTAG Data Register.  */
+    write_jtag_reg(JTAG_DATA_REGISTER, contents, BITS_IN_REGISTER);
+
+    return perform_jtag_transaction(Register, JTAG_WRITE_FAILURE);
+}
+
+
+/* Write a processor core register.  */
+
+static JTAG_OperationStatus
+jtag_write_core_reg (ARC_RegisterNumber regnum, ARC_RegisterContents contents)
+{
+    ENTERARGS("regnum %d", regnum);
+
+    return write_processor_register(regnum, WRITE_CORE_REGISTER, contents);
+}
+
+
+/* Read a processor auxiliary register.  */
+
+static JTAG_OperationStatus
+jtag_read_aux_reg (ARC_RegisterNumber regnum, ARC_RegisterContents *contents)
+{
+    ENTERARGS("regnum %d", regnum);
+
+    return read_processor_register(regnum, READ_AUX_REGISTER, contents);
+}
+
+
+/* Write a processor auxiliary register.  */
+
+static JTAG_OperationStatus
+jtag_write_aux_reg (ARC_RegisterNumber regnum, ARC_RegisterContents contents)
+{
+    ENTERARGS("regnum %d", regnum);
+
+    return write_processor_register(regnum, WRITE_AUX_REGISTER, contents);
+}
+
+
+/* Read a word of data from memory; the given address must be word-aligned.
+   Returns number of bytes read.  */
+
+static unsigned int
+jtag_read_word (ARC_Address addr, ARC_Word *data)
+{
+    JTAG_OperationStatus status;
+
+    ENTERARGS("addr 0x%08X", addr);
+
+    gdb_assert(IS_WORD_ALIGNED(addr));
+
+    /* Load the address of the memory word that is to be read into the JTAG
+       Address Register.  */
+    start_jtag_transaction(READ_MEMORY_LOCATION, addr);
+
+    status = perform_jtag_transaction(Memory, JTAG_READ_FAILURE);
+
+    if (status == JTAG_SUCCESS)
+    {
+        /* Read the data from the JTAG Data Register.  */
+        ARC_Word word = (ARC_Word) read_jtag_reg(JTAG_DATA_REGISTER, BITS_IN_WORD);
+
+        /* N.B. this assumes that the host is little-endian!  */
+        if (target_is_big_endian)
+            word = __bswap_32(word);
+
+        DEBUG("read 0x%08X\n", word);
+
+        *data = word;
+
+        return BYTES_IN_WORD;
+    }
+
+    /* Failed: no data read.  */
+    return 0;
+}
+
+
+/* Write a word of data to memory; the given address must be word-aligned.
+   Returns number of bytes written.  */
+
+static unsigned int
+jtag_write_word (ARC_Address addr, ARC_Word data)
+{
+    ENTERARGS("addr 0x%08X, data 0x%08X", addr, data);
+
+    gdb_assert(IS_WORD_ALIGNED(addr));
+
+    /* Load the address of the memory word that is to be written into the JTAG
+       Address Register.  */
+    start_jtag_transaction(WRITE_MEMORY_LOCATION, addr);
+
+    /* N.B. this assumes that the host is little-endian!  */
+    if (target_is_big_endian)
+        data = __bswap_32(data);
+
+    /* Load the data to be written into the JTAG Data Register.  */
+    write_jtag_reg(JTAG_DATA_REGISTER, data, BITS_IN_WORD);
+
+    if (perform_jtag_transaction(Memory, JTAG_WRITE_FAILURE) == JTAG_SUCCESS)
+        return BYTES_IN_WORD;
+
+    /* Failed: no data written.  */
+    return 0;
+}
+
+
+/* Read a number of words of data from target memory starting at the given address.
+   Returns number of bytes read.  */
+
+static unsigned int
+jtag_read_chunk (ARC_Address address, ARC_Byte *data, unsigned int words)
+{
+    unsigned int total_read = 0;
+
+    ENTERARGS("address 0x%08X, words %u", address, words);
+
+    /* Load the start address of the memory chunk that is to be read
+       into the JTAG Address Register.  */
+    start_jtag_transaction(READ_MEMORY_LOCATION, address);
+
+    /* Read all the words of data.  */
+    while (words--)
+    {
+        ARC_Word word;
+
+        /* Read the next word of data - this increments the address in
+           the JTAG Address Register by the word size, so the register
+           does not have to be re-loaded with the next address.  */
+        if (perform_jtag_transaction(Memory, JTAG_READ_FAILURE) != JTAG_SUCCESS)
+        {
+            DEBUG("FAIL: read %u bytes\n", total_read);
+
+            /* Failed - just return amount of data read so far.  */
+            return total_read;
+        }
+
+        /* Read the word of data from the JTAG Data Register.  */
+        word = (ARC_Word) read_jtag_reg(JTAG_DATA_REGISTER, BITS_IN_WORD);
+
+        /* N.B. this assumes that the host is little-endian!  */
+        if (target_is_big_endian)
+            word = __bswap_32(word);
+
+        /* Copy it into the buffer (byte-by-byte copy means that alignment does not matter).  */
+        COPY_WORD(data, &word);
+
+        total_read += BYTES_IN_WORD;
+        data       += BYTES_IN_WORD;
+   }
+
+    return total_read;
+}
+
+
+/* Write a number of words of data to target memory starting at the given address.
+   Returns number of bytes written.  */
+
+static unsigned int
+jtag_write_chunk (ARC_Address address, ARC_Byte *data, unsigned int words)
+{
+    unsigned int total_written = 0;
+
+#ifndef JTAG_DATA_REGISTER_IS_CORRUPTED_BY_WRITE
+    ARC_Word last_word;
+
+    /* Initialise last_word with a value that is different from the
+       first word to be written.  */
+    COPY_WORD(&last_word, data);
+    last_word++;
+#endif
+
+    ENTERARGS("address 0x%08X, words %u", address, words);
+
+    /* Load the start address of the memory chunk that is to be written
+       into the JTAG Address Register.  */
+    start_jtag_transaction(WRITE_MEMORY_LOCATION, address);
+
+    /* write all the words of data */
+    while (words--)
+    {
+        ARC_Word word;
+
+        /* Copy the next word of data from the buffer
+           (byte-by-byte copy means that alignment does not matter).  */
+        COPY_WORD(&word, data);
+
+        /* N.B. this assumes that the host is little-endian!  */
+        if (target_is_big_endian)
+            word = __bswap_32(word);
+
+#ifndef JTAG_DATA_REGISTER_IS_CORRUPTED_BY_WRITE
+        if (word != last_word)
+        {
+#endif
+            write_jtag_reg(JTAG_DATA_REGISTER, word, BITS_IN_WORD);
+
+#ifdef CHECK_JTAG_DATA_REGISTER
+            check_Data_Register(word);
+#endif
+
+#ifndef JTAG_DATA_REGISTER_IS_CORRUPTED_BY_WRITE
+            last_word = word;
+        }
+#endif
+
+        data += BYTES_IN_WORD;
+
+        /* Write the word - this increments the address in the JTAG
+           Address Register by the word size, so the register does not
+           have to be re-loaded with the next address.  */
+        if (perform_jtag_transaction(Memory, JTAG_WRITE_FAILURE) != JTAG_SUCCESS)
+        {
+            DEBUG("FAIL: written %u bytes\n", total_written);
+
+            /* Failed - just return amount of data written so far.  */
+            return total_written;
+        }
+
+        total_written += BYTES_IN_WORD;
+    }
+
+    return total_written;
+}
+
+
+/* Write a number of copies of a word-sized pattern of data to memory starting
+   at the given address.
+   Returns number of bytes written.  */
+
+static unsigned int
+jtag_write_pattern (ARC_Address address, ARC_Word pattern, unsigned int words)
+{
+    unsigned int total_written = 0;
+
+    ENTERARGS("address 0x%08X, pattern 0x%08X, words %u", address, pattern, words);
+
+    /* Load the start address of the memory chunk that is to be written
+       into the JTAG Address Register.  */
+    start_jtag_transaction(WRITE_MEMORY_LOCATION, address);
+
+    /* N.B. this assumes that the host is little-endian!  */
+    if (target_is_big_endian)
+        pattern = __bswap_32(pattern);
+
+#ifndef JTAG_DATA_REGISTER_IS_CORRUPTED_BY_WRITE
+    /* Load the pattern into the JTAG Data Register.  */
+    write_jtag_reg(JTAG_DATA_REGISTER, pattern, BITS_IN_WORD);
+#endif
+
+    /* Write all the complete words of data.  */
+    while (words--)
+    {
+#ifdef JTAG_DATA_REGISTER_IS_CORRUPTED_BY_WRITE
+        /* Load the pattern into the JTAG Data Register.  */
+        write_jtag_reg(JTAG_DATA_REGISTER, pattern, BITS_IN_WORD);
+#endif
+
+#ifdef CHECK_JTAG_DATA_REGISTER
+        check_Data_Register(pattern);
+#endif
+
+        /* Write the word - this increments the address in the JTAG
+           Address Register by the word size, so the register does not
+           have to be re-loaded with the next address.  */
+        if (perform_jtag_transaction(Memory, JTAG_WRITE_FAILURE) != JTAG_SUCCESS)
+        {
+            DEBUG("FAIL: written %u bytes\n", total_written);
+
+            /* Failed - just return amount of data written so far.  */
+            return total_written;
+        }
+
+        total_written += BYTES_IN_WORD;
+    }
+
+    return total_written;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 7)                            main operations                              */
+/* -------------------------------------------------------------------------- */
+
+/* These are the functions that are called from outside this module via the
+   pointers in the arc_jtag_ops global object.
+   N.B. none of these functions are called from within this module.  */
+
+
+/* Read a processor core register.  */
+
+static JTAG_OperationStatus
+jtag_read_core_reg (ARC_RegisterNumber regnum, ARC_RegisterContents *contents)
+{
+    ENTERARGS("regnum %d", regnum);
+
+    return read_processor_register(regnum, READ_CORE_REGISTER, contents);
+}
+
+
+/* Try to open the JTAG interface.
+   Returns TRUE for success.  */
+
+static Boolean
+jtag_open (ARC_RegisterNumber mem_subsys)
+{
+    ENTERMSG;
+
+    if (arc_jtag_ops.status == JTAG_CLOSED)
+    {
+        JTAG_OperationStatus status;
+
+        /* Make sure that the GPIO driver is open.  */
+        if (!gpio_open())
+            return FALSE;
+
+        set_interface(JTAG_OPENED);
+
+        tapc_reset();
+
+        /* Load the number of the MEMSUBSYS BCR that is to be read into the JTAG
+           Address Register.  */
+        start_jtag_transaction(READ_AUX_REGISTER, mem_subsys);
+
+        status = perform_jtag_transaction(Register, JTAG_READ_FAILURE);
+
+        if (status == JTAG_SUCCESS)
+        {
+            /* Read the register contents from the JTAG Data Register.  */
+            ARC_RegisterContents contents =
+                                 (ARC_RegisterContents) read_jtag_reg(JTAG_DATA_REGISTER, BITS_IN_REGISTER);
+
+            DEBUG("MEMSUBSYS BCR: 0x%08X\n", contents);
+
+            target_is_big_endian = ((contents & 4) != 0);
+        }
+        else
+        {
+            warning(_("can not discover endianness of target\n"));
+            return FALSE;
+        }
+
+        DEBUG("arcjtag opened\n");
+    }
+
+    LEAVEMSG;
+
+    return TRUE;
+}
+
+
+/* Close the JTAG interface.  */
+
+static void
+jtag_close (void)
+{
+    ENTERMSG;
+
+    if (arc_jtag_ops.status == JTAG_OPENED)
+    {
+        tapc_reset();
+
+        /* Close the file descriptor opened for communication with gpio driver.  */
+        gpio_close();
+
+        set_interface(JTAG_CLOSED);
+
+#ifdef STATE_MACHINE_DEBUG
+        current_state = UNDEFINED;
+#endif
+
+        DEBUG("arcjtag closed\n");
+    }
+
+    LEAVEMSG;
+}
+
+
+/* Reset the target JTAG controller.  */
+
+static void
+jtag_reset (void)
+{
+    ENTERMSG;
+    tapc_reset();
+    LEAVEMSG;
+}
+
+
+/* Reset the target board.  */
+
+static void
+jtag_reset_board (void)
+{
+    ENTERMSG;
+
+    /* Make sure that the GPIO driver is open.  */
+    if (gpio_open())
+    {
+        /* Writing 9 did not work. But that's what the manual says. Hmmm.  */
+//      gpio_write (CONTROL_PORT, 9);
+
+        /* What is this for?  */
+        gpio_write(CONTROL_PORT, (Byte) JTAG_TCK);
+        gpio_write(CONTROL_PORT, (Byte) 0xD);
+        gpio_write(CONTROL_PORT, (Byte) JTAG_TCK);
+        gpio_write(DATA_PORT,    (Byte) 0);
+        gpio_write(DATA_PORT,    (Byte) JTAG_TMS);
+        gpio_write(DATA_PORT,    (Byte) 0);
+
+        tapc_reset();
+    }
+
+    LEAVEMSG;
+}
+
+
+/* Check that the JTAG interface is open.
+   If it is closed, 'error' is called.  */
+
+static void jtag_check_open (void)
+{
+    if (arc_jtag_ops.status == JTAG_CLOSED)
+        interface_is_closed();
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 8)                            interface management                         */
+/* -------------------------------------------------------------------------- */
+
+/* Report that the JTAG interface is closed.  */
+
+static void
+interface_is_closed (void)
+{
+    error(_("JTAG connection is closed. "
+            "Use command 'target " ARC_TARGET_NAME "' first."));
+}
+
+
+/* Set up the function pointers in the arc_jtag_ops structure according to
+   whether the JTAG interface is open or closed.  Note that if the interface is
+   closed, all the pointers point to the 'interface_is_closed' function - so any
+   attempt to invoke one of those operations results in an error; but if the
+   interface is open, they point to the appropriate operations (which may be
+   called without incurring the overhead of a check on the interface status).  */
+
+static void
+set_interface (JTAG_Status status)
+{
+    arc_jtag_ops.status = status;
+
+    if (status == JTAG_OPENED)
+    {
+        arc_jtag_ops.memory_read_word     = jtag_read_word;
+        arc_jtag_ops.memory_write_word    = jtag_write_word;
+        arc_jtag_ops.memory_read_chunk    = jtag_read_chunk;
+        arc_jtag_ops.memory_write_chunk   = jtag_write_chunk;
+        arc_jtag_ops.memory_write_pattern = jtag_write_pattern;
+        arc_jtag_ops.read_aux_reg         = jtag_read_aux_reg;
+        arc_jtag_ops.write_aux_reg        = jtag_write_aux_reg;
+        arc_jtag_ops.read_core_reg        = jtag_read_core_reg;
+        arc_jtag_ops.write_core_reg       = jtag_write_core_reg;
+        arc_jtag_ops.reset                = jtag_reset;
+    }
+    else
+    {
+        typedef unsigned int         (*Read_Word)       (ARC_Address, ARC_Word*);
+        typedef unsigned int         (*Write_Word)      (ARC_Address, ARC_Word);
+        typedef unsigned int         (*Transfer_Chunk)  (ARC_Address, ARC_Byte*, unsigned int);
+        typedef unsigned int         (*Write_Pattern)   (ARC_Address, ARC_Word,  unsigned int);
+        typedef JTAG_OperationStatus (*Read_Register)   (ARC_RegisterNumber, ARC_RegisterContents*);
+        typedef JTAG_OperationStatus (*Write_Register)  (ARC_RegisterNumber, ARC_RegisterContents);
+
+        /* The type casts avoid "assignment from incompatible pointer type" warnings
+           at compile-time.  */
+        arc_jtag_ops.memory_read_word     = (Read_Word)      interface_is_closed;
+        arc_jtag_ops.memory_write_word    = (Write_Word)     interface_is_closed;
+        arc_jtag_ops.memory_read_chunk    = (Transfer_Chunk) interface_is_closed;
+        arc_jtag_ops.memory_write_chunk   = (Transfer_Chunk) interface_is_closed;
+        arc_jtag_ops.memory_write_pattern = (Write_Pattern)  interface_is_closed;
+        arc_jtag_ops.read_aux_reg         = (Read_Register)  interface_is_closed;
+        arc_jtag_ops.write_aux_reg        = (Write_Register) interface_is_closed;
+        arc_jtag_ops.read_core_reg        = (Read_Register)  interface_is_closed;
+        arc_jtag_ops.write_core_reg       = (Write_Register) interface_is_closed;
+        arc_jtag_ops.reset                =                  interface_is_closed;
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the module. This function is called from the gdb core on start-up.  */
+
 void
 _initialize_arc_jtag_ops (void)
 {
-    arc_jtag_ops.name=NULL;
-    arc_jtag_ops.jtag_open = arc_jtag_open;
-    arc_jtag_ops.jtag_close = arc_jtag_close;
-    arc_jtag_ops.jtag_memory_write = arc_jtag_write_chunk;
-    arc_jtag_ops.jtag_memory_read = arc_jtag_read_chunk;
-    arc_jtag_ops.jtag_memory_chunk_write = arc_jtag_write_chunk;
-    arc_jtag_ops.jtag_memory_chunk_read = arc_jtag_read_chunk;
-    arc_jtag_ops.jtag_write_aux_reg = arc_jtag_write_aux_reg;
-    arc_jtag_ops.jtag_read_aux_reg = arc_jtag_read_aux_reg;
-    arc_jtag_ops.jtag_read_core_reg = arc_jtag_read_core_reg;
-    arc_jtag_ops.jtag_write_core_reg = arc_jtag_write_core_reg;
-    arc_jtag_ops.jtag_wait = arc_jtag_wait;
-    arc_jtag_ops.jtag_reset_board = arc_jtag_reset_board;
-    arc_jtag_ops.jtag_status = JTAG_CLOSED ;
+    ENTERMSG;
+
+    /* Initialize the arc_jtag_ops global variable.  */
+
+    arc_jtag_ops.state_machine_debug = FALSE;
+    arc_jtag_ops.retry_count         = 50;
+
+    /* We want to be able to reset the board, and check whether it is connected,
+       regardless of the connection state.  */
+    arc_jtag_ops.open        = jtag_open;
+    arc_jtag_ops.close       = jtag_close;
+    arc_jtag_ops.check_open  = jtag_check_open;
+    arc_jtag_ops.reset_board = jtag_reset_board;
+
+    /* The JTAG interface is initially closed.  */
+    set_interface(JTAG_CLOSED);
 }
+
+/******************************************************************************/
diff --git a/gdb/arc-jtag-ops.h b/gdb/arc-jtag-ops.h
index dbf49e6..d278acd 100644
--- a/gdb/arc-jtag-ops.h
+++ b/gdb/arc-jtag-ops.h
@@ -1,62 +1,126 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
 
-   Authors: 
-      Sameer Dhavale <sameer.dhavale@codito.com>
-      Soam Vasani <soam.vasani@codito.com>
+   Authors:
+      Sameer Dhavale  <sameer.dhavale@codito.com>
+      Soam Vasani     <soam.vasani@codito.com>
+      Richard Stuckey <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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.  
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines the JTAG interface to an ARC processor.       */
+/*                                                                            */
+/*     Operations are provided for:                                           */
+/*        1) controlling the interface                                        */
+/*        2) reading/writing the core registers of the processor              */
+/*        3) reading/writing the auxiliary registers of the processor         */
+/*        4) reading/writing single words in the target memory                */
+/*        5) reading/writing blocks in the target memory                      */
+/*                                                                            */
+/*     The addresses specified for the memory word read/write operations must */
+/*     be word-aligned.  Those specified for the memory block read/write      */
+/*     operations may have any alignment; these operations may transfer an    */
+/*     arbitrary number of bytes.                                             */
+/*                                                                            */
+/* Usage:                                                                     */
+/*     The module exports a global variable arc_jtag_ops which holds pointers */
+/*     to the functions for the operations, as well as some state information.*/
+/*     This variable is initialized by the module's initialization function   */
+/*     which must be called before any use is made of the module (N.B. the    */
+/*     call to this function is generated by the gdb build mechanism, so this */
+/*     function should not be explicitly called).                             */
+/*                                                                            */
+/*     The variable arc_jtag_ops.retry_count controls how many repeated       */
+/*     attempts are made if a read/write operation fail; this variable is     */
+/*     initially set to 50.                                                   */
+/*                                                                            */
+/* Debugging Facilities:                                                      */
+/*     If the variable arc_jtag_ops.state_machine_debug is set to TRUE then   */
+/*     trace information will be output.                                      */
+/*                                                                            */
+/* Host/Target Byte Order:                                                    */
+/*     The register contents returned by the read/write aux/core register     */
+/*     functions, or supplied to them, are in little-endian byte order.       */
+/*                                                                            */
+/*     The memory contents returned by the read/write word/chunk/pattern      */
+/*     functions, or supplied to them, are in host byte order; the functions  */
+/*     perform whatever byte-swapping is required by the endiannness of the   */
+/*     target.                                                                */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_JTAG_OPS
+#define ARC_JTAG_OPS
+
+/* ARC header files */
+#include "arc-support.h"
 
 
-#define ARC_NR_CORE_REGS        64
-#define MAX_ARC700_REG_SIZE     4
-#define JTAG_READ_FAILURE 0
-#define JTAG_WRITE_FAILURE 0
-enum arc_jtag_status
-  {
+#define ARC_TARGET_NAME     "arcjtag"
+
+
+typedef enum
+{
+    JTAG_SUCCESS,
+    JTAG_READ_FAILURE,
+    JTAG_WRITE_FAILURE
+} JTAG_OperationStatus;
+
+
+typedef enum
+{
     JTAG_OPENED,
-    JTAG_CLOSED, 
-    JTAG_RUNNING
-  };
-
-struct jtag_ops{
-  char *name;
-  void (*jtag_open) (void);
-  void (*jtag_close) (void);
-  int (*jtag_memory_write) (unsigned int, unsigned int *, int);
-  int (*jtag_memory_chunk_write) (unsigned int, unsigned int *, int);
-  int (*jtag_memory_read) (unsigned int, unsigned int *, int);
-  int (*jtag_memory_chunk_read) (unsigned int, unsigned int *, int);
-  int (*jtag_read_aux_reg) (unsigned int, unsigned int *);
-  int (*jtag_write_aux_reg) (unsigned int, unsigned int);
-  int (*jtag_read_core_reg) (unsigned int, unsigned int *);
-  int (*jtag_write_core_reg) (unsigned int, unsigned int);
-  void (*jtag_wait) (void);
-  void (*jtag_reset_board) (void);
-  enum arc_jtag_status jtag_status;
-  int arc_jtag_state_machine_debug;
-};
+    JTAG_CLOSED
+} JTAG_Status;
 
 
-#define IS_ARC700	(arc_get_architecture() == ARC700)
-#define IS_ARC600	(arc_get_architecture() == ARC600)
-#define IS_A5		(arc_get_architecture() == A5)
-#define IS_A4		(arc_get_architecture() == A4)
+typedef struct
+{
+    JTAG_Status  status;
+    unsigned int retry_count;
+    Boolean      state_machine_debug;
+
+    Boolean (*open)        (ARC_RegisterNumber mem_subsys);
+    void    (*close)       (void);
+    void    (*reset)       (void);
+    void    (*reset_board) (void);
+    void    (*check_open)  (void);
+
+    /* These operations return the number of bytes read/written.  */
+    unsigned int (*memory_read_word)     (ARC_Address address, ARC_Word *data);                          /* single word.  */
+    unsigned int (*memory_write_word)    (ARC_Address address, ARC_Word  data);                          /* single word.  */
+    unsigned int (*memory_read_chunk)    (ARC_Address address, ARC_Byte *data,    unsigned int words);   /* block.        */
+    unsigned int (*memory_write_chunk)   (ARC_Address address, ARC_Byte *data,    unsigned int words);   /* block.        */
+    unsigned int (*memory_write_pattern) (ARC_Address address, ARC_Word  pattern, unsigned int words);   /* block.        */
+
+    JTAG_OperationStatus (*read_aux_reg)   (ARC_RegisterNumber reg, ARC_RegisterContents *contents);
+    JTAG_OperationStatus (*write_aux_reg)  (ARC_RegisterNumber reg, ARC_RegisterContents  contents);
+    JTAG_OperationStatus (*read_core_reg)  (ARC_RegisterNumber reg, ARC_RegisterContents *contents);
+    JTAG_OperationStatus (*write_core_reg) (ARC_RegisterNumber reg, ARC_RegisterContents  contents);
+} JTAG_Operations;
+
+
+extern JTAG_Operations arc_jtag_ops;
+
+
+#endif /* ARC_JTAG_OPS */
+/******************************************************************************/
diff --git a/gdb/arc-jtag-tdep.c b/gdb/arc-jtag-tdep.c
deleted file mode 100644
index 8401538..0000000
--- a/gdb/arc-jtag-tdep.c
+++ /dev/null
@@ -1,638 +0,0 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
-
-   Copyright 2005 Free Software Foundation, Inc.
-
-   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
-
-   Authors: 
-      Soam Vasani <soam.vasani@codito.com>
-      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
-
-   This file is part of GDB.
-   
-   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 <string.h>
-
-#include "defs.h"
-#include "osabi.h"
-#include "frame.h"
-#include "regcache.h"
-#include "gdb_assert.h"
-#include "inferior.h"
-#include "gdbcmd.h"
-#include "reggroups.h"
-
-#include "arc-tdep.h"
-#include "arc-jtag.h"
-
-
-#ifdef ARC4_JTAG
-/* brk */
-unsigned int a4_jtag_breakpoint_size = 4;
-unsigned char a4_jtag_breakpoint_insn[4] = { 0x00, 0xfe, 0xff, 0x1f };
-#define A4_HALT_VALUE 0x02000000
-#else
-/* brk_s */
-unsigned int arc700_jtag_breakpoint_size = 2;
-unsigned char arc700_jtag_breakpoint_insn[2] = { 0xff, 0x7f };
-#endif
-
-
-
-struct arc_reg_info 
-{
-  char *name ;
-  int hw_regno;
-  char *description;
-#ifdef ARC4_JTAG
-  enum arc4_jtag_regnums gdbregno;
-#else
-  enum arc700_jtag_regnums gdbregno;
-#endif
-  enum ARCProcessorVersion arcVersionSupported;
-};
-
-
-
-static const char *
-arc_jtag_register_name (int regno)
-{
-  static char jtag_names[][30] = {
-    "r0", "r1", "r2", "r3", "r4", "r5", "r6",
-    "r7", "r8", "r9", "r10", "r11", "r12", "r13",
-    "r14", "r15", "r16", "r17", "r18", "r19", "r20",
-    "r21", "r22", "r23", "r24", "r25", "r26",
-    
-    "fp",
-    "sp",
-    "ilink1",
-    "ilink2",
-    "blink",
-    
-    /* Extension core regs are 32..59 inclusive.  */
-    "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
-    "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", "r48", "r49",
-    "r50", "r51", "r52", "r53", "r54", "r55", "r56", "r57", "r58", "r59",
-       
-    "lp_count",
-
-    /* 61 is reserved, 62 is not a real register.  */
-    /*FIXMEA: The following 3 are supposed to be registers
-     that are used only to encode immediate values in A4*/
-    "r61",
-    "r62",
-    
-    "pcl",
-
-    /* Now the aux registers.  */
-    
-    "status",
-    "semaphore",
-    "lp_start",
-    "lp_end",
-    "identity",
-    "debug",
-    
-#ifndef ARC4_JTAG
-    "pc",
-    "status32",
-    "status32_l1",
-    "status32_l2",
-
-    "count0",
-    "control0",
-    "limit0",
-    "int_vector_base",
-    "aux_macmode",
-    "aux_irq_lv12",
-
-
-    "count1",
-    "control1",
-    "limit1",
-    "aux_irq_lev",
-    "aux_irq_hint",
-    "eret",
-    "erbta",
-    "erstatus",
-    "ecr",
-    "efa",
-    "icause1",
-    "icause2",
-    "aux_ienable",
-    "aux_itrigger",
-    "xpu",
-    "bta",
-    "bta_l1",
-    "bta_l2",
-    "aux_irq_pulse_cancel",
-    "aux_irq_pending",
-
-    /* Build configuration registers.  */
-    "bcr_0",
-    "dccm_base_build",
-    "crc_base_build",
-    "bta_link_build",
-    "dvbf_build",
-    "tel_instr_build",
-    "bcr_6",
-    "memsubsys",
-    "vecbase_ac_build",
-    "p_base_address",
-    "bcr_a",
-    "bcr_b",
-    "bcr_c",
-    "bcr_d",
-    "bcr_e",
-    "mmu_build",
-    "arcangel_build",
-    "bcr_11",
-    "d_cache_build",
-    "madi_build",
-    "dccm_build",
-    "timer_build",
-    "ap_build",
-    "icache_build",
-    "iccm_build",
-    "dspram_build",
-    "mac_build",
-    "multiply_build",
-    "swap_build",
-    "norm_build",
-    "minmax_build",
-    "barrel_build",
-#endif
-    
-  };
-  
-  gdb_assert(ARRAY_SIZE (jtag_names) == NUM_REGS + NUM_PSEUDO_REGS);
-  gdb_assert(regno >=0 && regno < NUM_REGS + NUM_PSEUDO_REGS);
-
-  return jtag_names[regno];
-}
-
-int
-arc_jtag_register_reggroup_p (int regnum, struct reggroup *group)
-{
-  /* These registers don't exist, so they are not in any reggroup.  */
-  if ((regnum >= 32 && regnum <= 59) || (regnum == 61) || (regnum == 62))
-    return 0;
-
-  /* Which regs to save/restore ? */
-  if ((group == save_reggroup || group == restore_reggroup))
-    {
-      /* Save/restore:
-	 1. all core regs, except PCL (PCL is not writable)
-	 2. aux regs LP_START..LP_END (IDENTITY is not writable)
-	 3. aux regs PC_REGNUM..STATUS32_L2
-	 3. aux regs ERET..EFA */
-      return ( ( regnum >= 0 && regnum < ARC_PCL_REGNUM)
-	       || ( regnum >= ARC_LP_START_REGNUM && regnum<= ARC_LP_END_REGNUM)
-#ifdef ARC4_JTAG
-	       || ( regnum == ARC_STATUS_REGNUM)
-#else	       
-	       || ( regnum >= ARC_PC_REGNUM && regnum <= ARC_STATUS32_L2_REGNUM)
-	       || ( regnum >= ARC_ERET_REGNUM && regnum <= ARC_EFA_REGNUM)
-#endif
-	       );
-    }
-  
-  return -1;
-}
-
-static void
-arc_jtag_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
-			       struct frame_info *frame, int regnum, int all)
-{
-  int i;
-
-  if (regnum >= 0 )
-    {
-      default_print_registers_info (gdbarch, file, frame, regnum, all);
-      return;
-    }
-
-  /* if regnum < 0 , print all registers */
-
-  for (i=0; i <= 26; ++i)
-    default_print_registers_info (gdbarch, file, frame, i, all);
-  default_print_registers_info (gdbarch, file, frame, 
-				ARC_FP_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, 
-				ARC_SP_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, 
-				ARC_ILINK1_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, 
-				ARC_ILINK2_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, 
-				ARC_BLINK_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, 
-				ARC_LP_COUNT_REGNUM, all);
-  
-  /* now the aux registers */
-   if (!all)
-    {
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_LP_START_REGNUM, all);
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_LP_END_REGNUM, all);
-      
-#ifndef ARC4_JTAG 
-      default_print_registers_info (gdbarch, file,frame,
-				    ARC_STATUS32_REGNUM, all);
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_BTA_REGNUM, all);
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_EFA_REGNUM, all);
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_ERET_REGNUM, all);
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_STATUS32_L1_REGNUM, all);
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_STATUS32_L2_REGNUM, all);
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_ERSTATUS_REGNUM, all);
-      
-      
-      /* PC */
-      default_print_registers_info (gdbarch, file, frame, 
-				    ARC_PC_REGNUM, all);
-#endif
-    }
-   else
-     {
-       /* This part needs cleaning up. */
-       for (i = ARC_STATUS_REGNUM;
-#ifndef ARC4_JTAG
-	    i <= ARC_AUX_IRQ_PENDING_REGNUM;
-#else /*FIXMEA*/
-	    i <=  ARC_DEBUG_REGNUM;
-#endif
-	    i ++ )
-	 default_print_registers_info (gdbarch, file, frame , 
-				       i, all);
-
-       
-       for (i = ARC_STATUS_REGNUM ; 
-#ifndef ARC4_JTAG
-	    i <= ARC_AUX_IRQ_PENDING_REGNUM;
-#else /*FIXMEA*/
-	    i <=  ARC_DEBUG_REGNUM;
-#endif
-	    i ++ )
-	 default_print_registers_info (gdbarch, file, frame, 
-				       i, all);
-       
-#ifndef ARC4_JTAG
-       for (i = ARC_BCR_1_REGNUM ; 
-	    i <= ARC_BCR_5_REGNUM ;
-	    i ++ )
-	 default_print_registers_info (gdbarch, file , frame, 
-				       i , all);
-       
-       for (i = ARC_BCR_7_REGNUM ;
-	    i <= ARC_BCR_9_REGNUM;
-	    i ++ )
-	 default_print_registers_info (gdbarch, file, frame, 
-				       i , all);
-
-       for (i = ARC_BCR_F_REGNUM;
-	    i <= ARC_BCR_10_REGNUM;
-	    i ++ )
-	 default_print_registers_info (gdbarch, file, frame , 
-				       i , all);
-
-       for (i = ARC_BCR_12_REGNUM;
-	    i <= ARC_BCR_1F_REGNUM;
-	    i ++)
-	 default_print_registers_info (gdbarch, file, frame , 
-				       i , all);
-#endif //if no ARC4_JTAG
-
-
-     }
-}
-
-/* Command: aux-read <from> <to>
-
-   Read and display a range of aux registers.  Some of the aux registers
-   (pc, debug, etc.) are part of the register set, but this is a more
-   general interface.
-
-   We should eventually change this to use the ui_out stuff rather than
-   printf_filtered.  */
-static void
-arc_jtag_aux_read_command (char *arg, int from_tty)
-{
-  char *arg2 = 0;
-  struct expression *expr;
-  struct value *val;
-  struct cleanup *old_chain = 0;
-  int auxregno, auxregno2 = 0, nrregs;
-  unsigned int *buf;
-  int i, nrtransfered;
-
-  if (!arg)
-    {
-      printf_filtered ("aux-read <REG-FROM> [<REG-TO>]\n");
-      return;
-    }
-  
-  /* strip leading spaces */
-  while(*arg == ' ')
-    arg++;
-
-  /* two arguments ?  */
-  /* This assumes that the first arg cannot have spaces.  (The disas command
-     also seems to work this way.)  */
-  arg2 = strchr (arg, ' ');
-
-  /* get the second one */
-  if (arg2)
-    {
-      struct expression *expr2;
-      struct value *val2;
-
-      arg2[0] = 0;
-      arg2++;
-     
-      expr2 = parse_expression (arg2);
-      val2 = evaluate_expression (expr2);
-      xfree (expr2);
-
-      auxregno2 = *(int *)(VALUE_CONTENTS (val2));
-    }
-
-  /* first arg */
-  expr = parse_expression (arg);
-  val = evaluate_expression (expr);
-  old_chain = make_cleanup (free_current_contents, &expr);
-  
-  auxregno = *(int *)(VALUE_CONTENTS (val));
-
-  /* so, how many regs do we want ? */
-  if (arg2)
-    {
-      if (auxregno2 < auxregno)
-	{
-	  warning ("aux-read: %s < %s, showing one register", arg2, arg);
-	  nrregs = 1;
-	}
-      else
-	nrregs = auxregno2 - auxregno + 1;
-    }
-  else
-    nrregs = 1;
-
-  buf = xcalloc (nrregs, sizeof(int));
-  make_cleanup (free_current_contents, &buf);
-  
-  /* Go get 'em !  */
-  nrtransfered = target_read_aux_reg (buf, auxregno, nrregs);
-  if (nrtransfered <= 0)
-    {
-      do_cleanups (old_chain);
-      error ("aux-read: couldn't read any registers.");
-    }
-  else if (nrtransfered < nrregs)
-    {
-      warning ("aux-read: could only read %d registers", nrtransfered);
-    }
-  
-  gdb_assert (nrtransfered <= nrregs);
-
-  /* Show them.  */
-  for (i = auxregno; i - auxregno < nrtransfered; ++i)
-    {
-      if ((i - auxregno) % 4 == 0)
-	printf_filtered("%s%08x: ", ((i - auxregno) ? "\n" : ""), i);
-      
-      printf_filtered ("%08x ", buf[i - auxregno]);
-    }
-  printf_filtered ("\n");
-  
-  do_cleanups (old_chain);
-}
-
-/* aux-write <regnum> = <value>
-   Write VALUE to aux register REGNUM. */
-static void
-arc_jtag_aux_write_command (char *arg, int from_tty)
-{
-  char *value_arg = 0;
-  struct expression *regnum_expr, *value_expr;
-  struct value *regnum_val, *value_val;
-  struct cleanup *old_chain = 0;
-  unsigned int regnum, value;
-  int err;
-  
-  if (!arg)
-    {
-      printf_filtered ("aux-write <regnum> = <value>\n");
-      return;
-    }
-
-  value_arg = strchr(arg, '=');
-  if (!value_arg)
-    {
-      error ("aux-write: can't find second argument\n\
-Usage: aux-write <regnum> = <value>");
-      return;
-    }
-  value_arg[0] = 0;
-  value_arg++;
-
-  /* Regnum expression */
-  regnum_expr = parse_expression (arg);
-  regnum_val = evaluate_expression (regnum_expr);
-  old_chain = make_cleanup (free_current_contents, &regnum_expr);
-  regnum = *(unsigned int *)(VALUE_CONTENTS (regnum_val));
-
-  /* Value expression */
-  value_expr = parse_expression (value_arg);
-  value_val = evaluate_expression (value_expr);
-  make_cleanup (free_current_contents, &value_expr);
-  value = *(unsigned int *)(VALUE_CONTENTS (value_val));
-
-  /* Write it.  */
-  err = target_write_aux_reg (&value, regnum, 1);
-  if (err != 1)
-    {
-      do_cleanups (old_chain);
-      error ("aux-write: couldn't write to register 0x%x", regnum);
-    }
-
-  do_cleanups (old_chain);
-}
-
-#ifdef ARC4_JTAG
-//  gdbarch_write_pc_ftype *write_pc;
-/*
-  Write PC
-  Arguments:
-  1.CORE_ADDR val : Contains the value to be written into PC.
-  2.ptid_t ptid: Process id of the process.
-
-  Returns: void
-  Description: FIXMEA: Update
-      Reads the status register
-      Inserts the value (upper 24 bit) into the bits
-      0-23 in the status register
-      Write the status register
- */
-void
-a4_jtag_write_pc (CORE_ADDR val, ptid_t ptid)
-{
-  CORE_ADDR insert_val = val >> 2;
-  unsigned int buffer;
-
-
-  if(debug_arc_jtag_target_message)
-      printf_filtered ("\n -----***------------ a4_jtag_write_pc Entered ---*%%*#\n");
-
-  
-  target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
-
-  if (!(buffer & A4_HALT_VALUE))
-    {
-      if(debug_arc_jtag_target_message)
-	printf_filtered ("\n***** Halting Processor... *********\n");
-      
-      buffer = buffer | A4_HALT_VALUE ;
-      target_write_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
-      /* Now the A4 processor has halted*/
-    }
-  
-  if(debug_arc_jtag_target_message)
-    printf_filtered (" \nWriting value %u to PC\n", val);
-
-
-  target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
-  if(debug_arc_jtag_target_message)
-    printf_filtered (" \nValue of Status Register before writing %d\
-                     \n Value of PC: 0x%x\n", buffer, buffer & 0x00ffffff);
-
-  buffer = buffer & 0xff000000;
-  insert_val    = insert_val & 0x00ffffff;
-  buffer = buffer | insert_val ;
-  
-  if(debug_arc_jtag_target_message)
-    printf_filtered (" \nValue of Status Register to be written %d\
-                       \n Value of PC: 0x%x\n", buffer, buffer & 0x00ffffff);
-
-  //  jtag_ops.jtag_write_aux_reg (ARC_STATUS_REGNUM, buffer);
-  target_write_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
-
-  if(debug_arc_jtag_target_message)
-    {
-      target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
-      printf_filtered (" \nValue of Status Register after reading again %d\
-                        \n Value of PC: 0x%x\n", buffer, buffer & 0x00ffffff);
-    }
-
-    if(debug_arc_jtag_target_message)
-      printf_filtered ("\n -----***------------ a4_jtag_write_pc Leaving ---*%%*#\n");
-
-}
-
-
-/*
-  Read PC
-  Arguments:
-  1.ptid_t ptid: Process id of the process.
-
-  Returns: CORE_ADDR 
-  Description:
-      Reads the status register
-      Extracts the PC value from it.
-      Right shift twice to get correct value of PC
-      return PC
-*/
-CORE_ADDR
-a4_jtag_read_pc (ptid_t ptid)
-{
-  unsigned int buffer;
-
-  if (debug_arc_jtag_target_message)
-    printf_filtered ("\n Entering a4_jtag_read_pc ()");
-  buffer = 0;
-  target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
-  if (debug_arc_jtag_target_message)
-    printf_filtered ("\n Value of Status Reg: 0x%x",buffer);
-  buffer = buffer & 0x00ffffff;
-  buffer = buffer << 2;
-
-  if (debug_arc_jtag_target_message)
-    printf_filtered ("\n Leaving a4_jtag_read_pc ()\
-                      \n Value of Pc: 0x%x\n", buffer);
-  
-  return buffer;
-}
-
-#endif // ARC4_JTAG
-
-ARCVariantsInfo arc_debug_processor_information;
-
-struct gdbarch *
-arc_jtag_init (struct gdbarch *gdbarch)
-{
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-
-#ifndef ARC4_JTAG
-  tdep->arc_breakpoint_size = arc700_jtag_breakpoint_size;
-  tdep->arc_breakpoint_insn = arc700_jtag_breakpoint_insn;
-#else
-  tdep->arc_breakpoint_size = a4_jtag_breakpoint_size;
-  tdep->arc_breakpoint_insn = a4_jtag_breakpoint_insn;
-#endif
-
-  set_gdbarch_num_regs (gdbarch, ARC_NR_REGS);
-#ifndef ARC4_JTAG
-  set_gdbarch_pc_regnum (gdbarch, ARC_PC_REGNUM);
-#else
-  //  set_gdbarch_pc_regnum (gdbarch, ARC_STATUS_REGNUM);
-  set_gdbarch_write_pc (gdbarch, a4_jtag_write_pc);
-  set_gdbarch_read_pc (gdbarch, a4_jtag_read_pc);
-#endif
-  set_gdbarch_register_name (gdbarch, arc_jtag_register_name);
-  
-  set_gdbarch_print_registers_info (gdbarch, arc_jtag_print_registers_info);
-
-  tdep->register_reggroup_p = arc_jtag_register_reggroup_p;
-
-  tdep->lowest_pc = 0;
-  
-  tdep->sigtramp_p = NULL;
-
-  tdep->arc_processor_variant_info = &arc_debug_processor_information;
-
-  /* Auxillary register commands.  */
-  add_cmd ("arc-aux-read", class_vars, arc_jtag_aux_read_command,
-	   "Read and show a range of auxillary registers.\n\
-Usage: arc-aux-read <REG-FROM> [<REG-TO>]\n\
-REG-FROM and REG-TO can be any expressions that evaluate to integers.\n\
-If REG-TO is not specified, one register is displayed.",
-	   &cmdlist);
-
-  add_cmd ("arc-aux-write", class_vars, arc_jtag_aux_write_command,
-	   "Write to an auxillary register.\n\
-Usage: arc-aux-write <REG> = <VALUE>\n\
-REG and VALUE can be any expressions that evaluate to integers.",
-	   &cmdlist);
-
-  return gdbarch;
-}
-
diff --git a/gdb/arc-jtag.c b/gdb/arc-jtag.c
index 9a86b6d..02c8b6e 100644
--- a/gdb/arc-jtag.c
+++ b/gdb/arc-jtag.c
@@ -1,1297 +1,1173 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
 
-   Authors: 
-      Sameer Dhavale <sameer.dhavale@codito.com>
-      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+   Authors:
+      Sameer Dhavale       <sameer.dhavale@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+      Richard Stuckey      <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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 <stdio.h>
-#include <string.h>
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module creates an instance of a gdb 'target_ops' structure which  */
+/*     contains information and operations for debugging a remote ARC target  */
+/*     with JTAG.                                                             */
+/*                                                                            */
+/*     It also registers a number of ARC-specific commands with gdb.          */
+/*                                                                            */
+/* Usage:                                                                     */
+/*     The module exports a function _initialize_arc_jtag: the call to this   */
+/*     function is generated by the gdb build mechanism, so this function     */
+/*     should not be explicitly called.                                       */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+
+/* gdb header files */
 #include "defs.h"
 #include "inferior.h"
-#include "target.h"
-#include "breakpoint.h"
-
-#include "arc-tdep.h"
-
-#include <unistd.h>
-#include <stdlib.h>
-
-#include <sys/io.h>
-#include <sys/types.h>
-
-#include <assert.h>
-
-#include "arc-jtag.h"
-#include "arc-jtag-ops.h"
-#include "gdbcore.h"
-#include "gdbarch.h"
-#include "regcache.h"
-#include "command.h"
 #include "gdbcmd.h"
-#include <signal.h>
+#include "objfiles.h"
+#include "libiberty.h"
+#include "gdb_assert.h"
 
-/* Flag to print debug messages from here. */
-/* FIXMEA:
-static int debug_arc_jtag_target_message;
-*/
-
-#define ENTERMSG  \
-do {\
-if(debug_arc_jtag_target_message) \
-printf_filtered ("--- entered %s:%s()\n", __FILE__, __FUNCTION__); \
-} while(0)
-
-#define ENTERARGS(fmt, args...) \
-do { \
-if(debug_arc_jtag_target_message) \
-printf_filtered ("--- entered %s:%s(" fmt ")\n", __FILE__, __FUNCTION__, args);\
-} while(0)
-
-#define LEAVEMSG \
-do { \
-if(debug_arc_jtag_target_message) \
-printf_filtered ("--- exited %s:%s()\n", __FILE__, __FUNCTION__); \
-} while(0)
-
-/* The number of times a memory read/write operation should be attempted
-   before returning an error.
-*/
-#define MEMORY_TRANSFER_ATTEMPTS 10
-
-/* defined in arc-jtag-ops.c */
-extern unsigned int arcjtag_retry_count;
-
-struct target_ops arc_debug_ops;
-extern struct jtag_ops arc_jtag_ops;
-
-static void arc_debug_interrupt (int signo);
-static void arc_debug_interrupt_twice (int signo);
-static void arc_print_processor_variant_info (void);
-static int arc_debug_write_aux_register (int hwregno, int *buf);
-static int arc_debug_read_aux_register (int hwregno, int *buf);
-static int arc_debug_read_core_register (int hwregno, int *buf);
+/* ARC header files */
+#include "config/arc/tm-embed.h"
+#include "arc-jtag.h"
+#include "arc-gpio.h"
+#include "arc-tdep.h"
+#include "arc-board.h"
+#include "arc-jtag-ops.h"
+#include "arc-elf32-tdep.h"
+#include "arc-architecture.h"
+#include "arc-registers.h"
+#include "arc-jtag-actionpoints.h"
 
 
-/* Register Mapping information between GDB regnums
-   and actual hardware register numbers. 
-*/
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
 
-struct arc_reg_info 
+typedef enum
 {
-  char *name ;
-  enum arc_hw_regnums hw_regno;
-  char *description;
-#ifdef ARC4_JTAG
-  enum arc4_jtag_regnums gdbregno;
-#else
-  enum arc700_jtag_regnums gdbregno;
-#endif
-  enum ARCProcessorVersion arcVersionSupported;
-};
-
-#define RBCR(name, hwregno , desc, gdbregno, version) { #name, hwregno , desc , gdbregno , version } ,
-
-#undef RAUX
-struct arc_reg_info arc_bcr_reg_info [] = 
-  {
-   #include "arc-regnums-defs.h"
-  };
-
-#undef RAUX
-#undef RBCR
-#define RAUX(name, hwregno , desc, gdbregno, version) { #name , hwregno , desc , gdbregno , version } ,
-struct arc_reg_info arc_aux_reg_map[] =
-  {
-    #include "arc-regnums-defs.h"
-  };
+    CLEAR_USER_BIT,
+    RESTORE_USER_BIT
+} Status32Action;
 
 
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
 
-static void 
-arc_update_architecture(void)
+#define ARC_CONFIGURATION_COMMAND      "arc-configuration"
+#define ARC_RESET_BOARD_COMMAND        "arc-reset-board"
+#define ARC_LIST_ACTIONPOINTS_COMMAND  "arc-list-actionpoints"
+#define ARC_FSM_DEBUG_COMMAND          "arcjtag-debug-statemachine"
+#define ARC_JTAG_RETRY_COMMAND         "arcjtag-retry-count"
+
+#define ARC_CONFIGURATION_COMMAND_USAGE      "Usage: info " ARC_CONFIGURATION_COMMAND     "\n"
+#define ARC_RESET_BOARD_COMMAND_USAGE        "Usage: "      ARC_RESET_BOARD_COMMAND       "\n"
+#define ARC_LIST_ACTIONPOINTS_COMMAND_USAGE  "Usage: "      ARC_LIST_ACTIONPOINTS_COMMAND "\n"
+
+
+/* The gdb target operations structure for this target.  */
+static struct target_ops jtag_target_ops;
+
+/* A set of pointers to operations for reading/writing registers/memory in the
+   JTAG target. */
+static TargetOperations operations;
+
+/* The h/w register numbers of various auxiliary registers needed for
+   controlling the target processor.  */
+static ARC_RegisterNumber lp_start_regnum;
+static ARC_RegisterNumber lp_end_regnum;
+static ARC_RegisterNumber icache_ivic_regnum;
+static ARC_RegisterNumber icache_control_regnum;
+static ARC_RegisterNumber dcache_ivdc_regnum;
+static ARC_RegisterNumber dcache_control_regnum;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               external data                                */
+/* -------------------------------------------------------------------------- */
+
+/* This declaration should be in the file breakpoint.h (a gdb core file).  */
+extern struct breakpoint *breakpoint_chain;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define IS_ARC700   (arc_get_architecture(arc_read_jtag_aux_register) == ARC700)
+#define IS_ARC600   (arc_get_architecture(arc_read_jtag_aux_register) == ARC600)
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------------- */
+/* 1)                functions for reading/writing registers                  */
+/* -------------------------------------------------------------------------- */
+
+/* Set UB bit in the DEBUG register: this allows brk_s instruction to work in
+   User mode.
+
+  Returns TRUE if the operation is successful.  */
+
+static Boolean
+set_debug_user_bit (ARC_RegisterContents extra_bits)
 {
-  unsigned int idinfo;
-  unsigned short tmp;
-  struct gdbarch_tdep * tdep = gdbarch_tdep (current_gdbarch);
+    /* The DEBUG User bit exists only in the ARC700 variant.  */
+    if (IS_ARC700)
+        extra_bits |= DEBUG_USER;
 
-  if (IS_ARC700) {
-    tdep->arc_processor_variant_info->arcprocessorversion = ARC700;
-    set_gdbarch_decr_pc_after_break (current_gdbarch,0);
-  }
-  else if(IS_ARC600) {
-    tdep->arc_processor_variant_info->arcprocessorversion = ARC600;
-    set_gdbarch_decr_pc_after_break (current_gdbarch,2);
-  }
-  else if(IS_A5) {
-    warning ("A5 debugging is unsupported and may be buggy.");
-    tdep->arc_processor_variant_info->arcprocessorversion = A5;
-  }
-  else {
-    tdep->arc_processor_variant_info->arcprocessorversion = A4;
-    set_gdbarch_decr_pc_after_break (current_gdbarch,0);
-  }    
-}
-
-/* Get us out of user mode.  */
-static unsigned int
-clear_status32_user_bit ()
-{
-  int rd;
-#ifndef ARC4_JTAG  
-  if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_STATUS32_REGNUM, &rd) == JTAG_READ_FAILURE)
-    error("Failure reading auxillary register 0x%x:status32 register", ARC_HW_STATUS32_REGNUM);
-
-  if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS32_REGNUM, rd & ~0x80) == JTAG_READ_FAILURE)
-    error("Failure writing to auxillary register 0x%x:status32 register", ARC_HW_STATUS32_REGNUM);
-#endif
-  return rd;
-}
-
-/* Restore a saved status32; use with clear_status32_user_bit().  */
-static void
-restore_status32_user_bit (unsigned int status32)
-{
-#ifndef ARC4_JTAG
-  if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS32_REGNUM, status32) == JTAG_READ_FAILURE)
-    error("Failure writing to auxillary register 0x%x:status32 register", ARC_HW_STATUS32_REGNUM);
-#endif
-}
-
-/* UB bit in the debug register.  It allows brk_s to work in user mode.  */
-static void
-set_debug_user_bit ()
-{
-  if(is_arc700 ())
+    /* If we have extra bits to be set in the DEBUG register.  */
+    if (extra_bits != 0)
     {
-      /* set UB = 1 */
-      unsigned int debug;
-      if (arc_jtag_ops.jtag_read_aux_reg (ARC_HW_DEBUG_REGNUM, &debug) == JTAG_READ_FAILURE)
-	error("Failure reading auxillary register 0x%x:debug register",ARC_HW_DEBUG_REGNUM);
-      debug |= 0x10000000;                     
-      arc_jtag_ops.jtag_write_aux_reg (ARC_HW_DEBUG_REGNUM, debug);
+        ARC_RegisterContents debug;
+
+        if (arc_read_jtag_aux_register(arc_debug_regnum, &debug, TRUE))
+        {
+            /* Set UB = 1.  */
+            ARC_RegisterContents new_debug = debug | extra_bits;
+
+            /* Do the write only if it will change the register contents.  */
+            if (new_debug != debug)
+                return arc_write_jtag_aux_register(arc_debug_regnum, new_debug, TRUE);
+        }
+        else
+            return FALSE;
     }
+
+    return TRUE;
 }
 
 
+/* Clear or restore the User bit in the STATUS32 auxiliary register.  */
 
 static void
-invalidateCaches (void)
+change_status32 (Status32Action action)
 {
-    if(arc_jtag_ops.jtag_write_aux_reg ( ARC_HW_ICACHE_IVIC , 1)==JTAG_WRITE_FAILURE)
-	error("Failure writing 0x1 to auxillary register 0x%x:Icache invalidate\n",ARC_HW_ICACHE_IVIC);
-    if(arc_jtag_ops.jtag_write_aux_reg ( ARC_HW_DCACHE_IVIC , 1)==JTAG_WRITE_FAILURE)
-	error("Failure writing 0x1 to auxillary register 0x%x:Dcache invalidate\n",ARC_HW_DCACHE_IVIC);
-}
+    static ARC_RegisterContents status32 = 0;
 
-static void
-disableCaches (void)
-{
-  /* Disabling Icache */
-    if(arc_jtag_ops.jtag_write_aux_reg( ARC_HW_ICACHE_CONTROL ,0x1)==JTAG_WRITE_FAILURE)
-      error("Failure writing 0x1 to auxillary register 0x%x:Icache control register\n",ARC_HW_ICACHE_CONTROL);
-  /* Disabling Dcache */
-    if(arc_jtag_ops.jtag_write_aux_reg( ARC_HW_DCACHE_CONTROL ,0x1)==JTAG_WRITE_FAILURE)
-	error("Failure writing 0x1 to auxillary register 0x%x:Dcache control register\n",ARC_HW_DCACHE_CONTROL);
-}
-
-
-/* Function: arc_debug_open
- * Parameters :
- * 1. args :
- * 2. from_tty:
- * Returns : void
- * Description: 
-	1. Connect to the jtag target . 
-	2. Read the number of action points supported. 
-	3. Read the configuration of action points. 
-	4. Set up internal data structures for number of hardware
-	   breakpoints and watchpoints. 
-	5. Set the UB bit to 1 for ARC700 and not for ARC600.
- * 
- */
-
-void
-arc_debug_open (char *args, int from_tty)
-{
-  ENTERARGS("%s", args);
-  target_preopen(from_tty);
-  
-  reopen_exec_file ();
-  reread_symbols ();
-  
-  unpush_target (&arc_debug_ops);  
-  arc_jtag_ops.jtag_open();
-  push_target (&arc_debug_ops);
-
-  /* Call arc_update_architecture if opened successfully.  */
-  arc_update_architecture();
-  /* Fixme  :: Should these be in create_inferior or 
-     some place else ?. We would not like these here
-     when attach starts working. 
-  */
-  disableCaches();
-#ifdef ARC4_JTAG
-  if(arc_jtag_ops.jtag_write_aux_reg (ARC_HW_STATUS_REGNUM, 0x02000000)==JTAG_WRITE_FAILURE)
-          error("Failure writing 0x0200 0000 to auxillary register 0x%x:status register\n",ARC_HW_STATUS_REGNUM);
-
-  if (from_tty)
-    printf_filtered ("Connected to the arcjtag target.\n");  
-  
-#else
-  if(arc_jtag_ops.jtag_write_aux_reg (ARC_HW_STATUS32_REGNUM, 0x1)==JTAG_WRITE_FAILURE)
-
-    error("Failure writing 0x1 to auxillary register 0x%x:status32 register\n",ARC_HW_STATUS32_REGNUM);
-  
-  /* allow breakpoints in user mode.  */
-  set_debug_user_bit ();
-
-
-  if (from_tty)
-    printf_filtered ("Connected to the arcjtag target.\n");  
-#endif
-}
-
-void arc_debug_close()
-{
-    arc_jtag_ops.jtag_close();
-}
-
-/* Function: arc_debug_attach
- * Parameters :
- * 1. char *x:
- * 2. int i:
- * Returns : void
- * Description: 
- *  1. attach without resetting the board 
- *  2. get all Board configuration registers of interest.
- *  if ARC700 set the UB bit to 1. (This is invalid in the 
- *  ARC600).
- */
-
-
-void
-arc_debug_attach (char *x, int i)
-{
-
-  ENTERMSG;
-}
-
-
-/* Function: arc_debug_attach
- * Parameters :
- * 1. char *x:
- * 2. int i:
- * Returns : void
- * Description: 
- *  1. Detach without resetting the board. 
- */
-void
-arc_debug_detach (char *x, int i)
-{
-	
-  ENTERMSG;
-
-  /* Let it continue.  */
-  target_resume (inferior_ptid, 0, 0);
-}
-
-
-/* Function: arc_debug_resume
- * Parameters :
- * 1. ptid_t ptid:
- * 2. int step: 1 - single step , 0 run freely.
- * 3. enum target_signal signal;
- * Returns : void
- * Description: 
- *  	1. What about Pipecleaning?
- *	2. Write 0 to the HALT bit in status32.
- *      3. Send a signal (ignore) in this case. 
- *      4. if(step) use hardware single step on the ARC700.
- *          done by setting the IS bit in the debug register
- *          and clearing the halt bit in status32. 
- *	
- */
-
-void
-arc_debug_resume (ptid_t ptid, int step, enum target_signal signal)
-{
-  
-  ENTERARGS("%d,%d,%d", ptid.pid, step, signal);
-  /* Make the inferior resume execution, sending a signal if necessary */
-  unsigned int rd;
-
-  /* Because breakpoints may have been set/removed.  */
-  invalidateCaches ();
-
-  /* This bit is required if breakpoints are to be allowed in user mode.  We
-     set it in target_open, but the operating system might clear it.  So we
-     set it every time we resume.  */
-  set_debug_user_bit ();
-
-  if(step)
-  {
-
-    /* reading debug reg */
-      if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_DEBUG_REGNUM,&rd)==JTAG_READ_FAILURE)
-	  error("Failure reading auxillary register 0x%x:debug register",ARC_HW_DEBUG_REGNUM);
-#ifdef ARC4_JTAG      
-      rd |= 0x801; /*Setting the IS and the SS bit in the status register
-		     for the A4 core to allow it to single step.  */
-#else
-      /* Mask for Single Stepping changes for ARC600 and ARC700. */
-      if(is_arc700())
-	rd |= 0x800;
-      else
-	if(is_arc600())
-	  rd |= 0x801;
-#endif
-      
-      /* Writing to IS bit in DEBUG register for 
-	 hardware single instruction stepping.  */
-      if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_DEBUG_REGNUM ,rd)==JTAG_WRITE_FAILURE)
-	  error("Failure writing 0x%x to auxillary register 0x%x:debug register\n",rd,ARC_HW_DEBUG_REGNUM);
-  }
-  else
-  {
-    /* Restarting the processor by clearing the 'H' bit in the status register*/
-#ifdef ARC4_JTAG    
-    /* reading the status reg */     
-    if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_STATUS_REGNUM,&rd)==JTAG_READ_FAILURE)
-      error("Failure reading auxillary register 0x%x:status register",ARC_HW_STATUS_REGNUM);
-  
-    rd = rd & ~(0x02000000);
-  
-    /* starting the halted processor */
-    if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS_REGNUM,rd)==JTAG_WRITE_FAILURE)
-      error("Failure writing 0x%x to auxillary register 0x%x:status register\n",rd,ARC_HW_STATUS_REGNUM);
-#else
-    /* reading the status32 reg */     
-    if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_STATUS32_REGNUM,&rd)==JTAG_READ_FAILURE)
-      error("Failure reading auxillary register 0x%x:status32 register",ARC_HW_STATUS32_REGNUM);
-  
-    rd = rd & ~(0x1);
-  
-    /* starting the halted processor */
-    if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS32_REGNUM,rd)==JTAG_WRITE_FAILURE)
-      error("Failure writing 0x%x to auxillary register 0x%x:status32 register\n",rd,ARC_HW_STATUS32_REGNUM);
-#endif
-  }
-}
-
-/* For the ^C signal handler.  */
-static  void (*ofunc) (int);
-
-/* The command line interface's stop routine.  This function is installed as
-   a signal handler for SIGINT.  The first time a user requests a stop, we
-   call target_stop to send a break or ^C.  If there is no response from the
-   target (it didn't stop when the user requested it), we ask the user if
-   he'd like to detach from the target.  */
-static void
-arc_debug_interrupt (int signo)
-{
-  /* If we get the signal twice, do something more drastic.  */
-  signal (signo, arc_debug_interrupt_twice);
-  
-  target_stop ();
-}
-
-/* The user typed ^C twice.  */
-static void
-arc_debug_interrupt_twice (int signo)
-{
-  signal (signo, ofunc);
-
-  if (query ("Interrupted while waiting for the program.\n\
-Give up (and stop debugging it)? "))
+    if (action == CLEAR_USER_BIT)
     {
-      target_mourn_inferior ();
-      throw_exception (RETURN_QUIT);
-    }
+        /* Get processor out of user mode.  */
 
-  signal (signo, arc_debug_interrupt);
-}
-
-/* Function: arc_debug_wait
- * Parameters :
- * 1. ptid_t ptid:
- * 2. struct target_waitstatus *status: Indicates status at end
-                                        of wait for F.E.
- * Returns : void
- * Description: 
- *        Poll status32 for the value of H bit.	
- *        After H bit is set in status32. 
- *        Wait till LD(load pending bit) in the DEBUG register
- *        is cleared.
- *        SH bit is set if flag instruction was used to halt the processor.
- *        BH bit is set if the ARCompact processor stopped due to 
- *        a brk_s instruction. Set the target_waitstatus (signal) to SIGTRAP
- *        only in such a situation. 
- *	
- */
-
-ptid_t
-arc_debug_wait (ptid_t ptid, struct target_waitstatus *status)
-{
-  unsigned int debug;
-  ENTERMSG;
-
-  /* signal handler for Control-C.  */
-  ofunc = signal (SIGINT, arc_debug_interrupt);
-
-  arc_jtag_ops.jtag_wait();
-  /* put the old function back.  */
-  signal (SIGINT, ofunc);
-
-  /* If the SH ("self halt") bit is set, we stopped because of the flag
-     instruction, which is used by programs to exit.  */
-  if (arc_jtag_ops.jtag_read_aux_reg (ARC_HW_DEBUG_REGNUM,
-				      &debug) == JTAG_READ_FAILURE)
-    {
-      error ("Failure reading from debug register");
-    }
-
-  /* SH bit of debug register */
-  if (debug & ARC_DEBUG_REG_SH_BIT)
-    {
-      int exitcode;
-      status->kind = TARGET_WAITKIND_EXITED;
-
-      /* Exit code of the program.  */
-      if (arc_jtag_ops.jtag_read_core_reg (0, &exitcode) == JTAG_READ_FAILURE)
-	{
-	  warning ("Failure reading from register r0, assuming exit code = 0");
-	  status->value.integer = 0;
-	}
-      status->value.integer = exitcode;
-    }
-  else
-    {
-      status->kind = TARGET_WAITKIND_STOPPED;
-      status->value.sig = TARGET_SIGNAL_TRAP;
-    }
-
-#ifndef ARC4_JTAG
-  /* Bug #1311 (ARC600): Setting a breakpoint on the last instruction of a
-     ZOL causes GDB to stop at LP_START.  Detect this condition and warn the
-     user.  */
-  if (is_arc600 ())
-    {
-      unsigned int pc, lp_start, lp_end, lp_count;
-      arc_debug_read_core_register (ARC_LP_COUNT_REGNUM, &lp_count);
-      if (lp_count != 0)
-	{
-	  arc_debug_read_aux_register (ARC_HW_PC_REGNUM, &pc);
-	  arc_debug_read_aux_register (ARC_HW_LP_START_REGNUM, &lp_start);
-	  
-	  if (pc == lp_start)
-	    {
-	      extern struct breakpoint *breakpoint_chain;
-	      struct breakpoint *b;
-	      arc_debug_read_aux_register (ARC_HW_LP_END_REGNUM, &lp_end);
-
-	      for (b = breakpoint_chain; b; b = b->next)
-		{
-		  /* lp_end is the address of the last instruction + the
-		     size of the last instruction.  We could use the
-		     disassembler and find out the size, or just try both
-		     possible sizes.  */
-		  if ((b->enable_state == bp_enabled && !b->pending) &&
-		      b->loc->address == lp_end-4 || b->loc->address == lp_end-2)
-		    {
-		      warning ("Did you set a breakpoint on the last instruction of \n\
-a Zero Overhead Loop ?  Such breakpoints do not work properly.");
-		    }
-		}
-	    }
-	}
-    }
-#endif
-  return inferior_ptid;
-}
-
-static unsigned int 
-arc_get_hw_regnum_mapping ( int regno )
-{
-  int i;
-
-  if (regno >= ARC_STATUS_REGNUM 
-#ifdef ARC4_JTAG
-      && regno <= ARC_DEBUG_REGNUM
-#else
-      && regno <= ARC_AUX_IRQ_PENDING_REGNUM
-#endif      
-      )
-    return  arc_aux_reg_map[regno - ARC_STATUS_REGNUM].hw_regno;
-  
-  for ( i = 0 ; i < (sizeof(arc_bcr_reg_info) / sizeof (struct arc_reg_info)) ; i++)
-    {
-      if (regno == arc_bcr_reg_info[i].gdbregno)
-	return arc_bcr_reg_info[i].hw_regno;
-    }
-
-  return -1;
-}
-
-
-/* Function: arc_debug_fetch_regs.
- * Parameters :
- * 1. int regnum: Register number. If register number is -1.Fetch
- *                all the registers.Read all core registers here.
- * Returns : void
- * Description: 
- *          Set up regcache_raw_supply(current_regcache,regno)
- *
- */
-void
-arc_debug_fetch_regs (int regno)
-{
-	/* Read all core registers */
-  ENTERARGS("%d",regno);
-
-  int dummyvalue = 0xABCDABCD;
-  unsigned int hw_regno;
-  unsigned int read_buf;
-
-  if( regno < ARC_NR_CORE_REGS )
-  {
-      hw_regno = regno;
-      if(arc_jtag_ops.jtag_read_core_reg(regno,&read_buf)==JTAG_READ_FAILURE)
-	  error("Failure reading from core register 0x%x\n",regno);
-  }
-  else
-  {
-#ifndef ARC4_JTAG    
-    if( regno > ARC_NR_REGS)
-      error("Invalid Register Number\n");
-#endif
-    
-    hw_regno  = arc_get_hw_regnum_mapping (regno);
-    if(arc_jtag_ops.jtag_read_aux_reg(hw_regno,&read_buf)==JTAG_READ_FAILURE)
-	error("Failure reading auxillary register 0x%x",hw_regno);
-  }
-  
-  if(debug_arc_jtag_target_message)
-    {
-      printf_filtered("HW_Regno=0x%x",hw_regno);
-      printf_filtered("Read Regno 0x%x the value 0x%x\n",hw_regno,read_buf);
-    }
-  regcache_raw_supply(current_regcache,regno,&read_buf);
-
-  LEAVEMSG;
-}
-
-
-/* Function: arc_debug_fetch_regs.
- * Parameters :
- * 1. int regnum: Register number. If register number is -1.Fetch
- *                all the registers.Read all core registers here.
- * Returns : void
- * Description: 
- *          Use deprecated register information for this or regcache_read_unsigned .
- * FIXME: would need to change to use regcache_raw_supply instead.
- */
-
-
-void
-arc_debug_store_regs (int regno)
-{
-  /* write_all core registers */
-  ENTERARGS("%d", regno);
-  unsigned int hw_regno;
-  unsigned int write_buf;
-
-  if(debug_arc_jtag_target_message)
-    printf_filtered("\n%d",regno);
-
-  regcache_raw_collect(current_regcache,regno,&write_buf);
-  if( regno < ARC_NR_CORE_REGS )
-  {
-      if(arc_jtag_ops.jtag_write_core_reg(regno,write_buf)==JTAG_WRITE_FAILURE)
-	  error("Failure writing 0x%x to core register 0x%x",write_buf,regno);
-  }
-  else
-  {
-#ifndef ARC4_JTAG    
-    if (regno > ARC_NR_REGS)
-      error ("Invalid register number \n");
-#endif
-
-    hw_regno = arc_get_hw_regnum_mapping (regno);
-
-    if(debug_arc_jtag_target_message)
-	printf_filtered("Writing to regno 0x%x the value 0x%x",
-			hw_regno,write_buf);
-    if(arc_jtag_ops.jtag_write_aux_reg(hw_regno,write_buf)==JTAG_WRITE_FAILURE)
-	error("Failure writing 0x%x to auxillary register 0x%x\n",write_buf,hw_regno);
-  }
-
-}
-
-
-/* Function: arc_debug_prepare_to_store.
- * Parameters :
- * 1. int regnum: Register number. If register number is -1.Fetch
- *                all the registers.Read all core registers here.
- * Returns : void
- * Description: 
- *          Use deprecated register information for this. 
- * FIXME: would need to change to use regcache_raw_supply instead.
- */
-
-/* This gets called just before store_regs */
-void
-arc_debug_prepare_to_store (void)
-{
-	/* does nothing . Why is this around ? */
-  ENTERMSG;
-}
-
-/* Read or write memory */
-
-
-
-/* Function: arc_debug_xfer_memory. 
- * Parameters : 
- * 1. int regnum: Register number. If register number is -1.Fetch
- *                all the registers.Read all core registers here.
- * Returns : void
- * Description: 
- *    This has been superceded by target_xfer_memory_partial.
- *
- */
-int
-arc_debug_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
-		      struct mem_attrib *attrib, struct target_ops *target)
-{
-	/* There is no xfer_memory . Its been deprecated in 6.3 .Replace	
-	 * this by target_xfer_memory_partial .
-	 */
-  ENTERARGS("memaddr=%lx, myaddr=%lx, len=%d, write=%d",
-	    memaddr, (unsigned long)myaddr, len, write);
-  
-  return len; /* success */
-}
-
-
-    
-
-LONGEST 
-arc_debug_xfer_partial (struct target_ops *ops,
-			enum target_object object, 
-			const char *annex,
-			void *readbuf, 
-			const void *writebuf,
-			ULONGEST offset, 
-			LONGEST len)
-{
-
-  int i=0, read_num=0, temp_len=0;
-  unsigned int small_buf;
-  char query_type;
-  ULONGEST temp_offset=0;
-  if(debug_arc_jtag_target_message)
-    printf("..Entered arc_debug_xfer_partial()...with offset 0x%x\n",(unsigned int)offset);
-  /* Handle memory */
-  if (object == TARGET_OBJECT_MEMORY)
-    {
-      int saved_status32;
-      int xfered=0;
-      int attempts;
-      errno = 0;
-
-      /* Get out of user mode so that we can read/write anything anywhere.  */
-      saved_status32 = clear_status32_user_bit ();
-
-      if (writebuf != NULL)
-	{
-	    char *buffer=(char *)xmalloc(4);
-	    char *temp_buf = (char *)writebuf;
-
-	    /* Address alignment to integral multiple of four */
-	    temp_offset = offset;
-	    temp_len = temp_offset % 4;
-	    
-	    i = 0;
-	    if(temp_len)
-	    {
-		temp_offset = offset - temp_len;
-		if(debug_arc_jtag_target_message)
-		  {
-		    printf("---- Aligning-----------\n");
-		    printf("calling write_chunk at 0x%x where \
-offset = 0x%x\n",
-			   (unsigned int)temp_offset,(unsigned int)offset);
-		  }
-
-		attempts = 0;
-		do{
-		    if (attempts++ == MEMORY_TRANSFER_ATTEMPTS)
-		      return 0;
-		    xfered = arc_jtag_ops.jtag_memory_chunk_read(temp_offset,
-								 (unsigned int *)buffer,4);
-		}while(xfered != 4);
-		
-		for(i=0;i<len && i<(4-temp_len);i++)
-		    
-		    buffer[i+temp_len]=temp_buf[i];
-
-		attempts = 0;
-		do{
-		    if (attempts++ == MEMORY_TRANSFER_ATTEMPTS)
-		      return 0;
-		    xfered = arc_jtag_ops.jtag_memory_chunk_write(temp_offset,
-								  (unsigned int *)buffer,4);
-		}while(xfered != 4);
-
-		
-		temp_buf = (char *)writebuf + i;
-		temp_offset = offset + i;
-		len = len - i;
-	    }
-	    if(len>0)
-	      len =arc_jtag_ops.jtag_memory_chunk_write(temp_offset,
-							(unsigned int *)temp_buf,len);
-	    if(debug_arc_jtag_target_message)
-	      printf("...leaving arc_debug_xfer_partial() write.. \
-with return value %d",(int)len);
-
-	    restore_status32_user_bit (saved_status32);
-	  return (len + i);
-	}
-      else
-      {
-	  char *buffer=(char *)xmalloc(4);
-	  char *temp_buf = (char *)readbuf;
-	  /* Address alignment to integral multiple of four */
-	  temp_offset= offset;
-	  temp_len= temp_offset % 4 ;
-
-	  i = 0;
-	  if(temp_len)
-	    {
-	      temp_offset = offset - temp_len;
-	      if(debug_arc_jtag_target_message)
-		{
-		  printf("---- Aligning-----------\n");
-		  printf("calling read_chunk at 0x%x where offset =0x%x \n",
-			 (unsigned int)temp_offset,(unsigned int)offset);
-		}
-
-	      attempts = 0;
-	      do{
-		if (attempts++ == MEMORY_TRANSFER_ATTEMPTS)
-		  return 0;
-		xfered = arc_jtag_ops.jtag_memory_chunk_read(temp_offset,(unsigned int *)buffer,4);
-	      }while(xfered != 4);
-	      
-	      for(i=0;i<len && i<(4-temp_len);i++)
-		temp_buf[i]=buffer[i+temp_len];
-	      
-	      temp_buf = (char *)readbuf + i;
-	      temp_offset = offset + i;
-	      len = len - i;
-	    }
-	  if(len>0)
-	    len = arc_jtag_ops.jtag_memory_chunk_read(temp_offset,(unsigned int *)temp_buf,len);
-	  if(debug_arc_jtag_target_message)
-	    {
-	      printf("\nlen=%d",(int)len + temp_len);
-	      printf("...leaving arc_debug_xfer_partial() read.. \
-with return value %d",
-		     (int)len + temp_len);
-	    }
-
-	  restore_status32_user_bit (saved_status32);
-	  return (len + i);
-	  
-      }
-
-    }
-
-  /* ARC auxillary registers: they are 32bits wide and are in a 32 bit
-     address space, although only part of the address space is used.  */
-  else if (object == ARC_TARGET_OBJECT_AUXREGS)
-    {
-      unsigned int regno;
-
-      if (readbuf)
-	{
-	  for (regno = offset; regno < offset+len; ++regno)
-	    {
-	      unsigned int rd;
-
-	      if (arc_jtag_ops.jtag_read_aux_reg (regno, &rd) == JTAG_READ_FAILURE)
-		{
-		  return (regno - offset);
-		}
-	      ((int *)readbuf)[regno - offset] = rd;
-	    }
-	}
-      else if (writebuf)
-	{
-	  for (regno = offset; regno < offset+len; ++regno)
-	    {
-	      if (arc_jtag_ops.jtag_write_aux_reg (regno, ((int*)writebuf)[regno - offset]) ==
-		  JTAG_WRITE_FAILURE)
-		{
-		  return (regno - offset);
-		}
-	    }
-	}
-
-      /* success */
-      return (LONGEST)len;
+        if (arc_read_jtag_aux_register(arc_status32_regnum, &status32, FALSE))
+        {
+            /* If the User bit is actually set.  */
+            if (status32 & STATUS32_USER)
+                if (!arc_write_jtag_aux_register(arc_status32_regnum,
+                                                 status32 & ~STATUS32_USER, FALSE))
+                    warning(_("can not clear User bit in STATUS32 auxiliary register"));
+        }
+        else
+            warning(_("can not read STATUS32 auxiliary register"));
     }
     else
     {
-	printf("\nRequested target_object not yet supported with arc-jtag");
+        /* If the User bit was actually cleared.  */
+        if (status32 & STATUS32_USER)
+            if (!arc_write_jtag_aux_register(arc_status32_regnum, status32, FALSE))
+                warning(_("can not restore User bit in STATUS32 auxiliary register"));
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 2)                functions for reading/writing mmeory                     */
+/* -------------------------------------------------------------------------- */
+
+/* These functions should NOT be used within this module: they are intended
+   purely for use by the arc-memory module for reading/writing multiple words
+   of data at word-aligned addresses.  */
+
+static unsigned int
+read_words (ARC_Address  address,
+            ARC_Byte    *data,
+            unsigned int words)
+{
+    DEBUG("reading %u words from 0x%08X on target board\n", words, address);
+
+    gdb_assert(IS_WORD_ALIGNED(address));
+
+    return arc_jtag_ops.memory_read_chunk(address, data, words);
+}
+
+
+static unsigned int
+write_words (ARC_Address  address,
+             ARC_Byte    *data,
+             unsigned int words)
+{
+    gdb_assert(IS_WORD_ALIGNED(address));
+
+    DEBUG("writing %u words to 0x%08X on target board\n", words, address);
+
+    return arc_jtag_ops.memory_write_chunk(address, data, words);
+}
+
+
+static unsigned int
+write_pattern (ARC_Address  address,
+               ARC_Word     pattern,
+               unsigned int words)
+{
+    gdb_assert(IS_WORD_ALIGNED(address));
+
+    DEBUG("writing pattern 0x%08X repeated %u times to 0x%08X on target board\n", pattern, words, address);
+
+    return arc_jtag_ops.memory_write_pattern(address, pattern, words);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 3)               functions for processor cache management                  */
+/* -------------------------------------------------------------------------- */
+
+/* Invalidate the target processor's caches.  */
+
+static void
+invalidate_caches (void)
+{
+    /* N.B. when invalidating the data caches, we must first set the DC_CTRL.IM
+            bit to 1 to ensure that any "dirty" lines in the cache get flushed
+            to main memory.  */
+    (void) arc_write_jtag_aux_register(dcache_control_regnum, DC_CTRL_IM, TRUE);
+    (void) arc_write_jtag_aux_register(icache_ivic_regnum,    IC_IVIC_IV, TRUE);
+    (void) arc_write_jtag_aux_register(dcache_ivdc_regnum,    DC_IVDC_IV, TRUE);
+}
+
+
+/* Disable the target processor's caches.  */
+
+static void
+disable_caches (void)
+{
+    (void) arc_write_jtag_aux_register(icache_control_regnum, IC_CTRL_DC, TRUE);
+    (void) arc_write_jtag_aux_register(dcache_control_regnum, DC_CTRL_DC, TRUE);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 4)                   functions for JTAG interface management               */
+/* -------------------------------------------------------------------------- */
+
+/* Open the JTAG interface to the debug target.  */
+
+static Boolean
+open_JTAG_interface (int from_tty)
+{
+    /* This is somewhat inelegant, but commands read from scripts in the gdb
+       testsuite are regarded as though they were being input interactively
+       (i.e. from_tty is 1), and interactive queries may be made (such as
+       asking the user whether the program currently being debugged should be
+       killed first) - and these queries hang the tests!
+
+       So, if the environment variable is set, assume that the gdb test suite is
+       being run, so that no such queries will be made.
+
+       It is not possible to make this check in the top-level command handler
+       loop, as the output from some other commands (e.g. 'file') depend on the
+       from_tty parameter passed to them, and the gdb test scripts expect to get
+       the interactive version of the output!  */
+    target_preopen(from_tty && (getenv("ARC_GDB_TEST") == NULL));
+
+    gdb_assert(arc_jtag_ops.open != NULL);
+
+    return arc_jtag_ops.open(arc_aux_find_register_number("MEMSUBSYS", ARC_HW_MEMSUBSYS_REGNUM));
+}
+
+
+/* Close the JTAG interface to the debug target.
+
+   Parameter:
+      resume: TRUE if program execution on the target should be allowed to resume
+ */
+
+static void
+close_JTAG_interface (Boolean resume)
+{
+    /* If we have a target connected.  */
+    if (arc_jtag_ops.status == JTAG_OPENED)
+    {
+        arc_elf32_close(resume);
+
+        /* And close the connection.  */
+        arc_jtag_ops.close();
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 5)                functions for starting/stopping the processor            */
+/* -------------------------------------------------------------------------- */
+
+/* Start the processor by clearing the 'H' bit in the STATUS32 register. */
+
+static void
+start_processor (void)
+{
+    ARC_RegisterContents status32;
+
+    if (!arc_read_jtag_aux_register (arc_status32_regnum, &status32,                  FALSE) ||
+        !arc_write_jtag_aux_register(arc_status32_regnum,  status32 & ~STATUS32_HALT, FALSE))
+        warning(_("can not clear Halt bit in STATUS32 auxiliary register - can not start processor"));
+}
+
+
+/* Stop the processor by setting the 'FH' bit in the DEBUG register.  */
+
+static void
+stop_processor (void)
+{
+    if (!arc_write_jtag_aux_register(arc_debug_regnum, DEBUG_FORCE_HALT, FALSE))
+        warning(_("can not set Force Halt bit in DEBUG auxiliary register - can not halt processor"));
+}
+
+
+/* Try to halt the processor (if it is running) upon connection to the debug
+   target.  Return TRUE if the processor is successfuly halted.  */
+
+static Boolean
+halt_processor_on_connection (void)
+{
+    Boolean      warn_on_read_failure = TRUE;
+    Boolean      inform_running       = TRUE;
+    Boolean      halt_attempted       = FALSE;
+    unsigned int tries                = 0;
+
+    /* Unfortunately, if the gpio driver module has been installed on the host
+       machine, the gpio read/write operations appear to work even if the host
+       is NOT physically connected to the JTAG target!
+
+       There does not appear to be any way of detecting that situation - all we
+       can do is bale out if we have not succeded in reading the STATUS32 register
+       after the required number of retries!  */
+    do
+    {
+        ARC_RegisterContents status = 0;
+
+        /* Read the STATUS32 register here to check if the halt bit is set.  */
+        if (arc_read_jtag_aux_register(arc_status32_regnum, &status, warn_on_read_failure))
+        {
+            if (status & STATUS32_HALT)
+            {
+                printf_filtered(_("Processor is halted.\n"));
+                return TRUE;
+            }
+
+            if (inform_running)
+            {
+                /* We inform the user that the processor is running only once
+                   (to avoid swamping the user with messages!).  */
+                printf_filtered(_("Processor is running. Trying to halt it...\n"));
+                inform_running = FALSE;
+            }
+
+            stop_processor();
+            halt_attempted = TRUE;
+        }
+        else
+        {
+            /* We give a warning only on the first read failure (otherwise the
+               user can get swamped with warnings!).  */
+            warn_on_read_failure = FALSE;
+        }
+
+        /* Just in case we actually did fail to read/write the port.  */
+        if (gpio_port_error)
+        {
+            warning(_("error in accessing parallel port via "
+                      GPIO_DEVICE
+                      " - check connection to target board."));
+            return FALSE;
+        }
+    }
+    while (++tries <= arc_jtag_ops.retry_count);
+
+    if (halt_attempted)
+        printf_filtered(_("Can not halt processor!\n"));
+    else
+        printf_filtered(_("Can not connect to processor!\n"));
+
+    return FALSE;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 6)       local functions called from outside this module (from gdb)        */
+/* -------------------------------------------------------------------------- */
+
+/* Connect to the JTAG target.
+
+   Parameters:
+      args    : user arguments to the 'target' command
+      from_tty: non-zero if the 'target' command was issued at the terminal
+
+   The arguments may be:
+      noreset | <xbf file>
+
+   If a XBF file is specified, the target board FPGA is blasted as part of the
+   connection process.  */
+
+static void
+arc_jtag_open (char *args, int from_tty)
+{
+    /* By default, reset the board, in case it has been left in a funny state by
+       the last connection.  */
+    Boolean     reset_required = TRUE;
+    char       *xbf_file       = NULL;
+    FPGA_Status fpga;
+
+    ENTERARGS("\"%s\" (%d)", (args) ? args : "", from_tty);
+
+    if (args)
+    {
+        if (strcmp(args, "noreset") == 0)
+            reset_required = FALSE;
+        else
+            xbf_file = args;
     }
 
-  return -1;
+    /* Is the target board FPGA already configured?  */
+    fpga = arc_is_FPGA_configured();
 
+    switch (fpga)
+    {
+        case INACCESSIBLE:
+            /* A warning has already been given.  */
+            return;
+
+        case UNCONFIGURED:
+            if (xbf_file == NULL)
+            {
+                warning(_("target FPGA is not configured; XBF file must be specified"));
+                return;
+            }
+            break;
+
+        case CONFIGURED:
+            break;
+    }
+
+    /* As far as we know, there is no program loaded on the target.  */
+    arc_program_is_loaded = FALSE;
+
+    /* Find the h/w register numbers of various auxiliary registers that we need
+       for debugging.
+
+       N.B. the gdb 'attach' command can attach only to an arcjtag target that
+            has been created (by this function) within the *same* debugging
+            session, i.e. the sequence of commands issued by the user is of the
+            form:
+                      target arcjtag ... detach ... attach
+
+            This means that we do not need to worry about finding these numbers
+            again on an 'attach', as they should be the same (they should really
+            be the same for *any* target, anyway - we are simply being paranoid
+            in looking them up, rather than having their numbers hard-coded, in
+            any case!).
+
+            Of course, there are really pathological cases such as the user
+            blasting the (ARCangel) target with an XBF giving a different
+            processor configuration, or even physically disconnecting the target
+            from the host machine and connecting a different target, between
+            issuing the 'detach' and the 'attach' commands (and that could change
+            the target's actionpoint configuration, if nothing else!) - but if
+            the user wants to do that then that is his problem!  */
+    arc_elf32_find_register_numbers();
+
+    lp_start_regnum       = arc_aux_find_register_number("LP_START", ARC_HW_LP_START_REGNUM);
+    lp_end_regnum         = arc_aux_find_register_number("LP_END",   ARC_HW_LP_END_REGNUM);
+    icache_ivic_regnum    = arc_aux_find_register_number("IC_IVIC", ARC_HW_IC_IVIC_REGNUM);
+    icache_control_regnum = arc_aux_find_register_number("IC_CTRL", ARC_HW_IC_CTRL_REGNUM);
+    dcache_ivdc_regnum    = arc_aux_find_register_number("DC_IVDC", ARC_HW_DC_IVDC_REGNUM);
+    dcache_control_regnum = arc_aux_find_register_number("DC_CTRL", ARC_HW_DC_CTRL_REGNUM);
+
+
+    /* Just to be sure that it is not in the target stack...  */
+    (void) unpush_target (&jtag_target_ops);
+
+    /* Now try to open the JTAG interface.  */
+    if (open_JTAG_interface(from_tty))
+    {
+        /* If a reset is required, do it now, in case it is necessary to reset
+           the target clock sources to their defaults before trying to access
+           the target's auxiliary registers!  */
+        if (reset_required)
+        {
+            arc_reset_board();
+            arc_jtag_ops.reset_board();
+        }
+
+        if (fpga == CONFIGURED)
+        {
+            /* If we are going to blast the board, don't bother halting the
+               processor first.  */
+            if ((xbf_file == NULL) && !halt_processor_on_connection())
+            {
+                /* We could not halt the processor.  */
+                close_JTAG_interface(FALSE);
+                return;
+            }
+        }
+
+        /* If we have been given an XBF file.  */
+        if (xbf_file)
+        {
+            /* Try to blast the board.
+               N.B. if the blasting operation fails for any reason,
+                    arc_blast_board calls error and does not return!  */
+            arc_blast_board(xbf_file, from_tty);
+        }
+
+        /* Get out of user mode so that we can access anything anywhere.  */
+        change_status32(CLEAR_USER_BIT);
+
+        /* We do not know whether the target processor supports actionpoints until
+           after we have connected to it, as we have to read the AP_BUILD
+           configuration register to find that out.  */
+        (void) arc_initialize_actionpoint_ops(&jtag_target_ops);
+
+        (void) push_target (&jtag_target_ops);
+
+        if (!reset_required)
+        {
+            /* If we have been explicitly told NOT to reset the board, it is
+               most likely because we have connected to a target upon which a
+               program is running and we want to debug that program - so assume
+               we have a program ready for execution on the target.  */
+            target_mark_running(&jtag_target_ops);
+            arc_program_is_loaded = TRUE;
+
+            /* Set to_has_execution back to 0; this stops the user getting the
+
+                  A program is being debugged already.
+                  Are you sure you want to change the file? (y or n) n
+
+               message on issuing the 'file' command after the connection.  */
+            current_target.to_has_execution = 0;
+        }
+
+        if (from_tty)
+            printf_filtered (_("Connected to the " ARC_TARGET_NAME " target.\n"));
+    }
+    else
+        error(_("Can not connect to target"));
 }
 
 
+/* Close the connection to the target.  */
 
-
-void
-arc_debug_files_info (struct target_ops *target)
+static void
+arc_jtag_close (int quitting)
 {
-	/* Do nothing. Just say its a remote target */
-  ENTERMSG;
+    ENTERMSG;
+    close_JTAG_interface(FALSE);
 }
 
 
-/* Function: arc_debug_insert_breakpoint
- * Parameters : 
- * 1. CORE_ADDR addr: Address for breakpoint.
- * 2. char * contents: Contents for the breakpoint.
- * Returns : int
- * Description: 
- * See if you can insert a hardware breakpoint using the actionpoints
- * interface. Use brk_s if architecture is ARC700 and you need to use
- * a software breakpoint.The gdbarch breakpoint should be initialized to
- * the right value if used with target_arc_debug.
- *
- */
+/* Attach to the debug target without resetting the board.
 
+   Parameters:
+      args    : user arguments to the 'attach' command (ignored)
+      from_tty: non-zero if the 'attach' command was issued at the terminal
+*/
 
-int
-arc_debug_insert_breakpoint (CORE_ADDR addr, char *contents)
+static void
+arc_jtag_attach (char *args, int from_tty)
 {
-	
-  ENTERARGS("%x", (unsigned int)addr);
-#ifndef ARC4_JTAG
-  unsigned int bp = 0x20207fff; /*FIXMEA: what does 0x2020 stand for ?*/
-#else
-  unsigned int bp = 0x1ffffe00;
-#endif
-  unsigned int r;
-  int instr_size;
-  const unsigned char *breakpt_instr;
-  breakpt_instr=BREAKPOINT_FROM_PC(&addr,&instr_size);
+    ENTERARGS("\"%s\" (%d)", args, from_tty);
 
-  /* save the existing value */
-  /* r==0 means the read succeeded */
-  if(debug_arc_jtag_target_message)
-    printf_filtered ("instrcution size = %d and instruction 0x%x",
-	   instr_size, *(unsigned int *)breakpt_instr);
-  r = target_read_memory (addr, contents, instr_size);
-  /* put the breakpoint */
-  if(r==0)
-    r = target_write_memory (addr, (char *)&bp, instr_size);
-  return r;
+    /* Try to open the JTAG interface.  */
+    if (open_JTAG_interface(from_tty))
+    {
+        /* Try to halt the processor (if it is running).  */
+        if (halt_processor_on_connection())
+        {
+            /* Check that the processor architecture is correct.  */
+            ARCHITECTURE_CHECK(current_gdbarch,
+                               (current_objfile) ? current_objfile->obfd : NULL);
+
+            if (from_tty)
+                printf_filtered (_("Connected to the " ARC_TARGET_NAME " target.\n"));
+        }
+    }
+    else
+        error(_("Can not connect to target"));
 }
 
 
-/* Function: arc_debug_remove_breakpoint. 
- * Parameters : 
- * 1. CORE_ADDR addr: Address. 
- * 2. char * contents : contents. 
- * Returns : int.
- * Description: 
- *  Write the old contents back for the breakpoint.
- *
- */
+/* Detach from the debug target without resetting the board.
 
-int
-arc_debug_remove_breakpoint (CORE_ADDR addr, char *contents)
+   Parameters:
+      args    : user arguments to the 'detach' command (ignored)
+      from_tty: non-zero if the 'detach' command was issued at the terminal
+*/
+
+static void
+arc_jtag_detach (char *args, int from_tty)
 {
-  ENTERARGS("%x, %lx", (unsigned int)addr, *(unsigned long *)contents);
-
-  /* write the old value back */
-#ifdef ARC4_JTAG
-  return target_write_memory (addr, contents, 4);
-#else
-  return target_write_memory (addr, contents, 2);
-#endif
+    ENTERMSG;
+    close_JTAG_interface(TRUE);
 }
 
 
+/* Cause the inferior on the debug target to resume execution, sending a signal
+   if necessary.
 
-/* Function: arc_debug_kill
- * Parameters : void.
+   Parameters:
+      ptid  : the thread id of the thread to be resumed (ignored)
+      step  : 1 means single step, 0 run freely.
+      signal: the number of the signal to be sent
 
- * Returns : void.
- * Description: Heavy duty arsenal.Kill the process. 
- * Maybe we do a board reset and kill it. Write 1 to Halt
- * in Status32. 
- */
+   N.B. signals are not supported.  */
 
-void
-arc_debug_kill (void)
+static void
+arc_jtag_resume (ptid_t ptid, int step, enum target_signal signal)
+{
+    ENTERARGS("%d, %d, %d", ptid.pid, step, signal);
+
+    if (signal != TARGET_SIGNAL_0)
+        error(_("Signals are not supported by the " ARC_TARGET_NAME " target"));
+
+    /* If we cleared the User bit in the STATUS32 bit the last time that
+       execution halted, restore it now.  */
+    change_status32(RESTORE_USER_BIT);
+
+    /* Software breakpoints may have been set/removed, and data in main memory
+       may have been altered, so invalidate (and flush!) the instruction and
+       data caches before restarting!
+
+       N.B. arc_jtag_open disabled the caches, so what is the point of doing this?
+
+            Also, invalidating a disabled cache when DC_CTRL.IM = 1 seems to have
+            the effect of overwriting valid data!!!!!  */
+//  invalidate_caches ();
+
+    /* The DEBUG User bit must be set if breakpoints are to be allowed in user
+       mode. We could set it in target_open, but something (the user?) might clear it.
+       So we set it every time we resume (if stepping, we set the extra bit(s) we
+       need in the DEBUG register in the same operation).  */
+
+    if (step)
+    {
+        ARC_RegisterContents mask = 0;
+
+        DEBUG("setting DEBUG.IS bit for single-step\n");
+
+        /* The mask for single-stepping differs between ARC600 and ARC700.  */
+        if (IS_ARC700)
+            mask = DEBUG_INSTRUCTION_STEP;
+        else
+            if (IS_ARC600)
+                mask = DEBUG_INSTRUCTION_STEP | DEBUG_SINGLE_STEP;
+
+        /* Allow breakpoints in User mode, and set the IS bit in the DEBUG
+           register for hardware single instruction stepping.  */
+        if (!set_debug_user_bit (mask))
+            error(_("Can not single-step one instruction"));
+    }
+    else
+    {
+        /* Allow breakpoints in User mode (no extra bits required).  */
+        (void) set_debug_user_bit (0);
+        start_processor();
+    }
+
+    LEAVEMSG;
+}
+
+
+/* Wait for execution on the target to halt (for whatever reason).
+
+   Parameters :
+      ptid  : ignored
+      status: set to indicate status at end of the wait
+*/
+
+static ptid_t
+arc_jtag_wait (ptid_t ptid, struct target_waitstatus *status)
+{
+    ENTERMSG;
+
+    /* Execute the program on the target processor. */
+    arc_elf32_execute(status,
+                      NULL,
+                      start_processor,
+                      stop_processor);
+
+    /* The target has now halted.  */
+
+    if (status->kind == TARGET_WAITKIND_EXITED)
+        target_mark_exited (&jtag_target_ops);
+
+    /* Get out of user mode so that we can access anything anywhere.  */
+    change_status32(CLEAR_USER_BIT);
+
+    /* Inform the actionpoints module that the target has halted.  */
+    arc_target_halted();
+
+    /* Bug #1311 (ARC600): Setting a breakpoint on the last instruction of a
+       ZOL causes GDB to stop at LP_START.  Detect this condition and warn the
+       user.  */
+    if (IS_ARC600)
+    {
+        ARC_RegisterContents pc, lp_start, lp_end, lp_count;
+
+        if (arc_read_jtag_core_register(ARC_LP_COUNT_REGNUM, &lp_count, TRUE) && (lp_count != 0)  &&
+            arc_read_jtag_aux_register (arc_pc_regnum,       &pc,       TRUE)                     &&
+            arc_read_jtag_aux_register (lp_start_regnum,     &lp_start, TRUE) && (pc == lp_start) &&
+            arc_read_jtag_aux_register (lp_end_regnum,       &lp_end,   TRUE))
+        {
+            struct breakpoint *b;
+
+            for (b = breakpoint_chain; b != NULL; b = b->next)
+            {
+                /* lp_end is the address of the last instruction + the size of
+                   the last instruction.  We could use the disassembler and find
+                   out the size, but it's easier just to try both possible sizes.  */
+                if ((b->enable_state == bp_enabled) &&
+                    (b->loc->address == lp_end - 4 || b->loc->address == lp_end - 2))
+                {
+                    warning(_("did you set a breakpoint on the last instruction of a"
+                              "Zero Overhead Loop? Such breakpoints do not work properly."));
+                }
+            }
+        }
+    }
+
+    LEAVEMSG;
+
+    return inferior_ptid;
+}
+
+
+/* This gets called just before store_regs.  */
+
+static void
+arc_jtag_prepare_to_store (struct regcache *regcache)
+{
+    ENTERMSG;
+}
+
+
+static void
+arc_jtag_files_info (struct target_ops *target)
+{
+    /* Do nothing.  */
+    ENTERMSG;
+}
+
+
+/* Heavy duty arsenal. Kill the process.
+   Maybe we should do a board reset and kill it.  */
+
+static void
+arc_jtag_kill (void)
 {
   ENTERMSG;
 
-  /* Do stuff */
-
   target_mourn_inferior ();
 }
 
-/* Function: arc_debug_load
- * Parameters :
- * 1. char * args: Arguments. 
- * 2. int from_tty: Which terminal.
- * Returns : void.
- * Description: Load the program into jtag.
+
+/* Create the inferior that will be executed upon the target.
+
+   Parameters :
+      exec_file: the executable file containing the program to be executed
+      args     : the command line arguments to be passed to the program
+      env      : the environment (name/value pairs) for the program
+      from_tty : ignored
  */
 
-void
-arc_debug_load (char *args, int from_tty)
-{
-	/* Write to RAM of the ARC700 board by running through the sections .*/
-  asection *bss_section;
-  CORE_ADDR bss_addr;
-  bfd_size_type bss_size;
-  char *zero_buf;
-  int target_errno;
-
-  ENTERARGS("%s", args);
-
-  generic_load(args, from_tty);
-
-  /* Zero the bss, if it exists.  */
-  bss_section = bfd_get_section_by_name (exec_bfd, ".bss");
-  if (bss_section)
-    {
-      bss_addr = bfd_section_lma (exec_bfd, bss_section);
-      bss_size = bfd_get_section_size (bss_section);
-      zero_buf = (char *)xcalloc (bss_size, 1);
-      
-      if (debug_arc_jtag_target_message)
-	printf_filtered("%s: bss at %x, size = %x\n", __FUNCTION__, (unsigned int)bss_addr,(unsigned int)bss_size);
-      
-      target_errno = target_write_memory (bss_addr, zero_buf, bss_size);
-      free (zero_buf);
-      if (target_errno)
-	{
-	  error ("load: error zeroing bss: %s\n", strerror(target_errno));
-	}
-    }
-  else
-    {
-      if (debug_arc_jtag_target_message)
-	printf_filtered("%s: no bss\n", __FUNCTION__);
-    }
-      
-  clear_symtab_users();
-}
-
-/* Function: arc_debug_create_inferior
- * Parameters :
- * 1. char * exec_file:
- * 2. char * args: 
- * 3. char ** env;
- * Returns : void.
- * Description: Set up sanity values for arc_debug_create_inferior. More thought
- * needed for this. 
- */
-
-
-void
-arc_debug_create_inferior (char *exec_file, char *args, char **env,int dummy)
-{
-  ENTERARGS("%s,%s", exec_file, args);
-
-  /* If no exec file handed to us, get it from the exec-file command
-     -- with a good, common error message if none is specified.  */
-  if (exec_file == 0)
-    exec_file = get_exec_file (1);
-
-  /* We dont really have a PID or anything, but GDB uses this value to check
-     if the program is running. */
-  inferior_ptid.pid = 42;
-
-  clear_proceed_status();
-  /* -1 means resume from current place
-     TARGET_SIGNAL_0 means dont give it any signal
-     Last arg should be true if you want to single step */
-  //proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
-  proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
-}
-
-
-/* Function: arc_debug_mourn_inferior
- * Parameters :void.
- * Returns : void.
- * Description: Set up sanity values for arc_debug_create_inferior. More thought
- * needed for this. 
- */
-
-void
-arc_debug_mourn_inferior (void)
-{
-  ENTERMSG;
-
-  unpush_target (&arc_debug_ops);
-
-  generic_mourn_inferior ();
-}
-
-
-/* Function: arc_debug_mourn_inferior
- * Parameters :ptid_t ptid.
- * Returns : 1 always. 
- * Description: Checks for return values .
- */
-
-
-int
-arc_debug_thread_alive (ptid_t ptid)
-{
-  ENTERMSG;
-  return 1;
-}
-
-
-/* Function: arc_debug_stop
- * Parameters: void
- * Returns: void.
- * Description: Stop the Processor. We stop by writing FH bit to Debug Register . 
- *	write 1 to the FH bit in the Debug register after 
- *	polling for the DEBUG register to have no loads pending .
- */
-void
-arc_debug_stop (void)
-{
-
-  ENTERMSG;
-  int val = 0x2;
-  /* Stop using the FH bit in the debug register. */
-  arc_debug_write_aux_register (ARC_HW_DEBUG_REGNUM, &val);
-  
-}
-
-/* Read core register.  Return 0 on success.  */
-static int
-arc_debug_read_core_register (int hwregno, int *buf)
-{
-  int rd;
-  if(arc_jtag_ops.jtag_read_core_reg(hwregno,&rd)==JTAG_READ_FAILURE)
-      error("Failure reading auxillary register 0x%x",hwregno);
-  *buf = rd;
-  return 0;
-}
-
-/* Read aux register.  Return 0 on success.  */
-static int
-arc_debug_read_aux_register (int hwregno, int *buf)
-{
-  int rd;
-  if(arc_jtag_ops.jtag_read_aux_reg(hwregno,&rd)==JTAG_READ_FAILURE)
-      error("Failure reading auxillary register 0x%x",hwregno);
-  *buf = rd;
-  return 0;
-}
-
-/* Write aux register.  Return 0 on success.  */
-static int
-arc_debug_write_aux_register (int hwregno, int *buf)
-{
-    if(arc_jtag_ops.jtag_write_aux_reg(hwregno, *buf)==JTAG_WRITE_FAILURE)
-	error("Failure writing 0x%x to auxillary register 0x%x\n",*buf,hwregno);
-  return 0;
-}
-
-/* Helper routine for commands added.  */
-/* Print Processor Variant Info.  */
-static void
-arc_print_processor_variant_info (void)
-{
-  struct gdbarch_tdep *tdep  = gdbarch_tdep (current_gdbarch);
-  
-#ifdef ARC4_JTAG
-  if (tdep->arc_processor_variant_info && 
-      tdep->arc_processor_variant_info->arcprocessorversion == A4)
-    {
-      printf_filtered ("A4\n");
-    }
-#else
-  if (tdep->arc_processor_variant_info)
-    {
-      if(tdep->arc_processor_variant_info->arcprocessorversion == ARC700)
-	printf_filtered ("ARC700\n");
-      else
-	printf_filtered ("ARC600\n");
-    }
-#endif
-  else
-    {
-      printf_filtered ("ARC Processor Information not available \n");
-    }
-
-}
-
-
-static void 
-arc_print_bcr_regs (void)
-{
-  int i = 0;
-  unsigned int bcrval = 0;
-  for ( i = 0 ; i < (sizeof(arc_bcr_reg_info) / sizeof (struct arc_reg_info)) ; i++)
-    {
-	if(arc_jtag_ops.jtag_read_aux_reg (arc_bcr_reg_info[i].hw_regno, &bcrval)==JTAG_READ_FAILURE)
-	    error("Failure reading auxillary register 0x%x",arc_bcr_reg_info[i].hw_regno);
-      printf_filtered ("[%02x] %-15s : 0x%02x\n",arc_bcr_reg_info[i].hw_regno,
-		       arc_bcr_reg_info[i].name, bcrval );
-    }
-
-}
-
 static void
-arc_debug_jtag_reset_board (void)
+arc_jtag_create_inferior (char *exec_file, char *args, char **env, int from_tty)
 {
-  arc_jtag_ops.jtag_reset_board();
+    arc_elf32_create_inferior(exec_file, args, env, &jtag_target_ops);
+
+    /* Why are the caches disabled anyway? Particularly as arc_jtag_resume
+       invalidates them before each restart?  */
+   disable_caches();
 }
 
 
-/* Function: init_arc_debug_ops
- * Parameters: void
- * Returns: void.
- * Description: Initialize the jtag operations. 
- */
+/* Mourn the inferior.  */
 
-void
-init_arc_debug_ops (void)
+static void
+arc_jtag_mourn_inferior (void)
 {
-  ENTERMSG;
-#ifdef ARC4_JTAG
-  arc_debug_ops.to_shortname = "arcjtag";
-  arc_debug_ops.to_longname = "Target for debugging an A4 board with JTAG.";
-  arc_debug_ops.to_doc = "Debug a remote A4 board via a JTAG"; /* to_doc */
-#else
-  arc_debug_ops.to_shortname = "arcjtag";
-  arc_debug_ops.to_longname = "Target for debugging an ARC700 board with JTAG.";
-  arc_debug_ops.to_doc = "Debug a remote ARC700 board via a JTAG"; /* to_doc */
+    ENTERMSG;
+
+//  (void) unpush_target (&jtag_target_ops);
+    generic_mourn_inferior ();
+    current_target.to_has_execution = 0;
+}
+
+
+/* Check whether the given thread is alive.  */
+
+static int
+arc_jtag_thread_alive (ptid_t ptid)
+{
+    ENTERMSG;
+
+    /* We only have one thread.  */
+    return 1;
+}
+
+
+/* Check whether our debug target is runnable: return 1 if it is, 0 otherwise. */
+
+static int
+arc_jtag_can_run (void)
+{
+    /* If we are connected to the JTAG i/f, and a program is loaded.  */
+    return (arc_jtag_ops.status == JTAG_OPENED) && arc_program_is_loaded;
+}
+
+
+/* We do not support asynchronous execution of the target program (i.e. commands
+   like 'run' or 'continue' or 'step' can not be executed in background mode
+   by appending a '&' to them) so we do not need to implement the target stop
+   operation (called by the 'interrupt' command); interrupting a running program
+   is handled by the Ctrl-C mechanism.  */
+
+#if 0
+static void
+arc_jtag_stop (void)
+{
+    ENTERMSG;
+}
 #endif
 
 
-  arc_debug_ops.to_open = arc_debug_open;
-  arc_debug_ops.to_close = arc_debug_close;
-  arc_debug_ops.to_attach = arc_debug_attach;
-  arc_debug_ops.to_detach = arc_debug_detach;
-  arc_debug_ops.to_resume = arc_debug_resume;
-  arc_debug_ops.to_wait = arc_debug_wait;
+/* -------------------------------------------------------------------------- */
+/* 7)                  local functions implementing commands                  */
+/* -------------------------------------------------------------------------- */
 
-  arc_debug_ops.to_fetch_registers = arc_debug_fetch_regs;
-  arc_debug_ops.to_store_registers = arc_debug_store_regs;
-  arc_debug_ops.to_prepare_to_store = arc_debug_prepare_to_store;
-  //arc_debug_ops.to_xfer_memory = arc_debug_xfer_memory;
-  arc_debug_ops.to_xfer_partial = arc_debug_xfer_partial;
-  arc_debug_ops.to_files_info = arc_debug_files_info;
-  arc_debug_ops.to_insert_breakpoint = arc_debug_insert_breakpoint;
-  arc_debug_ops.to_remove_breakpoint = arc_debug_remove_breakpoint;
-  arc_debug_ops.to_kill = arc_debug_kill;
-  arc_debug_ops.to_load = arc_debug_load;
+/* Print processor-variant information.  */
 
-  arc_debug_ops.to_create_inferior = arc_debug_create_inferior;
-
-  arc_debug_ops.to_mourn_inferior = arc_debug_mourn_inferior;
-  arc_debug_ops.to_thread_alive = arc_debug_thread_alive;
-  arc_debug_ops.to_stop = arc_debug_stop;
-
-  arc_debug_ops.to_terminal_inferior = NULL;
-
-  
-  arc_debug_ops.to_stratum = process_stratum;
-  
-  arc_debug_ops.to_has_all_memory = 1;
-  arc_debug_ops.to_has_memory = 1;
-  arc_debug_ops.to_has_stack = 1;
-  arc_debug_ops.to_has_registers = 1;
-  arc_debug_ops.to_has_execution = 1;
-
-  arc_debug_ops.to_magic = OPS_MAGIC;
+static void
+arc_print_processor_variant_info (char *arg, int from_tty)
+{
+    printf_filtered
+        (_("%s\n"),
+         arc_version_image(arc_get_architecture(arc_read_jtag_aux_register)));
 }
 
 
+/* Reset the target board.  */
+
+static void
+arc_jtag_reset_board (char *arg, int from_tty)
+{
+    /* Make sure the GPIO interface is open.  */
+    if (gpio_open())
+    {
+        printf_filtered(_("Attempting to reset target board...\n"));
+
+        if (arc_jtag_ops.status == JTAG_OPENED)
+        {
+            /* Try to force the processor to halt.  */
+            stop_processor();
+        }
+
+        /* Try to reset the board.  */
+        arc_reset_board();
+        arc_jtag_ops.reset_board();
+
+        if (arc_jtag_ops.status == JTAG_OPENED)
+        {
+            /* The ARC actionpoint registers are cleared upon reset, so it is
+               necessary to restore any actionpoints that were set.  */
+            if (!arc_restore_actionpoints_after_reset())
+                warning(_("can not restore hardware actionpoints"));
+        }
+    }
+}
+
+
+/* List the ARC target processor actionpoints.  */
+
+static void
+arc_list_actionpoints (char *arg, int from_tty)
+{
+    /* gdb manages breakpoints by deleting them from the target as soon as it
+       has halted, then re-inserting them again immediately before execution is
+       resumed (no, I don't know why either, unless it is to make generating a
+       disassembly display easier by removing all the s/w b/ps from the code) -
+       so in order to display what actionpoints are currently in use, we must
+       temporarily re-insert the breakpoints!  */
+    insert_breakpoints();
+    arc_display_actionpoints();
+    (void) remove_breakpoints();
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 8)                           initialization functions                      */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the JTAG target operations.  */
+
+static void
+initialize_jtag_target_ops (void)
+{
+    ENTERMSG;
+
+    jtag_target_ops.to_data = &operations;
+
+    jtag_target_ops.to_shortname = ARC_TARGET_NAME;
+    jtag_target_ops.to_longname  = "Remote JTAG debug target (ARC Processors)";
+    jtag_target_ops.to_doc       = "Remote JTAG debug target (ARC Processors)";
+
+    jtag_target_ops.to_open   = arc_jtag_open;
+    jtag_target_ops.to_close  = arc_jtag_close;
+    jtag_target_ops.to_attach = arc_jtag_attach;
+    jtag_target_ops.to_detach = arc_jtag_detach;
+    jtag_target_ops.to_resume = arc_jtag_resume;
+    jtag_target_ops.to_wait   = arc_jtag_wait;
+
+    jtag_target_ops.to_fetch_registers  = arc_elf32_fetch_registers;
+    jtag_target_ops.to_store_registers  = arc_elf32_store_registers;
+    jtag_target_ops.to_prepare_to_store = arc_jtag_prepare_to_store;
+    jtag_target_ops.to_xfer_partial     = arc_elf32_xfer_partial;
+    jtag_target_ops.to_files_info       = arc_jtag_files_info;
+
+    jtag_target_ops.to_insert_breakpoint = arc_elf32_insert_breakpoint;
+    jtag_target_ops.to_remove_breakpoint = arc_elf32_remove_breakpoint;
+
+    jtag_target_ops.to_kill = arc_jtag_kill;
+    jtag_target_ops.to_load = arc_elf32_load_program;
+
+    jtag_target_ops.to_create_inferior   = arc_jtag_create_inferior;
+    jtag_target_ops.to_mourn_inferior    = arc_jtag_mourn_inferior;
+    jtag_target_ops.to_thread_alive      = arc_jtag_thread_alive;
+//  jtag_target_ops.to_stop              = arc_jtag_stop;
+    jtag_target_ops.to_can_run           = arc_jtag_can_run;
+    jtag_target_ops.to_terminal_inferior = NULL;
+
+    jtag_target_ops.to_stratum = process_stratum;
+
+    jtag_target_ops.to_has_all_memory = 1;
+    jtag_target_ops.to_has_memory     = 1;
+    jtag_target_ops.to_has_stack      = 0;  /* Defer setting this until the program has been loaded.  */
+    jtag_target_ops.to_has_registers  = 1;
+    jtag_target_ops.to_has_execution  = 0;  /* Defer setting this until the program has been started.  */
+
+    jtag_target_ops.to_magic = OPS_MAGIC;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the module.  This function is called from the gdb core on start-up.  */
 
 void
-_initialize_arc_debug (void)
+_initialize_arc_jtag (void)
 {
-  ENTERMSG;
-  init_arc_debug_ops ();
-  add_target (&arc_debug_ops);
-  add_setshow_boolean_cmd("arcjtag-debug-target",no_class, 
-			  &debug_arc_jtag_target_message,
-			  "Set whether to print arc jtag debug messages.\n",
-			  "Show whether to print arc jtag debug messages.\n",
-			  "If set the jtag debug messages from the target are \
-printed.\n",
-			  "Whether to print debug jtag messages is %s.\n",		  
-			  NULL,NULL,&setlist,&showlist);
+    ENTERMSG;
 
-  add_setshow_boolean_cmd("arcjtag-debug-statemachine",no_class, 
-			  &(arc_jtag_ops.arc_jtag_state_machine_debug),
-			  "Set whether to print JTAG state machine \
-debug messages \n",
-			  "Show whether to print JTAG state machine \
-debug messages \n",
-			  "If set the JTAG state machine messages are \
-printed.\n",
-			  "Whether to print JTAG state machine debug \
-messages is %s\n",
-			  NULL,NULL,&setlist,&showlist);
+    operations.read_core_register       = arc_read_jtag_core_register;
+    operations.write_core_register      = arc_write_jtag_core_register;
+    operations.read_auxiliary_register  = arc_read_jtag_aux_register;
+    operations.write_auxiliary_register = arc_write_jtag_aux_register;
+    operations.read_memory              = read_words;
+    operations.write_memory             = write_words;
+    operations.fill_memory              = write_pattern;
 
-  add_setshow_uinteger_cmd("arcjtag-retry-count",no_class, &arcjtag_retry_count,
-			   "Set the number of attempts to be made for \
-a JTAG operation.\n",
-			   "Show the number of attempts to be made for \
-a JTAG operation.\n",
-			   "Indicates the number of times a JTAG operation \
-is attempted before returning a failure.\n",
-			   "The number of times a JTAG operation is attempted \
-before returning a failure is %s.\n",
-			   NULL, NULL, &setlist, &showlist);
+    initialize_jtag_target_ops ();
+    add_target (&jtag_target_ops);
 
-  add_cmd ("arc-configuration", class_info, arc_print_processor_variant_info,
-	   "Show ARC configuration information." , &infolist);
+    /* Register ARC-specific commands with gdb.  */
 
-  add_cmd ("arc-bcr-registers", class_info, arc_print_bcr_regs,
-           "Show BCR Registers in the ARC Processor Variant", &infolist);
+    add_setshow_boolean_cmd(ARC_FSM_DEBUG_COMMAND,
+                            no_class,
+                            &arc_jtag_ops.state_machine_debug,
+                            _("Set whether to print JTAG state machine debug messages.\n"),
+                            _("Show whether to print JTAG state machine debug messages.\n"),
+                            _("If set the JTAG state machine messages are printed.\n"),
+                            NULL,
+                            NULL,
+                            &setlist,
+                            &showlist);
 
-  add_cmd ("arc-reset-board", class_obscure, arc_debug_jtag_reset_board,
-           "Reset the board.", &cmdlist);
+    add_setshow_uinteger_cmd(ARC_JTAG_RETRY_COMMAND,
+                             no_class,
+                             &arc_jtag_ops.retry_count,
+                             _("Set the number of attempts to be made for a JTAG operation.\n"),
+                             _("Show the number of attempts to be made for a JTAG operation.\n"),
+                             _("Indicates the number of times a JTAG operation is attempted before returning a failure.\n"),
+                             NULL,
+                             NULL,
+                             &setlist,
+                             &showlist);
 
+    (void) add_cmd(ARC_CONFIGURATION_COMMAND,
+                   class_info,
+                   arc_print_processor_variant_info,
+                   _("Show ARC configuration information.\n"
+                     ARC_CONFIGURATION_COMMAND_USAGE),
+                   &infolist);
+
+    (void) add_cmd(ARC_RESET_BOARD_COMMAND,
+                   class_obscure,
+                   arc_jtag_reset_board,
+                   _("Reset the board.\n"
+                     ARC_RESET_BOARD_COMMAND_USAGE),
+                   &cmdlist);
+
+    (void) add_cmd(ARC_LIST_ACTIONPOINTS_COMMAND,
+                   class_obscure,
+                   arc_list_actionpoints,
+                   _("List the processor actionpoints.\n"
+                     ARC_LIST_ACTIONPOINTS_COMMAND_USAGE),
+                   &cmdlist);
 }
+
+
+/* N.B. the core and auxiliary register contents read from or written to the
+        target via the arc-jtag-ops module are ALWAYS in little-endian format,
+        regardless of the endianness of the target processor.  Given that the
+        values passed to/from the functions below are in host byte order, and
+        the host is little-endian (since the ARC gdb is currently built only 
+        on an X86 Linux host), this means that no byte-swapping is required
+        here.  This will require changing if the debugger is ever built upon a
+        big-endian host (such as a Sun).  */
+
+
+/* Read a core register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : set to the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the read fails
+
+   Result: TRUE if the register contents are read. */
+
+Boolean
+arc_read_jtag_core_register (ARC_RegisterNumber    hw_regno,
+                             ARC_RegisterContents *contents,
+                             Boolean               warn_on_failure)
+{
+    if (arc_jtag_ops.read_core_reg(hw_regno, contents) == JTAG_SUCCESS)
+    {
+        DEBUG("Read value 0x%08X from core register %d\n", *contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_core_warning(ERROR_ON_READING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+
+/* Write a core register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : set to the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the write fails
+
+   Result: TRUE if the register contents are written. */
+
+Boolean
+arc_write_jtag_core_register (ARC_RegisterNumber   hw_regno,
+                              ARC_RegisterContents contents,
+                              Boolean              warn_on_failure)
+{
+    if (arc_jtag_ops.write_core_reg(hw_regno, contents) == JTAG_SUCCESS)
+    {
+        DEBUG("Written value 0x%08X to core register %d\n", contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_core_warning(ERROR_ON_WRITING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+
+/* Read an auxiliary register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : set to the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the read fails
+
+   Result: TRUE if the register contents are read. */
+
+Boolean
+arc_read_jtag_aux_register (ARC_RegisterNumber    hw_regno,
+                            ARC_RegisterContents *contents,
+                            Boolean               warn_on_failure)
+{
+    if (arc_jtag_ops.read_aux_reg(hw_regno, contents) == JTAG_SUCCESS)
+    {
+        DEBUG("Read value 0x%08X from auxiliary register %d\n", *contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_aux_warning(ERROR_ON_READING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+
+/* Write an auxiliary register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the write fails
+
+   Result: TRUE if the register contents are written. */
+
+Boolean
+arc_write_jtag_aux_register (ARC_RegisterNumber   hw_regno,
+                             ARC_RegisterContents contents,
+                             Boolean              warn_on_failure)
+{
+    ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_hw_number(hw_regno);
+
+   if (def)
+       contents = arc_write_value(def, contents);
+
+    if (arc_jtag_ops.write_aux_reg(hw_regno, contents) == JTAG_SUCCESS)
+    {
+        DEBUG("Written value 0x%08X to auxiliary register %d\n", contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_aux_warning(ERROR_ON_WRITING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-jtag.h b/gdb/arc-jtag.h
index b770a53..68b747b 100644
--- a/gdb/arc-jtag.h
+++ b/gdb/arc-jtag.h
@@ -1,76 +1,64 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
 
-   Authors: 
-      Soam Vasani <soam.vasani@codito.com>
+   Authors:
+      Soam Vasani     <soam.vasani@codito.com>
+      Richard Stuckey <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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.  
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#define ARC_DEBUG_REG_SH_BIT 	0x40000000
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines some operations provided by the ARC JTAG      */
+/*     module.                                                                */
+/*                                                                            */
+/******************************************************************************/
 
-#define RAUX(name, hwregno , desc, gdbregno, version)  ARC_HW_##name##_REGNUM = hwregno , 
-#define RBCR(name, hwregno , desc, gdbregno, version)  ARC_HW_##name##_REGNUM = hwregno , 
+#ifndef ARC_JTAG_H
+#define ARC_JTAG_H
+
+/* ARC header files */
+#include "arc-support.h"
 
 
-enum arc_hw_regnums
-  {
-    #include "arc-regnums-defs.h"
-    /* Specific ARCAngel Registers for Caches.  */
-    ARC_HW_ICACHE_IVIC = 0x10 , /* Invalidate Cache. */
-    ARC_HW_ICACHE_CONTROL = 0x11 , /* Disable ICache. ICache control. */
-    ARC_HW_DCACHE_IVIC = 0x47, /* Invalidate Cache. */
-    ARC_HW_DCACHE_CONTROL = 0x48 , /* Disable DCache. DCache Control. */
-  };
+/* Operations for reading/writing core/auxiliary registers; these must be used
+   when access to the registers *specifically* via the JTAG i/f is required.
 
-#undef RBCR
-#undef RAUX
+   N.B. the register contents returned by these functions, or supplied to them,
+        are in host byte order.  */
 
-#define ARC_TARGET_OBJECT_AUXREGS 	-1
+Boolean arc_read_jtag_core_register  (ARC_RegisterNumber    hw_regno,
+                                      ARC_RegisterContents *contents,
+                                      Boolean               warn_on_failure);
 
-#define target_read_aux_reg(readbuf, offset, len)               \
-         (current_target.to_xfer_partial(&current_target,        \
-                                         ARC_TARGET_OBJECT_AUXREGS, NULL, readbuf, NULL, offset, len))
-	  
-#define target_write_aux_reg(writebuf, offset, len)             \
-         (current_target.to_xfer_partial(&current_target,        \
-                                         ARC_TARGET_OBJECT_AUXREGS, NULL, NULL, writebuf, offset, len))
+Boolean arc_write_jtag_core_register (ARC_RegisterNumber    hw_regno,
+                                      ARC_RegisterContents  contents,
+                                      Boolean               warn_on_failure);
 
+Boolean arc_read_jtag_aux_register   (ARC_RegisterNumber    hw_regno,
+                                      ARC_RegisterContents *contents,
+                                      Boolean               warn_on_failure);
 
-static inline int 
-is_arc700 (void)
-{
-  struct gdbarch_tdep * tdep = gdbarch_tdep (current_gdbarch);
-  if(tdep->arc_processor_variant_info->arcprocessorversion == ARC700)
-    return 1;
-  return 0;
-  
-}
+Boolean arc_write_jtag_aux_register  (ARC_RegisterNumber    hw_regno,
+                                      ARC_RegisterContents  contents,
+                                      Boolean               warn_on_failure);
 
-static inline int 
-is_arc600 (void)
-{
-  struct gdbarch_tdep * tdep = gdbarch_tdep (current_gdbarch);
-  if(tdep->arc_processor_variant_info->arcprocessorversion == ARC600)
-    return 1;
-  return 0;
-  
-}
- int debug_arc_jtag_target_message;
+#endif /* ARC_JTAG_H */
+/******************************************************************************/
diff --git a/gdb/arc-linux-tdep.c b/gdb/arc-linux-tdep.c
index 14d34a6..479d850 100644
--- a/gdb/arc-linux-tdep.c
+++ b/gdb/arc-linux-tdep.c
@@ -1,506 +1,881 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
-   Authors: 
-      Soam Vasani <soam.vasani@codito.com>
-      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors:
+      Soam Vasani          <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+      Richard Stuckey      <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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.  
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include <string.h>
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module provides support for the ARC processor family's target     */
+/*     dependencies which are specific to the arc-linux-uclibc configuration  */
+/*     of the ARC gdb.                                                        */
+/*                                                                            */
+/* Functionality:                                                             */
+/*     This module provides a number of operations, including:                */
+/*                                                                            */
+/*     1) a function which returns the name of a register, given its number   */
+/*                                                                            */
+/*     2) a function which determines whether a given register belongs to a   */
+/*        particular group (e.g. the group of registers which should be saved */
+/*        and restored across a function call)                                */
+/*                                                                            */
+/*     3) a function which prints out registers                               */
+/*                                                                            */
+/*                                                                            */
+/* Usage:                                                                     */
+/*     The module exports a function _initialize_arc_linux_tdep: the call to  */
+/*     this function is generated by the gdb build mechanism, so this function*/
+/*     should not be explicitly called.                                       */
+/*                                                                            */
+/*     Some of the operations provided by this module are registered with gdb */
+/*     during initialization; gdb then calls them via function pointers,      */
+/*     rather than by name (this allows gdb to handle multiple target         */
+/*     architectures):                                                        */
+/*                                                                            */
+/*          set_gdbarch_XXX (gdbarch, <function>);                            */
+/*                                                                            */
+/*                                                                            */
+/* Register Numbering Scheme:                                                 */
+/*     The N target processor registers are assigned gdb numbers which form a */
+/*     contiguous range starting at 0.  The scheme used is:                   */
+/*                                                                            */
+/*         0  .. 26  :  core registers R0 .. R26                              */
+/*         27        :  BTA (Branch Target Address) auxiliary register        */
+/*         28        :  LP_START auxiliary register                           */
+/*         29        :  LP_END   auxiliary register                           */
+/*         30        :  LP_COUNT core register            (R60)               */
+/*         31        :  STATUS32 auxiliary register                           */
+/*         32        :  BLINK (Branch Link) core register (R31)               */
+/*         33        :  FP (Frame Pointer) core register  (R27)               */
+/*         34        :  SP (Stack Pointer) core register  (R28)               */
+/*         35        :  EFA (Exception Fault Address) auxiliary register      */
+/*         36        :  RET (Exception Return Address) auxiliary register     */
+/*         37        :  ORIG_R8                                               */
+/*         38        :  STOP_PC                                               */
+/*                                                                            */
+/*     N.B. 1) core registers R61 and R62 are not included in the scheme, as  */
+/*             R61 is reserved, and R62 is not a real register;               */
+/*                                                                            */
+/*          2) core registers R29 (ILINK1), R30 (ILINK2) and R63 (PCL) are    */
+/*             not included;                                                  */
+/*                                                                            */
+/*          3) extension core registers R32 .. R59 are not included;          */
+/*                                                                            */
+/*          4) most auxiliary registers (including all Build Configuration    */
+/*             Registers) are not included.                                   */
+/*                                                                            */
+/******************************************************************************/
 
+/* gdb header files */
 #include "defs.h"
 #include "osabi.h"
-#include "frame.h"
 #include "regcache.h"
-#include "gdb_assert.h"
 #include "inferior.h"
 #include "reggroups.h"
 #include "solib-svr4.h"
-#include "symtab.h"
-#include "objfiles.h"
 #include "block.h"
-
-#include "arc-tdep.h"
 #include "regset.h"
+#include "dis-asm.h"
+#include "opcode/arc.h"
+#include "gdb_assert.h"
 
-//#define ARC_DEBUG 1
+/* ARC header files */
+#include "config/arc/tm-linux.h"
+#include "arc-linux-tdep.h"
+#include "arc-support.h"
+#include "arc-tdep.h"
+#include "opcodes/arcompact-dis.h"
 
-/* Default Breakpoint instructions used for 
-   ARC700 Linux 
-*/
-unsigned int arc700_linux_breakpoint_size = 2;
-unsigned char arc700_linux_breakpoint_insn[2] = { 0x3e,0x78 } ;
 
-static const char *
-arc_linux_register_name (int regno)
-{
-  static char linux_names[][10] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6",
-				   "r7", "r8", "r9", "r10", "r11", "r12", "r13",
-				   "r14", "r15", "r16", "r17", "r18", "r19", "r20",
-				   "r21", "r22", "r23", "r24", "r25", "r26",
-				   
-				   "bta",
-				   "lp_start", "lp_end", "lp_count",
-				   "status32", "blink",
-				   "fp", "sp", "efa",
-				   /* linux-only registers */
-				   "ret", "orig_r8", "pc",
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
 
-				   /* pseudo-regs */
-				   "ilink1", "ilink2", "eret",
-				   "status_l1", "status_l2", "erstatus" };
+#define STATUS32_L            0x00000100
 
-  gdb_assert(ARRAY_SIZE (linux_names) == NUM_REGS + NUM_PSEUDO_REGS);
-  gdb_assert(regno >=0 && regno < NUM_REGS + NUM_PSEUDO_REGS);
 
-  return linux_names[regno];
-}
+/* Default breakpoint instruction used for ARC700 Linux.  */
+static const unsigned char le_breakpoint_instruction[] = { 0x3e, 0x78 };
+static const unsigned char be_breakpoint_instruction[] = { 0x78, 0x3e };
 
-/*
- * The kernel stores only one of (ilink1,ilink2,eret).  This is stored in
- * the ret "register".  ilink1 is stored when the kernel has been entered
- * because of a level 1 interrupt, etc.
- *
- * Same story for (status_l1, status_l2, erstatus).
- *
- * This disambiguity has been fixed by adding orig_r8 to pt_regs.
- * It will take the following values -
- *    1. if an exception of any kind occurs then orig_r8 >= 0
- *    2. Int level 1 : -1
- *    3. Int level 2 : -2
- *
- * Registers whose value we don't know are given the value zero.
+
+/* This array holds the object code of two instructions:
+      mov r8,nr_sigreturn
+      swi
  */
-static void
-arc_linux_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
-				int regno, void *buf)
+static const gdb_byte arc_sigtramp_insns[] = { 0x8a, 0x20, 0xc1, 0x1d,
+                                               0x6f, 0x22, 0x3f, 0x00 };
+
+#define SIGTRAMP_INSNS_LENGTH     sizeof(arc_sigtramp_insns)
+
+
+/* N.B. the array size is specified in the declaration so that the compiler
+        will warn of "excess elements in array initializer" if there is a
+        mismatch (but not of too few elements, unfortunately!).  */
+static const char *register_names[ARC_NR_REGS + ARC_NR_PSEUDO_REGS] =
 {
-  int status32, ret, orig_r8;
-  regcache_cooked_read (current_regcache, ARC_ORIG_R8_REGNUM, &orig_r8);
+    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",
+    "r7",  "r8",  "r9",  "r10", "r11", "r12", "r13",
+    "r14", "r15", "r16", "r17", "r18", "r19", "r20",
+    "r21", "r22", "r23", "r24", "r25", "r26",
 
-  if(regno == ARC_ILINK1_REGNUM ||
-     regno == ARC_ILINK2_REGNUM ||
-     regno == ARC_ERET_REGNUM)
-    {
-      regcache_cooked_read (current_regcache, ARC_RET_REGNUM, &ret);
+    "bta",
+    "lp_start",
+    "lp_end",
+    "lp_count",
+    "status32",
+    "blink",
+    "fp",
+    "sp",
+    "efa",
 
-      if(regno == ARC_ILINK1_REGNUM)
-	*((unsigned int *)buf) = ((orig_r8 == -1) ? ret : 0);
-      else if(regno == ARC_ILINK2_REGNUM)
-	*((unsigned int *)buf) = ((orig_r8 == -2) ? ret : 0);
-      else if(regno == ARC_ERET_REGNUM)
-	*((unsigned int *)buf) = ((orig_r8 >= 0) ? ret : 0);
+    /* Linux-only registers.  */
+    "ret",
+    "orig_r8",
+    "pc",           // stop pc
 
-    }
-  else if(regno == ARC_STATUS32_L1_REGNUM ||
-	  regno == ARC_STATUS32_L2_REGNUM ||
-	  regno == ARC_ERSTATUS_REGNUM)
-    {
-      regcache_cooked_read (current_regcache, ARC_STATUS32_REGNUM, &status32);
-
-      if(regno == ARC_STATUS32_L1_REGNUM)
-	*((unsigned int *)buf) = ((orig_r8 == -1) ? status32 : 0);
-      else if(regno == ARC_STATUS32_L2_REGNUM)
-	*((unsigned int *)buf) = ((orig_r8 == -2) ? status32 : 0);
-      else if(regno == ARC_ERSTATUS_REGNUM)
-	*((unsigned int *)buf) = ((orig_r8 >= 0) ? status32 : 0);
-    }
-  else
-    internal_error(__FILE__, __LINE__, "arc_pseudo_register_read: bad register number (%d)", regno);
-}
-
-static void
-arc_linux_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
-				 int regno, const void *buf)
-{
-  /* none of our pseudo-regs are writable */
-  internal_error(__FILE__, __LINE__, "arc_pseudo_register_write: bad register number");
-}
-
-/*
- * print registers in the correct order.
- *
- * Why not have the regnums in the right order in the first place ?
- * Because some of the registers have to be pseudo-registers because of
- * the way the kernel is written, and because gdb assumes that
- * pseudo-registers have regnums greater than real register regnums.
- */
-static void
-arc_linux_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
-				struct frame_info *frame, int regnum, int all)
-{
-  int i;
-
-  if (regnum >= 0)
-    {
-      default_print_registers_info (gdbarch, file, frame, regnum, all);
-      return;
-    }
-
-  /* print all registers */
-
-  /* r0..r26 */
-  for (i=0; i <= 26; ++i)
-    default_print_registers_info (gdbarch, file, frame, i, all);
-
-  default_print_registers_info (gdbarch, file, frame, ARC_FP_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_SP_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_ILINK1_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_ILINK2_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_BLINK_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_LP_COUNT_REGNUM, all);
-  
-  /* now the aux registers */
-  
-  default_print_registers_info (gdbarch, file, frame, ARC_BTA_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_LP_START_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_LP_END_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_EFA_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_ERET_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_STATUS32_L1_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_STATUS32_L2_REGNUM, all);
-  default_print_registers_info (gdbarch, file, frame, ARC_ERSTATUS_REGNUM, all);
-
-  /* show the pc */
-  default_print_registers_info (gdbarch, file, frame, ARC_STOP_PC_REGNUM, all);
-}
+    /* Pseudo-regs.  */
+    "ilink1",
+    "ilink2",
+    "eret",
+    "status_l1",
+    "status_l2",
+    "erstatus"
+};
 
 
-/*
- * mov r8,nr_sigreturn
- * swi 
- */
-static char arc_sigtramp_insn[] = { 0x8a, 0x20, 0xc1, 0x1d, 0x6f, 0x22, 0x3f, 0x00 };
+/* Mapping between the general-purpose registers in `struct sigcontext' format
+   and GDB's register cache layout.
 
-/* Return whether the frame preceding NEXT_FRAME corresponds to a
-   GNU/Linux sigtramp routine.  */
-static int
-arc_linux_sigtramp_p (struct frame_info *next_frame)
-{
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
-  unsigned char buf[8];
-
-  if (!safe_frame_unwind_memory (next_frame, pc, buf, 8))
-    return 0;
-
-  if (memcmp(buf, arc_sigtramp_insn, 8) == 0)
-    return 1;
-  else
-    {
-      pc -= 4;
-      
-      if (!safe_frame_unwind_memory (next_frame, pc, buf, 8))
-	return 0;
-
-      if (memcmp(buf, arc_sigtramp_insn, 8) == 0)
-	return 1;
-    }
-
-  return 0;
-}
-
-/* Assuming NEXT_FRAME is a frame following a GNU/Linux sigtramp
-   routine, return the address of the associated sigcontext structure.  */
-static CORE_ADDR
-arc_linux_sigcontext_addr (struct frame_info *next_frame)
-{
-  char buf[4];
-  CORE_ADDR sp;
-  
-  frame_unwind_register (next_frame, ARC_SP_REGNUM, buf);
-  sp = extract_unsigned_integer (buf, 4);
-
-  return sp;
-}
-
-int
-arc_linux_register_reggroup_p (int regnum, struct reggroup *group)
-{
-  if(regnum == ARC_ORIG_R8_REGNUM && group == system_reggroup)
-    return 1;
-
-  if(regnum == ARC_RET_REGNUM && group == general_reggroup)
-    return 0;
-
-  return -1;
-}
-
-/* Mapping between the general-purpose registers in `struct
-   sigcontext' format and GDB's register cache layout.
    arc_linux_sc_reg_offset[i] is the sigcontext offset of GDB regnum `i'.  */
 
 /* From <asm/sigcontext.h>.  */
-static int arc_linux_sc_reg_offset[] =
+static const int arc_linux_sc_reg_offset[ARC_NR_REGS] =
 {
-  23 * 4,				     /* r0 */
-  22 * 4,				     /* r1 */
-  21 * 4,				     /* r2 */
-  20 * 4,				     /* r3 */
-  19 * 4,				     /* r4 */
-  18 * 4,				     /* r5 */
-  17 * 4,				     /* r6 */
-  16 * 4,				     /* r7 */
-  15 * 4,				     /* r8 */
-  14 * 4,				     /* r9 */
-  13 * 4,				     /* r10 */
-  12 * 4,				     /* r11 */
-  11 * 4,				     /* r12 */
-  -1,					     /* r13 */
-  -1,					     /* r14 */
-  -1,					     /* r15 */
-  -1,					     /* r16 */
-  -1,					     /* r17 */
-  -1,					     /* r18 */
-  -1,					     /* r19 */
-  -1,					     /* r20 */
-  -1,					     /* r21 */
-  -1,					     /* r22 */
-  -1,					     /* r23 */
-  -1,					     /* r24 */
-  -1,					     /* r25 */
-  10 * 4,				     /* r26 */
-  2 * 4,				     /* bta */
-  3 * 4,				     /* lp_start */
-  4 * 4,				     /* lp_end */
-  5 * 4,				     /* lp_count */
-  6 * 4,				     /* status32 */
-  8 * 4,				     /* blink */
-  9 * 4,				     /* fp */
-  1 * 4,				     /* sp */
-  -1,					     /* efa */
-  7 * 4,				     /* ret */
-  -1,					     /* orig_r8 */
-  -1, 					     /* stop_pc */
+    23 * BYTES_IN_REGISTER,      /* r0       */
+    22 * BYTES_IN_REGISTER,      /* r1       */
+    21 * BYTES_IN_REGISTER,      /* r2       */
+    20 * BYTES_IN_REGISTER,      /* r3       */
+    19 * BYTES_IN_REGISTER,      /* r4       */
+    18 * BYTES_IN_REGISTER,      /* r5       */
+    17 * BYTES_IN_REGISTER,      /* r6       */
+    16 * BYTES_IN_REGISTER,      /* r7       */
+    15 * BYTES_IN_REGISTER,      /* r8       */
+    14 * BYTES_IN_REGISTER,      /* r9       */
+    13 * BYTES_IN_REGISTER,      /* r10      */
+    12 * BYTES_IN_REGISTER,      /* r11      */
+    11 * BYTES_IN_REGISTER,      /* r12      */
+    REGISTER_NOT_PRESENT,        /* r13      */
+    REGISTER_NOT_PRESENT,        /* r14      */
+    REGISTER_NOT_PRESENT,        /* r15      */
+    REGISTER_NOT_PRESENT,        /* r16      */
+    REGISTER_NOT_PRESENT,        /* r17      */
+    REGISTER_NOT_PRESENT,        /* r18      */
+    REGISTER_NOT_PRESENT,        /* r19      */
+    REGISTER_NOT_PRESENT,        /* r20      */
+    REGISTER_NOT_PRESENT,        /* r21      */
+    REGISTER_NOT_PRESENT,        /* r22      */
+    REGISTER_NOT_PRESENT,        /* r23      */
+    REGISTER_NOT_PRESENT,        /* r24      */
+    REGISTER_NOT_PRESENT,        /* r25      */
+    10 * BYTES_IN_REGISTER,      /* r26      */
+     2 * BYTES_IN_REGISTER,      /* bta      */
+     3 * BYTES_IN_REGISTER,      /* lp_start */
+     4 * BYTES_IN_REGISTER,      /* lp_end   */
+     5 * BYTES_IN_REGISTER,      /* lp_count */
+     6 * BYTES_IN_REGISTER,      /* status32 */
+     8 * BYTES_IN_REGISTER,      /* blink    */
+     9 * BYTES_IN_REGISTER,      /* fp       */
+     1 * BYTES_IN_REGISTER,      /* sp       */
+    REGISTER_NOT_PRESENT,        /* efa      */
+     7 * BYTES_IN_REGISTER,      /* ret      */
+    REGISTER_NOT_PRESENT,        /* orig_r8  */
+    REGISTER_NOT_PRESENT         /* stop_pc  */
 };
 
 
+/* arcompact_linux_core_reg_offsets[i] is the offset in the .reg section of GDB regnum i.
+   From include/asm-arc/user.h in the ARC Linux sources.  */
+
+static const int arcompact_linux_core_reg_offsets[ARC_NR_REGS] =
+{
+    22 * BYTES_IN_REGISTER,    /* r0       */
+    21 * BYTES_IN_REGISTER,    /* r1       */
+    20 * BYTES_IN_REGISTER,    /* r2       */
+    19 * BYTES_IN_REGISTER,    /* r3       */
+    18 * BYTES_IN_REGISTER,    /* r4       */
+    17 * BYTES_IN_REGISTER,    /* r5       */
+    16 * BYTES_IN_REGISTER,    /* r6       */
+    15 * BYTES_IN_REGISTER,    /* r7       */
+    14 * BYTES_IN_REGISTER,    /* r8       */
+    13 * BYTES_IN_REGISTER,    /* r9       */
+    12 * BYTES_IN_REGISTER,    /* r10      */
+    11 * BYTES_IN_REGISTER,    /* r11      */
+    10 * BYTES_IN_REGISTER,    /* r12      */
+    39 * BYTES_IN_REGISTER,    /* r13      */
+    38 * BYTES_IN_REGISTER,    /* r14      */
+    37 * BYTES_IN_REGISTER,    /* r15      */
+    36 * BYTES_IN_REGISTER,    /* r16      */
+    35 * BYTES_IN_REGISTER,    /* r17      */
+    34 * BYTES_IN_REGISTER,    /* r18      */
+    33 * BYTES_IN_REGISTER,    /* r19      */
+    32 * BYTES_IN_REGISTER,    /* r20      */
+    31 * BYTES_IN_REGISTER,    /* r21      */
+    30 * BYTES_IN_REGISTER,    /* r22      */
+    29 * BYTES_IN_REGISTER,    /* r23      */
+    28 * BYTES_IN_REGISTER,    /* r24      */
+    27 * BYTES_IN_REGISTER,    /* r25      */
+     9 * BYTES_IN_REGISTER,    /* r26      */
+     1 * BYTES_IN_REGISTER,    /* bta      */
+     2 * BYTES_IN_REGISTER,    /* lp_start */
+     3 * BYTES_IN_REGISTER,    /* lp_end   */
+     4 * BYTES_IN_REGISTER,    /* lp_count */
+     5 * BYTES_IN_REGISTER,    /* status32 */
+     7 * BYTES_IN_REGISTER,    /* blink    */
+     8 * BYTES_IN_REGISTER,    /* fp       */
+    25 * BYTES_IN_REGISTER,    /* sp       */
+    REGISTER_NOT_PRESENT,      /* efa      */
+     6 * BYTES_IN_REGISTER,    /* ret      */
+    24 * BYTES_IN_REGISTER,    /* orig_r8  */
+    40 * BYTES_IN_REGISTER,    /* stop_pc  */
+};
+
+
+/* -------------------------------------------------------------------------- */
+/*                               forward declarations                         */
+/* -------------------------------------------------------------------------- */
+
+static int arc_linux_binutils_reg_to_regnum (struct gdbarch *gdbarch, int reg);
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define PRINT(regnum) \
+    default_print_registers_info (gdbarch, file, frame, regnum, all)
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Returns TRUE if the instruction at PC is a branch (of any kind).
+     *fall_thru is set to the address of the next insn.
+     *target    is set to the branch target.  */
+
+static Boolean
+next_pc (CORE_ADDR pc, CORE_ADDR *fall_thru, CORE_ADDR *target)
+{
+    struct regcache        *regcache = get_current_regcache();
+    struct disassemble_info di;
+    struct arcDisState      instr;
+    Boolean                 two_targets = FALSE;
+
+    arc_initialize_disassembler(&di);
+
+    /* So what is the instruction at the given PC?  */
+    instr = arcAnalyzeInstr(pc, &di);
+
+    /* By default, the next instruction is the one immediately after the one at PC.  */
+    *fall_thru = pc + instr.instructionLen;
+
+    DEBUG("--- next_pc(%x) = %x, isBranch = %d, tcnt = %d [%x], flow = %s (%d), "
+          "reg for indirect jump = %d, nullifyMode = %s\n",
+          (unsigned int) pc, (unsigned int) *fall_thru, instr.isBranch, instr.tcnt, instr.targets[0],
+          (instr.flow == direct_jump || instr.flow == direct_call) ? "direct" : "indirect",
+          instr.flow,
+          instr.register_for_indirect_jump,
+          ((instr.nullifyMode == (char) BR_exec_always) ? "delay slot" : "no delay"));
+
+    /* OK, it's a branch.  */
+    if ((Boolean) instr.isBranch)
+    {
+        two_targets = TRUE;
+
+        /* If it's a direct jump or call, the destination address is encoded in
+           the instruction, so we got it by disassembling the instruction;
+           otherwise, it's an indirect jump to the address held in the register
+           named in the instruction, so we must read that register.  */
+        if (instr.flow == direct_jump || instr.flow == direct_call)
+            *target = (CORE_ADDR) instr.targets[0];
+        else
+            regcache_cooked_read(regcache,
+                                 arc_linux_binutils_reg_to_regnum(current_gdbarch,
+                                 instr.register_for_indirect_jump),
+                                 (gdb_byte*) target);
+
+        /* For instructions with delay slots, the fall thru is not the instruction
+           immediately after the branch instruction, but the one after that.  */
+        if (instr.nullifyMode == (char) BR_exec_always)
+        {
+            struct arcDisState instr_d = arcAnalyzeInstr(*fall_thru, &di);
+
+            *fall_thru += instr_d.instructionLen;
+        }
+    }
+
+
+    /* Check for a zero-overhead loop.  */
+    {
+        unsigned int lp_end, lp_start, lp_count, status32;
+
+        regcache_cooked_read(regcache, ARC_LP_START_REGNUM, (gdb_byte*) &lp_start);
+        regcache_cooked_read(regcache, ARC_LP_END_REGNUM,   (gdb_byte*) &lp_end);
+        regcache_cooked_read(regcache, ARC_LP_COUNT_REGNUM, (gdb_byte*) &lp_count);
+        regcache_cooked_read(regcache, ARC_STATUS32_REGNUM, (gdb_byte*) &status32);
+
+        if (!(status32 & STATUS32_L) && *fall_thru == lp_end && lp_count > 1)
+        {
+            /* The instruction is in effect a jump back to the start of the loop.  */
+            two_targets = TRUE;
+            *target     = lp_start;
+        }
+    }
+
+    return two_targets;
+}
+
+
+/* Extract the register values found in the ABI GREGSET, storing their values in
+   regcache.  */
+
+static void
+arcompact_linux_supply_gregset (struct regcache *regcache,
+                                int              regnum,
+                                const void      *gregs,
+                                size_t           size)
+{
+    const bfd_byte *buf = gregs;
+    unsigned int    reg;
+
+    for (reg = 0; reg < ELEMENTS_IN_ARRAY(arcompact_linux_core_reg_offsets); reg++)
+    {
+        if (arcompact_linux_core_reg_offsets[reg] != REGISTER_NOT_PRESENT)
+            regcache_raw_supply (regcache,
+                                 (int) reg,
+                                 buf + arcompact_linux_core_reg_offsets[reg]);
+    }
+}
+
+
+/* Return whether the frame preceding next_frame corresponds to a GNU/Linux
+   sigtramp routine.  */
+
+static Boolean
+is_linux_sigtramp (struct frame_info *next_frame)
+{
+    /* Find the PC for that previous frame.  */
+    CORE_ADDR pc = frame_pc_unwind (next_frame);
+    gdb_byte  buf[SIGTRAMP_INSNS_LENGTH];
+
+    /* Read the memory at that PC (this gives us the code without any s/w
+       breakpoints that may have been set in it).  */
+    if (!safe_frame_unwind_memory (next_frame, pc, buf, (int) SIGTRAMP_INSNS_LENGTH))
+        /* Failed to unwind frame.  */
+        return FALSE;
+
+    /* Is that code the sigtramp instruction sequence?  */
+    if (memcmp(buf, arc_sigtramp_insns, SIGTRAMP_INSNS_LENGTH) == 0)
+        return TRUE;
+
+    /* No - look one instruction earlier in the code.  */
+    if (!safe_frame_unwind_memory (next_frame, pc - 4, buf, (int) SIGTRAMP_INSNS_LENGTH))
+        /* Failed to unwind frame.  */
+        return FALSE;
+
+    if (memcmp(buf, arc_sigtramp_insns, SIGTRAMP_INSNS_LENGTH) == 0)
+        return TRUE;
+
+    return FALSE;
+}
+
+
+/* Assuming next_frame is a frame following a GNU/Linux sigtramp
+   routine, return the address of the associated sigcontext structure.  */
+
+static CORE_ADDR
+linux_sigcontext_addr (struct frame_info *next_frame)
+{
+    gdb_byte buf[4];
+
+    frame_unwind_register (next_frame, ARC_SP_REGNUM, buf);
+
+    return (CORE_ADDR) extract_unsigned_integer (buf, 4);
+}
+
+
+/* Determine whether the given register is a member of the given group.
+
+   Returns 0, 1, or -1:
+      0 means the register is not in the group.
+      1 means the register is in the group.
+     -1 means the tdep has nothing to say about this register and group.  */
+
+static int
+register_reggroup_p (int regnum, struct reggroup *group)
+{
+    if (system_reggroup)
+    {
+        if (regnum == ARC_ORIG_R8_REGNUM ||
+            regnum == ARC_EFA_REGNUM     ||
+            regnum == ARC_ERET_REGNUM    ||
+            regnum == ARC_ERSTATUS_REGNUM)
+            return 1;
+    }
+    else if (group == general_reggroup)
+    {
+        if (regnum == ARC_RET_REGNUM)
+            return 0;
+
+        return (regnum == ARC_STATUS32_REGNUM) ? 0 : 1;
+    }
+
+    /* Let the caller sort it out!  */
+    return -1;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                       local functions called from gdb                      */
+/* -------------------------------------------------------------------------- */
+
+/* The Linux kernel stores only one of (ilink1, ilink2, eret). This is stored
+   in the ret "register".  ilink1 is stored when the kernel has been entered
+   because of a level 1 interrupt, etc.
+
+   Same story for (status_l1, status_l2, erstatus).
+
+   This disambiguity has been fixed by adding orig_r8 to pt_regs.
+
+   FIXME: what is pt_regs????
+
+   It will take the following values -
+      1. if an exception of any kind occurs then orig_r8 >= 0
+      2. Interrupt level 1 : orig == -1
+      3. Interrupt level 2 : orig == -2
+
+   Registers whose value we don't know are given the value zero.
+
+   The only pseudo-registers are:
+
+       ARC_ILINK1_REGNUM
+       ARC_ILINK2_REGNUM
+       ARC_ERET_REGNUM
+       ARC_STATUS32_L1_REGNUM
+       ARC_STATUS32_L2_REGNUM
+       ARC_ERSTATUS_REGNUM
+*/
+
+static void
+arc_linux_pseudo_register_read (struct gdbarch  *gdbarch,
+                                struct regcache *regcache,
+                                int              gdb_regno,
+                                gdb_byte        *buf)
+{
+    unsigned int* contents = (unsigned int *) buf;
+    unsigned int  status32, ret;
+    int           orig_r8;
+
+    regcache_cooked_read (regcache, ARC_ORIG_R8_REGNUM, (gdb_byte*) &orig_r8);
+
+    if (gdb_regno == ARC_ILINK1_REGNUM ||
+        gdb_regno == ARC_ILINK2_REGNUM ||
+        gdb_regno == ARC_ERET_REGNUM)
+    {
+        regcache_cooked_read (regcache, ARC_RET_REGNUM, (gdb_byte*) &ret);
+
+        if (gdb_regno == ARC_ILINK1_REGNUM)
+            *contents = ((orig_r8 == -1) ? ret : 0);
+        else if (gdb_regno == ARC_ILINK2_REGNUM)
+            *contents = ((orig_r8 == -2) ? ret : 0);
+        else  // (gdb_regno == ARC_ERET_REGNUM)
+            *contents = ((orig_r8 >= 0)  ? ret : 0);
+
+    }
+    else if (gdb_regno == ARC_STATUS32_L1_REGNUM ||
+             gdb_regno == ARC_STATUS32_L2_REGNUM ||
+             gdb_regno == ARC_ERSTATUS_REGNUM)
+    {
+        regcache_cooked_read (regcache, ARC_STATUS32_REGNUM, (gdb_byte*) &status32);
+
+        if (gdb_regno == ARC_STATUS32_L1_REGNUM)
+            *contents = ((orig_r8 == -1) ? status32 : 0);
+        else if (gdb_regno == ARC_STATUS32_L2_REGNUM)
+            *contents = ((orig_r8 == -2) ? status32 : 0);
+        else // (gdb_regno == ARC_ERSTATUS_REGNUM)
+            *contents = ((orig_r8 >= 0)  ? status32 : 0);
+    }
+    else
+        internal_error(__FILE__, __LINE__, _("%s: bad pseudo register number (%d)"), __FUNCTION__, gdb_regno);
+}
+
+
+static void
+arc_linux_pseudo_register_write (struct gdbarch  *gdbarch,
+                                 struct regcache *regcache,
+                                 int              gdb_regno,
+                                 const gdb_byte  *buf)
+{
+    /* None of our pseudo-regs are writable.  */
+    internal_error(__FILE__, __LINE__, _("%s: pseudo-registers are unwritable"), __FUNCTION__);
+}
+
+
+/* Mapping from binutils/gcc register number to GDB register number ("regnum").
+   N.B. registers such as ARC_FP_REGNUM, ARC_SP_REGNUM, etc., actually have
+        different GDB register numbers in the arc-elf32 and arc-linux-uclibc
+        configurations of the ARC gdb.  */
+
+static int
+arc_linux_binutils_reg_to_regnum (struct gdbarch *gdbarch, int reg)
+{
+    /* From gcc/config/arc/arc.h header file.  */
+
+    if (reg >= 0 && reg <= 26)
+        return reg;
+    else if (reg == ARC_ABI_FRAME_POINTER)      /* fp */
+        return ARC_FP_REGNUM;
+    else if (reg == ARC_ABI_STACK_POINTER)      /* sp */
+        return ARC_SP_REGNUM;
+    else if (reg == 29)                         /* ilink1 */
+        return ARC_ILINK1_REGNUM;
+    else if (reg == 30)                         /* ilink2 */
+        return ARC_ILINK2_REGNUM;
+    else if (reg == 31)                         /* blink */
+        return ARC_BLINK_REGNUM;
+    else if (IS_EXTENSION_CORE_REGISTER(reg))   /* reserved */
+        ;
+    else if (reg == 60)                         /* lp_count */
+        return ARC_LP_COUNT_REGNUM;
+#if 0
+    else if (reg == 61)                         /* reserved */
+        ;
+    else if (reg == 62)                         /* no such register */
+        ;
+   else if (reg == 63)                          /* PCL */
+        ;
+#endif
+
+    warning(_("unmapped register #%d encountered"), reg);
+    return -1;
+}
+
+
+/* Print the contents of one, some or all registers.
+
+   Print registers in the correct order.
+   Why not have the regnums in the right order in the first place?
+   Because some of the registers have to be pseudo-registers because of
+   the way the kernel is written, and because gdb assumes that
+   pseudo-registers have regnums greater than real register regnums.  */
+
+static void
+arc_linux_print_registers_info (struct gdbarch    *gdbarch,
+                                struct ui_file    *file,
+                                struct frame_info *frame,
+                                int                regnum,
+                                int                all)
+{
+    if (regnum >= 0)
+        PRINT (regnum);
+    else /* If regnum < 0, print all registers.  */
+    {
+        int i;
+
+        /* R0 .. R26 */
+        for (i = 0; i <= 26; i++) PRINT (i);
+
+        PRINT (ARC_FP_REGNUM        );
+        PRINT (ARC_SP_REGNUM        );
+        PRINT (ARC_ILINK1_REGNUM    );
+        PRINT (ARC_ILINK2_REGNUM    );
+        PRINT (ARC_BLINK_REGNUM     );
+        PRINT (ARC_LP_COUNT_REGNUM  );
+
+        /* Now the auxiliary registers.  */
+
+        PRINT (ARC_BTA_REGNUM        );
+        PRINT (ARC_LP_START_REGNUM   );
+        PRINT (ARC_LP_END_REGNUM     );
+        PRINT (ARC_EFA_REGNUM        );
+        PRINT (ARC_ERET_REGNUM       );
+        PRINT (ARC_STATUS32_L1_REGNUM);
+        PRINT (ARC_STATUS32_L2_REGNUM);
+        PRINT (ARC_ERSTATUS_REGNUM   );
+
+        /* Show the PC.  */
+        PRINT (ARC_STOP_PC_REGNUM    );
+    }
+}
+
+
+/* Return the name of the given register.  */
+
+static const char*
+arc_linux_register_name (struct gdbarch *gdbarch, int gdb_regno)
+{
+    gdb_assert(ELEMENTS_IN_ARRAY(register_names) == (unsigned int) (ARC_NR_REGS + ARC_NR_PSEUDO_REGS));
+
+    /* Oh, for a proper language with array bounds checking, like Ada...  */
+    gdb_assert(0 <= gdb_regno && gdb_regno < (int) ELEMENTS_IN_ARRAY(register_names));
+
+    return register_names[gdb_regno];
+}
+
+
+/* Determine whether the given register is read-only.  */
+
+static int
+arc_linux_cannot_store_register (struct gdbarch *gdbarch, int gdb_regno)
+{
+    if (gdb_regno == ARC_EFA_REGNUM         ||
+        gdb_regno == ARC_ERET_REGNUM        ||
+        gdb_regno == ARC_STATUS32_L1_REGNUM ||
+        gdb_regno == ARC_STATUS32_L2_REGNUM ||
+        gdb_regno == ARC_ERSTATUS_REGNUM    ||
+        gdb_regno == ARC_ILINK1_REGNUM      ||
+        gdb_regno == ARC_ILINK2_REGNUM)
+    {
+      /* No warning should be printed.  arc_cannot_store_register being
+         called does not imply that someone is actually writing to regnum.  */
+
+     /* warning(_("writing to read-only register: %s"), gdbarch_register_name(gdbarch, gdb_regno)); */
+        return 1;
+    }
+
+    return 0;
+}
+
+
+/* This function is called just before we resume executing the inferior, if we
+   want to single-step it.  We find the target(s) of the instruction about to
+   be executed and and place breakpoints there.  */
+
+static int
+arc_linux_software_single_step (struct frame_info *frame)
+{
+    CORE_ADDR fall_thru, branch_target;
+    CORE_ADDR pc              = get_frame_pc(frame);
+    Boolean   two_breakpoints = next_pc(pc, &fall_thru, &branch_target);
+
+    insert_single_step_breakpoint (fall_thru);
+
+    if (two_breakpoints)
+    {
+       if (pc != branch_target)
+           insert_single_step_breakpoint (branch_target);
+    }
+
+    /* Always returns true for now.  */
+    return 1;
+}
+
+
 /* Set the program counter for process PTID to PC.  */
 
 static void
-arc700_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
+arc_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
 {
-  ULONGEST val;
-  write_register_pid (PC_REGNUM, pc, ptid);
+    regcache_cooked_write_unsigned (regcache, ARC_PC_REGNUM, pc);
 
-  /* We must be careful with modifying the program counter.  If we
-     just interrupted a system call, the kernel might try to restart
-     it when we resume the inferior.  On restarting the system call,
-     the kernel will try backing up the program counter even though it
-     no longer points at the system call.  This typically results in a
-     SIGSEGV or SIGILL.  We can prevent this by writing `-1' in the
-     "orig_r8" pseudo-register.
+    /* We must be careful with modifying the program counter.  If we
+       just interrupted a system call, the kernel might try to restart
+       it when we resume the inferior.  On restarting the system call,
+       the kernel will try backing up the program counter even though it
+       no longer points at the system call.  This typically results in a
+       SIGSEGV or SIGILL.  We can prevent this by writing `-1' in the
+       "orig_r8" pseudo-register.
 
-     Note that "orig_r8" is saved when setting up a dummy call frame.
-     This means that it is properly restored when that frame is
-     popped, and that the interrupted system call will be restarted
-     when we resume the inferior on return from a function call from
-     within GDB.  In all other cases the system call will not be
-     restarted.  */
-  write_register_pid (ARC_ORIG_R8_REGNUM, -3, ptid);
+       Note that "orig_r8" is saved when setting up a dummy call frame.
+       This means that it is properly restored when that frame is
+       popped, and that the interrupted system call will be restarted
+       when we resume the inferior on return from a function call from
+       within GDB.  In all other cases the system call will not be
+       restarted.  */
+
+    // FIXME: why -3 and not -1? -3 does not appear to be a defined valued for
+    //        orig_r8 (i.e. -2, -1 or >= 0) - perhaps it means "none of these"?
+    regcache_cooked_write_signed (regcache, ARC_ORIG_R8_REGNUM, -3);
 }
 
 
 /* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c.
 
-   This is called on every single step thru the PLT and runtime resolver.
+   This is called on every single step through the PLT and runtime resolver.
 
    This function:
-   1) decides whether a PLT has sent us into the linker to resolve
-      a function reference, and 
-   2) if so, tells us where to set a temporary breakpoint that will
-      trigger when the dynamic linker is done.  */
+      1) decides whether a PLT has sent us into the linker to resolve
+         a function reference, and
+      2) if so, tells us where to set a temporary breakpoint that will
+         trigger when the dynamic linker is done.  */
 
-CORE_ADDR
+static CORE_ADDR
 arc_linux_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  /* For uClibc 0.9.26.
+    /* For uClibc 0.9.26.
 
-     An unresolved PLT entry points to "__dl_linux_resolve", which calls
-     "__dl_linux_resolver" to do the resolving and then eventually jumps to
-     the function.
+         An unresolved PLT entry points to "__dl_linux_resolve", which calls
+         "__dl_linux_resolver" to do the resolving and then eventually jumps to
+         the function.
 
-     So we look for the symbol `_dl_linux_resolver', and if we are there,
-     we set a breakpoint at the return address, and continue.  */
+         So we look for the symbol `_dl_linux_resolver', and if we are there,
+         gdb sets a breakpoint at the return address, and continues.  */
 
-  /* lookup_minimal_symbol didn't work, for some reason.  */
-  struct symbol *resolver 
-    = lookup_symbol_global ("_dl_linux_resolver", 0, VAR_DOMAIN, 0);
-  
-#ifdef ARC_DEBUG
-  printf("--- arc_linux_skip_solib_resolver: pc = %x, resolver at %x\n", pc,
-	 resolver ? BLOCK_START (SYMBOL_BLOCK_VALUE (resolver)) : 0);
-#endif
-  
-  if (resolver && (BLOCK_START (SYMBOL_BLOCK_VALUE (resolver))) == pc)
-    {
-	return frame_pc_unwind (get_current_frame ());
-    }
+    /* Lookup_minimal_symbol didn't work, for some reason.  */
+    struct symbol *resolver =
+                   lookup_symbol_global ("_dl_linux_resolver", 0, 0, VAR_DOMAIN, 0);
 
-  return 0;
-}      
+    DEBUG((resolver == NULL) ? "--- %s : pc = %x, no resolver found"
+                             : "--- %s : pc = %x, resolver at %x\n",
+          __FUNCTION__,
+          (unsigned int) pc,
+          (unsigned int) ((resolver == NULL) ? 0 : BLOCK_START (SYMBOL_BLOCK_VALUE (resolver))));
 
+    if ((resolver != NULL) && (BLOCK_START (SYMBOL_BLOCK_VALUE (resolver))) == pc)
+        /* Find the return address.  */
+        return frame_pc_unwind (get_current_frame ());
 
-/* arcompact_linux_core_reg_offsets[i] is the offset in the .reg section of GDB
-   regnum i .
-   
-   From include/asm-arc/user.h in the ARC Linux sources.  */
-static int arcompact_linux_core_reg_offsets[] = {
-  22 * 4,    /* r0 */
-  21 * 4,    /* r1 */
-  20 * 4,    /* r2 */
-  19 * 4,    /* r3 */
-  18 * 4,    /* r4 */
-  17 * 4,    /* r5 */
-  16 * 4,    /* r6 */
-  15 * 4,    /* r7 */
-  14 * 4,    /* r8 */
-  13 * 4,    /* r9 */
-  12 * 4,    /* r10 */
-  11 * 4,    /* r11 */
-  10 * 4,    /* r12 */
-  39 * 4,    /* r13 */
-  38 * 4,    /* r14 */
-  37 * 4,    /* r15 */
-  36 * 4,    /* r16 */
-  35 * 4,    /* r17 */
-  34 * 4,    /* r18 */
-  33 * 4,    /* r19 */
-  32 * 4,    /* r20 */
-  31 * 4,    /* r21 */
-  30 * 4,    /* r22 */
-  29 * 4,    /* r23 */
-  28 * 4,    /* r24 */
-  27 * 4,    /* r25 */
-   9 * 4,    /* r26 */
-   1 * 4,    /* bta */
-   2 * 4,    /* lp_start */
-   3 * 4,    /* lp_end */
-   4 * 4,    /* lp_count */
-   5 * 4,    /* status32 */
-   7 * 4,    /* blink */
-   8 * 4,    /* fp */
-  25 * 4,    /* sp */
-  -1,        /* efa */
-   6 * 4,    /* ret */
-  24 * 4,    /* orig_r8 */
-  40 * 4,    /* stop_pc */
-};
-
-/* Extract the register values found in the ABI GREGSET, storing their
-   values in REGCACHE.  */
-static void
-arcompact_linux_supply_gregset (struct regcache *regcache,
-				int regnum, const void *gregs, size_t size)
-{
-  int regi;
-  int arc_num_gprs = ARRAY_SIZE (arcompact_linux_core_reg_offsets);
-  const bfd_byte *buf = gregs;
-
-  for (regi = 0; regi < arc_num_gprs; regi++)
-    {
-      if (arcompact_linux_core_reg_offsets[regi] > 0)
-	regcache_raw_supply (regcache, regi,
-			     buf + arcompact_linux_core_reg_offsets[regi]);
-    }
+    /* No breakpoint is required.  */
+    return 0;
 }
 
-/* Call the right architecture variant's supply_gregset function.  For now,
-   we only have ARCompact.  */
+
+/* Call the right architecture variant's supply_gregset function.  For now, we
+   have only ARCompact.  */
+
 static void
 arc_linux_supply_gregset (const struct regset *regset,
-			  struct regcache *regcache,
-			  int regnum, const void *gregs, size_t size)
+                          struct regcache     *regcache,
+                          int                  regnum,
+                          const void          *gregs,
+                          size_t               size)
 {
-  arcompact_linux_supply_gregset (regcache, regnum, gregs, size);
+    arcompact_linux_supply_gregset (regcache, regnum, gregs, size);
 }
 
+
 /* Functions for handling core files.
    The first element is a parameter to pass the rest of the functions.  We
    don't need it.
    supply_gregset is for reading the core file.
    collect_regset, which we haven't defined, would be for writing the core
    file.  */
-static struct regset arc_linux_gregset = {
-  NULL, arc_linux_supply_gregset
-};
 
-/* This is called through gdbarch.  */
 static const struct regset *
 arc_linux_regset_from_core_section (struct gdbarch *core_arch,
-				    const char *sect_name, size_t sect_size)
+                                    const char     *sect_name,
+                                    size_t          sect_size)
 {
-  if (strcmp (sect_name, ".reg") == 0)
-    return &arc_linux_gregset;
+    static const struct regset arc_linux_gregset =
+    {
+        NULL,                        // descr
+        arc_linux_supply_gregset,    // supply_regset
+        NULL,                        // collect_regset
+        NULL                         // arch
+    };
 
-  return NULL;
+    if (strcmp (sect_name, ".reg") == 0)
+        return &arc_linux_gregset;
+
+    return NULL;
 }
 
-/* Add the signal stuff to gdbarch->tdep.  */
+
+/* Initialize for this ABI.  */
+
 static void
 arc_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  
-  tdep->sigtramp_p = arc_linux_sigtramp_p;
-  tdep->sigcontext_addr = arc_linux_sigcontext_addr;
-  tdep->sc_reg_offset = arc_linux_sc_reg_offset;
-  tdep->sc_num_regs = ARRAY_SIZE (arc_linux_sc_reg_offset);
+    struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  tdep->arc_breakpoint_size = arc700_linux_breakpoint_size;
-  tdep->arc_breakpoint_insn = arc700_linux_breakpoint_insn;
+    /* Fill in target-dependent info in ARC-private structure.  */
 
-  set_gdbarch_num_regs (gdbarch, ARC_NR_REGS);
-  set_gdbarch_num_pseudo_regs (gdbarch, ARC_NR_PSEUDO_REGS);
-  
-  set_gdbarch_pc_regnum (gdbarch, ARC_STOP_PC_REGNUM);
-  set_gdbarch_register_name (gdbarch, arc_linux_register_name);
+    tdep->is_sigtramp             = is_linux_sigtramp;
+    tdep->sigcontext_addr         = linux_sigcontext_addr;
+    tdep->sc_reg_offset           = arc_linux_sc_reg_offset;
+    tdep->sc_num_regs             = ELEMENTS_IN_ARRAY(arc_linux_sc_reg_offset);
+    tdep->pc_regnum_in_sigcontext = ARC_RET_REGNUM;
 
-  set_gdbarch_software_single_step (gdbarch, arc_software_single_step);
+    tdep->le_breakpoint_instruction = le_breakpoint_instruction;
+    tdep->be_breakpoint_instruction = be_breakpoint_instruction;
+    tdep->breakpoint_size        = (unsigned int) sizeof(le_breakpoint_instruction);
 
-  set_gdbarch_write_pc (gdbarch, arc700_linux_write_pc);
+    tdep->register_reggroup_p = register_reggroup_p;
 
-  tdep->pc_regnum_in_sigcontext = ARC_RET_REGNUM;
+    tdep->lowest_pc              = 0x74;             // FIXME: why this?
+    tdep->processor_variant_info = NULL;
 
+    /* Pass target-dependent info to gdb.  */
 
-  set_gdbarch_pseudo_register_read (gdbarch, arc_linux_pseudo_register_read);
-  set_gdbarch_pseudo_register_write (gdbarch, arc_linux_pseudo_register_write);
+    /* ARC_NR_REGS and ARC_NR_PSEUDO_REGS are defined in the tm.h configuration file.  */
+    set_gdbarch_pc_regnum                (gdbarch, ARC_STOP_PC_REGNUM);
+    set_gdbarch_num_regs                 (gdbarch, ARC_NR_REGS);
+    set_gdbarch_num_pseudo_regs          (gdbarch, ARC_NR_PSEUDO_REGS);
+    set_gdbarch_print_registers_info     (gdbarch, arc_linux_print_registers_info);
+    set_gdbarch_register_name            (gdbarch, arc_linux_register_name);
+    set_gdbarch_cannot_store_register    (gdbarch, arc_linux_cannot_store_register);
+    set_gdbarch_dwarf2_reg_to_regnum     (gdbarch, arc_linux_binutils_reg_to_regnum);
 
-  set_gdbarch_print_registers_info (gdbarch, arc_linux_print_registers_info);
+    set_gdbarch_decr_pc_after_break      (gdbarch, 0);
+    set_gdbarch_software_single_step     (gdbarch, arc_linux_software_single_step);
+    set_gdbarch_write_pc                 (gdbarch, arc_linux_write_pc);
+    set_gdbarch_pseudo_register_read     (gdbarch, arc_linux_pseudo_register_read);
+    set_gdbarch_pseudo_register_write    (gdbarch, arc_linux_pseudo_register_write);
+    set_gdbarch_regset_from_core_section (gdbarch, arc_linux_regset_from_core_section);
+    set_gdbarch_skip_solib_resolver      (gdbarch, arc_linux_skip_solib_resolver);
 
-  tdep->register_reggroup_p = arc_linux_register_reggroup_p;
-  
-  tdep->lowest_pc = 0x74;
-
-  tdep->arc_processor_variant_info = NULL;
-  set_gdbarch_regset_from_core_section (gdbarch, 
-					arc_linux_regset_from_core_section);
-  /* GNU/Linux uses SVR4-style shared libraries.  */
-  set_solib_svr4_fetch_link_map_offsets
-    (gdbarch, svr4_ilp32_fetch_link_map_offsets);
-
-  set_gdbarch_skip_solib_resolver (gdbarch, arc_linux_skip_solib_resolver);
+    /* GNU/Linux uses SVR4-style shared libraries.  */
+    set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets);
 }
 
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the module. This function is called from the gdb core on start-up.  */
+
 void
 _initialize_arc_linux_tdep (void)
 {
-  gdbarch_register_osabi (bfd_arch_arc, 0, GDB_OSABI_LINUX,
-			  arc_linux_init_abi);
+    /* Register a handler with gdb for the Linux O/S ABI variant for the ARC
+       processor architecture, providing an initialization function;
+       'bfd_arch_arc' is an enumeration value specifically denoting the ARC
+       architecture.  */
+    gdbarch_register_osabi (bfd_arch_arc,
+                            0,                   // machine (irrelevant)
+                            GDB_OSABI_LINUX,
+                            arc_linux_init_abi);
 }
+
+
+/* This function is required simply to avoid an undefined symbol at linkage.  */
+
+void
+arc_check_pc_defined (struct gdbarch *gdbarch)
+{
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-linux-tdep.h b/gdb/arc-linux-tdep.h
new file mode 100644
index 0000000..af1aa0e
--- /dev/null
+++ b/gdb/arc-linux-tdep.h
@@ -0,0 +1,51 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines the type and operations for the Linux-uclibc  */
+/*     variant of the ARC debugger.                                           */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_LINUX_TDEP_H
+#define ARC_LINUX_TDEP_H
+
+/* gdb header files */
+#include "defs.h"
+#include "gdbarch.h"
+
+
+/* Complete the structure definition here.  */
+struct arc_variant_info
+{
+   /* There is currently no variant-specific info.  */
+};
+
+
+void arc_check_pc_defined (struct gdbarch *gdbarch);
+
+#endif /* ARC_LINUX_TDEP_H */
+/******************************************************************************/
diff --git a/gdb/arc-memory.c b/gdb/arc-memory.c
new file mode 100644
index 0000000..806efb0
--- /dev/null
+++ b/gdb/arc-memory.c
@@ -0,0 +1,445 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Author:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements operations for reading data from and writing    */
+/*     data to target memory.                                                 */
+/*                                                                            */
+/*     The operations may be required to transfer arbitrary amounts of data   */
+/*     to/from arbitrary addresses in memory; however, the supplied transfer  */
+/*     operations must be assumed to be able only to transfer multiple words  */
+/*     of data to/from word-aligned addresses.                                */
+/*                                                                            */
+/*     This gives the general case:                                           */
+/*                                                                            */
+/*                           word boundaries                                  */
+/*                                  |                                         */
+/*           -------------------------------------------------                */
+/*          |         |         |         |         |         |               */
+/*      -----------------------------------------------------------           */
+/*          | g g L L | W W W W | W W W W | W W W W | T T e e |               */
+/*      -----------------------------------------------------------           */
+/*                ^                                                           */
+/*                |-------------------------------------|                     */
+/*                |                len                                        */
+/*                addr                                                        */
+/*                                                                            */
+/*       where addr is the base address of the data to be transferred         */
+/*             len  is the number of bytes of data to be transferred          */
+/*             W denotes a byte that can be transfered in a whole word        */
+/*             L denotes a leading byte                                       */
+/*             T denotes a trailing byte                                      */
+/*             g denotes a gap byte                                           */
+/*             e denotes a end gap byte                                       */
+/*                                                                            */
+/*     There may be 0 .. BYTES_IN_WORD - 1 leading bytes, 0 or more whole     */
+/*     words, and 0 .. BYTES_IN_WORD - 1 trailing bytes. If the given address */
+/*     is word-aligned, there is no gap and hence no leading bytes.           */
+/*                                                                            */
+/*     There is also a pathological case:                                     */
+/*                                                                            */
+/*                           word boundaries                                  */
+/*                                  |                                         */
+/*                               ---------                                    */
+/*                              |         |                                   */
+/*      -----------------------------------------------------------           */
+/*                              | g B B e |                                   */
+/*      -----------------------------------------------------------           */
+/*                                  ^                                         */
+/*                                  |-|                                       */
+/*                                  | len                                     */
+/*                                  addr                                      */
+/*                                                                            */
+/*     where 1 .. BYTES_IN_WORD - 2 bytes of data in the middle of a word     */
+/*     must be transfered.                                                    */
+/*                                                                            */
+/*     In a write operation, it is necessary to preserve the contents of the  */
+/*     gap and end gap bytes, if any - this is done by first reading the word */
+/*     which contains those bytes, constructing a new word which contains     */
+/*     those bytes and the new bytes, and writing the new value back to that  */
+/*     location.                                                              */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+
+/* gdb header files */
+#include "defs.h"
+
+/* ARC header files */
+#include "arc-memory.h"
+#include "arc-tdep.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef struct
+{
+    unsigned int leading_bytes;
+    unsigned int trailing_bytes;
+    unsigned int words;
+} Layout;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Split a memory chunk up into its layout - see diagram in file header.  */
+
+static Layout
+split (ARC_Address addr, unsigned int bytes)
+{
+    unsigned int gap = addr % BYTES_IN_WORD;
+    Layout       layout;
+
+    layout.leading_bytes  = (gap == 0) ? 0 : (BYTES_IN_WORD - gap);
+    layout.trailing_bytes = (addr + bytes) % BYTES_IN_WORD;
+    layout.words          = (bytes - layout.leading_bytes
+                                   - layout.trailing_bytes) / BYTES_IN_WORD;
+
+    DEBUG("%u leading bytes, %u words, %u trailing bytes\n",
+          layout.leading_bytes, layout.words, layout.trailing_bytes);
+
+    return layout;
+}
+
+
+/* Read part of a word of data from memory; the given address must be word-aligned.  */
+
+static unsigned int
+read_partial_word (TargetOperations *ops,
+                   ARC_Address       addr,
+                   ARC_Byte         *data,
+                   unsigned int      bytes,
+                   unsigned int      offset)  /* Offset of required bytes within word.  */
+{
+    ARC_Byte word[BYTES_IN_WORD];
+
+    /* Read the word: only some bytes of this are required.  */
+    if (ops->read_memory(addr, word, 1) > 0)
+    {
+        unsigned int i;
+
+        for (i = 0; i < bytes; i++)
+            data[i] = word[offset + i];
+
+        /* Have read the specified number of bytes.  */
+        return bytes;
+    }
+
+    /* Failed: no data read.  */
+    return 0;
+}
+
+
+/* Write part of a word of data to memory; the given address must be word-aligned.  */
+
+static unsigned int
+write_partial_word (TargetOperations *ops,
+                    ARC_Address       addr,
+                    ARC_Byte         *data,
+                    unsigned int      bytes,
+                    unsigned int      offset)   /* Offset of required bytes within word.  */
+{
+    ARC_Byte word[BYTES_IN_WORD];
+
+    /* First read the word of memory that will be overwritten.  */
+    if (ops->read_memory(addr, word, 1) > 0)
+    {
+        unsigned int i;
+
+        /* Next replace the bytes in that word that are to be written.  */
+        for (i = 0; i < bytes; i++)
+            word[offset + i] = data[i];
+
+        /* Now write it!  */
+        if (ops->write_memory(addr, word, 1) > 0)
+            /* Have written the specified number of bytes.  */
+            return bytes;
+    }
+
+    /* Failed: no data written.  */
+    return 0;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Read a chunk of data from target memory.
+   Returns number of bytes read.  */
+
+unsigned int
+arc_read_memory (TargetOperations *ops,
+                 ARC_Address       address,
+                 ARC_Byte         *data,
+                 unsigned int      bytes)
+{
+    unsigned int gap        = address % BYTES_IN_WORD;
+    unsigned int total_read = 0;
+
+    ENTERARGS("address 0x%08X, bytes %u", address, bytes);
+
+    /* Special fast case for reading a single word.  */
+    if (gap == 0 && bytes == BYTES_IN_WORD)
+    {
+        DEBUG("read single word\n");
+
+        /* N.B. assumes that 'data' is word-aligned, or that host does not care!  */
+        total_read = ops->read_memory(address, data, 1);
+    }
+    /* Pathological case: bytes in middle of word.  */
+    else if (gap > 0 && gap + bytes < BYTES_IN_WORD)
+    {
+        DEBUG("read pathological\n");
+
+        total_read = read_partial_word(ops,
+                                       address - gap,   /* Word-aligned address.  */
+                                       data,
+                                       bytes,
+                                       gap);
+    }
+    else /* The general case.  */
+    {
+        Layout chunk = split(address, bytes);
+
+        if (chunk.leading_bytes > 0)
+        {
+            /* Read the first few bytes.  */
+            total_read = read_partial_word(ops,
+                                           address - gap,   /* Word-aligned addres.  */
+                                           data,
+                                           chunk.leading_bytes,
+                                           gap);
+            data += chunk.leading_bytes;
+            address += chunk.leading_bytes;
+        }
+
+        if (chunk.words > 0)
+        {
+            unsigned int bytes_read = ops->read_memory(address, data, chunk.words);
+
+            total_read += bytes_read;
+            address       += bytes_read;
+            data       += bytes_read;
+        }
+
+        if (chunk.trailing_bytes > 0)
+        {
+            /* Read the last few bytes of data.  */
+            total_read += read_partial_word(ops,
+                                            address,     // Word-aligned address.  */
+                                            data,
+                                            chunk.trailing_bytes,
+                                            0);
+        }
+    }
+
+    DEBUG("read %u bytes\n", total_read);
+
+    return total_read;
+}
+
+
+/* Write a chunk of data to target memory.
+   Returns number of bytes written.  */
+
+unsigned int
+arc_write_memory (TargetOperations *ops,
+                  ARC_Address       address,
+                  ARC_Byte         *data,
+                  unsigned int      bytes)
+{
+    unsigned int gap           = address % BYTES_IN_WORD;
+    unsigned int total_written = 0;
+
+    ENTERARGS("address 0x%08X, bytes %u", address, bytes);
+
+    /* Useful debugging code: just change 0 to 1.  */
+    if (0)
+    {
+        unsigned int i;
+        for (i = 0; i < bytes; i++)
+        {
+            DEBUG("%02X", data[i]);
+            if ((i + 1) % 16 == 0)
+                DEBUG("\n");
+        }
+        DEBUG("\n");
+    }
+
+    /* Special fast case for writing a single word.  */
+    if (gap == 0 && bytes == BYTES_IN_WORD)
+    {
+        DEBUG("write single word (%02X %02X %02X %02X)\n", data[0], data[1], data[2], data[3]);
+
+        total_written = ops->write_memory(address, data, 1);
+    }
+    /* Pathological case: bytes in middle of word.  */
+    else if (gap > 0 && gap + bytes < BYTES_IN_WORD)
+    {
+        DEBUG("write pathological\n");
+
+        total_written = write_partial_word(ops,
+                                           address - gap,   /* Word-aligned address.  */
+                                           data,
+                                           bytes,
+                                           gap);
+    }
+    else /* general case */
+    {
+        Layout chunk = split(address, bytes);
+
+        if (chunk.leading_bytes > 0)
+        {
+            /* Write the first few bytes.  */
+            total_written = write_partial_word(ops,
+                                               address - gap,   /* Word-aligned address.  */
+                                               data,
+                                               chunk.leading_bytes,
+                                               gap);
+            data += chunk.leading_bytes;
+            address += chunk.leading_bytes;
+        }
+
+        if (chunk.words > 0)
+        {
+            unsigned int bytes_written = ops->write_memory(address, data, chunk.words);
+
+            total_written += bytes_written;
+            address          += bytes_written;
+            data          += bytes_written;
+        }
+
+        if (chunk.trailing_bytes > 0)
+        {
+            /* Write the last few bytes of data.  */
+            total_written += write_partial_word(ops,
+                                                address,    /* Word-aligned address.  */
+                                                data,
+                                                chunk.trailing_bytes,
+                                                0);
+        }
+    }
+
+    DEBUG("written %u bytes\n", total_written);
+
+    return total_written;
+}
+
+
+/* Write a repeated pattern of data to memory;
+   the start of each pattern is always word-aligned, so if the given address is
+   not word-aligned, the first partial word written will contain trailing bytes
+   of the pattern.  */
+
+unsigned int
+arc_write_pattern (TargetOperations *ops,
+                   ARC_Address       address,
+                   ARC_Word          pattern,
+                   unsigned int      bytes)
+{
+    unsigned int gap           = address % BYTES_IN_WORD;
+    unsigned int total_written = 0;
+
+    ENTERARGS("address 0x%08X, pattern 0x%08X, bytes %u", address, pattern, bytes);
+
+    /* Special fast case for writing a single word.  */
+    if (gap == 0 && bytes == BYTES_IN_WORD)
+    {
+        DEBUG("write single word (%08X)\n", pattern);
+
+        total_written = ops->write_memory(address, (ARC_Byte*) &pattern, 1);
+    }
+    /* Pathological case: bytes in middle of word.  */
+    else if (gap > 0 && gap + bytes < BYTES_IN_WORD)
+    {
+        DEBUG("write pathological\n");
+
+        total_written = write_partial_word(ops,
+                                           address - gap,   /* Word-aligned address.  */
+                                           ((ARC_Byte*) &pattern) + gap ,
+                                           bytes,
+                                           gap);
+    }
+    else /* General case.  */
+    {
+        Layout chunk = split(address, bytes);
+
+        if (chunk.leading_bytes > 0)
+        {
+            /* Write the first few bytes.  */
+            total_written = write_partial_word(ops,
+                                               address - gap,   /* Word-aligned address.   */
+                                               ((ARC_Byte*) &pattern) + gap ,
+                                               chunk.leading_bytes,
+                                               gap);
+
+            address += chunk.leading_bytes;
+        }
+
+        /* If we have been given a fill_memory operation.  */
+        if (ops->fill_memory)
+        {
+            /* Write the complete words of data in one go.  */
+            unsigned int bytes_written = ops->fill_memory(address, pattern, chunk.words);
+
+            total_written += bytes_written;
+            address       += bytes_written;
+        }
+        else
+        {
+            /* Write all the complete words of data, one word at a time.  */
+            while (chunk.words--)
+            {
+                unsigned int bytes_written = ops->write_memory(address, (ARC_Byte*) &pattern, 1);
+
+                total_written += bytes_written;
+                address       += bytes_written;
+            }
+        }
+
+        if (chunk.trailing_bytes > 0)
+        {
+            /* Write the last few bytes of data.  */
+            total_written += write_partial_word(ops,
+                                                address,    /* Word-aligned address.  */
+                                                ((ARC_Byte*) &pattern),
+                                                chunk.trailing_bytes,
+                                                0);
+        }
+    }
+
+    DEBUG("written %u bytes\n", total_written);
+
+    return total_written;
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-memory.h b/gdb/arc-memory.h
new file mode 100644
index 0000000..110d5cb
--- /dev/null
+++ b/gdb/arc-memory.h
@@ -0,0 +1,64 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines operations for reading data from, and writing */
+/*     data to, target memory.                                                */
+/*                                                                            */
+/*     The data transferred may be of any length, and its start address may   */
+/*     have any alignment.                                                    */
+/*                                                                            */
+/*     These operations must be supplied with more basic operations which can */
+/*     read or write an arbitrary number of complete words of data to or from */
+/*     word-aligned addresses.                                                */
+/*                                                                            */
+/*     Optionally, an operation which can write an arbitrary number of copies */
+/*     of a word-sized pattern to memory, starting at a word-aligned address, */
+/*     may be supplied for use by the arc_write_pattern operation; this is an */
+/*     optimisation for improving performance: if it is not supplied, the     */
+/*     arc_write_pattern operation will use repeated calls of the supplied    */
+/*     'write_words' operation.                                               */
+/*                                                                            */
+/*     A pointer to user-defined data may be passed to these operations: it   */
+/*     will be passed to the basic operations when they are invoked (this     */
+/*     allows any required context data to be passed to those operations).    */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_MEMORY
+#define ARC_MEMORY
+
+/* ARC header files */
+#include "arc-support.h"
+
+
+unsigned int arc_read_memory   (TargetOperations *ops, ARC_Address address, ARC_Byte *data,    unsigned int bytes);
+unsigned int arc_write_memory  (TargetOperations *ops, ARC_Address address, ARC_Byte *data,    unsigned int bytes);
+unsigned int arc_write_pattern (TargetOperations *ops, ARC_Address address, ARC_Word  pattern, unsigned int bytes);
+
+
+#endif /* ARC_MEMORY */
+/******************************************************************************/
diff --git a/gdb/arc-registers.c b/gdb/arc-registers.c
new file mode 100644
index 0000000..c0f7710
--- /dev/null
+++ b/gdb/arc-registers.c
@@ -0,0 +1,2566 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Author:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements operations for manipulating the ARC processor   */
+/*     core registers and auxiliary registers.                                */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "gdbcmd.h"
+#include "regcache.h"
+#include "objfiles.h"
+#include "inferior.h"
+#include "target.h"
+#include "xml-support.h"
+#include "gdb_assert.h"
+
+/* ARC header files */
+#include "arc-registers.h"
+#include "arc-architecture.h"
+#include "arc-tdep.h"
+#include "arc-elf32-tdep.h"
+#include "config/arc/tm-embed.h"
+
+/* ARC simulator header files */
+#include "sim/arc/arc-sim-registers.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef struct field_meaning
+{
+    char                *description;
+    ARC_RegisterContents value;
+} ARC_FieldMeaning;
+
+
+typedef struct field_definition
+{
+    char                *name;
+    char                *description;
+    unsigned int         offset;
+    unsigned int         size;
+    RegisterAccess       access;
+    ARC_RegisterContents value_for_write;
+    Boolean              fixed;
+    ARC_FieldMeaning    *meanings;
+    unsigned int         meaning_count;
+} ARC_FieldDefinition;
+
+
+/* Complete the type (declared in the header file) here.  */
+struct aux_register_definition
+{
+    char                *name;
+    char                *description;
+    ARC_RegisterNumber   number;    /* The number in the auxiliary register space.  */
+    int                  gdb_regno;
+    Boolean              is_BCR;
+    ARC_Word             mask;
+    RegisterAccess       access;
+    ARC_FieldDefinition *fields;
+    unsigned int         field_count;
+    unsigned int         longest_field_name;
+    unsigned int         max_bits_in_field;
+};
+
+
+/* An instance of this structure is used to pass state data
+   between the parsing routines.
+
+   The information is accumulated into the 'info' * field;
+   as each register or field description is parsed, the
+   information is held in the 'reg' or 'field' field before
+   validation is performed.  If the information is valid,
+   it is copied into the 'info' structure.  */
+typedef struct parsing_data
+{
+    const char                *filename;
+    ARC_RegisterInfo          *info;
+    ARC_AuxRegisterDefinition *currentRegister;
+    ARC_FieldDefinition       *currentField;
+    ARC_RegisterContents       maxFieldContents;
+    ARC_AuxRegisterDefinition  reg;
+    ARC_FieldDefinition        field;
+} ParsingData;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               forward declarations                         */
+/* -------------------------------------------------------------------------- */
+
+static gdb_xml_element_start_handler start_architecture;
+static gdb_xml_element_end_handler   end_architecture;
+static gdb_xml_element_start_handler start_feature;
+static gdb_xml_element_start_handler start_target;
+static gdb_xml_element_start_handler start_auxregister;
+static gdb_xml_element_start_handler start_bcr;
+static gdb_xml_element_start_handler start_ecr;
+static gdb_xml_element_start_handler start_field;
+static gdb_xml_element_start_handler start_bcrfield;
+static gdb_xml_element_start_handler start_meaning;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* This indicates whether a 'register architecture changed' event must be sent,
+   but has not yet been sent.  */
+Boolean arc_pending_register_architecture_change_event;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define REG_READ_FILE_COMMAND               "arc-reg-read-file"
+#define REG_READ_EXTRA_FILE_COMMAND         "arc-reg-read-extra-file"
+#define AUX_REG_READ_COMMAND                "arc-aux-read"
+#define AUX_REG_WRITE_COMMAND               "arc-aux-write"
+#define AUX_REG_SHOW_COMMAND                "arc-aux-show"
+#define AUX_LIST_REGISTER_COMMAND           "arc-aux-list"
+#define ARC_BCR_COMMAND                     "arc-bcr-registers"
+
+#define REG_READ_FILE_COMMAND_USAGE         "Usage: "      REG_READ_FILE_COMMAND       " <FILE>\n"
+#define REG_READ_EXTRA_FILE_COMMAND_USAGE   "Usage: "      REG_READ_EXTRA_FILE_COMMAND " <FILE>\n"
+#define AUX_REG_READ_COMMAND_USAGE          "Usage: "      AUX_REG_READ_COMMAND        " <REG-FROM> [ <REG-TO> ]\n"
+#define AUX_REG_WRITE_COMMAND_USAGE         "Usage: "      AUX_REG_WRITE_COMMAND       " <REG> = <VALUE>\n"
+#define AUX_REG_SHOW_COMMAND_USAGE          "Usage: "      AUX_REG_SHOW_COMMAND        " [ <REG> ] \n"
+#define AUX_LIST_REGISTER_COMMAND_USAGE     "Usage: "      AUX_LIST_REGISTER_COMMAND   " [ <REG> ]\n"
+#define ARC_BCR_COMMAND_USAGE               "Usage: info " ARC_BCR_COMMAND             "\n"
+
+
+#define ELEMENT_END_MARKER       { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
+#define ATTRIBUTE_END_MARKER     { NULL,             GDB_XML_AF_NONE, NULL, NULL }
+
+
+/* Special values for the name and description fields.  */
+static const char *NO_DESCRIPTION = "";
+static const char *RESERVED       = "<reserved>";
+static const char *UNUSED         = "<unused>";
+
+
+/* The elements and attributes of an XML target description.  */
+
+/* A handler_data for access values.  */
+
+static const struct gdb_xml_enum enums_access[] =
+{
+    { "RO", READ_ONLY  },
+    { "RW", READ_WRITE },
+    { "WO", WRITE_ONLY },
+    { NULL, 0          }
+};
+
+
+static const struct gdb_xml_attribute aux_register_attributes[] =
+{
+    { "name",         GDB_XML_AF_NONE,     NULL,                        NULL         },
+    { "description",  GDB_XML_AF_NONE,     NULL,                        NULL         },
+    { "number",       GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    { "mask",         GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    { "access",       GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_enum,     enums_access },
+    ATTRIBUTE_END_MARKER
+};
+
+
+static const struct gdb_xml_attribute core_register_attributes[] =
+{
+    { "number",       GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    { "mask",         GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    { "access",       GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_enum,     enums_access },
+    ATTRIBUTE_END_MARKER
+};
+
+
+static const struct gdb_xml_attribute field_attributes[] =
+{
+    { "name",         GDB_XML_AF_NONE,     NULL,                        NULL         },
+    { "description",  GDB_XML_AF_OPTIONAL, NULL,                        NULL         },
+    { "onwrite",      GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL         },
+    { "offset",       GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    { "size",         GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    { "access",       GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_enum,     enums_access },
+    ATTRIBUTE_END_MARKER
+};
+
+
+static const struct gdb_xml_attribute bcrfield_attributes[] =
+{
+    { "name",         GDB_XML_AF_NONE,     NULL,                        NULL         },
+    { "description",  GDB_XML_AF_OPTIONAL, NULL,                        NULL         },
+    { "offset",       GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    { "size",         GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    ATTRIBUTE_END_MARKER
+};
+
+
+static const struct gdb_xml_attribute meaning_attributes[] =
+{
+    { "description",  GDB_XML_AF_NONE,     NULL,                        NULL         },
+    { "value",        GDB_XML_AF_NONE,     gdb_xml_parse_attr_ulongest, NULL         },
+    ATTRIBUTE_END_MARKER
+};
+
+
+static const struct gdb_xml_attribute feature_attributes[] =
+{
+    { "name", GDB_XML_AF_NONE, NULL, NULL },
+    ATTRIBUTE_END_MARKER
+};
+
+
+static const struct gdb_xml_element field_children[] =
+{
+    { "meaning", meaning_attributes, NULL, GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE, start_meaning, NULL },
+    ELEMENT_END_MARKER
+};
+
+
+static const struct gdb_xml_element auxregister_children[] =
+{
+    { "field", field_attributes, field_children, GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE, start_field, NULL },
+    ELEMENT_END_MARKER
+};
+
+
+static const struct gdb_xml_element bcr_children[] =
+{
+    { "bcrfield", bcrfield_attributes, NULL, GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE, start_bcrfield, NULL },
+    ELEMENT_END_MARKER
+};
+
+
+static const struct gdb_xml_element feature_children[] =
+{
+    { "auxregister", aux_register_attributes,  auxregister_children, GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE, start_auxregister, NULL },
+    { "bcr",         aux_register_attributes,  bcr_children,         GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE, start_bcr,         NULL },
+    { "ecr",         core_register_attributes, NULL,                 GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE, start_ecr,         NULL },
+    ELEMENT_END_MARKER
+};
+
+
+static const struct gdb_xml_attribute target_attributes[] =
+{
+    { "version", GDB_XML_AF_NONE, NULL, NULL },
+    ATTRIBUTE_END_MARKER
+};
+
+
+static const struct gdb_xml_element target_children[] =
+{
+    { "architecture", NULL, NULL, GDB_XML_EF_OPTIONAL, start_architecture, end_architecture },
+    { "feature",      feature_attributes, feature_children,
+                      GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
+                      start_feature, NULL },
+    ELEMENT_END_MARKER
+};
+
+
+static const struct gdb_xml_element elements[] =
+{
+    { "target", target_attributes, target_children, GDB_XML_EF_NONE, start_target, NULL },
+    ELEMENT_END_MARKER
+};
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define NAME_IS(ident)    (strcmp(name, ident) == 0)
+
+#define INFO_OF(gdbarch)  &gdbarch_tdep (gdbarch)->processor_variant_info->registers
+
+#define EXTRACT(argument, type, result)                                    \
+{                                                                          \
+    struct expression *expr  = parse_expression(argument);                 \
+    struct value      *val   = evaluate_expression(expr);                  \
+    struct cleanup    *chain = make_cleanup(free_current_contents, &expr); \
+                                                                           \
+    result = *(type*) (value_contents (val));                              \
+    do_cleanups (chain);                                                   \
+}
+
+#define FIND_REGISTER_DEFINITION_SUCH_THAT(condition)             \
+{                                                                 \
+    ARC_RegisterInfo *info = find_info(TRUE);                     \
+    unsigned int      i;                                          \
+                                                                  \
+    for (i = 0; i < info->aux_register_count; i++)                \
+    {                                                             \
+        ARC_AuxRegisterDefinition *def = &info->aux_registers[i]; \
+                                                                  \
+        if (condition)                                            \
+            return def;                                           \
+    }                                                             \
+                                                                  \
+    return NULL;                                                  \
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                     local functions for XML file parsing                   */
+/* -------------------------------------------------------------------------- */
+
+/* Return a string corresponding to the given access.  */
+
+static const char*
+RegisterAccess_Image (RegisterAccess val)
+{
+    switch (val)
+    {
+        case READ_ONLY : return "read-only";
+        case READ_WRITE: return "read/write";
+        case WRITE_ONLY: return "write-only";
+        default        : return "???";
+    }
+}
+
+
+static void
+initialize_register (ARC_AuxRegisterDefinition *reg)
+{
+    reg->name               = NULL;
+    reg->number             = 0;
+    reg->gdb_regno          = 0;
+    reg->is_BCR             = FALSE;
+    reg->description        = (char*) NO_DESCRIPTION;
+    reg->mask               = 0xFFFFFFFF;
+    reg->access             = READ_WRITE;
+    reg->field_count        = 0;
+    reg->fields             = NULL;
+    reg->longest_field_name = 0;
+    reg->max_bits_in_field  = 0;
+}
+
+
+static void
+initialize_field (ARC_FieldDefinition *field, RegisterAccess access)
+{
+    field->name            = NULL;
+    field->description     = (char*) NO_DESCRIPTION;
+    field->value_for_write = 0;
+    field->fixed           = FALSE;
+    field->size            = 1;
+    field->offset          = 0;
+    field->access          = access;
+    field->meanings        = NULL;
+    field->meaning_count   = 0;
+}
+
+
+static void
+initialize_meaning (ARC_FieldMeaning *meaning)
+{
+    meaning->description = (char*) NO_DESCRIPTION;
+    meaning->value       = 0;
+}
+
+
+/* Return TRUE if the given register fields overlap within the register.  */
+
+static Boolean
+overlaps(ARC_FieldDefinition *field1, ARC_FieldDefinition *field2)
+{
+    unsigned int field1_start = field1->offset;
+    unsigned int field1_end   = field1_start + field1->size - 1;
+    unsigned int field2_start = field2->offset;
+    unsigned int field2_end   = field2_start + field2->size - 1;
+
+    return !(field2_end < field1_start || field1_end < field2_start);
+}
+
+
+/* Release all the storage allocated to hold the given register information,
+   and re-initialize it.   */
+
+static void
+free_register_set (ARC_RegisterInfo *info)
+{
+    if (info->aux_registers)
+    {
+        unsigned int i;
+
+        for (i = 0; i < info->aux_register_count; i++)
+        {
+            ARC_AuxRegisterDefinition *r = &info->aux_registers[i];
+
+            if (r->name != UNUSED)
+                xfree (r->name);
+            if (r->description != NO_DESCRIPTION)
+                xfree (r->description);
+
+            if (r->fields)
+            {
+                unsigned int j;
+
+                for (j = 0; j < r->field_count; j++)
+                {
+                    ARC_FieldDefinition *f = &r->fields[j];
+
+                    if (f->name != RESERVED)
+                        xfree (f->name);
+
+                    if (f->description != NO_DESCRIPTION)
+                        xfree (f->description);
+
+                    if (f->meanings)
+                    {
+                        unsigned int k;
+
+                        for (k = 0; k < f->meaning_count; k++)
+                        {
+                            ARC_FieldMeaning *m = &f->meanings[k];
+
+                            if (m->description != NO_DESCRIPTION)
+                                xfree (m->description);
+                        }
+
+                        xfree(f->meanings);
+                    }
+                }
+            }
+
+            xfree(r->fields);
+        }
+
+        xfree(info->aux_registers);
+
+        arc_initialize_aux_reg_info(info);
+    }
+}
+
+
+/* This function reads the contents of a file.
+
+   Parameters:
+      filename : the name of the file to be accessed
+      baton    : the path to the directory containing the file
+
+   Result:
+      If the file contents were successfully read, a pointer to a buffer
+      containing those contents; otherwise NULL.  */
+
+static char*
+read_file_contents (const char *filename, void *baton)
+{
+    char       *name     = (char*) filename;
+    const char *dirname  = baton;
+    char       *contents = NULL;
+    int         fd;
+
+    if ((dirname != NULL) && (*dirname != '\0'))
+    {
+        name = concat (dirname, "/", filename, NULL);
+
+        if (name == NULL)
+        {
+            /* N.B. this does not return */
+            nomem (0);
+        }
+    }
+
+    if ((fd = open (name, O_RDONLY)) != -1)
+    {
+        struct stat stat;
+        int         status;
+
+        if ((status = fstat(fd, &stat)) != -1)
+        {
+            size_t size = (size_t) stat.st_size;
+
+            /* Allocate buffer to hold the file contents; note that this space
+               is deliberately made larger than required, so that it is possible
+               to add extra characters to the end of the data.  */
+            if ((contents = xmalloc (size + 10)))
+            {
+                ssize_t bytes;
+
+                if ((bytes = read (fd, contents, size)) == (ssize_t) size)
+                {
+                    /* Append an explicit end-of-line to the data, in case there
+                       was not one there already; also, explicitly NUL-terminate
+                       the data so that it is a valid string.  */
+                    contents[bytes]     = '\n';
+                    contents[bytes + 1] = '\0';
+                }
+                else
+                {
+                    warning (_("can not read contents of file '%s': %s"),
+                             name, strerror (errno));
+
+                    /* Cannot trust the contents of the buffer.  */
+                    xfree (contents);
+                    contents = NULL;
+                }
+
+                if ((status = close (fd)) != 0)
+                    warning (_("can not close file '%s': %s"), name,
+                             strerror (errno));
+            }
+            else
+                warning (_("can not allocate buffer to hold contents of file '%s'"), name);
+        }
+        else
+            warning (_("can not get size of file '%s': %s"), name,
+                     strerror (errno));
+    }
+    else
+        warning (_("can not open file '%s': %s"), name, strerror (errno));
+
+    if (name != filename)
+        xfree (name);
+
+    return contents;
+}
+
+
+/* This function is called by the XML parser when the start of a <target> element is seen.  */
+
+static void
+start_target (struct gdb_xml_parser        *parser,
+              const struct gdb_xml_element *element,
+              void                         *user_data,
+              VEC(gdb_xml_value_s)         *attributes)
+{
+//  ParsingData* data = user_data;
+    char *version = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+
+    if (strcmp (version, "1.0") != 0)
+        gdb_xml_error (parser,
+                       _("Registers description has unsupported version \"%s\""),
+                       version);
+
+    DEBUG("target started\n");
+}
+
+
+/* This function is called by the XML parser when the start of an <architecture> element is seen.  */
+
+static void
+start_architecture (struct gdb_xml_parser        *parser,
+                    const struct gdb_xml_element *element,
+                    void                         *user_data,
+                    VEC(gdb_xml_value_s)         *attributes)
+{
+    DEBUG("architecture started\n");
+}
+
+
+/* This function is called by the XML parser when the end of an <architecture> element is seen.  */
+
+static void
+end_architecture (struct gdb_xml_parser        *parser,
+                  const struct gdb_xml_element *element,
+                  void                         *user_data,
+                  const char                   *body_text)
+{
+    ParsingData *data = user_data;
+
+    if (body_text[0] != '\0')
+    {
+        data->info->processor = arc_version(body_text);
+
+        if (data->info->processor == UNSUPPORTED_ARCHITECTURE)
+            warning(_("unknown target architecture '%s' in XML file '%s'\n"),
+                    body_text, data->filename);
+    }
+}
+
+
+/* This function is called by the XML parser when the start of a <feature> element is seen.  */
+
+static void
+start_feature (struct gdb_xml_parser        *parser,
+               const struct gdb_xml_element *element,
+               void                         *user_data,
+               VEC(gdb_xml_value_s)         *attributes)
+{
+    DEBUG("feature started\n");
+}
+
+
+/* This function checks the XML description of an auxiliary register for
+   correctness, and if it is correct, adds a definition of this register to the
+   register information that is currently being constructed.
+
+   Parameters:
+      parser    : the XML parser being used
+      element   : a pointer to the parse structure
+      user_data : a pointer to the parsing data
+      attributes: a vector containing the attributes of the register from the XML
+      is_BCR    : TRUE if the register is a Build Configuration Register
+  */
+
+static void
+add_aux_register (struct gdb_xml_parser        *parser,
+                  const struct gdb_xml_element *element,
+                  void                         *user_data,
+                  VEC(gdb_xml_value_s)         *attributes,
+                  Boolean                       is_BCR)
+{
+    ParsingData               *data   = user_data;
+    ARC_RegisterInfo          *info   = data->info;
+    ARC_AuxRegisterDefinition *reg    = &data->reg;
+    struct gdb_xml_value      *attrs  = VEC_address (gdb_xml_value_s, attributes);
+    unsigned int               length = VEC_length  (gdb_xml_value_s, attributes);
+    unsigned int               i;
+    Boolean                    add    = TRUE;
+
+    initialize_register(reg);
+
+    /* Look at all the register attributes.  */
+    for (i = 0; i < length; i++)
+    {
+        const char *name  = attrs[i].name;
+        void       *value = attrs[i].value;
+
+        if      (NAME_IS("name"))        reg->name        = value;
+        else if (NAME_IS("description")) reg->description = xstrdup(value);
+        else if (NAME_IS("number"))      reg->number      = (ARC_RegisterNumber) *(ULONGEST*) value;
+        else if (NAME_IS("mask"))        reg->mask        = (ARC_Word)           *(ULONGEST*) value;
+        else if (NAME_IS("access"))      reg->access      = (RegisterAccess)     *(ULONGEST*) value;
+    }
+
+    if (strcasecmp(reg->name, "unused") == 0)
+        reg->name = (char*) UNUSED;
+    else
+        reg->name = xstrdup (reg->name);
+
+    if (is_BCR)
+    {
+        reg->is_BCR = is_BCR;
+        reg->access = READ_ONLY;
+    }
+
+    /* Sanity checking.  */
+    for (i = 0; i < info->aux_register_count; i++)
+    {
+        if (reg->name != UNUSED)
+            if (strcasecmp(reg->name, info->aux_registers[i].name) == 0)
+            {
+                warning(_("auxiliary register with name '%s' already defined in file %s"),
+                        reg->name, data->filename);
+                add = FALSE;
+            }
+
+        if (reg->number == info->aux_registers[i].number)
+        {
+            warning(_("auxiliary register with number %u already defined in file %s"),
+                    reg->number, data->filename);
+            add = FALSE;
+        }
+    }
+
+    if (add)
+    {
+        unsigned int name_length = (unsigned int) strlen(reg->name);
+
+        if (name_length > info->max_name_length)
+            info->max_name_length = name_length;
+
+        info->aux_register_count++;
+        info->aux_registers = xrealloc(info->aux_registers,
+                                       info->aux_register_count * sizeof(ARC_AuxRegisterDefinition));
+
+        if (info->aux_registers == NULL)
+        {
+            /* N.B. this does not return.  */
+            nomem (0);
+        }
+
+        /* Copy the register description into the array, and make it the current
+           register that will be referred to when parsing any fields.  */
+        data->currentRegister = &info->aux_registers[info->aux_register_count - 1];
+        *data->currentRegister = *reg;
+    }
+    else
+        /* Do not copy it into the array, but still make it the current register.  */
+        data->currentRegister = reg;
+}
+
+
+/* This function is called by the XML parser when the start of a <auxregister> element is seen.  */
+
+static void
+start_auxregister (struct gdb_xml_parser        *parser,
+                   const struct gdb_xml_element *element,
+                   void                         *user_data,
+                   VEC(gdb_xml_value_s)         *attributes)
+{
+    add_aux_register(parser, element, user_data, attributes, FALSE);
+}
+
+
+/* This function is called by the XML parser when the start of a <bcr> element is seen.  */
+
+static void
+start_bcr (struct gdb_xml_parser        *parser,
+           const struct gdb_xml_element *element,
+           void                         *user_data,
+           VEC(gdb_xml_value_s)         *attributes)
+{
+    add_aux_register(parser, element, user_data, attributes, TRUE);
+}
+
+
+/* This function is called by the XML parser when the start of a <ecr> element
+   is seen.  It checks the XML description of an extension core register for
+   correctness, and if it is correct, adds a definition of this register to the
+   register information that is currently being constructed.
+
+   Parameters:
+      parser    : the XML parser being used
+      element   : a pointer to the parse structure
+      user_data : a pointer to the parsing data
+      attributes: a vector containing the attributes of the register from the XML
+  */
+
+static void
+start_ecr (struct gdb_xml_parser        *parser,
+           const struct gdb_xml_element *element,
+           void                         *user_data,
+           VEC(gdb_xml_value_s)         *attributes)
+{
+    ParsingData          *data   = user_data;
+    ARC_RegisterInfo     *info   = data->info;
+    struct gdb_xml_value *attrs  = VEC_address (gdb_xml_value_s, attributes);
+    unsigned int          length = VEC_length  (gdb_xml_value_s, attributes);
+    ARC_RegisterNumber    number = 0;
+    ARC_Word              mask   = 0xFFFFFFFF;
+    RegisterAccess        access = READ_WRITE;
+    unsigned int          i;
+
+    /* Look at all the register attributes.  */
+    for (i = 0; i < length; i++)
+    {
+        const char *name  = attrs[i].name;
+        void       *value = attrs[i].value;
+
+        if      (NAME_IS("number")) number = (ARC_RegisterNumber) *(ULONGEST*) value;
+        else if (NAME_IS("mask"))   mask   = (ARC_Word)           *(ULONGEST*) value;
+        else if (NAME_IS("access")) access = (RegisterAccess)     *(ULONGEST*) value;
+    }
+
+    /* Sanity checking.  */
+    if (IS_EXTENSION_CORE_REGISTER(number))
+    {
+        ARC_CoreRegisterDefinition *reg = &info->core_registers[number];
+
+        if (reg->exists)
+        {
+            warning(_("extension core register with number %d already defined in file %s"),
+                    number, data->filename);
+        }
+        else
+        {
+            reg->mask   = mask;
+            reg->access = access;
+            reg->exists = TRUE;
+        }
+    }
+    else
+        warning(_("extension core register with invalid number %d defined in file %s"),
+                number, data->filename);
+}
+
+
+/* This function checks the XML description of an auxiliary register field for
+   correctness, and if it is correct, adds a definition of this field to the
+   register information that is currently being constructed.
+
+   Parameters:
+      parser    : the XML parser being used
+      element   : a pointer to the parse structure
+      user_data : a pointer to the parsing data
+      attributes: a vector containing the attributes of the field from the XML
+      is_BCR    : TRUE if the field is part of a Build Configuration Register
+  */
+
+static void
+add_field (struct gdb_xml_parser        *parser,
+           const struct gdb_xml_element *element,
+           void                         *user_data,
+           VEC(gdb_xml_value_s)         *attributes,
+           Boolean                       is_BCR)
+{
+    ParsingData               *data   = user_data;
+    ARC_AuxRegisterDefinition *reg    = data->currentRegister;
+    ARC_FieldDefinition       *field  = &data->field;
+    struct gdb_xml_value      *attrs  = VEC_address (gdb_xml_value_s, attributes);
+    unsigned int               length = VEC_length  (gdb_xml_value_s, attributes);
+    unsigned int               i;
+    Boolean                    add    = TRUE;
+
+    /* By default, a field has the same access as the register that contains it
+       (though a particular field in a R/W register might be R/O or W/O).  */
+    initialize_field(field, reg->access);
+
+    /* Look at all the field attributes.  */
+    for (i = 0; i < length; i++)
+    {
+        const char *name  = attrs[i].name;
+        void       *value = attrs[i].value;
+
+        if      (NAME_IS("name"))        field->name            = value;
+        else if (NAME_IS("description")) field->description     = xstrdup(value);
+        else if (NAME_IS("offset"))      field->offset          = (unsigned int)         *(ULONGEST*) value;
+        else if (NAME_IS("size"))        field->size            = (unsigned int)         *(ULONGEST*) value;
+        else if (NAME_IS("access"))      field->access          = (RegisterAccess)       *(ULONGEST*) value;
+        else if (NAME_IS("onwrite"))  {  field->value_for_write = (ARC_RegisterContents) *(ULONGEST*) value;
+                                         field->fixed = TRUE; }
+    }
+
+    if (strcasecmp(field->name, "reserved") == 0)
+        field->name = (char*) RESERVED;
+    else
+        field->name = xstrdup (field->name);
+
+    /* Sanity checking.  */
+    if (is_BCR)
+    {
+        /* BCRs are, by definition, read-only.  */
+        field->access = READ_ONLY;
+    }
+    else
+    {
+        if (field->access != WRITE_ONLY && reg->access == WRITE_ONLY)
+        {
+            warning (_("field '%s' is readable in write-only auxiliary register '%s' in file %s"),
+                     field->name, reg->name, data->filename);
+            add = FALSE;
+        }
+        else if (field->access != READ_ONLY && reg->access == READ_ONLY)
+        {
+            warning (_("field '%s' is writable in read-only auxiliary register '%s' in file %s"),
+                     field->name, reg->name, data->filename);
+            add = FALSE;
+        }
+    }
+
+    if (field->size == 0)
+    {
+        warning(_("field '%s' contains no bits in auxiliary register '%s' in file %s"),
+                field->name, reg->name, data->filename);
+        add = FALSE;
+    }
+
+    if (field->offset > BITS_IN_REGISTER - 1)
+    {
+        warning(_("field '%s' offset > %u in auxiliary register '%s' in file %s"),
+                field->name, BITS_IN_REGISTER - 1, reg->name, data->filename);
+        add = FALSE;
+    }
+
+    if (field->offset + field->size > BITS_IN_REGISTER)
+    {
+        warning(_("field '%s' is too wide in auxiliary register '%s' in file %s"),
+                field->name, reg->name, data->filename);
+        add = FALSE;
+    }
+
+    for (i = 0; i < reg->field_count; i++)
+    {
+        ARC_FieldDefinition *f = &reg->fields[i];
+
+        if (field->name != RESERVED)
+            if (strcasecmp(field->name, f->name) == 0)
+            {
+                warning(_("field '%s' already defined in auxiliary register '%s' in file %s"),
+                        field->name, reg->name, data->filename);
+                add = FALSE;
+            }
+
+        if (overlaps(field, f))
+        {
+            warning(_("field '%s' overlaps field '%s' in auxiliary register '%s' in file %s"),
+                    field->name, f->name, reg->name, data->filename);
+            add = FALSE;
+        }
+    }
+
+    data->maxFieldContents = 0;
+
+    for (i = 0; i < field->size; i++)
+        data->maxFieldContents = (data->maxFieldContents << 1) + 1;
+
+    if (field->value_for_write > data->maxFieldContents)
+    {
+        warning(_("value on write %u is too large for %u-bit reserved field in auxiliary register '%s' in file %s"),
+                field->value_for_write, field->size, reg->name, data->filename);
+        add = FALSE;
+    }
+
+    if (add)
+    {
+        /* Keep track of the longest field name, and the most number of bits in a field.  */
+        unsigned int len = (unsigned int) strlen(field->name);
+
+        if (len > reg->longest_field_name)
+            reg->longest_field_name = len;
+
+        if (field->size > reg->max_bits_in_field)
+            reg->max_bits_in_field = field->size;
+
+        reg->field_count++;
+        reg->fields = xrealloc(reg->fields,
+                               reg->field_count * sizeof(ARC_FieldDefinition));
+
+        if (reg->fields == NULL)
+        {
+            /* N.B. this does not return.  */
+            nomem (0);
+        }
+
+        /* Copy the field description into the array, and make it the current
+           field that will be referred to when parsing any meanings.  */
+        data->currentField = &reg->fields[reg->field_count - 1];
+        *data->currentField = *field;
+    }
+    else
+        /* Do not copy it into the array, but still make it the current field.  */
+        data->currentField = field;
+}
+
+
+/* This function is called by the XML parser when the start of a <field> element is seen.  */
+
+static void
+start_field (struct gdb_xml_parser        *parser,
+             const struct gdb_xml_element *element,
+             void                         *user_data,
+             VEC(gdb_xml_value_s)         *attributes)
+{
+    add_field(parser, element, user_data, attributes, FALSE);
+}
+
+
+/* This function is called by the XML parser when the start of a <bcrfield> element is seen.  */
+
+static void
+start_bcrfield (struct gdb_xml_parser        *parser,
+                const struct gdb_xml_element *element,
+                void                         *user_data,
+                VEC(gdb_xml_value_s)         *attributes)
+{
+    add_field(parser, element, user_data, attributes, TRUE);
+}
+
+
+/* This function is called by the XML parser when the start of a <meaning>
+   element is seen.  It checks the XML description of the meaning for
+   correctness, and if it is correct, adds a definition of this meaning to the
+   register information that is currently being constructed.
+
+   Parameters:
+      parser    : the XML parser being used
+      element   : a pointer to the parse structure
+      user_data : a pointer to the parsing data
+      attributes: a vector containing the attributes of the meaning from the XML
+  */
+
+static void
+start_meaning (struct gdb_xml_parser        *parser,
+               const struct gdb_xml_element *element,
+               void                         *user_data,
+               VEC(gdb_xml_value_s)         *attributes)
+{
+    ParsingData               *data   = user_data;
+    ARC_AuxRegisterDefinition *reg    = data->currentRegister;
+    ARC_FieldDefinition       *field  = data->currentField;
+    ARC_FieldMeaning           meaning;
+    struct gdb_xml_value      *attrs  = VEC_address (gdb_xml_value_s, attributes);
+    unsigned int               length = VEC_length  (gdb_xml_value_s, attributes);
+    unsigned int               i;
+    Boolean                    add    = TRUE;
+
+    initialize_meaning(&meaning);
+
+    /* Look at all the meaning attributes.  */
+    for (i = 0; i < length; i++)
+    {
+        const char *name  = attrs[i].name;
+        void       *value = attrs[i].value;
+
+        if      (NAME_IS("description")) meaning.description = xstrdup(value);
+        else if (NAME_IS("value"))       meaning.value       = (ARC_RegisterContents) *(ULONGEST*) value;
+    }
+
+    if (meaning.value > data->maxFieldContents)
+    {
+        warning(_("value %u is too large for field '%s' in auxiliary register '%s' in file %s"),
+                meaning.value, field->name, reg->name, data->filename);
+        add = FALSE;
+    }
+
+    /* Sanity checking.  */
+    for (i = 0; i < field->meaning_count; i++)
+    {
+        ARC_FieldMeaning *m = &field->meanings[i];
+
+        if (strcmp(meaning.description, m->description) == 0)
+        {
+            warning(_("meaning '%s' already defined for field '%s' in auxiliary register '%s' in file %s"),
+                    meaning.description, field->name, reg->name, data->filename);
+            add = FALSE;
+        }
+
+        if (meaning.value == m->value)
+        {
+            warning(_("value %u already has meaning for field '%s' in auxiliary register '%s' in file %s"),
+                    meaning.value, field->name, reg->name, data->filename);
+            add = FALSE;
+        }
+    }
+
+    if (add)
+    {
+        field->meaning_count++;
+        field->meanings = xrealloc(field->meanings,
+                                   field->meaning_count * sizeof(ARC_FieldMeaning));
+
+        if (field->meanings == NULL)
+        {
+            /* N.B. this does not return.  */
+            nomem (0);
+        }
+
+        field->meanings[field->meaning_count - 1] = meaning;
+    }
+}
+
+
+/* This function is passed to qsort to sort the auxiliary registers into a
+   canonical order such that BCRs come after the non-BCR aux registers, but
+   otherwise, the registers are ordered by increasing number, with the
+   exception that the IDENTITY register must come first.   */
+
+static int
+compare_auxiliary_registers(const void *p1, const void *p2)
+{
+    ARC_AuxRegisterDefinition* reg1 = (ARC_AuxRegisterDefinition*) p1;
+    ARC_AuxRegisterDefinition* reg2 = (ARC_AuxRegisterDefinition*) p2;
+
+    if (reg1->is_BCR && !reg2->is_BCR)
+        return 1;
+
+    if (!reg1->is_BCR && reg2->is_BCR)
+        return -1;
+
+    if (!reg1->is_BCR && !reg2->is_BCR)
+    {
+        if (strcmp(reg1->name, "IDENTITY") == 0)
+            return -1;
+        if (strcmp(reg2->name, "IDENTITY") == 0)
+            return 1;
+    }
+
+    return (reg1->number < reg2->number) ? -1 : 1;
+}
+
+
+/* This function assigns the gdb register numbers to the target processor's
+   registers, using the scheme defined in arc-elf32-tdep.c.  */
+
+static void
+assign_gdb_register_numbers (struct gdbarch *gdbarch, ARC_RegisterInfo *info)
+{
+    unsigned int i;
+    int          pc = -1;
+
+    /* Core registers first.  */
+    for (i = 0; i < ELEMENTS_IN_ARRAY(info->core_registers); i++)
+    {
+        ARC_CoreRegisterDefinition *reg = &info->core_registers[i];
+
+        /* If this core register exists in the target, we have one more core
+           register in total; and the gdb number of this register is that number
+           less 1.  */
+        if (reg->exists)
+            reg->gdb_regno = (int) info->core_register_count++;
+    }
+
+    info->first_aux_gdb_regno = (int) info->core_register_count;
+
+    /* Then the auxiliary registers. */
+    for (i = 0; i < info->aux_register_count; i++)
+    {
+        ARC_AuxRegisterDefinition *reg = &info->aux_registers[i];
+
+        reg->gdb_regno = info->first_aux_gdb_regno + i;
+
+        /* Is this the PC?  */
+        if (strcasecmp(reg->name, "PC") == 0)
+        {
+            pc = reg->gdb_regno;
+            info->PC_number = pc;
+        }
+    }
+
+    /* We must tell gdb that the total number of registers has changed.  */
+    set_gdbarch_num_regs (gdbarch, (int) (info->core_register_count +
+                                          info->aux_register_count));
+
+    /* The file may have contained a description of the PC, so we must tell gdb
+       what its number is.
+       N.B. if the 'replace' parameter to read_XML_file was true and the file
+            did NOT contain a description of the PC, we now no longer know which
+            auxiliary register is the PC, so we must set gdb's PC number back to
+            -1!  */
+    set_gdbarch_pc_regnum(gdbarch, pc);
+
+    if (pc >= 0)
+    {
+        DEBUG("PC is reg #%d (arch %p)\n", pc, gdbarch);
+
+        /* So PC is defined - so remove the guard.  */
+        arc_aux_pc_guard(gdbarch, FALSE);
+    }
+}
+
+
+/* Parse the XML file containing the register definitions.
+
+   Parameters:
+      document      : the XML document to be parsed (i.e. the XML text)
+      fetcher       : a function which can be used to read an XML document from a file
+      fetcher_baton : the directory containing the XML file(s)
+      data          : a pointer to a structure used to pass state data
+                      between the parsing routines.  */
+
+static void
+parse_XML (const char          *document,
+           xml_fetch_another    fetcher,
+           void                *fetcher_baton,
+           ParsingData         *data)
+
+{
+    struct cleanup        *back_to;
+    struct gdb_xml_parser *parser;
+    char                  *expanded_text;
+
+    /* Expand all XInclude directives.  */
+    expanded_text = xml_process_xincludes (_("aux registers description"),
+                                           document, fetcher, fetcher_baton, 0);
+    if (expanded_text == NULL)
+    {
+        warning (_("can not load XML auxiliary registers description"));
+        return;
+    }
+
+    back_to = make_cleanup (null_cleanup, NULL);
+    parser = gdb_xml_create_parser_and_cleanup (_("aux registers description"),
+                                                elements, data);
+
+    /* Do the parsing; the DTD file defines the schema to be used by the XML.  */
+    gdb_xml_use_dtd (parser, "arc-registers.dtd");
+
+    (void) make_cleanup (xfree, expanded_text);
+
+    if (gdb_xml_parse (parser, expanded_text) != 0)
+        warning (_("can not load XML auxiliary registers description"));
+
+    do_cleanups (back_to);
+}
+
+
+/* Read an XML file containing the register definitions.
+
+   Parameters:
+      filename : the path to the file
+      gdbarch  : the architecture for which the register set is are being defined
+      replace  : TRUE if any existing set of register defintions should be deleted first
+      inform   : TRUE if a message should be output say that the file has been read
+      check    : TRUE if an architectural check is to be performed once the file has been read
+
+   Result: TRUE if the file was successfully read and its contents parsed.  */
+
+static Boolean
+read_XML_file (const char     *filename,
+               struct gdbarch *gdbarch,
+               Boolean         replace,
+               Boolean         inform,
+               Boolean         check)
+{
+    char *xml = read_file_contents(filename, NULL);
+
+    DEBUG("reading XML file: %s\n", filename);
+
+    if (xml)
+    {
+        ARC_RegisterInfo *info    = INFO_OF(gdbarch);
+        struct cleanup   *back_to = make_cleanup (xfree, xml);
+        char             *dirname = ldirname (filename);
+        ParsingData       data;
+
+        memset (&data, 0, sizeof (ParsingData));
+
+        if (replace)
+            free_register_set(info);
+
+        info->processor = NO_ARCHITECTURE;
+
+        data.info     = info;
+        data.filename = filename;
+
+        if (dirname != NULL)
+            (void) make_cleanup (xfree, dirname);
+
+        parse_XML (xml, read_file_contents, dirname, &data);
+        do_cleanups (back_to);
+
+        if (inform)
+            printf_filtered(_("Register definitions read from file %s\n"), filename);
+
+        if (check)
+            ARCHITECTURE_CHECK(gdbarch,
+                               (current_objfile) ? current_objfile->obfd : NULL);
+
+        /* Sort the auxiliary registers into a canonical order: this allows
+           entries in the XML file to be in any order without affecting the gdb
+           register numbers assigned to them; in particular, it aids in ensuring
+           that when the xISS is being used as a remote debug target gdb and the
+           xISS agree upon the order in which register contents are held in the
+           RSP 'G' (set all registers) packet and the 'g' (get all registers)
+           response packet.  */
+        qsort(info->aux_registers,
+              (size_t) info->aux_register_count,
+              sizeof (ARC_AuxRegisterDefinition),
+              compare_auxiliary_registers);
+
+        /* Now that we know all of the core and auxiliary registers in this
+           target, we can assign gdb register numbers to them.  */
+        assign_gdb_register_numbers(gdbarch, info);
+
+        /* We can send the event now only if current_gdbarch is not NULL, or
+           it could cause an error elsewhere where gdbarch_num_regs or
+           gdbarch_num_pseudo_regs is used (e.g. in setup_architecture_data in
+           gdbtk/generic/gdbtk-register.c).  */
+        if (current_gdbarch == NULL)
+            arc_pending_register_architecture_change_event = TRUE;
+        else
+            reg_architecture_changed_event();
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/* Try to find a file containing the default AUX register definitions; look in
+      1) the current working directory
+      2) the user's home directory
+
+   Parameters:
+      gdbarch  : the architecture for which the register set is are being defined
+      inform   : TRUE if a message should be output say that the file has been read
+      check    : TRUE if an architectural check is to be performed once the file has been read
+*/
+
+static void
+read_default_file (struct gdbarch *gdbarch, Boolean inform, Boolean check)
+{
+    ENTERARGS("inform = %d, check = %d", inform, check);
+
+#define DESCR  "auxiliary registers definition file "
+
+    if (access(REGISTER_DEFINITION_FILE, F_OK) == 0)
+    {
+        if (!read_XML_file(REGISTER_DEFINITION_FILE, gdbarch, FALSE, inform, check))
+            error(_("Can not read " DESCR REGISTER_DEFINITION_FILE));
+    }
+    else
+    {
+        const char *home_dir = getenv ("HOME");
+
+        if (home_dir)
+        {
+            char *home_file = xstrprintf (_("%s/%s"), home_dir, REGISTER_DEFINITION_FILE);
+
+            if (access(home_file, F_OK) == 0)
+            {
+                if (!read_XML_file(home_file, gdbarch, FALSE, inform, check))
+                    error(_("Can not read " DESCR " %s"), home_file);
+            }
+            else
+                warning(_("can not find " DESCR REGISTER_DEFINITION_FILE " in either current directory or $HOME"));
+
+            xfree (home_file);
+        }
+        else
+            warning(_("HOME environment variable is not set - can not find " DESCR REGISTER_DEFINITION_FILE));
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                         miscellaneous local functions                      */
+/* -------------------------------------------------------------------------- */
+
+/* This is a callback which is called from gdb when it writes the PC.
+   It is used to "guard" the PC.  */
+
+static CORE_ADDR
+get_pc (struct regcache *regcache)
+{
+    struct gdbarch *gdbarch = get_regcache_arch (regcache);
+
+    /* This does not return if PC is not defined.  */
+    arc_aux_check_pc_defined(gdbarch);
+
+    /* So PC is defined - so remove the guard.  */
+    arc_aux_pc_guard(gdbarch, FALSE);
+
+    /* Now read and return the PC.  */
+    return read_pc();
+}
+
+
+/* This is a callback which is called from gdb when it reads the PC.
+   It is used to "guard" the PC.  */
+
+static void
+set_pc (struct regcache *regcache, CORE_ADDR val)
+{
+    struct gdbarch *gdbarch = get_regcache_arch (regcache);
+
+    /* This does not return if PC is not defined.  */
+    arc_aux_check_pc_defined(gdbarch);
+
+    /* So PC is defined - so remove the guard.  */
+    arc_aux_pc_guard(gdbarch, FALSE);
+
+    write_pc(val);
+}
+
+
+/* Try to find the register information for the current architecture.
+
+   Parameter:
+       must_be_defined : TRUE if the register information must be known
+
+   Result: a pointer to the info; NULL if there is none as yet.  */
+
+static ARC_RegisterInfo*
+find_info (Boolean must_be_defined)
+{
+    gdb_assert (current_gdbarch != NULL);
+
+    {
+        ARC_RegisterInfo *info = INFO_OF(current_gdbarch);
+
+        /* If we have no aux register info.  */
+        if (must_be_defined && info->aux_register_count == 0)
+        {
+            /* Try to get it.  */
+            read_default_file(current_gdbarch, FALSE, FALSE);
+
+            /* No, could not get it.  */
+            if (info->aux_register_count == 0)
+                error(_("No auxiliary registers have yet been defined for this target"));
+        }
+
+        return info;
+    }
+}
+
+
+/* Map a gdb register number to the ARC processor hardware number, and
+   determine the class of the register (as known to the built-in simulator).  */
+
+static void
+simulator_mapping (int                gdb_regno,
+                   int               *hw_regno,
+                   ARC_RegisterClass *reg_class)
+{
+    /* Just in case gdb_regno is invalid.  */
+    *hw_regno  = -1;
+    *reg_class = ARC_UNKNOWN_REGISTER;
+
+   if (arc_is_core_register(gdb_regno))
+   {
+       *hw_regno  = (int) arc_core_register_number(gdb_regno);
+       *reg_class = ARC_CORE_REGISTER;
+   }
+   else if (gdb_regno == arc_aux_pc_number(current_gdbarch))
+   {
+        /* The hw_regno is irrelevant here.  */
+        *reg_class = ARC_PROGRAM_COUNTER;
+   }
+   else
+   {
+        ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_gdb_number(gdb_regno);
+
+        if (def)
+        {
+            *hw_regno  = (int) arc_aux_hw_register_number(def);
+            *reg_class = ARC_AUX_REGISTER;
+        }
+   }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                  local functions for supporting commands                   */
+/* -------------------------------------------------------------------------- */
+
+/* This function determines the h/w register number of an auxiliary register
+   from a command argument provided by a user. The argument might be a register
+   name, a number, or an expression to be evaluated.  */
+
+static ARC_RegisterNumber
+extractRegisterNumber (char *arg)
+{
+    ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_name(arg);
+    ARC_RegisterNumber         num;
+
+    /* Is it a register name?  */
+    if (def)
+       num = arc_aux_hw_register_number(def);
+    else
+    {
+        int regnum;
+
+        /* Is it some expression?  */
+        EXTRACT(arg, int, regnum)
+
+        if (regnum < 0)
+            error(_("Register number '%s < 0"), arg);
+
+        num = (ARC_RegisterNumber) regnum;
+    }
+
+    return num;
+}
+
+
+/* This function finds the definition of an auxiliary register from a command
+   argument provided by a user. The argument might be a register name, a number,
+   or an expression to be evaluated.
+
+   NULL is returned if the argumenmt does not identify a defined auxiliary
+   register.  */
+
+static ARC_AuxRegisterDefinition*
+find_aux_register (char *arg)
+{
+    ARC_AuxRegisterDefinition* def = arc_find_aux_register_by_name(arg);
+
+    /* Is it not a register name?  */
+    if (def == NULL)
+    {
+        int regnum;
+
+        /* Is it some expression?  */
+        EXTRACT(arg, int, regnum)
+
+        if (regnum < 0)
+            error(_("Register number '%s < 0"), arg);
+
+        def = arc_find_aux_register_by_hw_number((ARC_RegisterNumber) regnum);
+    }
+
+    return def;
+}
+
+
+/* This function list the description (but not the contents) of an auxiliary
+   register.
+
+   Parameters:
+      r   : a pointer to the register definition
+      full: TRUE if full information is to be listed.
+*/
+
+static void
+list_register (ARC_AuxRegisterDefinition *r, Boolean full)
+{
+    printf_filtered("%s", r->name);
+    if (r->is_BCR)
+        printf_filtered(_(" (BCR)"));
+    printf_filtered(_("\n"));
+
+    if (r->description != NO_DESCRIPTION)
+        printf_filtered(_("    description: %s\n"), r->description);
+    printf_filtered(_("    number     : 0x%x\n"), r->number);
+
+    if (full)
+    {
+        /* The gdb number of the register is internal information which would
+           be meaningless to the user; the mask is probably not useful either.  */
+        printf_filtered(_("    gdb number : %d\n"),   r->gdb_regno);
+        printf_filtered(_("    mask       : %08X\n"), r->mask);
+    }
+
+    if (!r->is_BCR)
+        printf_filtered(_("    access     : %s\n"), RegisterAccess_Image(r->access));
+
+    if (r->fields)
+    {
+        unsigned int j;
+
+        printf_filtered(_("    fields\n"));
+
+        for (j = 0; j < r->field_count; j++)
+        {
+            ARC_FieldDefinition *f = &r->fields[j];
+
+            printf_filtered(_("    %s\n"), f->name);
+            if (f->description != NO_DESCRIPTION)
+                printf_filtered(_("        description: %s\n"),    f->description);
+            printf_filtered(_("        position   : %u:%u\n"), f->offset, f->size);
+            printf_filtered(_("        access     : %s\n"),    RegisterAccess_Image(f->access));
+
+            if (f->meanings)
+            {
+                unsigned int k;
+
+                printf_filtered(_("        field meanings\n"));
+
+                for (k = 0; k < f->meaning_count; k++)
+                {
+                    ARC_FieldMeaning *m = &f->meanings[k];
+
+                    printf_filtered(_("          %x ==> %s\n"), m->value, m->description);
+                }
+            }
+        }
+    }
+
+    printf_filtered(_("\n"));
+}
+
+
+/* This function list the descriptions (but not the contents) of all auxiliary
+   registers.
+
+   Parameter:
+      full: TRUE if full information is to be listed.
+*/
+
+static void
+list_registers (Boolean full)
+{
+    ARC_RegisterInfo *info = find_info(TRUE);
+    unsigned int      i;
+
+    for (i = 0; i < info->aux_register_count; i++)
+    {
+        ARC_AuxRegisterDefinition *def = info->aux_registers + i;
+
+        if (def->name != UNUSED)
+            list_register(def, full);
+    }
+}
+
+
+/* This function reads the contents of an auxiliary register on the target.
+
+   Parameters:
+      def            : the definition of the register
+      value          : set to the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the read fails
+
+   Result: TRUE if the register contents are read. */
+
+static Boolean
+read_aux_register (ARC_AuxRegisterDefinition *def,
+                   ARC_RegisterContents      *value,
+                   Boolean                    warn_on_failure)
+{
+    int              gdb_regno = arc_aux_gdb_register_number(def);
+    struct regcache *regcache  = get_current_regcache();
+
+    /* Read the register contents from the target to the register cache,
+       then collect the register value from the cache.  */
+    target_fetch_registers(regcache, gdb_regno);
+    regcache_raw_collect (regcache, gdb_regno, value);
+
+    /* Unfortunately, the target_fetch_registers operation does not give us an
+       indication of success or failure.  */
+    return TRUE;
+}
+
+
+/* This function writes the contents of an auxiliary register on the target.
+
+   Parameters:
+      def            : the definition of the register
+      value          : the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the write fails
+
+   Result: TRUE if the register contents are written. */
+
+static Boolean
+write_aux_register (ARC_AuxRegisterDefinition *def,
+                    ARC_RegisterContents       value,
+                    Boolean                    warn_on_failure)
+{
+    int                  gdb_regno = arc_aux_gdb_register_number(def);
+    struct regcache     *regcache  = get_current_regcache();
+    ARC_RegisterContents written   = arc_write_value(def, value);
+
+    /* Supply the register value to the register cache, then write it from the
+       cache to the target.  */
+    regcache_raw_supply (regcache, gdb_regno, &written);
+    target_store_registers(regcache, gdb_regno);
+
+    /* If the value we actually wrote to the target is not the same as the value
+       we were given (because the register has fields that must have particular
+       values when written).  */
+    if (written != value)
+    {
+        DEBUG("%s auxiliary register value %08X written as %08X\n",
+              arc_aux_register_name(def), value, written);
+
+        /* Put the value we were actually given into the register cache, so if
+           the user then displays the register contents he will see the
+           unmodified value.  */
+        regcache_raw_supply (regcache, gdb_regno, &value);
+    }
+
+    /* Unfortunately, the target_store_registers operation does not give us an
+       indication of success or failure.  */
+    return TRUE;
+}
+
+
+/* This function is passed to the arc_all_aux_registers iterator.
+   It is called for each auxiliary register defined for the current architecture;
+   if the register is a Build Configuration Register, and it is not unused, the
+   register's contents are read from the target and printed.  */
+
+static void
+print_bcr (ARC_AuxRegisterDefinition *def, void *data)
+{
+    if (arc_aux_is_BCR(def) && !arc_aux_is_unused(def))
+    {
+        ARC_RegisterNumber   bcr = arc_aux_hw_register_number(def);
+        ARC_RegisterContents bcr_value;
+
+        if (read_aux_register (def, &bcr_value, TRUE))
+            printf_filtered(_("[%02x] %-16s : 0x%02x\n"),
+                            bcr, arc_aux_register_name(def), bcr_value);
+    }
+}
+
+
+/* This function may be passed to the arc_all_aux_registers iterator.
+   It reads the contents of the register whose definition is given from
+   the target and prints those contents.  */
+
+static void
+show_one_aux_register (ARC_AuxRegisterDefinition *def, void *data)
+{
+    ARC_RegisterNumber   reg_no = arc_aux_hw_register_number(def);
+    ARC_RegisterContents contents;
+
+    DEBUG("try to read aux reg %u\n", reg_no);
+
+    if (read_aux_register(def, &contents, TRUE))
+        arc_print_aux_register(def, contents);
+}
+
+
+/* Read the register definitions from a file.
+
+   Parameters:
+      filename : the path to the file
+      gdbarch  : the architecture for which the register set is are being defined
+      replace  : TRUE if any existing set of register defintions should be deleted first
+      inform   : TRUE if a message should be output say that the file has been read
+      check    : TRUE if an architectural check is to be performed once the file has been read
+*/
+static Boolean
+read_aux_regs_file (const char     *filename,
+                    struct gdbarch *gdbarch,
+                    Boolean         replace,
+                    Boolean         inform,
+                    Boolean         check)
+{
+    /* Try to read the register descriptions from the file.  */
+    if (read_XML_file(filename, gdbarch, replace, inform, check))
+        return TRUE;
+
+    printf_filtered(_("can not read file '%s'\n"), filename);
+    return FALSE;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                     local functions implementing commands                  */
+/* -------------------------------------------------------------------------- */
+
+/* Command: <command> <from> [ <to> ]
+
+   Read and display a range of auxiliary registers.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+
+static void
+arc_aux_reg_read_command (char *arg, int from_tty)
+{
+    char              *arg2;
+    ARC_RegisterNumber first_regnum, last_regnum, r;
+    char               format[40];
+
+    if (!arg)
+    {
+        printf_filtered (_(AUX_REG_READ_COMMAND_USAGE));
+        return;
+    }
+
+    /* Strip leading spaces.  */
+    while (*arg == ' ')
+        arg++;
+
+    /* This assumes that the first arg cannot have spaces (the disas command
+       also seems to work this way).  */
+    arg2 = strchr (arg, ' ');
+
+    /* Are there two arguments?  */
+    if (arg2)
+    {
+        /* Split the input string up.  */
+        arg2[0] = (char) 0;
+        arg2++;
+    }
+
+    /* First arg.  */
+    first_regnum = extractRegisterNumber(arg);
+
+    /* So, how many regs do we want?  */
+    if (arg2)
+    {
+        last_regnum = extractRegisterNumber(arg2);
+
+        if (last_regnum < first_regnum)
+        {
+            warning(_(AUX_REG_READ_COMMAND ": %s < %s, showing one register"), arg2, arg);
+            last_regnum = first_regnum;
+        }
+    }
+    else
+        last_regnum = first_regnum;
+
+    DEBUG("try to read aux regs %d .. %d\n", first_regnum, last_regnum);
+
+    (void) snprintf(format, sizeof(format),
+                    _("0x%%08x %%-%us: %%08X\n"),
+                    arc_aux_register_max_name_length() + 1);
+
+    for (r = first_regnum; r <= last_regnum; r++)
+    {
+        ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_hw_number(r);
+
+        /* If the aux register exists, and is used.  */
+        if ((def != NULL) && !arc_aux_is_unused(def))
+        {
+            ARC_RegisterContents contents;
+
+            DEBUG("try to read aux reg %u\n", r);
+
+            if (read_aux_register(def, &contents, TRUE))
+                printf_filtered (format, r, arc_aux_register_name(def), contents);
+        }
+    }
+}
+
+
+/* Command: <command> <reg> = <value>
+
+   Write VALUE to auxiliary register REG.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+static void
+arc_aux_reg_write_command (char *arg, int from_tty)
+{
+    char                      *value_arg;
+    char                      *p;
+    ARC_RegisterNumber         regnum;
+    ARC_RegisterContents       value;
+    ARC_AuxRegisterDefinition *def;
+
+    if (!arg)
+    {
+        printf_filtered (_(AUX_REG_WRITE_COMMAND_USAGE));
+        return;
+    }
+
+    p = strchr(arg, '=');
+
+    if (p == NULL)
+    {
+        printf_filtered (_(AUX_REG_WRITE_COMMAND ": no second argument\n" AUX_REG_WRITE_COMMAND_USAGE));
+        return;
+    }
+
+    /* Split up the input string.  */
+    value_arg = p + 1;
+    p--;
+    while (*p == ' ') p--;
+    p[1] = '\0';
+
+    /* Register expression.  */
+    regnum = extractRegisterNumber(arg);
+
+    /* Value expression.  */
+    EXTRACT(value_arg, ARC_RegisterContents, value)
+
+    def = arc_find_aux_register_by_hw_number(regnum);
+
+    if (def == NULL)
+        warning(_("no such auxiliary register: %s"), arg);
+    else
+    {
+        DEBUG("try to write aux reg %d = 0x%08X\n", regnum, value);
+
+        /* Write it.  */
+        (void) write_aux_register(def, value, TRUE);
+    }
+}
+
+
+/* Command: <command> [ <reg> ]
+
+   Display the values of one or all of the auxiliary registers.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+
+static void
+arc_aux_reg_show_command (char *arg, int from_tty)
+{
+    if (arg)
+    {
+        ARC_AuxRegisterDefinition *def = find_aux_register(arg);
+
+        if (def)
+            show_one_aux_register(def, NULL);
+        else
+            printf_filtered(_("There is no auxiliary register named '%s'\n"), arg);
+    }
+    else
+        /* list them all */
+        arc_all_aux_registers(show_one_aux_register, NULL);
+}
+
+
+/* Command: <command> [ <file> ]
+
+   Read a definition of a set of auxiliary registers from an XML file.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+
+static void
+arc_aux_reg_file_read_command (char *arg, int from_tty)
+{
+    if (!arg)
+    {
+        printf_filtered (REG_READ_FILE_COMMAND_USAGE);
+        return;
+    }
+
+    /* The new set replaces the existing set (if any).  */
+    (void) read_aux_regs_file(arg, current_gdbarch, TRUE, TRUE, TRUE);
+}
+
+
+/* Command: <command> <file>
+
+   Read a definition of a set of auxiliary registers from an XML file.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+
+static void
+arc_aux_reg_file_read_extra_command (char *arg, int from_tty)
+{
+    if (!arg)
+    {
+        printf_filtered (REG_READ_EXTRA_FILE_COMMAND_USAGE);
+        return;
+    }
+
+    /* The new set is added to the existing set (if any).  */
+    (void) read_aux_regs_file(arg, current_gdbarch, FALSE, TRUE, TRUE);
+}
+
+
+/* Command: <command> [ <reg> ]
+
+   Display a description of one or all auxiliary registers.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+
+static void
+arc_aux_reg_list_command (char *arg, int from_tty)
+{
+    if (arg)
+    {
+        ARC_AuxRegisterDefinition *def = find_aux_register(arg);
+
+        if (def)
+            list_register(def, FALSE);
+        else
+            printf_filtered(_("There is no auxiliary register named '%s'\n"), arg);
+    }
+    else
+        /* List them all.  */
+        list_registers(FALSE);
+}
+
+
+/* Command: <command>
+
+   Display the Build Configuration Registers.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+
+static void
+arc_print_bcr_regs (char *arg, int from_tty)
+{
+    arc_all_aux_registers(print_bcr, NULL);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the given register information to the base configuration:
+      1) core registers exist
+      2) extension core registers do not exist
+      3) no aux registers
+  */
+
+void
+arc_initialize_aux_reg_info (ARC_RegisterInfo *info)
+{
+    unsigned int i;
+
+    info->processor           = NO_ARCHITECTURE;
+    info->aux_registers       = NULL;
+    info->aux_register_count  = 0;
+    info->max_name_length     = 0;
+    info->PC_number           = -1;
+    info->first_aux_gdb_regno = 0;
+    info->core_register_count = 0;
+
+    /* All possible core registers.  */
+    for (i = 0; i < ELEMENTS_IN_ARRAY(info->core_registers); i++)
+    {
+        ARC_CoreRegisterDefinition *reg = &info->core_registers[i];
+
+        reg->exists  = TRUE;
+        reg->mask    = 0xFFFFFFFF;
+        reg->access  = READ_WRITE;
+    }
+
+    /* We do not yet know if we have any extension registers.  */
+    for (i = ARC_FIRST_EXTENSION_CORE_REGISTER; i <= ARC_LAST_EXTENSION_CORE_REGISTER; i++)
+        info->core_registers[i].exists = FALSE;
+
+    /* R61 is reserved, R62 is not a real register.  */
+    info->core_registers[61].exists = FALSE;
+    info->core_registers[62].exists = FALSE;
+
+    /* PCL is read-only */
+    info->core_registers[63].access = READ_ONLY;
+}
+
+
+/* Read the XML registers definition for the given architecture from the default file.  */
+
+void
+arc_read_default_aux_registers (struct gdbarch *gdbarch)
+{
+    ENTERMSG;
+    read_default_file(gdbarch, FALSE, FALSE);
+}
+
+
+
+/* This function sets up or remaoves a "guard" on the PC */
+
+void
+arc_aux_pc_guard (struct gdbarch *gdbarch, Boolean on)
+{
+    set_gdbarch_read_pc (gdbarch, (on) ? get_pc : NULL);
+    set_gdbarch_write_pc(gdbarch, (on) ? set_pc : NULL);
+}
+
+
+/* Check whether the PC aux register is defined for the given architecture.  */
+
+void
+arc_aux_check_pc_defined (struct gdbarch *gdbarch)
+{
+    ENTERARGS("target %s", current_target.to_shortname);
+
+    if (gdbarch == NULL)
+        gdbarch = current_gdbarch;
+
+    if (arc_aux_pc_number(gdbarch) < 0)
+        error(_("There is no auxiliary register description for the PC (Program Counter)"));
+}
+
+
+/* Return the gdb register number of the PC (Program Counter); -1 if the PC is not defined.  */
+
+int
+arc_aux_pc_number (struct gdbarch *gdbarch)
+{
+    ARC_RegisterInfo *info = INFO_OF(gdbarch);
+
+    return (info) ? info->PC_number : -1;
+}
+
+
+/* Find the register definition of the given aux register (identified by name).  */
+
+ARC_AuxRegisterDefinition*
+arc_find_aux_register_by_name (const char *name)
+{
+    FIND_REGISTER_DEFINITION_SUCH_THAT(strcasecmp(name, def->name) == 0)
+}
+
+
+/* Find the register definition of the given aux register (identified by hardware register number).  */
+
+ARC_AuxRegisterDefinition*
+arc_find_aux_register_by_hw_number (ARC_RegisterNumber hw_regno)
+{
+    FIND_REGISTER_DEFINITION_SUCH_THAT(hw_regno == def->number)
+}
+
+
+/* Find the register definition of the given aux register (identified by gdb register number).  */
+
+ARC_AuxRegisterDefinition*
+arc_find_aux_register_by_gdb_number (int gdb_regno)
+{
+    /* N.B. the elements in the info->aux_registers array have strictly increasing
+            gdb numbers starting at info->first_aux_gdb_regno, so we can index the array
+            instead of searching it.  */
+    ARC_RegisterInfo *info  = find_info(TRUE);
+    int               index = gdb_regno - info->first_aux_gdb_regno;
+
+    if (0 <= index && index < (int) info->aux_register_count)
+    {
+        ARC_AuxRegisterDefinition *def = info->aux_registers + index;
+
+        /* Just to be sure we have found the right element.  */
+        gdb_assert(def->gdb_regno == gdb_regno);
+
+        return def;
+    }
+
+    return NULL;
+}
+
+
+/* Return the hardware register number of the given named auxiliary register;
+   if no register set is currently defined, or there is no register of that
+   name in the set, return the given default number. */
+
+ARC_RegisterNumber
+arc_aux_find_register_number (const char        *name,
+                              ARC_RegisterNumber defaultNumber)
+{
+    if (arc_aux_regs_defined(current_gdbarch))
+    {
+        ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_name(name);
+
+        if (def != NULL)
+            return arc_aux_hw_register_number(def);
+    }
+
+    warning(_("there is no auxiliary register description for the %s register - "
+              "using 0x%x for the register number"), name, defaultNumber);
+    return defaultNumber;
+}
+
+
+/* Return the hardware register number of the given core register.  */
+
+ARC_RegisterNumber
+arc_core_register_number (int gdb_regno)
+{
+    ARC_RegisterInfo *info  = find_info(TRUE);
+    unsigned int      i;
+
+    /* The lower-numbered set of non-extension core registers (i.e. excluding
+       R60 .. R63) have fixed gdb numbers which are the same as the h/w number.  */
+    if (gdb_regno < ARC_FIRST_EXTENSION_CORE_REGISTER)
+        return (ARC_RegisterNumber) gdb_regno;
+
+    /* Scan the rest of the array.  */
+    for (i = ARC_FIRST_EXTENSION_CORE_REGISTER; i < ELEMENTS_IN_ARRAY(info->core_registers); i++)
+    {
+        ARC_CoreRegisterDefinition *def = &info->core_registers[i];
+
+        if (def->exists)
+            if (gdb_regno == def->gdb_regno)
+                return (ARC_RegisterNumber) (i);
+    }
+
+    /* Too large to be the number of a core register.  */
+    return ARC_MAX_CORE_REGS + 1000;
+}
+
+
+/* Return the gdb register number of the given core register.  */
+
+int
+arc_core_register_gdb_number (ARC_RegisterNumber hw_regno)
+{
+    ARC_RegisterInfo           *info = find_info(TRUE);
+    ARC_CoreRegisterDefinition *def  = &info->core_registers[hw_regno];
+
+    gdb_assert(def->exists);
+
+    return def->gdb_regno;
+}
+
+
+/* Print the aux register whose definition and contents are given.
+   The field and meaning information in the definition is used to
+   give a detailed display of the register.  */
+
+void
+arc_print_aux_register (ARC_AuxRegisterDefinition *def,
+                        ARC_RegisterContents       contents)
+
+{
+    printf_filtered (_("%s : %08x\n"), def->name, contents);
+
+    if (def->fields)
+    {
+        unsigned int i;
+        char         format[128];
+
+        printf_filtered(_("    fields\n"));
+
+        /* Create a format string such as
+
+              "   %-10s:  %8s"
+
+           so that the field name is left-justified, and the field value is
+           right-justified.  */
+        (void) snprintf(format, sizeof(format),
+                                _("      %%-%us: %%%us"),
+                                def->longest_field_name, def->max_bits_in_field);
+
+        for (i = 0; i < def->field_count; i++)
+        {
+            ARC_FieldDefinition *f    = &def->fields[i];
+            ARC_RegisterContents val  = contents >> f->offset;
+            ARC_RegisterContents val2 = val;
+            ARC_RegisterContents mask = 0;
+            char                 bits[BITS_IN_REGISTER];
+            char                *p = &bits[BITS_IN_REGISTER - 1];
+            unsigned int         b;
+
+            *p = '\0';
+
+            /* Build up a string representing the bits of the field, starting
+               with the least significant bit, which will be the rightmost digit
+               displayed; at the same time, construct a mask of 1-bits of the
+               same size as the field.  */
+            for (b = 0; b < f->size; b++)
+            {
+                p--;
+                *p = (val & 1) ? '1' : '0';
+                val >>= 1;
+
+                mask <<= 1;
+                mask++;
+            }
+
+            printf_filtered(format, f->name, p);
+
+            if (f->meanings)
+            {
+                unsigned int j;
+
+                val2 &= mask;
+
+                /* Look for a meaning for this particular value of the field.  */
+                for (j = 0; j < f->meaning_count; j++)
+                {
+                    ARC_FieldMeaning *m = &f->meanings[j];
+
+                    if (val2 == m->value)
+                    {
+                        printf_filtered(_("    (%s)"), m->description);
+                        break;
+                    }
+                }
+            }
+
+            printf_filtered(_("\n"));
+        }
+    }
+
+    printf_filtered(_("\n"));
+}
+
+
+/* Return the gdb register number of the given aux register.  */
+
+int
+arc_aux_gdb_register_number (ARC_AuxRegisterDefinition *def)
+{
+    return def->gdb_regno;
+}
+
+
+/* Return the hardware register number of the given aux register.  */
+
+ARC_RegisterNumber
+arc_aux_hw_register_number (ARC_AuxRegisterDefinition *def)
+{
+    return def->number;
+}
+
+
+/* Return the access mode (R/W, RO 0r WO) of the given aux register.  */
+
+RegisterAccess
+arc_aux_register_access (ARC_AuxRegisterDefinition *def)
+{
+    return def->access;
+}
+
+
+/* Return TRUE if the given aux register is not used in the processor architecture,
+   i.e. there is a "place-holder" definition of that register (possibly a BCR) in
+   the XML file, but that register does not actually exist on the target.  */
+
+Boolean
+arc_aux_is_unused (ARC_AuxRegisterDefinition *def)
+{
+    return (def->name == UNUSED);
+}
+
+
+/* Return TRUE if the given aux register is a BCR (Build Configuration Register).  */
+
+Boolean
+arc_aux_is_BCR (ARC_AuxRegisterDefinition *def)
+{
+    return def->is_BCR;
+}
+
+
+/* Return the name of the given aux register.  */
+
+const char*
+arc_aux_register_name (ARC_AuxRegisterDefinition *def)
+{
+    return def->name;
+}
+
+
+/* Return the access mode (R/W, RO 0r WO) of the given core register.  */
+
+RegisterAccess
+arc_core_register_access (ARC_RegisterNumber hw_regno)
+{
+    ARC_RegisterInfo           *info = find_info(TRUE);
+    ARC_CoreRegisterDefinition *def  = &info->core_registers[hw_regno];
+
+    gdb_assert(def->exists);
+
+    return def->access;
+}
+
+
+/* Return the name of the given auxiliary register.  */
+
+const char*
+arc_aux_register_name_of (ARC_RegisterNumber hw_regno)
+{
+    ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_hw_number(hw_regno);
+
+    return (def) ? def->name : "<no such register>";
+}
+
+
+/* Return TRUE if the given register is a core register.  */
+
+Boolean
+arc_is_core_register (int gdb_regno)
+{
+    ARC_RegisterInfo *info = find_info(TRUE);
+
+    return (gdb_regno < info->first_aux_gdb_regno);
+}
+
+
+/* Iterate across all the aux registers; for each one, call the supplied
+   function, passing it the defintion of the register and the supplied data.  */
+
+void
+arc_all_aux_registers (ARC_AuxRegisterFunction function, void *data)
+{
+    ARC_RegisterInfo *info = find_info(TRUE);
+    unsigned int         i;
+
+    for (i = 0; i < info->aux_register_count; i++)
+        function(info->aux_registers + i, data);
+}
+
+
+/* Return the length of the longest aux register name in the current architecture.  */
+unsigned int
+arc_aux_register_max_name_length (void)
+{
+    ARC_RegisterInfo *info = find_info(TRUE);
+
+    return info->max_name_length;
+}
+
+
+/* Return the number of aux registers defined for the given architecture;
+   0 if no register set has yet been defined.  */
+
+unsigned int
+arc_aux_register_count (struct gdbarch *gdbarch)
+{
+    ARC_RegisterInfo *info = INFO_OF(gdbarch);
+
+    return (info) ? info->aux_register_count : 0;
+}
+
+
+/* Return the number of core registers defined for the given architecture;
+   ARC_NUM_STANDARD_CORE_REGS if no register set has yet been defined.  */
+
+unsigned int
+arc_core_register_count (struct gdbarch *gdbarch)
+{
+    ARC_RegisterInfo *info = INFO_OF(gdbarch);
+
+    return (info) ? info->core_register_count : ARC_NUM_STANDARD_CORE_REGS;
+}
+
+
+/* Return TRUE if the register set has been defined for the given architecture.  */
+
+Boolean
+arc_aux_regs_defined (struct gdbarch *gdbarch)
+{
+    ARC_RegisterInfo *info = INFO_OF(gdbarch);
+
+    return (info->aux_register_count > 0 && info->aux_registers != NULL);
+}
+
+
+/* Return the architectural version of the register set associated with the
+   given architecture.  */
+
+ARC_ProcessorVersion
+arc_aux_architecture (struct gdbarch *gdbarch)
+{
+    ARC_RegisterInfo *info = INFO_OF(gdbarch);
+
+    return info->processor;
+}
+
+
+/* Compute the value to be written to an auxiliary register so that any fields it
+   has contain the values that they are required to have by the ARC architectural
+   specification.
+
+   Parameters:
+      def   : the definition of the aux register
+      value : the value to be adjusted
+
+   Result: the adjusted register contents.  */
+
+ARC_RegisterContents
+arc_write_value (ARC_AuxRegisterDefinition *def,
+                 ARC_RegisterContents       value)
+{
+    unsigned int i;
+
+    for (i = 0; i < def->field_count; i++)
+    {
+        ARC_FieldDefinition *field = &def->fields[i];
+
+        if (field->fixed)
+        {
+            value &= ~(((1 << field->size) - 1) << field->offset);
+            value |=  (field->value_for_write   << field->offset);
+        }
+    }
+
+    return value;
+}
+
+
+/* Adjust the value to be written to a register so that any fields it has contain
+   the values that they are required to have by the ARC architectural specification.
+
+   Parameters:
+      gdb_regno : the number of the aux register
+      buffer    : the value to be adjusted
+ */
+
+void
+arc_convert_aux_contents_for_write (int gdb_regno, void *buffer)
+{
+    ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_gdb_number(gdb_regno);
+
+    /* Is it an auxiliary register? If not, do nothing.  */
+    if (def)
+    {
+        ARC_RegisterContents old;
+        ARC_RegisterContents new;
+
+        memcpy(&old, buffer, BYTES_IN_REGISTER);
+        new = arc_write_value(def, old);
+
+        if (new != old)
+        {
+            DEBUG("*** converted register %s value from %08X to %08X\n",
+                  arc_aux_register_name(def), old, new);
+            memcpy(buffer, &new, BYTES_IN_REGISTER);
+        }
+    }
+}
+
+
+/* Initialize the module.  This function is called from the gdb core on start-up.  */
+
+void
+_initialize_arc_aux_regs (void)
+{
+    arc_pending_register_architecture_change_event = FALSE;
+
+    /* If this module is being built with a test driver.  */
+#ifdef STANDALONE_TEST
+    /* N.B. it would be better to set this up in the test driver, but that
+            causes problems when linking!  */
+    struct gdbarch_info     info;
+    static ARC_VariantsInfo variant;
+    struct gdbarch_tdep    *tdep    = malloc (sizeof (struct gdbarch_tdep));
+    struct gdbarch         *gdbarch = gdbarch_alloc (&info, tdep);
+
+    tdep->processor_variant_info = &variant;
+    current_gdbarch = gdbarch;
+#endif
+
+    (void) add_cmd (REG_READ_FILE_COMMAND,
+                    class_files,
+                    arc_aux_reg_file_read_command,
+                    _("Read a file describing a set of auxiliary registers.\n"
+                      REG_READ_FILE_COMMAND_USAGE
+                      "<FILE> is an XML file containing the auxiliary register definitions.\n"),
+                    &cmdlist);
+
+    (void) add_cmd (REG_READ_EXTRA_FILE_COMMAND,
+                    class_files,
+                    arc_aux_reg_file_read_extra_command,
+                    _("Read a file describing an additional set of auxiliary registers.\n"
+                      REG_READ_EXTRA_FILE_COMMAND_USAGE
+                      "<FILE> is an XML file containing the auxiliary register definitions.\n"),
+                    &cmdlist);
+
+    (void) add_cmd (AUX_LIST_REGISTER_COMMAND,
+                    class_vars,
+                    arc_aux_reg_list_command,
+                    _("Show a description of one or all auxiliary registers.\n"
+                      AUX_LIST_REGISTER_COMMAND_USAGE
+                      "<REG> is the name of an auxiliary register.\n"),
+                    &cmdlist);
+
+    (void) add_cmd(ARC_BCR_COMMAND,
+                   class_info,
+                   arc_print_bcr_regs,
+                   _("Show Build Configuration Registers in the ARC processor variant.\n"
+                     ARC_BCR_COMMAND_USAGE),
+                   &infolist);
+
+    (void) add_cmd (AUX_REG_READ_COMMAND,
+                    class_vars,
+                    arc_aux_reg_read_command,
+                    _("Read and show a range of auxiliary registers.\n"
+                      AUX_REG_READ_COMMAND_USAGE
+                      "REG-FROM and REG-TO are the names or numbers of the registers.\n"
+                      "If REG-TO is not specified, one register is displayed.\n"),
+                    &cmdlist);
+
+    (void) add_cmd (AUX_REG_WRITE_COMMAND,
+                    class_vars,
+                    arc_aux_reg_write_command,
+                    _("Write to an auxiliary register.\n"
+                      AUX_REG_WRITE_COMMAND_USAGE
+                      "REG is the name or number of the register.\n"
+                      "VALUE can be any expression that evaluates to an integer.\n"),
+                    &cmdlist);
+
+    (void) add_cmd (AUX_REG_SHOW_COMMAND,
+                    class_vars,
+                    arc_aux_reg_show_command,
+                    _("Read and show one or all auxiliary registers.\n"
+                      AUX_REG_SHOW_COMMAND_USAGE
+                      "<REG> is the name of an auxiliary register.\n"),
+                    &cmdlist);
+
+    /* Provide the built-in simulator with a functions that it can use to map
+       from gdb register numbers to h/w register numbers, and set the fields
+       of aux registers to any values that they may be required to have on write.  */
+    arc_set_register_mapping(&simulator_mapping);
+    arc_set_aux_register_conversion(arc_convert_aux_contents_for_write);
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-registers.h b/gdb/arc-registers.h
new file mode 100644
index 0000000..9fb6521
--- /dev/null
+++ b/gdb/arc-registers.h
@@ -0,0 +1,226 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines operations for manipulating the ARC processor */
+/*     core registers and auxiliary registers.                                */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_REGISTERS_H
+#define ARC_REGISTERS_H
+
+/* gdb header files */
+#include "defs.h"
+#include "gdbarch.h"
+
+/* ARC header files */
+#include "arc-support.h"
+#include "arc-tdep.h"
+#include "arc-architecture.h"
+
+
+#define REGISTER_DEFINITION_FILE      "arc-registers.xml"
+
+
+/* ARC aux registers with known (well-defined) numbers.  */
+#define ARC_HW_LP_START_REGNUM        (ARC_RegisterNumber) 0x2
+#define ARC_HW_LP_END_REGNUM          (ARC_RegisterNumber) 0x3
+#define ARC_HW_IDENTITY_REGNUM        (ARC_RegisterNumber) 0x4
+#define ARC_HW_DEBUG_REGNUM           (ARC_RegisterNumber) 0x5
+#define ARC_HW_PC_REGNUM              (ARC_RegisterNumber) 0x6
+#define ARC_HW_STATUS32_REGNUM        (ARC_RegisterNumber) 0xA
+
+/* Specific ARCangel aux registers for caches.  */
+#define ARC_HW_IC_IVIC_REGNUM         (ARC_RegisterNumber) 0x10     /* Invalidate ICache.  */
+#define ARC_HW_IC_CTRL_REGNUM         (ARC_RegisterNumber) 0x11     /* Disable    ICache.  */
+#define ARC_HW_DC_IVDC_REGNUM         (ARC_RegisterNumber) 0x47     /* Invalidate DCache.  */
+#define ARC_HW_DC_CTRL_REGNUM         (ARC_RegisterNumber) 0x48     /* Disable    DCache.  */
+
+/* BCRs.  */
+#define ARC_HW_MEMSUBSYS_REGNUM       (ARC_RegisterNumber) 0x67
+#define ARC_HW_AP_BUILD_REGNUM        (ARC_RegisterNumber) 0x76
+
+/* Auxiliary registers for actionpoint 0 (there are up to 8 sets of these).  */
+#define ARC_HW_AMV0_REGNUM            (ARC_RegisterNumber) 0x220
+#define ARC_HW_AMM0_REGNUM            (ARC_RegisterNumber) 0x221
+#define ARC_HW_AC0_REGNUM             (ARC_RegisterNumber) 0x222
+
+
+/* Bit masks for use with the cache-related auxiliary registers.  */
+#define IC_IVIC_IV                     0x00000001
+#define DC_IVDC_IV                     0x00000001
+#define IC_CTRL_DC                     0x00000001
+#define DC_CTRL_DC                     0x00000001
+#define DC_CTRL_IM                     0x00000040
+
+
+/* Bit masks for use with the auxiliary DEBUG, IDENTITY, STATUS32 and AP_BUILD registers.  */
+#define DEBUG_SH                         0x40000000
+#define DEBUG_BH                         0x20000000
+#define DEBUG_USER                       0x10000000
+#define DEBUG_ACTIONPOINT_HALT           0x00000004
+#define DEBUG_ACTIONPOINT_STATUS         0x000007F8
+#define DEBUG_ACTIONPOINT_STATUS_SHIFT   3
+#define DEBUG_FORCE_HALT                 0x00000002
+#define DEBUG_INSTRUCTION_STEP           0x00000800
+#define DEBUG_SINGLE_STEP                0x00000001
+#define DEBUG_LOAD_PENDING               0x80000000
+#define IDENTITY_ARCVER                  0x000000FF
+#define STATUS32_USER                    0x00000080
+#define STATUS32_L                       0x00000100
+#define STATUS32_HALT                    0x00000001
+#define AP_BUILD_VERSION                 0x000000FF
+#define AP_BUILD_TYPE                    0x00000F00
+#define AP_BUILD_TYPE_SHIFT              8
+
+
+typedef enum register_access
+{
+    READ_ONLY,
+    READ_WRITE,
+    WRITE_ONLY
+} RegisterAccess;
+
+
+struct core_register_definition
+{
+    int            gdb_regno;
+    ARC_Word       mask;
+    RegisterAccess access;
+    Boolean        exists;
+};
+
+
+/* The type 'struct aux_register_definition' is incomplete: it is private to this
+   module.  */
+typedef struct aux_register_definition  ARC_AuxRegisterDefinition;
+typedef struct core_register_definition ARC_CoreRegisterDefinition;
+
+
+/* This type is essentially private: no access to any of its fields should
+   be performed outside of this module.  */
+typedef struct _register_info
+{
+    ARC_ProcessorVersion       processor;
+    ARC_AuxRegisterDefinition *aux_registers;
+    unsigned int               aux_register_count;
+    int                        first_aux_gdb_regno;
+    unsigned int               max_name_length;
+    int                        PC_number;
+    ARC_CoreRegisterDefinition core_registers[ARC_MAX_CORE_REGS];
+    unsigned int               core_register_count;
+} ARC_RegisterInfo;
+
+
+typedef void (*ARC_AuxRegisterFunction)(ARC_AuxRegisterDefinition *def, void *data);
+
+
+extern Boolean arc_pending_register_architecture_change_event;
+
+
+/* Initialization functions.  */
+
+void arc_initialize_aux_reg_info (ARC_RegisterInfo *info);
+
+void arc_read_default_aux_registers (struct gdbarch *gdbarch);
+
+
+/* PC-related functions.  */
+
+void arc_aux_pc_guard         (struct gdbarch *gdbarch, Boolean on);
+
+void arc_aux_check_pc_defined (struct gdbarch *gdbarch);
+
+int  arc_aux_pc_number        (struct gdbarch *gdbarch);
+
+
+/* Output functions.  */
+
+void arc_print_aux_register (ARC_AuxRegisterDefinition *def,
+                             ARC_RegisterContents       contents);
+
+
+/* Search functions.  */
+
+ARC_AuxRegisterDefinition* arc_find_aux_register_by_name       (const char *name);
+
+ARC_AuxRegisterDefinition* arc_find_aux_register_by_gdb_number (int gdb_regno);
+
+ARC_AuxRegisterDefinition* arc_find_aux_register_by_hw_number  (ARC_RegisterNumber hw_regno);
+
+ARC_RegisterNumber      arc_aux_find_register_number (const char        *name,
+                                                      ARC_RegisterNumber defaultNumber);
+
+ARC_RegisterNumber      arc_core_register_number (int gdb_regno);
+
+int                     arc_core_register_gdb_number (ARC_RegisterNumber hw_regno);
+
+const char*             arc_aux_register_name_of (ARC_RegisterNumber hw_regno);
+
+Boolean                 arc_is_core_register (int gdb_regno);
+
+
+/* Accessor functions.  */
+
+int                arc_aux_gdb_register_number (ARC_AuxRegisterDefinition *def);
+
+ARC_RegisterNumber arc_aux_hw_register_number  (ARC_AuxRegisterDefinition *def);
+
+RegisterAccess     arc_aux_register_access     (ARC_AuxRegisterDefinition *def);
+
+Boolean            arc_aux_is_unused           (ARC_AuxRegisterDefinition *def);
+
+Boolean            arc_aux_is_BCR              (ARC_AuxRegisterDefinition *def);
+
+const char*        arc_aux_register_name       (ARC_AuxRegisterDefinition *def);
+
+RegisterAccess     arc_core_register_access    (ARC_RegisterNumber regno);
+
+
+/* Iterator/summary functions.  */
+
+void arc_all_aux_registers (ARC_AuxRegisterFunction function, void *data);
+
+unsigned int         arc_aux_register_max_name_length  (void);
+
+unsigned int         arc_aux_register_count            (struct gdbarch *gdbarch);
+
+unsigned int         arc_core_register_count           (struct gdbarch *gdbarch);
+
+Boolean              arc_aux_regs_defined              (struct gdbarch *gdbarch);
+
+ARC_ProcessorVersion arc_aux_architecture              (struct gdbarch *gdbarch);
+
+/* Register contents conversion functions.  */
+
+ARC_RegisterContents arc_write_value (ARC_AuxRegisterDefinition *def, ARC_RegisterContents value);
+
+void arc_convert_aux_contents_for_write (int gdb_regno, void *buffer);
+
+
+#endif /* ARC_REGISTERS_H */
+/******************************************************************************/
diff --git a/gdb/arc-regnums-defs.h b/gdb/arc-regnums-defs.h
index 6071ee4..bc87295 100644
--- a/gdb/arc-regnums-defs.h
+++ b/gdb/arc-regnums-defs.h
@@ -1,108 +1,125 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008 Free Software Foundation, Inc.
 
    Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
 
-   Authors: 
-      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+   Authors:
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+      Richard Stuckey      <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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.  
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This file defines register numbers for ARC processors.                 */
+/*                                                                            */
+/* N.B. this file is NOT a module header file and must NOT have an inclusion  */
+/*      guard: it may be included at multiple points in a module.             */
+/*                                                                            */
+/*                      THIS FILE IS NO LONGER USED!!!!                       */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef STANDALONE_TEST
+#error This file is no longer used
+#endif
+
+/* Auxiliary Registers.  */
 
 #ifdef RAUX
-#ifdef ARC4_JTAG
 
-RAUX ( STATUS , 0x0, "Status Regnum " , ARC_STATUS_REGNUM , A4 )
-RAUX ( SEMAPHORE ,  0x1, "Semaphore Regnum ", ARC_SEMAPHORE_REGNUM , A4  ) 
-RAUX ( LP_START , 0x2, "Loop Start" , ARC_LP_START_REGNUM , A4  )
-RAUX ( LP_END , 0x3, "Loop End", ARC_LP_END_REGNUM , A4 )
-RAUX ( IDENTITY , 0x4, "Identity", ARC_IDENTITY_REGNUM , A4 )
-RAUX ( DEBUG , 0x5, "Debug" , ARC_DEBUG_REGNUM , A4 )
+RAUX ( STATUS,               0x0,   "Status (obsolete)",                          ARC_STATUS_REGNUM,                      0xFEFFFFFF,   RO,   ARCompact )
+RAUX ( SEMAPHORE,            0x1,   "Semaphore",                                  ARC_SEMAPHORE_REGNUM,                   0x0000000F,   RW,   ARCompact )
+RAUX ( LP_START,             0x2,   "Loop Start",                                 ARC_LP_START_REGNUM,                    0xFFFFFFFE,   RW,   ARCompact )
+RAUX ( LP_END,               0x3,   "Loop End",                                   ARC_LP_END_REGNUM,                      0xFFFFFFFE,   RW,   ARCompact )
+RAUX ( IDENTITY,             0x4,   "Identity",                                   ARC_IDENTITY_REGNUM,                    0xFFFFFFFF,   RO,   ARCompact )
+RAUX ( DEBUG,                0x5,   "Debug",                                      ARC_DEBUG_REGNUM,                       0xF0800802,   RO,   ARCompact )
+RAUX ( PC,                   0x6,   "PC",                                         ARC_PC_REGNUM,                          0xFFFFFFFE,   RO,   ARCompact )
+RAUX ( STATUS32,             0xA,   "STATUS32",                                   ARC_STATUS32_REGNUM,                    0x00001FFF,   RO,   ARCompact )
+RAUX ( STATUS32_L1,          0xB,   "STATUS32 register in case of L1 interrupts", ARC_STATUS32_L1_REGNUM,                 0x00001FFE,   RW,   ARCompact )
+RAUX ( STATUS32_L2,          0xC,   "STATUS32 register in case of L2 interrupts", ARC_STATUS32_L2_REGNUM,                 0x00001FFE,   RW,   ARCompact )
+RAUX ( COUNT0,               0x21,  "Processor Timer 1 Count Value",              ARC_COUNT0_REGNUM,                      0xFFFFFFFF,   RW,   ARCompact )
+RAUX ( CONTROL0,             0x22,  "Processor Timer 1 Control Value",            ARC_CONTROL0_REGNUM,                    0x0000000F,   RW,   ARCompact )
+RAUX ( LIMIT0,               0x23,  "Processor Timer 1 Limit Value",              ARC_LIMIT0_REGNUM,                      0xFFFFFFFF,   RW,   ARCompact )
+RAUX ( INT_VECTOR_BASE,      0x25,  "Interrupt Vector Base Register",             ARC_INT_VECTOR_BASE_REGNUM,             0xFFFFFC00,   RW,   ARCompact )
+RAUX ( AUX_MACMODE,          0x41,  "Aux MAC Mode",                               ARC_AUX_MACMODE_REGNUM,                 0xFFFFFFFF,   RW,   ARCompact )
+RAUX ( AUX_IRQ_LV12,         0x43,  "Aux IRQ Level 2",                            ARC_AUX_IRQ_LV12_REGNUM,                0x00000003,   RW,   ARCompact )
+RAUX ( COUNT1,               0x100, "Processor Timer 1 Count Value",              ARC_COUNT1_REGNUM,                      0xFFFFFFFF,   RW,   ARCompact )
+RAUX ( CONTROL1,             0x101, "Processor Timer 1 Control Value",            ARC_CONTROL1_REGNUM,                    0x0000000F,   RW,   ARCompact )
+RAUX ( LIMIT1,               0x102, "Processor Timer 1 Limit Value",              ARC_LIMIT1_REGNUM,                      0xFFFFFFFF,   RW,   ARCompact )
+RAUX ( AUX_IRQ_LEV,          0x200, "Interrupt Level programming",                ARC_AUX_IRQ_LEV_REGNUM,                 0xFFFFFFF8,   RW,   ARCompact )
+RAUX ( AUX_IRQ_HINT,         0x201, "Software Triggered Interrupt",               ARC_AUX_IRQ_HINT_REGNUM,                0x0000001F,   RW,   ARCompact )
+RAUX ( ERET,                 0x400, "Exception Return",                           ARC_ERET_REGNUM,                        0xFFFFFFFE,   RW,   ARC700    )
+RAUX ( ERBTA,                0x401, "Exception BTA",                              ARC_ERBTA_REGNUM,                       0xFFFFFFFE,   RW,   ARC700    )
+RAUX ( ERSTATUS,             0x402, "Exception Return Status",                    ARC_ERSTATUS_REGNUM,                    0x00001FFE,   RW,   ARC700    )
+RAUX ( ECR,                  0x403, "Exception Cause Register",                   ARC_ECR_REGNUM,                         0x00FFFFFF,   RO,   ARC700    )
+RAUX ( EFA,                  0x404, "Exception Fault Address",                    ARC_EFA_REGNUM,                         0xFFFFFFFF,   RW,   ARC700    )
+RAUX ( ICAUSE1,              0x40A, "Interrupt Cause (Level 1)",                  ARC_ICAUSE1_REGNUM,                     0x0000001F,   RO,   ARC700    )
+RAUX ( ICAUSE2,              0x40B, "Interrupt Cause (Level 2)",                  ARC_ICAUSE2_REGNUM,                     0x0000001F,   RO,   ARC700    )
+RAUX ( AUX_IENABLE,          0x40C, "Interrupt Mask Programming",                 ARC_AUX_IENABLE_REGNUM,                 0xFFFFFFF8,   RW,   ARC700    )
+RAUX ( AUX_ITRIGGER,         0x40D, "Interrupt Sensitivity Programming",          ARC_AUX_ITRIGGER_REGNUM,                0xFFFFFFF8,   RW,   ARC700    )
+RAUX ( XPU,                  0x410, "User Mode Extension Permissions",            ARC_XPU_REGNUM,                         0xFFFFFFFF,   RW,   ARC700    )
+RAUX ( BTA,                  0x412, "Branch Target Address",                      ARC_BTA_REGNUM,                         0xFFFFFFFE,   RO,   ARC700    )
+RAUX ( BTA_L1,               0x413, "Branch Target Address in Level 1",           ARC_BTA_L1_REGNUM,                      0xFFFFFFFE,   RW,   ARC700    )
+RAUX ( BTA_L2,               0x414, "Branch Target Address in Level 2",           ARC_BTA_L2_REGNUM,                      0xFFFFFFFE,   RW,   ARC700    )
+RAUX ( AUX_IRQ_PULSE_CANCEL, 0x415, "Interrupt Pulse Cancel",                     ARC_AUX_IRQ_PULSE_CANCEL_REGNUM,        0xFFFFFFFA,   WO,   ARC700    )
+RAUX ( AUX_IRQ_PENDING,      0x416, "Interrupt Pending Register",                 ARC_AUX_IRQ_PENDING_REGNUM,             0xFFFFFFF8,   RO,   ARC700    )
 
-#else
-
-RAUX ( STATUS , 0x0, "Status Regnum (obsolete)" , ARC_STATUS_REGNUM , ARCompact )
-RAUX ( SEMAPHORE ,  0x1, "Semaphore Regnum ", ARC_SEMAPHORE_REGNUM , ARCompact  ) 
-RAUX ( LP_START , 0x2, "Loop Start" , ARC_LP_START_REGNUM , ARCompact  )
-RAUX ( LP_END , 0x3, "Loop End", ARC_LP_END_REGNUM , ARCompact )
-RAUX ( IDENTITY , 0x4, "Identity", ARC_IDENTITY_REGNUM , ARCompact )
-RAUX ( DEBUG , 0x5, "Debug" , ARC_DEBUG_REGNUM , ARCompact )
-RAUX ( PC, 0x6,"PC" , ARC_PC_REGNUM ,ARCompact )
-RAUX ( STATUS32 ,0xA,"STATUS32", ARC_STATUS32_REGNUM , ARCompact ) 
-RAUX ( STATUS32_L1 , 0xB, "STATUS32 register in case of L1 interrupts" ,ARC_STATUS32_L1_REGNUM , ARCompact )
-RAUX ( STATUS32_L2 , 0xC, "STATUS32 register in case of L2 interrupts" ,ARC_STATUS32_L2_REGNUM , ARCompact )
-RAUX ( COUNT0 , 0x21, "Processor Timer 1 Count Value", ARC_COUNT0_REGNUM , ARCompact )
-RAUX ( CONTROL0 , 0x22, "Processor Timer 1 Control Value" , ARC_CONTROL0_REGNUM, ARCompact)
-RAUX ( LIMIT0 , 0x23, "Processor Timer 1 Limit Value" , ARC_LIMIT0_REGNUM, ARCompact )
-RAUX ( INT_VECTOR_BASE , 0x25, "Interrupt Vector Base Register", ARC_INT_VECTOR_BASE_REGNUM , ARCompact )
-RAUX ( AUX_IRQ_MACMODE , 0x41, "Aux IRQ MAC Mode " , ARC_AUX_MACMODE_REGNUM , ARCompact )
-RAUX ( AUX_IRQ_LV12 , 0x42, "Aux IRQ Level 2 " , ARC_AUX_IRQ_LV12_REGNUM , ARCompact )
-RAUX ( COUNT1 , 0x100, "Processor Timer 1 Count Value", ARC_COUNT1_REGNUM , ARCompact )
-RAUX ( CONTROL1 , 0x101, "Processor Timer 1 Control Value" , ARC_CONTROL1_REGNUM , ARCompact)
-RAUX ( LIMIT1 , 0x102, "Processor Timer 1 Limit Value", ARC_LIMIT1_REGNUM , ARCompact)
-RAUX ( AUX_IRQ_LEV , 0x200, "Interrupt Level programming. ", ARC_AUX_IRQ_LEV_REGNUM , ARCompact)
-RAUX ( AUX_IRQ_HINT , 0x201, "Software Triggered Interrupt" , ARC_AUX_IRQ_HINT_REGNUM, ARCompact )
-RAUX ( ERET , 0x400, "Exception Return " , ARC_ERET_REGNUM, ARC700 )
-RAUX ( ERBTA , 0x401, "Exception BTA ", ARC_ERBTA_REGNUM, ARC700 )
-RAUX ( ERSTATUS , 0x402, "Exception Return Status" , ARC_ERSTATUS_REGNUM, ARC700 )
-RAUX ( ECR , 0x403, "Exception Cause Register" , ARC_ECR_REGNUM, ARC700 )
-RAUX ( EFA , 0x404, "Exception Fault Address" , ARC_EFA_REGNUM, ARC700 )
-RAUX ( ICAUSE1 , 0x40A, "Interrupt Cause (Level 1)", ARC_ICAUSE1_REGNUM,ARC700 )
-RAUX ( ICAUSE2 , 0x40B, "Interrupt Cause (Level 2)", ARC_ICAUSE2_REGNUM, ARC700)
-RAUX ( AUX_IENABLE , 0x40C, "Interrupt Mask Programming", ARC_AUX_IENABLE_REGNUM, ARC700 )
-RAUX ( AUX_ITRIGGER , 0x40D, "Interrupt Sensitivity Programming", ARC_AUX_ITRIGGER_REGNUM, ARC700 )
-RAUX ( XPU , 0x410, "User Mode Extension Permissions", ARC_XPU_REGNUM, ARC700 )
-RAUX ( BTA , 0x412, "Branch Target Address", ARC_BTA_REGNUM, ARC700 )
-RAUX ( BTA_L1 , 0x413, "Branch Target Address in Level 1", ARC_BTA_L1_REGNUM, ARC700 )
-RAUX ( BTA_L2 , 0x414, "Branch Target Address in Level 2", ARC_BTA_L2_REGNUM, ARC700 )
-RAUX ( AUX_IRQ_PULSE_CANCEL , 0x415, "Interrupt Pulse Cancel", ARC_AUX_IRQ_PULSE_CANCEL_REGNUM, ARC700 )
-RAUX ( AUX_IRQ_PENDING , 0x416, "Interrupt Pending Register", ARC_AUX_IRQ_PENDING_REGNUM, ARC700 )
-#endif // ARC4_JTAG
 #endif // RAUX
 
+
+/* Build Configuration Registers.  */
+
 #ifdef RBCR
-#ifndef ARC4_JTAG
 
-RBCR ( DCCM_BASE_BUILD , 0x61, "Base address for DCCM.", ARC_BCR_1_REGNUM, ARCompact)
-RBCR ( CRC_BASE_BUILD , 0x62, "BCRBCR for CRC Unit.", ARC_BCR_2_REGNUM , ARCompact)
-RBCR ( BTA_LINK_BUILD , 0x63, "Interrupt Link Registers Available for BTA",ARC_BCR_3_REGNUM, ARCompact )
-RBCR ( DVBF_BUILD , 0x64, "BCRBCR for Dual Viterbi Instruction.",ARC_BCR_4_REGNUM, ARCompact )
-RBCR ( TEL_INSTR_BUILD , 0x65, "BCRBCR for Extended Arithmetic Instructions. ",ARC_BCR_5_REGNUM, ARCompact)
-RBCR ( MEMSUBSYS , 0x67, "BCRBCR for Memory Subsystem. ",ARC_BCR_7_REGNUM, ARCompact)
-RBCR ( VECBASE_AC_BUILD ,0x68, "BCRBCR for Interrupt Vector Base. ", ARC_BCR_8_REGNUM,ARCompact) 
-RBCR ( P_BASE_ADDRESS , 0x69, "Peripheral Base Address" , ARC_BCR_9_REGNUM , ARCompact) 
-RBCR ( MMU_BUILD , 0x6F, "MMU Build. " , ARC_BCR_F_REGNUM, ARCompact)
-RBCR ( ARCANGEL_BUILD , 0x70, "ARC Angel Build config. ", ARC_BCR_10_REGNUM, ARCompact)
-RBCR ( D_CACHE_BUILD , 0x72, "D Cache Build Config. ", ARC_BCR_12_REGNUM , ARCompact )
-RBCR ( MADI_BUILD , 0x73 , "Multiple ARC Debug Interface. " , ARC_BCR_13_REGNUM , ARCompact)
-RBCR ( DCCM_BUILD , 0x74, "BCRBCR for DCCM.(Data Closely coupled Memory", ARC_BCR_14_REGNUM, ARCompact)
-RBCR ( TIMER_BUILD , 0x75, "BCRBCR for Timers. " , ARC_BCR_15_REGNUM , ARCompact)
-RBCR ( AP_BUILD, 0x76, "Actionpoints build. ", ARC_BCR_16_REGNUM , ARCompact )
-RBCR ( ICACHE_BUILD , 0x77, "Instruction Cache BCR", ARC_BCR_17_REGNUM , ARCompact )
-RBCR ( ICCM_BUILD , 0x78, "ICCM BCRBCR (Instruction Closely Coupled Memory.", ARC_BCR_18_REGNUM , ARCompact)
-RBCR ( DSPRAM_BUILD , 0x79, "DSP RAM Build", ARC_BCR_19_REGNUM , ARCompact)
-RBCR ( MAC_BUILD , 0x7A, "MAC Unit Build", ARC_BCR_1A_REGNUM , ARCompact)
-RBCR ( MULTIPLY_BUILD , 0x7B, "(32 X 32) Multiply Unit Build", ARC_BCR_1B_REGNUM , ARCompact)
-RBCR ( SWAP_BUILD , 0x7C, "SWAP Build", ARC_BCR_1C_REGNUM , ARCompact)
-RBCR ( NORM_BUILD , 0x7D ,"NORM Unit Build", ARC_BCR_1D_REGNUM, ARCompact)
-RBCR ( MINMAX_BUILD , 0x7E, "Minmax Unit Build", ARC_BCR_1E_REGNUM, ARCompact)
-RBCR ( BARREL_BUILD , 0x7F, "Barrel Shifter Build", ARC_BCR_1F_REGNUM , ARCompact) 
+RBCR ( UNUSED_0,             0x60,  "unused",                                            ARC_BCR_0_REGNUM,                0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( DCCM_BASE_BUILD,      0x61,  "Base address for DCCM",                             ARC_BCR_1_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( CRC_BASE_BUILD,       0x62,  "BCR for CRC Unit",                                  ARC_BCR_2_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( BTA_LINK_BUILD,       0x63,  "Interrupt Link Registers Available for BTA",        ARC_BCR_3_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( DVBF_BUILD,           0x64,  "BCR for Dual Viterbi Instruction",                  ARC_BCR_4_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( TEL_INSTR_BUILD,      0x65,  "BCR for Extended Arithmetic Instructions",          ARC_BCR_5_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( UNUSED_6,             0x66,  "unused",                                            ARC_BCR_6_REGNUM,                0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( MEMSUBSYS,            0x67,  "BCR for Memory Subsystem",                          ARC_BCR_7_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( VECBASE_AC_BUILD,     0x68,  "BCR for Interrupt Vector Base",                     ARC_BCR_8_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( P_BASE_ADDRESS,       0x69,  "Peripheral Base Address",                           ARC_BCR_9_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( UNUSED_A,             0x6A,  "unused",                                            ARC_BCR_A_REGNUM,                0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( UNUSED_B,             0x6B,  "unused",                                            ARC_BCR_B_REGNUM,                0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( UNUSED_C,             0x6C,  "unused",                                            ARC_BCR_C_REGNUM,                0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( UNUSED_D,             0x6D,  "unused",                                            ARC_BCR_D_REGNUM,                0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( UNUSED_E,             0x6E,  "unused",                                            ARC_BCR_E_REGNUM,                0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( MMU_BUILD,            0x6F,  "MMU Build",                                         ARC_BCR_F_REGNUM,                0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( ARCANGEL_BUILD,       0x70,  "ARC Angel Build Config",                            ARC_BCR_10_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( UNUSED_11,            0x6E,  "unused",                                            ARC_BCR_11_REGNUM,               0xFFFFFFFF,   UU,   ARCompact )
+RBCR ( D_CACHE_BUILD,        0x72,  "D Cache Build Config",                              ARC_BCR_12_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( MADI_BUILD,           0x73,  "Multiple ARC Debug Interface",                      ARC_BCR_13_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( DCCM_BUILD,           0x74,  "BCR for DCCM (Data Closely Coupled Memory)",        ARC_BCR_14_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( TIMER_BUILD,          0x75,  "BCR for Timers",                                    ARC_BCR_15_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( AP_BUILD,             0x76,  "Actionpoints build",                                ARC_BCR_16_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( ICACHE_BUILD,         0x77,  "Instruction Cache BCR",                             ARC_BCR_17_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( ICCM_BUILD,           0x78,  "ICCM BCR (Instruction Closely Coupled Memory)",     ARC_BCR_18_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( DSPRAM_BUILD,         0x79,  "DSP RAM Build",                                     ARC_BCR_19_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( MAC_BUILD,            0x7A,  "MAC Unit Build",                                    ARC_BCR_1A_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( MULTIPLY_BUILD,       0x7B,  "(32 X 32) Multiply Unit Build",                     ARC_BCR_1B_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( SWAP_BUILD,           0x7C,  "SWAP Build",                                        ARC_BCR_1C_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( NORM_BUILD,           0x7D,  "NORM Unit Build",                                   ARC_BCR_1D_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( MINMAX_BUILD,         0x7E,  "Minmax Unit Build",                                 ARC_BCR_1E_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
+RBCR ( BARREL_BUILD,         0x7F,  "Barrel Shifter Build",                              ARC_BCR_1F_REGNUM,               0xFFFFFFFF,   RO,   ARCompact )
 
+#endif // RBCR
 
-#endif // ARC4_JTAG
-#endif // RBCR 
+/******************************************************************************/
diff --git a/gdb/arc-remote-fileio.c b/gdb/arc-remote-fileio.c
new file mode 100644
index 0000000..5bb22ea
--- /dev/null
+++ b/gdb/arc-remote-fileio.c
@@ -0,0 +1,741 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Author:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements facilities for intercepting I/O (and other)     */
+/*     operations attempted on an ARC target and performing them on the host, */
+/*     using a RPC (Remote Procedure Call) mechanism.                         */
+/*                                                                            */
+/* Mechanism:                                                                 */
+/*     When interception is enabled, this module sets a breakpoint at the     */
+/*     entry point of each operation which is to be intercepted; it finds the */
+/*     entry points of named routines in the C runtime library code by using  */
+/*     gdb's symbol lookup facilities.                                        */
+/*                                                                            */
+/*     When a breakpoint is triggered on the target, the target monitoring    */
+/*     loop calls the function 'arc_check_interception_breakpoint' to check   */
+/*     whether the breakpoint triggered is an interception breakpoint; this   */
+/*     function will return a code indicating either                          */
+/*                                                                            */
+/*       a) the breakpoint is an interception breakpoint, the interception    */
+/*          has been performed and execution of the target program should be  */
+/*          resumed; or                                                       */
+/*                                                                            */
+/*       b) the breakpoint is an interception breakpoint, but the intercepted */
+/*          routine is 'exit' and execution should not be resumed; or         */
+/*                                                                            */
+/*       c) the breakpoint is not an interception breakpoint, so execution    */
+/*          should not be resumed and the trigger should be reported to gdb.  */
+/*                                                                            */
+/*     In case a), this module then reads the routine's parameters from the   */
+/*     target's registers, performs whatever conversions are required, and    */
+/*     constructs a gdb RSP File I/O extension 'F' message which it passes to */
+/*     the gdb target_fileio module, which performs the requested operation   */
+/*     on the host machine.                                                   */
+/*                                                                            */
+/*     The target_fileio module is passed a set of operations which allow it  */
+/*     to read data from target memory, write data to target memory, and      */
+/*     return a result value (and possibly a error code) to the intercepted   */
+/*     routine.  The result value is written into the target's R0 register;   */
+/*     the error code (if any) is written into the location of the 'errno'    */
+/*     variable.                                                              */
+/*                                                                            */
+/*     Finally, this module copies the routine return address from the BLINK  */
+/*     register to the PC register - this ensures that when execution of the  */
+/*     target is resumed, control returns to the code after the call to the   */
+/*     intercepted routine.                                                   */
+/*                                                                            */
+/* Notes:                                                                     */
+/*     1) the set of routines to be intercepted, and the parameters to these  */
+/*        routines, is defined by a table (see below) - so it is simple to    */
+/*        add more routines to the set;                                       */
+/*                                                                            */
+/*     2) the 'open' syscall (see man open(2)) has a 'flags' parameter which  */
+/*        is a bit mask; unfortunately, the bits differ in meaning between    */
+/*        the host and the elf-32 target program, so the parameter must be    */
+/*        converted before it can be passed to the target_fileio module;      */
+/*                                                                            */
+/*     3) the 'fstat' syscall (see man fstat(2)) has an out parameter which   */
+/*        is a 'struct stat' structure (i.e. the address of such a structure  */
+/*        is a parameter to the syscall): the target_fileio module writes the */
+/*        data of the structure to that location in target memory; however,   */
+/*        the structure does not have the same layout on host and target, so  */
+/*        the structure must be converted before it can be written to the     */
+/*        target;                                                             */
+/*                                                                            */
+/*     4) the interception breakpoints are not handled by the core gdb        */
+/*        breakpoint mechanism; hence, they are not listed by the 'info break'*/
+/*        command, and can not be (accidentally) deleted by the user; though  */
+/*        they could be handled by gdb, that would require the introduction   */
+/*        of a new "invisible" breakpoint type, and hence more changes to     */
+/*        supposedly generic code;                                            */
+/*                                                                            */
+/*     5) it would be more elegant (from one perspective) to intecept these   */
+/*        operations by placing a breakpoint at the interrupt vector location */
+/*        of the 'swi' (SoftWare Interrupt) handler: only one breakpoint      */
+/*        would then be required, and all syscalls would be intercepted;      */
+/*        however, this module would then have to simulate a "return from     */
+/*        exception" in order to resume target execution, which would be more */
+/*        complex than the "restart at return address" method currently used. */
+/*                                                                            */
+/* Restrictions:                                                              */
+/*     1) this module places s/w breakpoints at the entry points; therefore,  */
+/*        the mechanism will not work with programs that are loaded into read */
+/*        -only memory;                                                       */
+/*                                                                            */
+/*     2) this mechanism will probably not work if the user sets breakpoints  */
+/*        on the entry points of the intercepted routines - there will be a   */
+/*        conflict!                                                           */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "symtab.h"
+#include "frame.h"
+#include "block.h"
+#include "target.h"
+#include "target-fileio.h"
+#include "exceptions.h"
+#include "gdb/fileio.h"
+
+/* ARC header files */
+#include "arc-remote-fileio.h"
+#include "config/arc/tm-embed.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+#define MAX_SYSCALL_PARAMS    4
+
+/* These are the intercepted routines.  */
+typedef enum
+{
+    READ_CALL,
+    WRITE_CALL,
+    OPEN_CALL,
+    CLOSE_CALL,
+    LSEEK_CALL,
+    FSTAT_CALL,
+    GETTIMEOFDAY_CALL,
+    EXIT_CALL
+} SystemCall;
+
+
+struct lib_function
+{
+    SystemCall            call;
+    const char           *name;
+    const char           *format;
+    Boolean               bp_is_set;
+    unsigned int          param_count;
+    ARC_RegisterNumber    param_register[MAX_SYSCALL_PARAMS];
+    struct bp_target_info breakpoint;
+};
+
+
+/* This structure defines a memory image of the 'stat' structure as it is
+   represented on the ARC target.  */
+struct arc_stat
+{
+    ARC_Byte fst_dev    [4];
+    ARC_Byte fst_ino    [4];
+    ARC_Byte fst_mode   [2];
+    ARC_Byte fst_nlink  [2];
+    ARC_Byte fst_uid    [2];
+    ARC_Byte fst_gid    [2];
+    ARC_Byte fst_rdev   [4];
+    ARC_Byte fst_size   [4];
+    ARC_Byte fst_blksize[4];
+    ARC_Byte fst_blocks [4];
+    ARC_Byte fst_atime  [8];
+    ARC_Byte fst_mtime  [8];
+    ARC_Byte fst_ctime  [8];
+};
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+/* The %x specifiers in the format strings in this table correspond to the
+   parameters to the intercepted functions; the register number of the target
+   register in which the parameter is passed is given by the corresponding
+   entry in the param_register array.
+
+   N.B. the special value of SL as the number of the register in which a
+        parameter is passed indicates that the preceding parameter was the
+        address of a string, and the length of that string (including the
+        terminating NUL) is required here.
+
+        F<n> indicates that the parameter in register <n> is a word of flag
+        bits which must be handled specially!
+
+        X indicates that the array element is not used.  */
+
+#define SL   1000
+#define F2   1002
+#define X    9999
+
+static struct lib_function functions[] =
+{
+    { READ_CALL,         "_read_r",         "Fread,%x,%x,%x",       FALSE, 3, {1, 2,   3, X} },
+    { WRITE_CALL,        "_write_r",        "Fwrite,%x,%x,%x",      FALSE, 3, {1, 2,   3, X} },
+    { OPEN_CALL,         "_open_r",         "Fopen,%x/%x,%x,%x",    FALSE, 4, {1, SL, F2, 3} },
+    { CLOSE_CALL,        "_close_r",        "Fclose,%x",            FALSE, 1, {1, X,   X, X} },
+    { LSEEK_CALL,        "_lseek_r",        "Flseek,%x,%x,%x",      FALSE, 3, {1, 2,   3, X} },
+    { FSTAT_CALL,        "_fstat_r",        "Ffstat,%x,%x",         FALSE, 2, {1, 2,   X, X} },
+    { GETTIMEOFDAY_CALL, "_gettimeofday_r", "Fgettimeofday,%x,%x",  FALSE, 2, {1, 2,   X, X} },
+    { EXIT_CALL,         "_exit_r",         NULL,                   FALSE, 1, {1, X,   X, X} }
+};
+
+
+/* A pointer to the set of target operations for the current target.  */
+static TargetOperations *target_operations;
+
+/* TRUE if the operation currently being intercepted has NOT been interrupted
+   by the user typing a Ctrl-C.  */
+static Boolean not_interrupted;
+
+/* For the Ctrl-C signal handler.  */
+static void (*old_signal_handler) (int);
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* Read a number of bytes of data from the given address in target memory.  */
+
+static int
+read_bytes (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
+{
+    DEBUG("reading %d bytes from %x\n", len, (unsigned int) memaddr);
+
+    return (int) target_read (&current_target, TARGET_OBJECT_MEMORY, NULL, myaddr, memaddr, len);
+}
+
+
+/* Read a number of bytes of data from the given address in target memory.  */
+
+static int
+write_bytes (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
+{
+    DEBUG("writing %d bytes to %x\n", len, (unsigned int) memaddr);
+
+    return (int) target_write (&current_target, TARGET_OBJECT_MEMORY, NULL, myaddr, memaddr, len);
+}
+
+
+/* Perform the reply to the intercepted operation: set up the result of the call
+   and the error code (if any) so that the intercepted operation receives them
+   just as though the operation had really been performed upon the target.  */
+
+static void
+reply (int retcode, int error)
+{
+    /* Ignore any Ctrl-Cs while performing the reply.  */
+    (void) signal (SIGINT, SIG_IGN);
+
+    DEBUG("reply: retcode = %d, error = %d\n", retcode, error);
+
+    /* If an error has occurred.  */
+    if (retcode == -1)
+    {
+        ARC_RegisterContents errno_address;
+
+        if (error == FILEIO_EINTR)
+        {
+            DEBUG("*** interrupted by user!\n");
+            /* Set the global flag so that it can be tested later.  */
+            not_interrupted = FALSE;
+            return;
+        }
+
+        /* Read the address of the 'errno' variable from R0.  */
+        if (target_operations->read_core_register(0, &errno_address, TRUE))
+            /* Write the error number into the 'errno' variable.  */
+            (void) write_bytes((CORE_ADDR) errno_address, (gdb_byte*) &error, BYTES_IN_WORD);
+    }
+
+    /* Write the return code into the function result register R0.  */
+    (void) target_operations->write_core_register(0, (ARC_RegisterContents) retcode, TRUE);
+}
+
+
+/* Copy a number of bytes of data from one buffer to another.  Note that the
+   buffers are not necessarily of the same size. Perform endianess byte-swapping
+   if necessary.  */
+
+static void
+copy_bytes (char     *from, size_t from_size,
+            ARC_Byte *to,   size_t to_size,
+            Boolean   target_is_big_endian)
+{
+    /* We can not copy more data than we have been given in the source buffer,
+       or for which there is room in the destination buffer.  */
+    unsigned int bytes = (unsigned int) ((from_size > to_size) ? to_size : from_size);
+    unsigned int i;
+
+    /* N.B. 1) the fio_stat structure created by target-fileio.c has the values
+               in big-endian byte order; so if the ARC target is little-endian
+               we must reverse the order;
+
+            2) the fields in the fio_stat structure may be smaller (or larger!)
+               than the corresponding fields in the ARC target structure - so we
+               copy the *least* significant bytes of the fields, on the grounds
+               that the most significant bytes are probably just sign-extensions!  */
+    for (i = 0; i < bytes; i++)
+        to[i] = (ARC_Byte) ((target_is_big_endian) ? from[i]
+                                                   : from[from_size - 1 - i]);
+}
+
+
+/* Write a 'stat' structure to the target at a given address in memory.
+   'myaddr' points to a fio_stat structure created by the target-fileio module;
+   this structure is meant for use in the RSP protocol, and is designed for
+   independence of host/target systems - therefore, we must create an equivalent
+   structure which is ARC-specific, and write that structure to the target.
+
+   Return the number of bytes of data written.  */
+
+static int
+write_fstat (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
+{
+    Boolean          target_is_big_endian = (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG);
+    struct fio_stat *fst                  = (struct fio_stat*) myaddr;
+    struct arc_stat  ast;
+
+    memset(&ast, 0, sizeof(ast));
+
+#define COPY(from, to)   copy_bytes(from, sizeof(from), to, sizeof(to), target_is_big_endian)
+
+    COPY(fst->fst_dev,     ast.fst_dev);
+    COPY(fst->fst_ino,     ast.fst_ino);
+    COPY(fst->fst_mode,    ast.fst_mode);
+    COPY(fst->fst_nlink,   ast.fst_nlink);
+    COPY(fst->fst_uid,     ast.fst_uid);
+    COPY(fst->fst_gid,     ast.fst_gid);
+    COPY(fst->fst_rdev,    ast.fst_rdev);
+    COPY(fst->fst_size,    ast.fst_size);
+    COPY(fst->fst_blksize, ast.fst_blksize);
+    COPY(fst->fst_blocks,  ast.fst_blocks);
+    COPY(fst->fst_atime,   ast.fst_atime);
+    COPY(fst->fst_mtime,   ast.fst_mtime);
+    COPY(fst->fst_ctime,   ast.fst_ctime);
+
+    return write_bytes(memaddr, (gdb_byte*) &ast, (int) sizeof(ast));
+}
+
+
+/* Find the address of the entry point of the given routine in the target program.
+   Return 0 if the entry point can not be found, or is not a function.  */
+
+static CORE_ADDR
+findEntryPoint (const char *routine)
+{
+    CORE_ADDR      entry = 0;
+    int            is_a_field_of_this;
+    struct symbol *sym = lookup_symbol (routine,
+                                        get_selected_block (0),
+                                        VAR_DOMAIN,
+                                        &is_a_field_of_this,
+                                        (struct symtab **) NULL);
+    if (sym)
+    {
+        if (SYMBOL_CLASS (sym) == LOC_BLOCK)
+            entry = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+        else
+            warning(_("%s is not a function"), routine);
+    }
+    else
+        warning(_("can not find entry point of function %s"), routine);
+
+    return entry;
+}
+
+
+/* Insert a s/w breakpoint in the target program code at the entry point of the
+   given library function.  */
+
+static void
+insert_breakpoint (struct lib_function *f)
+{
+    if (!f->bp_is_set)
+    {
+        if (arc_elf32_insert_breakpoint(&f->breakpoint) == 0)
+            f->bp_is_set = TRUE;
+        else
+            warning(_("can not set breakpoint at entrypoint of %s"), f->name);
+    }
+}
+
+
+/* Remove a s/w breakpoint from the target program code at the entry point of the
+   given library function.  */
+
+static void
+remove_breakpoint (struct lib_function *f)
+{
+    if (f->bp_is_set)
+    {
+        if (arc_elf32_remove_breakpoint(&f->breakpoint) == 0)
+            f->bp_is_set = FALSE;
+        else
+            warning(_("can not unset breakpoint at entrypoint of %s"), f->name);
+    }
+}
+
+
+/* This function handles any Ctrl-C typed by the user whilst the interception of
+   an operation is in progress.  */
+
+static void
+Ctrl_C_signal_handler (int signo)
+{
+    /* Ignore any more Ctrl-Cs.  */
+    (void) signal (SIGINT, SIG_IGN);
+
+    /* We must use the gdb exception mechanism since the target_fileio_request
+       function calls catch_exceptions, and if we do something else (like a long
+       jump) here, gdb's cleanup list would be left in an inconsistent state!  */
+    DEBUG("*** throwing RETURN_QUIT...\n");
+    deprecated_throw_reason (RETURN_QUIT);
+}
+
+
+/* This function is called from the gdb target-fileio module: it sets up this
+   module's handler for Ctrl-C interrupts.  */
+
+static void
+set_Ctrl_C_signal_handler (void)
+{
+    old_signal_handler = signal (SIGINT, Ctrl_C_signal_handler);
+}
+
+
+/* This function finds the length of a C string stored in target memory at the
+   given address.  */
+
+static unsigned int
+find_string_length (ARC_Address address)
+{
+    unsigned int length = 0;
+
+    while (TRUE)
+    {
+        gdb_byte buf[65];
+        int      bytes = read_bytes((CORE_ADDR) address,
+                                    buf,
+                                    (int) sizeof(buf) - 1);
+        int      i;
+
+        for (i = 0; i < bytes; i++)
+            if (buf[i] == (gdb_byte) '\0')
+                return (unsigned int) (length + i + 1);
+
+        address += bytes;
+        length  += bytes;
+    }
+}
+
+
+/* Convert flags to target syscall to what they "should" be!  */
+
+static ARC_RegisterContents
+convert_flags (ARC_RegisterContents flags)
+{
+    ARC_RegisterContents result = flags;
+
+/* See gcc/src/newlib/libc/sys/arc/sys/fcntl.h */
+
+/* The following values have been changed for uclibc compatibility.  */
+#define _FAPPEND        0x0400  /* append (writes guaranteed at the end) */
+#define _FASYNC         0x2000  /* signal pgrp when data ready */
+#define _FCREAT         0x0040  /* open with file create */
+#define _FTRUNC         0x0200  /* open with truncation */
+#define _FEXCL          0x0080  /* error on open if file exists */
+#define _FSYNC          0x1000  /* do all writes synchronously */
+#define _FNONBLOCK      0x0800  /* non blocking I/O (POSIX style) */
+
+#define REMOVE(flag)    if (flags & _F ## flag) result &= ~ _F        ## flag
+#define ADD(flag)       if (flags & _F ## flag) result |=   FILEIO_O_ ## flag
+
+    /* N.B. all "old" bits most be removed from the result word before all
+            "new" bits are added, in case the old and new sets intersect!  */
+    REMOVE(APPEND);
+//  REMOVE(ASYNC);     // no equivalent flag in gdb/fileio.h
+    REMOVE(CREAT);
+    REMOVE(TRUNC);
+    REMOVE(EXCL);
+//  REMOVE(SYNC);      // no equivalent flag in gdb/fileio.h
+//  REMOVE(NONBLOCK);  // no equivalent flag in gdb/fileio.h
+    ADD(APPEND);
+//  ADD(ASYNC);        // no equivalent flag in gdb/fileio.h
+    ADD(CREAT);
+    ADD(TRUNC);
+    ADD(EXCL);
+//  ADD(SYNC);         // no equivalent flag in gdb/fileio.h
+//  ADD(NONBLOCK);     // no equivalent flag in gdb/fileio.h
+
+    return result;
+}
+
+
+/* Perform the interception of the given library function.
+   Return TRUE if the interception is completed successfully,
+          FALSE if it is interrupted by the user.  */
+
+static Boolean
+perform_interception (struct lib_function *f)
+{
+    ARC_RegisterContents params [MAX_SYSCALL_PARAMS];
+    char                 request[MAX_SYSCALL_PARAMS * 9 + 40];
+    unsigned int         i;
+
+    /* These operations allow the target_fileio module to read data from target
+       memory, write data to target memory, and return a result value (and
+       possibly a error code) to the intercepted routine.
+
+       N.B. if the syscsall is 'fstat', we pass a special write function
+            which converts the 'struct stat' structure to target layout before
+            writing it to target memory.  */
+    struct file_io_operations io_operations =
+    {
+        read_bytes,
+        (f->call == FSTAT_CALL) ? write_fstat : write_bytes,
+        reply,
+        set_Ctrl_C_signal_handler
+    };
+
+    /* Evaluate the parameters to be passed to the RPC request.  */
+    for (i = 0; i < f->param_count; i++)
+    {
+        ARC_RegisterNumber reg = f->param_register[i];
+
+        if (reg == SL)
+            params[i] = find_string_length((ARC_Address) params[i - 1]);
+        else if (reg == F2)
+        {
+            ARC_RegisterContents flags;
+
+            (void) target_operations->read_core_register(2, &flags, TRUE);
+            params[i] = convert_flags(flags);
+        }
+        else
+            (void) target_operations->read_core_register(reg, &params[i], TRUE);
+    }
+
+    /* Do not close the target program's stdin, stdout or stderr streams on the
+       host: it is possible that the program may be re-loaded and re-run on the
+       target in the same debugging session (so re-initializing its I/O system)
+       so it may try to read/write those streams again - instead, just tell the
+       target that the close succeeded.  */
+    if (f->call == CLOSE_CALL)
+    {
+        int fd = (int) params[0];
+
+        if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO)
+        {
+            reply(0, 0);
+            DEBUG("*** RPC close of stream %d ignored\n", fd);
+            return TRUE;
+        }
+    }
+
+    /* Parameters which are extra to those required by the format will simply be
+       ignored.  */
+    (void) snprintf(request, sizeof(request), f->format,
+                    params[0], params[1], params[2], params[3]);
+
+    DEBUG("RPC request: %s\n", request);
+
+    /* the interception might be interrupted by the user typing Ctrl-C whilst
+       the interception is in progress; if that happens, this flag will be set
+       to FALSE.  */
+    not_interrupted = TRUE;
+
+    /* Make the RPC request.  */
+    target_fileio_request(request, &io_operations);
+
+    (void) signal (SIGINT, old_signal_handler);
+
+    /* If the call was not interrupted, the interception has been performed.  */
+    return not_interrupted;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                         externally visible functions                       */
+/* -------------------------------------------------------------------------- */
+
+/* Set the state of the I/O interception mechanism:
+      ON   : set breakpoints on all the functions to be intercepted
+      OFF  : clear breakpoints from all the intercepted functions
+      RESET: mark the breakpoints as not being set (if a new program has been
+             downloaded to the target, the s/w breakpoints in the old program
+             have been lost, and so should not be removed).  */
+
+void
+arc_set_IO_interception (TargetOperations *operations,
+                         InterceptionState state)
+{
+    unsigned int i;
+
+    DEBUG("*** interception: %s\n", (state == INTERCEPTION_RESET) ? "RESET" :
+                                    (state == INTERCEPTION_ON)    ? "ON"    :
+                                                                    "OFF");
+
+    target_operations = operations;
+
+    for (i = 0; i < ELEMENTS_IN_ARRAY(functions); i++)
+    {
+        struct lib_function* f = &functions[i];
+
+        switch (state)
+        {
+            case INTERCEPTION_RESET:
+                f->bp_is_set = FALSE;
+                break;
+
+            case INTERCEPTION_ON:
+                /* Set a breakpoint on the entry point of the function.  */
+                f->breakpoint.placed_address = findEntryPoint(f->name);
+
+                if (f->breakpoint.placed_address != 0)
+                {
+                    DEBUG("intercept 0x%08X : %s\n", (unsigned int) f->breakpoint.placed_address, f->name);
+                    insert_breakpoint(f);
+                }
+                break;
+
+            case INTERCEPTION_OFF:
+                if (f->breakpoint.placed_address != 0)
+                {
+                    remove_breakpoint(f);
+                    f->breakpoint.placed_address = 0;
+                }
+                break;
+        }
+    }
+}
+
+
+/* This function is called when the execution of the target program has been
+   halted by a breakpoint trigger. It checks whether the breakpoint that has
+   been triggered is at the entry point of an intercepted function, and, if so,
+   performs the required interception.
+
+   Returns:
+      INTERCEPTION_RESUME    : interception has been performed, execution should be resumed
+      INTERCEPTION_HALT      : the program is halted (no interception has been performed)
+      INTERCEPTION_EXIT      : the program has exited
+      INTERCEPTION_INTERRUPT : the interception has been interrupted by the user
+
+  If the program has exited, the 'exitcode' parameter is set to the program's exit code.  */
+
+InterceptionAction
+arc_check_interception_breakpoint (int *exitcode)
+{
+    ARC_RegisterContents pc;
+
+    ENTERMSG;
+
+    *exitcode = 0;
+
+    /* Get the current execution point from the PCL, rather than the PC - this
+       gives the same result on both ARC700 and ARC600 targets.  */
+    if (target_operations->read_core_register(ARC_PCL_REGNUM, &pc, TRUE))
+    {
+        unsigned int i;
+
+        DEBUG("checking for interception at 0x%08X\n", pc);
+
+        /* Look at each of the intercepted operations.  */
+        for (i = 0; i < ELEMENTS_IN_ARRAY(functions); i++)
+        {
+            struct lib_function *f = &functions[i];
+
+            if (f->breakpoint.placed_address == (CORE_ADDR) pc)
+            {
+                DEBUG("intercepted function %s\n", f->name);
+
+                if (f->call == EXIT_CALL)
+                {
+                    ARC_RegisterContents code;
+
+                    /* The exit code is in parameter register R1.  */
+                    if (target_operations->read_core_register(1, &code, TRUE))
+                        *exitcode = (int) code;
+
+                    return INTERCEPTION_EXIT;
+                }
+                else
+                {
+                    /* If the interception is performed.  */
+                    if (perform_interception(f))
+                    {
+                        ARC_RegisterContents blink;
+
+                        /* Copy BLINK to PC, so that when execution is re-started,
+                           control will return to the point after the call of the
+                           intercepted function.  */
+                        if (target_operations->read_core_register      (ARC_BLINK_REGNUM, &blink, TRUE) &&
+                            target_operations->write_auxiliary_register(arc_pc_regnum,     blink, TRUE))
+                        {
+                            DEBUG("copied BLINK (%x) to PC (was %x)\n", blink, pc);
+                            return INTERCEPTION_RESUME;
+                        }
+
+                        /* If we couldn't set PC, fall through.  */
+                    }
+                    else
+                    {
+                        /* The interception has been interrupted by a Ctrl-C
+                           from the user - do not change the PC, as we want
+                           execution to resume at the same point in the code,
+                           so that the I/O request will be performed (and
+                           intercepted) again: this e.g. allows the user to
+                           break into a program that is in a tight loop doing
+                           reads or writes.  */
+                        return INTERCEPTION_INTERRUPT;
+                    }
+                }
+            }
+        }
+    }
+
+    return INTERCEPTION_HALT;
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-remote-fileio.h b/gdb/arc-remote-fileio.h
new file mode 100644
index 0000000..7a2d76c
--- /dev/null
+++ b/gdb/arc-remote-fileio.h
@@ -0,0 +1,64 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Author:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines facilities for intercepting I/O (and other)   */
+/*     operations attempted on an ARC target and performing them on the host, */
+/*     using a RPC (Remote Procedure Call) mechanism.                         */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_REMOTE_FILEIO
+#define ARC_REMOTE_FILEIO
+
+/* ARC header files */
+#include "arc-support.h"
+
+
+typedef enum
+{
+    INTERCEPTION_RESUME,
+    INTERCEPTION_HALT,
+    INTERCEPTION_EXIT,
+    INTERCEPTION_INTERRUPT
+} InterceptionAction;
+
+
+typedef enum
+{
+    INTERCEPTION_RESET,
+    INTERCEPTION_ON,
+    INTERCEPTION_OFF
+} InterceptionState;
+
+
+void arc_set_IO_interception (TargetOperations *operations,
+                              InterceptionState state);
+
+InterceptionAction arc_check_interception_breakpoint (int *exitcode);
+
+#endif /* ARC_REMOTE_FILEIO */
+/******************************************************************************/
diff --git a/gdb/arc-support.h b/gdb/arc-support.h
new file mode 100644
index 0000000..76ff0bf
--- /dev/null
+++ b/gdb/arc-support.h
@@ -0,0 +1,136 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines some useful types and constants, and macros   */
+/*     for use in debugging.                                                  */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_SUPPORT_H
+#define ARC_SUPPORT_H
+
+
+#define ARC_DEBUG 1
+
+#ifdef ARC_DEBUG
+#define DEBUG(...)              if (arc_debug_target) fprintf_unfiltered(gdb_stdlog, __VA_ARGS__)
+#define ENTERMSG                DEBUG("--- entered %s:%s()\n",        __FILE__, __FUNCTION__)
+#define ENTERARGS(fmt, args...) DEBUG("--- entered %s:%s(" fmt ")\n", __FILE__, __FUNCTION__, args)
+#define LEAVEMSG                DEBUG("--- exited  %s:%s()\n",        __FILE__, __FUNCTION__)
+#else
+#define DEBUG(...)
+#define ENTERMSG
+#define ENTERARGS(fmt, args...)
+#define LEAVEMSG
+#endif
+
+
+/* N.B. it must be possible to build some ARC modules without the rest of gdb so
+        that they can be exercised by stand-alone test drivers.  */
+#ifdef STANDALONE_TEST
+#define error(...)                    { printf(__VA_ARGS__); printf("\n"); }
+#define warning(...)                  { printf(__VA_ARGS__); printf("\n"); }
+#define printf_filtered(...)            printf(__VA_ARGS__)
+#define printf_unfiltered(...)          printf(__VA_ARGS__)
+#define fprintf_unfiltered(STR, ...)    printf(__VA_ARGS__)
+#define internal_error(...)             abort()
+#endif
+
+
+/* Useful Boolean type and constants.  */
+typedef int Boolean;
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+
+/* Useful types for machine-related quantities.
+
+   N.B. the type ARC_RegisterNumber does not denote gdb register numbers;
+        instead, it denotes ARC processor hardware numbers, which are not
+        the same.  */
+
+typedef unsigned int           ARC_RegisterNumber;
+typedef unsigned int           ARC_RegisterContents;
+typedef unsigned int           ARC_Address;
+typedef unsigned long long int ARC_Doubleword;
+typedef unsigned int           ARC_Word;
+typedef unsigned short int     ARC_Halfword;
+typedef unsigned char          ARC_Byte;
+
+
+/* Types for machine-access functions.  */
+typedef Boolean (*ReadRegisterFunction)(ARC_RegisterNumber    hw_regno,
+                                        ARC_RegisterContents *contents,
+                                        Boolean               warn_on_failure);
+
+typedef Boolean (*WriteRegisterFunction)(ARC_RegisterNumber   hw_regno,
+                                         ARC_RegisterContents contents,
+                                         Boolean              warn_on_failure);
+
+
+typedef unsigned int (*MemoryTransferFunction)(ARC_Address  address,
+                                               ARC_Byte    *data,    /* May be not word-aligned.  */
+                                               unsigned int amount);
+
+typedef unsigned int (*MemoryFillFunction)    (ARC_Address  address,
+                                               ARC_Word     pattern,
+                                               unsigned int amount);
+
+typedef struct
+{
+    ReadRegisterFunction   read_core_register;
+    WriteRegisterFunction  write_core_register;
+    ReadRegisterFunction   read_auxiliary_register;
+    WriteRegisterFunction  write_auxiliary_register;
+    MemoryTransferFunction read_memory;
+    MemoryTransferFunction write_memory;
+    MemoryFillFunction     fill_memory;
+} TargetOperations;
+
+
+/* Sizes of machine quantities.  */
+#define BYTES_IN_WORD              4
+#define BYTES_IN_REGISTER          4
+#define BITS_IN_BYTE               8
+#define BITS_IN_WORD              32
+#define BITS_IN_ADDRESS           32
+#define BITS_IN_REGISTER          32
+
+
+/* Useful macros.  */
+#define ELEMENTS_IN_ARRAY(arr)           (unsigned int) (sizeof(arr) / sizeof(arr[0]))
+
+#define IS_WORD_ALIGNED(addr)  ((addr) % BYTES_IN_WORD == 0)
+
+
+#endif /* ARC_SUPPORT_H */
+/******************************************************************************/
diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index 8b54257..f912f89 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -1,1999 +1,2591 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
 
-   Authors: 
-      Soam Vasani <soam.vasani@codito.com>
-      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+   Authors:
+      Soam Vasani          <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+      Richard Stuckey      <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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 <string.h>
 
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module provides support for the ARC processor family's target     */
+/*     dependencies.  In particular, it has knowledge of the processor ABI.   */
+/*                                                                            */
+/*     See                                                                    */
+/*           ARCompact Instruction Set Architecture                           */
+/*                   Programmer's Reference                                   */
+/*                         (5115-018)                                         */
+/*                                                                            */
+/*     for a description of ARC processor architecture, and                   */
+/*                                                                            */
+/*           System V ABI Supplement                                          */
+/*                   4093-004                                                 */
+/*                                                                            */
+/*     for a complete definition of the ABI.                                  */
+/*                                                                            */
+/*                                                                            */
+/* Stack Frame Layout:                                                        */
+/*     This shows the layout of the stack frame for the general case of a     */
+/*     function call; a given function might not have a variable number of    */
+/*     arguments or local variables, or might not save any registers, so it   */
+/*     would not have the corresponding frame areas.  Additionally, a leaf    */
+/*     function (i.e. one which calls no other functions) does not need to    */
+/*     save the contents of the BLINK register (which holds its return        */
+/*     address), and a function might not have a frame pointer.               */
+/*                                                                            */
+/*     N.B. the stack grows downward, so SP points below FP in memory; SP     */
+/*          always points to the last used word on the stack, not the first   */
+/*          one.                                                              */
+/*                                                                            */
+/*                   |                       |   |                            */
+/*                   |      arg word N       |   | caller's                   */
+/*                   |           :           |   | frame                      */
+/*                   |      arg word 10      |   |                            */
+/*                   |      arg word 9       |   |                            */
+/*       old SP ---> |-----------------------| --                             */
+/*                   |   var arg word 8      |   |                            */
+/*                   |           :           |   |                            */
+/*                   |   var arg word P+1    |   |                            */
+/*                   |-----------------------|   |                            */
+/*                   |                       |   |                            */
+/*                   |      callee-saved     |   |                            */
+/*                   |        registers      |   |                            */
+/*                   |                       |   |                            */
+/*                   |-----------------------|   |                            */
+/*                   |      saved blink (*)  |   |                            */
+/*                   |-----------------------|   | callee's                   */
+/*                   |      saved FP         |   | frame                      */
+/*           FP ---> |-----------------------|   |                            */
+/*                   |                       |   |                            */
+/*                   |         local         |   |                            */
+/*                   |       variables       |   |                            */
+/*                   |                       |   |                            */
+/*                   |       register        |   |                            */
+/*                   |      spill area       |   |                            */
+/*                   |                       |   |                            */
+/*                   |     outgoing args     |   |                            */
+/*                   |                       |   |                            */
+/*           SP ---> |-----------------------| --                             */
+/*                   |                       |                                */
+/*                   |         unused        |                                */
+/*                   |                       |                                */
+/*                               |                                            */
+/*                               |                                            */
+/*                               V                                            */
+/*                           downwards                                        */
+/*                                                                            */
+/*     The list of arguments to be passed to a function is considered to be a */
+/*     sequence of N words (as though all the parameters were stored in order */
+/*     in memory with each parameter occupying an integral number of words).  */
+/*     Words 1 .. 8 are passed in registers 0 .. 7; if the function has more  */
+/*     than 8 words of arguments then words 9 .. N are passed on the stack in */
+/*     the caller's frame.                                                    */
+/*                                                                            */
+/*     If the function has a variable number of arguments, e.g. it has a form */
+/*     such as                                                                */
+/*                      function(p1, p2, ...);                                */
+/*                                                                            */
+/*     and P words are required to hold the values of the named parameters    */
+/*     (which are passed in registers 0 .. P-1), then the remaining 8 - P     */
+/*     words passed in registers P .. 7 are spilled into the top of the frame */
+/*     so that the anonymous parameter words occupy a continous region.       */
+/*                                                                            */
+/*     (*) if saved.                                                          */
+/*                                                                            */
+/* Usage:                                                                     */
+/*     The module exports a function _initialize_arc_tdep: the call to this   */
+/*     function is generated by the gdb build mechanism, so this function     */
+/*     should not be explicitly called.                                       */
+/*                                                                            */
+/*     The operations provided by this module are registered with gdb during  */
+/*     initialization; gdb then calls them via function pointers, rather than */
+/*     by name (this allows gdb to handle multiple target architectures):     */
+/*                                                                            */
+/*          set_gdbarch_XXX (gdbarch, <function>);                            */
+/*                                                                            */
+/*                                                                            */
+/* Build Configuration:                                                       */
+/*     The ARC gdb may be built in two different configurations, according to */
+/*     the nature of the target that it is to debug:                          */
+/*                                                                            */
+/*     1) arc-elf32:                                                          */
+/*           for debugging 'bare-metal' builds of user code (i.e. built with  */
+/*           newlib)                                                          */
+/*                                                                            */
+/*           ARC-specific modules:                                            */
+/*                arc-tdep                                                    */
+/*                arc-elf32-tdep                                              */
+/*                arc-xiss                                                    */
+/*                arc-jtag                                                    */
+/*                arc-jtag-ops                                                */
+/*                arc-jtag-actionpoints                                       */
+/*                arc-gpio                                                    */
+/*                arc-remote-fileio                                           */
+/*                arc-registers                                               */
+/*                arc-architecture                                            */
+/*                arc-board                                                   */
+/*                arc-arguments                                               */
+/*                arc-memory                                                  */
+/*                arc-inst-tracing                                            */
+/*                                                                            */
+/*     2) arc-linux-uclibc:                                                   */
+/*           for deugging user mode Linux applications, via communication to  */
+/*           the remote gdbserver process, running on Linux for ARC700        */
+/*                                                                            */
+/*           ARC-specific modules:                                            */
+/*                arc-tdep                                                    */
+/*                arc-linux-tdep                                              */
+/*                                                                            */
+/*     This module provides operations which are common to both; operations   */
+/*     which are specific to one, or which have different variants in each    */
+/*     configuration, are provided by the other modules.                      */
+/*                                                                            */
+/*                                                                            */
+/* Debug Targets:                                                             */
+/*     The ARC gdb supports a number of debug targets.  These are:            */
+/*                                                                            */
+/*         arc-elf32-gdb                                                      */
+/*             built-in simulator                       'target sim'          */
+/*             ARCangel 4 h/w emulator                  'target arcjtag'      */
+/*             dynamically loaded xISS simulator        'target arcxiss'      */
+/*             separately executing xISS simulator      'target remote'       */
+/*                                                                            */
+/*         arc-linux-uclibc-gdb                                               */
+/*             gdbserver running on ARC Linux           'target remote'       */
+/*                                                                            */
+/*     It should, in theory, be possible for either debugger to connect to    */
+/*     any remote target which supports the gdb Remote Serial Protocol.       */
+/*     However, any such target MUST agree with the debugger on the register  */
+/*     numbering scheme that is used, as this controls the order of register  */
+/*     contents held in the RSP 'G' (set all registers) packet and the 'g'    */
+/*     (get all registers) response packet, as well as the register numbers   */
+/*     used in the 'P' (set one register) and 'p' (get one register) packets, */
+/*     and in the 'T' stop reply packet.  The schemes used by each debugger   */
+/*     are defined in the arc-elf32-tdep and arc-linux-tdep modules.          */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <byteswap.h>
+
+/* gdb header files */
 #include "defs.h"
+#include "config.h"
 #include "arch-utils.h"
 #include "dis-asm.h"
-#include "gdbtypes.h"
 #include "frame.h"
 #include "frame-unwind.h"
-#include "target.h"
-#include "breakpoint.h"
 #include "inferior.h"
 #include "regcache.h"
 #include "reggroups.h"
 #include "trad-frame.h"
 #include "dwarf2-frame.h"
-#include "gdbtypes.h"
-#include "gdb_assert.h"
 #include "gdbcore.h"
 #include "observer.h"
 #include "osabi.h"
+#include "gdbcmd.h"
+#include "block.h"
+#include "dictionary.h"
+#include "language.h"
+#include "demangle.h"
+#include "objfiles.h"
+#include "gdb_assert.h"
+
+/* ARC header files */
+
+/* N.B. one and only one of ARC_ELF32_TARGET and ARC_LINUX_TARGET must be defined!  */
+
+#ifdef ARC_ELF32_TARGET
+#ifdef ARC_LINUX_TARGET
+#error ARC build is not correctly configured (both flags set)
+#else
+#include "config/arc/tm-embed.h"
+#endif
+#else
+#ifdef ARC_LINUX_TARGET
+#include "config/arc/tm-linux.h"
+#else
+#error ARC build is not correctly configured (no flag set)
+#endif
+#endif
 
 #include "opcode/arc.h"
-
+#include "opcodes/arc-dis.h"
+#include "opcodes/arc-ext.h"
+#include "opcodes/arcompact-dis.h"
+#include "arc-support.h"
 #include "arc-tdep.h"
 
 
-//#define ARC_DEBUG 1
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
 
-#if ARC_DEBUG
-#  define ENTERMSG printf ("--- entered %s:%s()\n", __FILE__, __FUNCTION__)
-#  define ENTERARGS(fmt, args...) printf ("--- entered %s:%s(" fmt ")\n", __FILE__, __FUNCTION__, args)
-#  define LEAVEMSG printf ("--- exited %s:%s()\n", __FILE__, __FUNCTION__)
-#else
-#  define ENTERMSG
-#  define ENTERARGS(fmt, args...) 
-#  define LEAVEMSG
-#endif
-
-#define ARC_STATUS32_A1 0x8
-#define ARC_STATUS32_A2 0x10
-#define ARC_STATUS32_AE 0x20
-#define ARC_STATUS32_L  0x100
-
-
-static CORE_ADDR arc_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp);
-/* The frame unwind cache for the ARC 
- */
-
-struct arc_unwind_cache
+typedef struct
 {
-  /* blink offset in stack */
-  int blink_offset ;
+    const char  *name;
+    CORE_ADDR    address;
+    Boolean      is_argument;
+    Boolean      is_callee;
+    Boolean      is_array;
+    unsigned int size;
+    unsigned int element_size;
+} LocalVariable;
 
-  /* Caller's PC */
-  CORE_ADDR prev_pc;
 
-  
-  /* The stack pointer at the time this frame was created; i.e. the
-     caller's stack pointer when this function was called.  It is used
-     to identify this frame.  */
-  
-  CORE_ADDR prev_sp;
-  /* The frame base */
-  CORE_ADDR frame_base;
-  /* Frame size */
-  int framesize;
-  
-  /* offset of sp from the stack frame base */
-  LONGEST sp_offset;
-  /* offset of fp from the stack frame base */
-  LONGEST fp_offset;
-  /* Is this a leaf function */
-  int is_leaf ;
-  /* Is there a frame pointer */
-  int uses_fp;
-  
-  
-  /* Offsets for each register in the stack frame */
-  struct trad_frame_saved_reg *saved_regs;
-};
+/* The frame unwind cache for the ARC.  */
+
+typedef struct
+{
+    /* BLINK save location offset from previous SP (-ve value).  */
+    int blink_save_offset_from_prev_sp;
+
+    /* The stack pointer at the time this frame was created; i.e. the
+       caller's stack pointer when this function was called.  It is used
+       to identify this frame.  */
+    CORE_ADDR prev_sp;
+
+    /* The frame base (as held in FP).
+       N.B. this is NOT the address of the lowest word in the frame!  */
+    CORE_ADDR frame_base;
+
+    /* Change in SP from previous SP (-ve value) - this is computed by scanning
+       the prologue of the function: initially 0, it is updated for each
+       instruction which changes SP (either explicitly by a subtraction from SP
+       or implicitly by a push operation), so at each point in the prologue it
+       gives the difference between the previous SP (i.e. before the function
+       was called) and the current SP at that point; at the end of the prologue
+       it holds the total change in SP, i.e. the size of the frame.  */
+    LONGEST delta_sp;
+
+    /* Offset of old stack pointer from frame base (+ve value).  */
+    LONGEST old_sp_offset_from_fp;
+
+    /* Is this a leaf function? */
+    Boolean is_leaf;
+    /* Is there a frame pointer? */
+    Boolean uses_fp;
+
+    /* Offsets for each register in the stack frame.  */
+    struct trad_frame_saved_reg *saved_regs;
+    unsigned int                 saved_regs_mask;
+} UnwindCache;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define DEBUG_COMMAND               "arc-debug"
+#define SHOW_FRAME_COMMAND          "arc-show-frame"
+#define SHOW_FRAME_COMMAND_USAGE    "Usage: " SHOW_FRAME_COMMAND " [ <FRAME> ]\n"
+
+#define NEW_LINE                     _("\n")
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* Global debug flag.  */
+Boolean arc_debug_target;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define WORD_ALIGNED(addr)         ((addr) & ~(BYTES_IN_WORD - 1))
+#define WORDS_OCCUPIED(bytes)      (((bytes) + BYTES_IN_WORD - 1) / BYTES_IN_WORD)
+#define ROUND_UP_TO_WORDS(bytes)   (WORDS_OCCUPIED(bytes) * BYTES_IN_WORD)
 
 
 
+/* Macros to be used with disassembling the prologue and update the frame info.
+   The *FI macros are to update the frame info and the ACT macros are to
+   actually do the action on a corresponding match.  */
 
-/* Function Prototypes */
+#define IS_INSTRUCTION(insn_name, search_string)    !strcmp(insn_name, search_string)
 
-static CORE_ADDR arc_unwind_sp (struct gdbarch *gdbarch, 
-			       struct frame_info *next_frame);
-
-static CORE_ADDR arc_unwind_pc (struct gdbarch *gdbarch, 
-			       struct frame_info *next_frame);
-
-static struct arc_unwind_cache * arc_frame_unwind_cache (struct frame_info *next_frame, 
-							 void ** this_prologue);
-
-static CORE_ADDR arc_scan_prologue (CORE_ADDR pc, 
-				     struct frame_info *next_frame,
-				     struct arc_unwind_cache *info);
+#define CHECK_OPERAND_STRING_AND_ACT(target_check, search_string, action) \
+    if (strstr(target_check, search_string) == target_check)              \
+    {                                                                     \
+        action;                                                           \
+        return TRUE;                                                      \
+    }
 
 
-static int arc_binutils_reg_to_regnum (int reg);
+/* The frame info changes by changing the decrementing the delta_sp and setting
+   the leaf function flag to be False (if this function prologue is saving blink
+   then it must be going to call another function - so it can not be a leaf!);
+   also the offset of the blink register save location from the previous value
+   of sp is recorded.  This will eventually used to compute the address of the
+   save location:
 
-extern struct arcDisState arcAnalyzeInstr (  bfd_vma address,disassemble_info* info );
-extern struct arcDisState a4AnalyzeInstr (  bfd_vma address,disassemble_info* info );
+           <blink saved address> = <prev sp> + <blink offset from prev sp>
 
-/* defined in opcodes, but there's no header file with this prototype... */
-disassembler_ftype arcompact_get_disassembler (void *);
+   The addition (+=) below is because the sp offset and the instruction offset
+   are negative - so incrementing the sp offset by the instruction offset is
+   actually making the sp offset more negative, correctly reflecting that SP
+   is moving further down the downwards-growing stack.  */
 
-/*  Standard register type for the ARC platform . 
- *  It would be builtin_type_uint32 until 
- *  we consider the DSP extensions 
- */
+#define PUSH_BLINK(offset)                                           \
+    {                                                                \
+        info->delta_sp += offset;                                    \
+        info->blink_save_offset_from_prev_sp = (int) info->delta_sp; \
+        info->is_leaf = FALSE;                                       \
+    }
+
+#define PUSH_BLINK_ACT                          \
+    do {                                        \
+           if (info) PUSH_BLINK(instr->_offset) \
+       } while (0);
+
+
+#define IS_PUSH_BLINK_FI(state) CHECK_OPERAND_STRING_AND_ACT(state->operandBuffer, "blink", PUSH_BLINK_ACT)
+
+
+/* At the point that that FP is pushed onto the stack (so saving the dynamic
+   link chain pointer to the previous frame), at the address that will be the
+   base of the new frame, we know the offset of SP from the previous SP - so the
+   offset of the old SP from the new frame base is known (the -ve delta_sp is
+   negated to give the +ve old_sp_offset_from_fp).  */
+#define PUSH_FP_ACT  do {                                                       \
+                            if (info)                                           \
+                            {                                                   \
+                                 info->delta_sp += instr->_offset;              \
+                                 info->old_sp_offset_from_fp = -info->delta_sp; \
+                        }} while (0);
+
+#define IS_PUSH_FP_FI(state) CHECK_OPERAND_STRING_AND_ACT(state->operandBuffer, "fp", PUSH_FP_ACT)
+
+
+#define UPDATE_FP_ACT    do {                         \
+                             if (info)                \
+                                info->uses_fp = TRUE; \
+                          } while (0);
+
+#define IS_UPDATE_FP_FI(state)                                                    \
+   if (IS_INSTRUCTION(state->instrBuffer, "mov"))                                 \
+   {                                                                              \
+      CHECK_OPERAND_STRING_AND_ACT(state->operandBuffer, "fp,sp", UPDATE_FP_ACT); \
+   }
+
+
+#define UPDATE_STACK_SPACE(state)    do {                                                 \
+                                       if (info) {                                        \
+                                          /* Eat up sp,sp.  */                            \
+                                          int immediate = atoi(state->operandBuffer + 6); \
+                                          info->delta_sp -= immediate;                    \
+                                      }} while (0);
+
+
+#define IS_SUB_SP_FI(state)                                                                    \
+    if (IS_INSTRUCTION(state->instrBuffer, "sub") ||                                           \
+        IS_INSTRUCTION(state->instrBuffer, "sub_s"))                                           \
+    {                                                                                          \
+        CHECK_OPERAND_STRING_AND_ACT(state->operandBuffer, "sp,sp", UPDATE_STACK_SPACE(state)) \
+    }
+
+
+/* -------------------------------------------------------------------------- */
+/*                              forward declarations                          */
+/* -------------------------------------------------------------------------- */
+
+static CORE_ADDR scan_prologue (CORE_ADDR          entrypoint,
+                                struct frame_info *next_frame,
+                                UnwindCache       *info);
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local debug functions                        */
+/* -------------------------------------------------------------------------- */
+
+/* Print information for a frame.  */
+
+static void
+printFrameInfo (const char  *message,
+                UnwindCache *info,
+                Boolean      addresses_known)
+{
+    unsigned int i;
+
+    DEBUG("-------------------\n");
+    DEBUG("%s (info = %p)\n",     message, info);
+    DEBUG("prev_sp               = %lx\n", (long unsigned int) info->prev_sp);
+    DEBUG("frame_base            = %lx\n", (long unsigned int) info->frame_base);
+    DEBUG("blink offset          = %d\n",                      info->blink_save_offset_from_prev_sp);
+    DEBUG("delta_sp              = %d\n",  (int)               info->delta_sp);
+    DEBUG("old_sp_offset_from_fp = %d\n",  (int)               info->old_sp_offset_from_fp);
+    DEBUG("is_leaf = %d, uses_fp = %d\n", info->is_leaf, info->uses_fp);
+
+     for (i = ARC_ABI_FIRST_CALLEE_SAVED_REGISTER; i < ARC_ABI_LAST_CALLEE_SAVED_REGISTER; i++)
+     {
+        if (info->saved_regs_mask & (1 << i))
+            DEBUG("saved register R%02d %s 0x%lx\n",
+                  i,
+                  (addresses_known) ? "address" : "offset",
+                  (unsigned long) info->saved_regs[i].addr);
+    }
+    DEBUG("-------------------\n");
+}
+
+
+static const char*
+ARC_Debugger_OperandType_Image (enum ARC_Debugger_OperandType value)
+{
+    switch (value)
+    {
+        case ARC_LIMM          : return "LIMM";
+        case ARC_SHIMM         : return "SHIMM";
+        case ARC_REGISTER      : return "REGISTER";
+        case ARCOMPACT_REGISTER: return "COMPACT REGISTER";
+        case ARC_UNDEFINED     : return "UNDEFINED";
+    }
+    return "?";
+}
+
+
+/* Print the instruction state returned by the disassembler.
+   Used for internal debugging only.  */
+
+static void
+printInsnState (struct arcDisState state)
+{
+    DEBUG("---------------------------------\n");
+    DEBUG("Instruction Length %d\n",          state.instructionLen);
+    DEBUG("Opcode [0x%x] : Cond [%x]\n",      state._opcode, state._cond);
+    DEBUG("Words 1 [%lx] : 2 [%lx]\n",        state.words[0], state.words[1]);
+    DEBUG("Ea present [%x] : memload [%x]\n", state._ea_present, state._mem_load);
+    DEBUG("Load Length [%d]:\n",              state._load_len);
+    DEBUG("Address Writeback [%d]\n",         state._addrWriteBack);
+    DEBUG("EA reg1 is [%x] offset [%x]\n",    state.ea_reg1, state._offset);
+    DEBUG("EA reg2 is [%x]\n",                state.ea_reg2);
+    DEBUG("Instr   buffer is %s\n",           state.instrBuffer);
+    DEBUG("Operand buffer is %s\n",           state.operandBuffer);
+    DEBUG("SourceType is %s\n",               ARC_Debugger_OperandType_Image(state.sourceType));
+    DEBUG("Source operand is %u\n",           state.source_operand.registerNum);   /* All fields of the union have same type.  */
+    DEBUG("Flow is %d\n",                     state.flow);
+    DEBUG("Branch is %d\n",                   state.isBranch);
+    DEBUG("---------------------------------\n");
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                     local functions for the disassembler                   */
+/* -------------------------------------------------------------------------- */
+
+/* Wrapper for the target_read_memory function.  */
+
+static int
+read_memory_for_disassembler (bfd_vma                  memaddr,
+                              bfd_byte                *myaddr,
+                              unsigned int             length,
+                              struct disassemble_info *info)    // unused
+{
+    return target_read_memory((CORE_ADDR) memaddr, (gdb_byte*) myaddr, (int) length);
+}
+
+
+/* This is a callback function which gets called by gdb whenever the current
+   object file changes.  */
+
+static void
+set_disassembler (struct objfile *objfile)
+{
+    if (objfile)
+    {
+       /* The ARC libopcodes wants obfd so that it can find out what CPU
+          extensions are defined in the file.  */
+        set_gdbarch_print_insn(current_gdbarch, arcompact_get_disassembler(objfile->obfd));
+//      dump_ARC_extmap();
+    }
+}
+
+
+/* This function is supplied to gdb as the disassembler until such time as we do
+   have a disassembler available.  */
+
+static int
+dummy_disassembler (bfd_vma address, disassemble_info *info)
+{
+    error(_("No disassembly operation yet available (no executable file loaded)"));
+    return 0;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*               local functions for decoding call chains                     */
+/* -------------------------------------------------------------------------- */
+
+/* Simple utility function to create a new frame cache structure.  */
+
+static UnwindCache*
+create_cache (struct frame_info *next_frame)
+{
+    UnwindCache *cache = FRAME_OBSTACK_ZALLOC (UnwindCache);
+
+    /* Zero all fields.  */
+    cache->blink_save_offset_from_prev_sp = 0;
+    cache->prev_sp                        = 0;
+    cache->frame_base                     = 0;
+    cache->delta_sp                       = 0;
+    cache->old_sp_offset_from_fp          = 0;
+    cache->is_leaf                        = FALSE;
+    cache->uses_fp                        = FALSE;
+
+    /* Allocate space for saved register info.  */
+    cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+
+    return cache;
+}
+
+
+/* Compute the previous frame's stack pointer (which is also the frame's ID's
+   stack address), and this frame's base pointer.  */
+
+static void
+find_previous_stack_pointer (UnwindCache       *info,
+                             struct frame_info *next_frame)
+{
+    ENTERARGS("next_frame = %p", next_frame);
+
+    /* If the frame has a frame pointer.  */
+    if (info->uses_fp)
+    {
+        ULONGEST     this_base;
+        unsigned int i;
+
+        /* The SP was moved to the FP. This indicates that a new frame
+           was created. Get THIS frame's FP value by unwinding it from
+           the next frame. The old contents of FP were saved in the location
+           at the base of this frame, so this also gives us the address of
+           the FP save location.  */
+	this_base = frame_unwind_register_unsigned(next_frame, ARC_FP_REGNUM);
+        info->frame_base                     = (CORE_ADDR) this_base;
+        info->saved_regs[ARC_FP_REGNUM].addr = (long long) this_base;
+
+        /* The previous SP is the current frame base + the difference between
+           that frame base and the previous SP.  */
+        info->prev_sp = info->frame_base + (CORE_ADDR) info->old_sp_offset_from_fp;
+
+        for (i = ARC_ABI_FIRST_CALLEE_SAVED_REGISTER; i < ARC_ABI_LAST_CALLEE_SAVED_REGISTER; i++)
+        {
+            /* If this register has been saved, add the previous stack pointer
+               to the offset from the previous stack pointer at which the
+               register was saved, so giving the address at which it was saved.  */
+            if (info->saved_regs_mask & (1 << i))
+            {
+                info->saved_regs[i].addr += info->prev_sp;
+
+#ifdef DUMP_SAVED_REGISTERS
+                /* This is a really useful debugging aid: we can debug a test
+                   program which loads known values into the callee-saved
+                   registers, then calls another function which uses those
+                   registers (and hence must save them) then hits a breakpoint;
+                   traversing the stack chain (e.g. with the 'where' command)
+                   should then execute this code, and we should see those known
+                   values being dumped, so showing that we have got the right
+                   addresses for the save locations!  */
+                {
+                    unsigned int contents;
+
+                    DEBUG("saved R%02d is at 0x%lx\n", i, (long unsigned int) info->saved_regs[i].addr);
+
+                    if (target_read_memory((CORE_ADDR) info->saved_regs[i].addr,
+                                           (gdb_byte*) &contents,
+                                           BYTES_IN_REGISTER) == 0)
+                    {
+                        DEBUG("saved R%02d contents: 0x%0x\n", i, contents);
+                    }
+                }
+#endif
+            }
+        }
+    }
+    else
+    {
+        ULONGEST this_sp;
+
+        /* Get the stack pointer for this frame by getting the saved SP
+           from the next frame.  */
+ 	this_sp = frame_unwind_register_unsigned (next_frame, ARC_SP_REGNUM);
+
+        /* The previous SP is this frame's SP plus the known difference between
+           the previous SP and this frame's SP (the delta_sp is negated as it is
+           a negative quantity).  */
+        info->prev_sp = (CORE_ADDR) (this_sp + (ULONGEST) (-info->delta_sp));
+
+        /* Assume that the FP is this frame's SP.  */
+        info->frame_base = (CORE_ADDR) this_sp;
+    }
+
+    /* If the function owning this frame is not a leaf function.  */
+    if (!info->is_leaf)
+    {
+        /* Usually blink is saved above the callee save registers and below the
+           space created for variable arguments. The quantity
+
+                    info->blink_save_offset_from_prev_sp
+
+           is negative, so adding it to the the previous SP gives the address of
+           a location further down the stack from that SP.  */
+        info->saved_regs[ARC_BLINK_REGNUM].addr =
+            (LONGEST) (info->prev_sp + info->blink_save_offset_from_prev_sp);
+    }
+}
+
+
+/* The workhorse : frame_unwind_cache for the ARC700 target.  */
+
+static UnwindCache *
+frame_unwind_cache (struct frame_info *next_frame,
+                    void             **this_prologue_cache)
+{
+    ENTERMSG;
+
+    if ((*this_prologue_cache) == NULL)
+    {
+        CORE_ADDR    entrypoint = frame_func_unwind(next_frame, NORMAL_FRAME);
+        UnwindCache *cache      = create_cache(next_frame);
+
+        /* Return the newly-created cache.  */
+        *this_prologue_cache = cache;
+
+        /* Prologue analysis does the rest... */
+
+        /* Currently our scan prologue does not support getting input for the
+           frame unwinder.  */
+        (void) scan_prologue(entrypoint, next_frame, cache);
+    }
+
+    return *this_prologue_cache;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*               local functions for decoding function prologues              */
+/* -------------------------------------------------------------------------- */
+
+/* This function determines whether the given register, which is being saved
+   by a function prologue on the stack at a known offset from the current SP,
+   is a callee-saved register.  If it is, the information in the frame unwind
+   cache is updated.  */
+
+static Boolean
+is_callee_saved_register (unsigned int  reg,
+                          int           offset,
+                          UnwindCache * info)
+{
+    if (ARC_ABI_FIRST_CALLEE_SAVED_REGISTER <= reg && reg <= ARC_ABI_LAST_CALLEE_SAVED_REGISTER)
+    {
+        DEBUG("register R%02u saved\n", reg);
+
+        if (info)
+        {
+            /* We can not determine the address of the location in the stack
+               frame in which the register was saved, as we do not (yet) know
+               the frame or stack pointers for the frame; so the most we can do
+               is to record the offset from the old SP of that location, which
+               we can compute as we know the offset of SP from the old SP, and
+               the offset of the location from SP (which is the offset in the
+               store instruction).
+
+               N.B. the stack grows downward, so the store offset is positive,
+                    but the delta-SP is negative, so the save offset is also
+                    negative.
+
+                                             |            |
+                              old sp ------> |------------|
+                            /                |            |  \
+                            :                |            |  :
+                            :                |            |  :    -ve
+                            :                |            |  : save offset
+                            :                |------------|  :
+                    -ve     :                |  save loc  |  /
+                  delta sp  :                |------------| <--- store address
+                            :            /   |            |
+                            :     +ve    :   |            |
+                            :    store   :   |            |
+                            :    offset  :   |            |
+                            \            \   |            |
+                              sp' ---------> |            |
+                                             |            |
+                                             |            |
+                                             |------------| <---- frame base
+                                             |            |
+                                             |            |
+                                             |            |
+                                             |     |      |
+                                                   |
+                                                   V
+                                               downwards
+
+               where sp' is the stack pointer at the current point in the code */
+
+            info->saved_regs[reg].addr = info->delta_sp + offset;
+
+            /* We now know that this register has been saved, so set the
+               corresponding bit in the save mask.  */
+            info->saved_regs_mask |= (1 << reg);
+
+            printFrameInfo("after callee register save", info, FALSE);
+
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+
+/* This function determines whether the given disassembled instruction may be
+   part of a function prologue.  If it is, the information in the frame unwind
+   cache may be updated.  */
+
+static Boolean
+is_in_prologue (UnwindCache *info, struct arcDisState *instr)
+{
+    /* Might be a push or a pop */
+    if (instr->_opcode == 0x3)
+    {
+        if (instr->_addrWriteBack != (char) 0)
+        {
+            /* This is a st.a instruction.  */
+            if (instr->ea_reg1 == ARC_ABI_STACK_POINTER)
+            {
+                if (instr->_offset == -4)
+                {
+                    /* This is a push something at SP.  */
+                    /* Is it a push of the blink?  */
+                    IS_PUSH_BLINK_FI(instr);
+
+                    /* Is it a push for fp?  */
+                    IS_PUSH_FP_FI(instr);
+                }
+                else
+                {
+                    if (instr->sourceType == ARC_REGISTER )
+                    {
+                        /* st.a <reg>, [sp,<offset>] */
+
+                        if (is_callee_saved_register(instr->source_operand.registerNum,
+                                                     instr->_offset,
+                                                     info))
+                        {
+                            /* This is a push onto the stack, so change delta_sp.  */
+                            info->delta_sp += instr->_offset;
+                            return TRUE;
+                        }
+                    }
+                }
+           }
+        }
+        else
+        {
+            if (instr->sourceType == ARC_REGISTER )
+            {
+                /* Is this a store of some register onto the stack using the
+                   stack pointer?  */
+                if (instr->ea_reg1 == ARC_ABI_STACK_POINTER)
+                {
+                    /* st <reg>, [sp,offset] */
+
+                    if (is_callee_saved_register(instr->source_operand.registerNum,
+                                                 instr->_offset,
+                                                 info))
+                        /* This is NOT a push onto the stack, so do not change delta_sp.  */
+                        return TRUE;
+                }
+
+                /* Is this the store of some register on the stack using the
+                   frame pointer? We check for argument registers getting saved
+                   and restored.  */
+                if (instr->ea_reg1 == ARC_ABI_FRAME_POINTER)
+                {
+                    if (IS_ARGUMENT_REGISTER(instr->source_operand.registerNum))
+                    {
+                        /* Saving argument registers. Don't set the bits in the
+                           saved mask, just skip.  */
+                        return TRUE;
+                    }
+                }
+            }
+        }
+    }
+
+    else if (instr->_opcode == 0x4)
+    {
+        /* A major opcode 0x4 instruction.  */
+        /* We are usually interested in a mov or a sub.  */
+        IS_UPDATE_FP_FI(instr);
+        IS_SUB_SP_FI(instr);
+    }
+
+    else if (instr->_opcode == 0x18)
+    {
+        /* sub_s sp,sp,constant */
+        IS_SUB_SP_FI(instr);
+
+        /* push_s blink */
+        if (strcmp(instr->instrBuffer, "push_s") == 0)
+        {
+            if (strcmp(instr->operandBuffer, "blink") == 0)
+            {
+                if (info)
+                {
+                    /* SP is decremented by the push_s instruction (before it
+                       stores blink at the stack location addressed by SP).  */
+                    PUSH_BLINK(-BYTES_IN_REGISTER)
+                }
+                return TRUE;
+            }
+        }
+        else if (strcmp(instr->instrBuffer, "st_s") == 0)
+        {
+            unsigned int reg;
+            int          offset;
+
+            if (sscanf(instr->operandBuffer, "r%u,[sp,%d]", &reg, &offset) == 2)
+            {
+                /* st_s <reg>,[sp,<offset>] */
+
+                if (is_callee_saved_register(reg, offset, info))
+                    /* This is NOT a push onto the stack, so do not change delta_sp.  */
+                    return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+
+/* Scan the prologue and update the corresponding frame cache for the frame
+   unwinder for unwinding frames without debug info. In such a situation GDB
+   attempts to parse the prologue for this purpose. This currently would attempt
+   to parse the prologue generated by our gcc 2.95 compiler (we should support
+   Metaware generated binaries at some suitable point of time).
+
+   This function is called with:
+      entrypoint : the address of the functon entry point
+      next_frame : the next frame to be filled in (if need be)
+      info       : the existing cached info.
+
+   Returns: the address of the first instruction after the prologue.
+
+   This function is called by our unwinder as well as from arc_skip_prologue
+   in the case that it cannot detect the end of the prologue.
+
+   'next_frame' and 'info' are NULL if this function is called from
+   arc_skip_prologue in an attempt to discover the end of the prologue.
+   In this case we don't fill in the 'info' structure that is passed in.
+
+   TODOs:
+      1. Support 32 bit normal frames generated by GCC 2.95
+      2. Support 16 and 32 bit mixed frames generated by GCC 2.95
+      3. Support 32 bit normal variadic function frames by GCC 2.95
+      4. Support 32 bit normal frames from GCC 3.4.x with variadic args
+      5. Support 16 and 32 bit normal frames from GCC 3.4.x with variadic args
+      6. Support 16 and 32 bit mixed frames generated by GCC 3.4.x
+      7. Support Metaware generated prologues
+           (The difference is in the use of thunks to identify the saving and
+            restoring of callee saves: may have to do some hackery even in
+            next_pc, since the call is going to create its own set of problems
+            with our stack setup).
+
+   We attempt to use the disassembler interface from the opcodes library to do
+   our disassembling.
+
+   The usual 32 bit normal gcc -O0 prologue looks like this:
+
+   Complete Prologue for all GCC frames (Cases #1 to #6 in TODOs above):
+
+      sub  sp, sp, limm         ; space for variadic arguments
+      st.a blink, [sp,-4]       ; push blink (if not a leaf function) - decrements sp
+      sub  sp, sp , limm        ; (optional space creation for callee saves)
+      st   r13, [sp]            ; push of first callee saved register
+      st   r14, [sp,4]          ; push of next callee saved register
+      ...
+      st.a fp , [sp,-4]         ; push fp (if fp has to be saved) - decrements sp
+      mov  fp , sp              ; set the current frame up correctly
+      sub  sp , sp , #immediate ; create space for local vars on the stack   */
+
+/* 3 instructions before and after callee saves, and max number of saves; assume each is 4-byte inst.  */
+#define MAX_PROLOGUE_LENGTH   ((6 + (ARC_ABI_LAST_CALLEE_SAVED_REGISTER - ARC_ABI_FIRST_CALLEE_SAVED_REGISTER + 1)) * 4)
+
+static CORE_ADDR
+scan_prologue (CORE_ADDR          entrypoint,
+               struct frame_info *next_frame,
+               UnwindCache       *info)
+{
+    ENTERARGS("next_frame = %p, info = %p", next_frame, info);
+
+    {
+        /* Will be set to end of prologue.  */
+        CORE_ADDR               prologue_ends_pc = entrypoint;
+        struct disassemble_info di;
+
+        /* An arbitrary limit on the length of the prologue. If next_frame is
+           NULL this means that there was no debug info and we are called from
+           arc_skip_prologue; otherwise, if we know the frame, we can find the
+           pc within the function.
+
+           N.B. that pc will usually be after the end of the prologue, but
+                it could actually be within the prologue (i.e. execution has
+                halted within the prologue, e.g. at a breakpoint); in that
+                case, do NOT go beyond that pc, as the instructions at the
+                pc and after have not been executed yet, so have had no effect!  */
+        CORE_ADDR final_pc = (next_frame) ? frame_pc_unwind(next_frame)
+                                          : entrypoint + MAX_PROLOGUE_LENGTH;
+
+        if (info)
+        {
+            /* Assume that the function is a leaf function until we find out
+               that it is not (i.e. when we find the 'push blink' instruction
+               in the prologue).  */
+            info->is_leaf = TRUE;
+
+            /* No registers known to be saved, as yet.  */
+            info->saved_regs_mask = 0;
+        }
+
+        /* Initializations to use the opcodes library.  */
+        arc_initialize_disassembler(&di);
+
+        DEBUG("Prologue PC: %lx\n", (unsigned long) prologue_ends_pc);
+        DEBUG("Final    PC: %lx\n", (unsigned long) final_pc);
+
+        /* Look at each instruction in the prologue.  */
+        while (prologue_ends_pc < final_pc)
+        {
+            struct arcDisState current_instr = arcAnalyzeInstr(prologue_ends_pc, &di);
+
+            printInsnState(current_instr);
+
+            /* If this instruction is in the prologue, fields in the info will be updated,
+               and the saved registers mask may be updated.  */
+            if (!is_in_prologue(info, &current_instr))
+            {
+                /* Found a instruction that is not in the prologue.  */
+                DEBUG("End of Prologue reached \n");
+                break;
+            }
+
+            prologue_ends_pc += current_instr.instructionLen;
+        }
+
+        /* Means we were not called from arc_skip_prologue.  */
+        if (!((next_frame == NULL) && (info == NULL)))
+        {
+            printFrameInfo("after prologue", info, FALSE);
+
+            find_previous_stack_pointer(info, next_frame);
+
+            /* The PC is found in blink (the actual register or located on the stack).  */
+            info->saved_regs[ARC_PC_REGNUM] = info->saved_regs[ARC_BLINK_REGNUM];
+
+            printFrameInfo("after previous SP found", info, TRUE);
+        }
+
+        return prologue_ends_pc;
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*              local functions for handling function return values           */
+/* -------------------------------------------------------------------------- */
+
+/* This function gets the return value of a function from the registers used to
+   return it, according to the convention used by the ABI.
+
+   Parameters:
+      type     : the information for the return type of the function
+      regcache : the register cache holding the register contents
+      valbuf   : a buffer to be filled with the return value
+*/
+
+static void
+extract_return_value (struct type     *type,
+                      struct regcache *regcache,
+                      gdb_byte        *valbuf)
+
+{
+    unsigned int len = TYPE_LENGTH (type);
+
+    ENTERMSG;
+
+    if (len <= BYTES_IN_REGISTER)
+    {
+        ULONGEST val;
+
+        /* Get the return value from one register.  */
+        regcache_cooked_read_unsigned (regcache, ARC_ABI_RETURN_REGNUM, &val);
+        store_unsigned_integer (valbuf, (int) len, val);
+
+        DEBUG("returning 0x%08lX\n", (unsigned long) val);
+    }
+    else if (len <= BYTES_IN_REGISTER * 2)
+    {
+        ULONGEST low, high;
+
+        /* Get the return value from two registers.  */
+        regcache_cooked_read_unsigned (regcache, ARC_ABI_RETURN_LOW_REGNUM,  &low);
+        regcache_cooked_read_unsigned (regcache, ARC_ABI_RETURN_HIGH_REGNUM, &high);
+
+        store_unsigned_integer (valbuf,                     BYTES_IN_REGISTER,             low);
+        store_unsigned_integer (valbuf + BYTES_IN_REGISTER, (int) len - BYTES_IN_REGISTER, high);
+
+        DEBUG("returning 0x%08lX%08lX\n",
+              (unsigned long) high, (unsigned long) low);
+    }
+    else
+        error(_("%s: type length %u too large"), __FUNCTION__, len);
+}
+
+
+/* This function loads the return value of a function into the registers used to
+   return it, according to the convention used by the ABI.
+
+   Parameters:
+      type     : the information for the return type of the function
+      regcache : the register cache holding the register contents
+      valbuf   : a buffer holding the return value
+*/
+
+static void
+store_return_value (struct type     *type,
+                    struct regcache *regcache,
+                    const  gdb_byte *valbuf)
+{
+    unsigned int len = TYPE_LENGTH (type);
+
+    ENTERMSG;
+
+    if (len <= BYTES_IN_REGISTER)
+    {
+        ULONGEST val;
+
+        /* Put the return value into one register.  */
+        val = extract_unsigned_integer (valbuf, (int) len);
+        regcache_cooked_write_unsigned (regcache, ARC_ABI_RETURN_REGNUM, val);
+
+        DEBUG("storing 0x%08lX\n", (unsigned long) val);
+    }
+    else if (len <= BYTES_IN_REGISTER * 2)
+    {
+        ULONGEST low, high;
+
+        /* Put the return value into  two registers.  */
+        low  = extract_unsigned_integer (valbuf,                     BYTES_IN_REGISTER);
+        high = extract_unsigned_integer (valbuf + BYTES_IN_REGISTER, (int) len - BYTES_IN_REGISTER);
+
+        regcache_cooked_write_unsigned (regcache, ARC_ABI_RETURN_LOW_REGNUM,  low);
+        regcache_cooked_write_unsigned (regcache, ARC_ABI_RETURN_HIGH_REGNUM, high);
+
+        DEBUG("storing 0x%08lX%08lX\n",
+              (unsigned long) high, (unsigned long) low);
+    }
+    else
+        error(_("arc_store_return_value: type length too large."));
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                 local functions for handling the stack frame               */
+/* -------------------------------------------------------------------------- */
+
+/* This is copied from file stack.c in the gdb sources.
+   It identifies a frame from information (such as frame number) given by the
+   user (in the frame_exp parameter).  */
+
+static struct frame_info*
+parse_frame_specification_1 (const char *frame_exp,
+                             const char *message,
+                             int        *selected_frame_p)
+{
+    int           numargs = 0;
+    struct value *args[4];
+    CORE_ADDR     addrs[ARRAY_SIZE (args)];
+
+    if (frame_exp)
+    {
+        while (TRUE)
+        {
+            char           *addr_string;
+            struct cleanup *cleanup;
+            const char     *p;
+
+            /* Skip leading white space.  */
+            while (isspace (*frame_exp))
+                frame_exp++;
+
+            if (*frame_exp == '\0')
+                break;
+
+            /* Parse the argument, extract it, save it.  */
+            for (p = frame_exp; (*p != '\0') && !isspace (*p); p++);
+
+            addr_string = savestring (frame_exp, (size_t) (p - frame_exp));
+            frame_exp   = p;
+            cleanup     = make_cleanup (xfree, addr_string);
+
+            /* NOTE: Parse and evaluate expression, but do not use
+               functions such as parse_and_eval_long or
+               parse_and_eval_address to also extract the value.
+               Instead value_as_long and value_as_address are used.
+               This avoids problems with expressions that contain
+               side-effects.  */
+            if (numargs >= (int) ARRAY_SIZE (args))
+                error (_("Too many args in frame specification"));
+
+            args[numargs++] = parse_and_eval (addr_string);
+
+            do_cleanups (cleanup);
+        }
+    }
+
+    /* If no args, default to the selected frame.  */
+    if (numargs == 0)
+    {
+        if (selected_frame_p != NULL)
+            (*selected_frame_p) = 1;
+        return get_selected_frame (message);
+    }
+
+    /* None of the remaining use the selected frame.  */
+    if (selected_frame_p != NULL)
+        (*selected_frame_p) = 0;
+
+    /* Assume the single arg[0] is an integer, and try using that to
+       select a frame relative to current.  */
+    if (numargs == 1)
+    {
+        int                level = (int) value_as_long (args[0]);
+        struct frame_info *fid   = find_relative_frame (get_current_frame (), &level);
+
+        if (level == 0)
+            /* find_relative_frame was successful.  */
+            return fid;
+    }
+
+    /* Convert each value into a corresponding address.  */
+    {
+        int i;
+        for (i = 0; i < numargs; i++)
+            addrs[i] = value_as_address (args[i]);
+    }
+
+    /* Assume that the single arg[0] is an address, use that to identify
+       a frame with a matching ID.  Should this also accept stack/pc or
+       stack/pc/special.  */
+    if (numargs == 1)
+    {
+        struct frame_id id = frame_id_build_wild (addrs[0]);
+        struct frame_info *fid;
+
+        /* If (s)he specifies the frame with an address, he deserves
+           what (s)he gets.  Still, give the highest one that matches.
+           (NOTE: cagney/2004-10-29: Why highest, or outer-most, I don't
+           know).  */
+        for (fid = get_current_frame ();
+             fid != NULL;
+             fid = get_prev_frame (fid))
+        {
+            if (frame_id_eq (id, get_frame_id (fid)))
+            {
+                while (frame_id_eq (id, frame_unwind_id (fid)))
+                    fid = get_prev_frame (fid);
+                return fid;
+            }
+        }
+    }
+
+    /* We couldn't identify the frame as an existing frame, but
+       perhaps we can create one with a single argument.  */
+    if (numargs == 1)
+        return create_new_frame (addrs[0], 0);
+    else if (numargs == 2)
+        return create_new_frame (addrs[0], addrs[1]);
+    else
+        error (_("Too many args in frame specification"));
+}
+
+
+/* Return an array (and count) of the local variables and parameters declared
+   in the function which owns the given frame.
+
+   Parameters:
+      frame    : the frame information for the function
+      variables: a pointer to an existing array of variable information (may be NULL)
+      count    : (IN/OUT) the total number of variables found
+      callee   : TRUE if the function is a callee of another function
+
+   Result:
+      A pointer to an array containing one element for each parameter, and, if
+      'callee' is FALSE, each local variable, of the function.  */
+
+static LocalVariable*
+find_variables (struct frame_info *frame,
+                LocalVariable     *variables,
+                unsigned int      *count,
+                Boolean            callee)
+{
+    struct block *block = get_frame_block (frame, 0);
+    unsigned int  vars  = *count;
+
+    while (block)
+    {
+        struct dict_iterator iter;
+        struct symbol       *sym;
+
+        ALL_BLOCK_SYMBOLS (block, iter, sym)
+        {
+            Boolean   is_arg = (SYMBOL_CLASS(sym) == LOC_COMPUTED_ARG);
+            CORE_ADDR addr;
+
+            switch (SYMBOL_CLASS (sym))
+            {
+                case LOC_COMPUTED:
+                case LOC_COMPUTED_ARG:
+                    addr = SYMBOL_OPS (sym)->get_variable_address(sym, frame);
+
+                    /* For callees, we are only interested in the arguments.  */
+                    if ((addr != 0) && (!callee || is_arg))
+                    {
+                        struct type *type = SYMBOL_TYPE (sym);
+
+                        vars++;
+                        variables = xrealloc(variables, sizeof(LocalVariable) * vars);
+
+                        if (variables)
+                        {
+                            LocalVariable *var = &variables[vars - 1];
+
+                            var->name        = SYMBOL_PRINT_NAME (sym);
+                            var->address     = addr;
+                            var->is_callee   = callee;
+                            var->is_argument = is_arg;
+                            var->is_array    = (TYPE_CODE (type) == TYPE_CODE_ARRAY);
+                            var->size        = SYMBOL_OPS (sym)->get_variable_size(sym, frame);
+
+                            if (var->is_array)
+                                var->element_size = TYPE_LENGTH (TYPE_TARGET_TYPE (type));
+                        }
+                        else
+                        {
+                            *count = 0;
+                            return NULL;
+                        }
+                    }
+                    break;
+
+                default:
+                  /* Ignore symbols which are not locals.  */
+                  break;
+            }
+        }
+
+        /* After handling the function's top-level block, stop.  Don't continue
+           to its superblock, the block of per-file symbols.  */
+        if (BLOCK_FUNCTION (block))
+            break;
+        block = BLOCK_SUPERBLOCK (block);
+    }
+
+    *count = vars;
+    return variables;
+}
+
+
+/* Return an array (and count) of the local variables declared in the function
+   which owns the given frame, and also those declared in the function which is
+   the callee (if any) of that function in the current call chain.  */
+
+static LocalVariable*
+find_local_variables (struct frame_info *frame, unsigned int *count)
+{
+    struct frame_info *callee = get_next_frame(frame);
+    LocalVariable     *variables;
+
+    *count = 0;
+
+    variables = find_variables(frame, NULL, count, FALSE);
+
+    if (callee)
+        variables = find_variables(callee, variables, count, TRUE);
+
+    return variables;
+}
+
+
+/* Try to add the name of a local variable or function parameter to a line of
+   output, if a given address lies within the range of locations occupied by
+   that data item.
+
+   Parameters:
+      line                   : the line in which any output is to be placed
+      location               : the address of a location on the stack
+      variables              : an array of local variables and parameters
+      num_variables          : the number of elements in the array
+      is_following_element   : set to TRUE if the location lies within an
+                               array element, and it is not the 0th element
+      elements_are_word_sized: set to TRUE if the array element is word-sized
+
+   Returns TRUE if the given location holds a local variable or parameter
+   (i.e. information has been added to the line of output).  */
+
+static Boolean
+add_local_name (char          *line,
+                CORE_ADDR      location,
+                LocalVariable *variables,
+                unsigned int   num_variables,
+                Boolean       *is_following_element,
+                Boolean       *elements_are_word_sized)
+{
+    unsigned int i;
+
+    *is_following_element    = FALSE;
+    *elements_are_word_sized = FALSE;
+
+    /* Look at each of the local variables / parameters in the array.  */
+    for (i = 0; i < num_variables; i++)
+    {
+        LocalVariable *var   = &variables[i];
+        int            index = -1;
+
+        /* is the variable an array?  */
+        if (var->is_array)
+        {
+            /* If we know the size of the array, and the size of its elements. */
+            if (var->size > 0 && var->element_size > 0)
+            {
+                /* What is the offset of the given stack location from the start
+                   of the array?  */
+                int offset = (int) ((long int) location - (long int) var->address);
+
+                /* Does that offset actually lie within the array?  */
+                if (0 <= offset && offset < (int) var->size)
+                {
+                    /* Compute the index of the array element which contains the
+                       location.  */
+                    index = offset / var->element_size;
+                }
+
+                if (var->element_size == BYTES_IN_WORD)
+                    *elements_are_word_sized = FALSE;
+            }
+        }
+
+        /* If the variable starts in the given location, or the variable is an
+           array and one of its elements contains the location. */
+        if (var->address == location || index >= 0)
+        {
+            int n;
+
+            /* What is the variable?  */
+            if (var->is_callee)
+                n = sprintf(line, _("callee parameter"));
+            else if (var->is_argument)
+                n = sprintf(line, _("parameter"));
+            else
+                n = sprintf(line, _("local variable"));
+
+            line[n] = ' ';
+            n++;
+            n += sprintf(line + n, _("'%s'"),  var->name);
+            line[n] = ' ';
+
+            /* If it is an array element.  */
+            if (index >= 0)
+            {
+                /* Add the array element index to the output.  */
+                (void) sprintf(line + n, _("[%u]"), index);
+
+                /* Is it an element which follows another element?  */
+                *is_following_element = (index > 0);
+            }
+            else if (var->size > BYTES_IN_WORD)
+            {
+                /* It occupies more than one word.  */
+                (void) sprintf(line + n + 1, _("(%u words)"),
+                               WORDS_OCCUPIED(var->size));
+            }
+
+            return TRUE;
+        }
+     }
+
+    return FALSE;
+}
+
+
+/* Try to identify the given frame, and output that identification.  */
+
+static void
+identify_frame (struct frame_info *frame)
+{
+    enum language          func_lang = language_unknown;
+    char                  *func_name = NULL;
+    char                  *demangled = NULL;
+    struct symbol         *func;
+    struct symtab_and_line sal;
+
+    find_frame_sal (frame, &sal);
+    func = get_frame_function (frame);
+
+    /* Have we found the function owning the frame?  */
+    if (func)
+    {
+        func_name = DEPRECATED_SYMBOL_NAME (func);
+        func_lang = SYMBOL_LANGUAGE        (func);
+    }
+    else
+    {
+        struct minimal_symbol *msymbol;
+
+        /* Try to find the symbol most closely associated with the PC
+           corresponding to the frame.  */
+        msymbol = lookup_minimal_symbol_by_pc (get_frame_pc (frame));
+
+        if (msymbol != NULL)
+        {
+            func_name = DEPRECATED_SYMBOL_NAME (msymbol);
+            func_lang = SYMBOL_LANGUAGE        (msymbol);
+        }
+    }
+
+    /* Have we found a name?  */
+    if (func_name)
+    {
+        /* If user wants to see raw output, no problem.
+           (demangle is a global flag which can be set by user command).  */
+        if (demangle)
+        {
+            demangled = language_demangle (language_def (func_lang),
+                                           func_name,
+                                           DMGL_ANSI | DMGL_PARAMS);
+
+            /* If the demangler fails, try the demangled name from the symbol
+               table. That'll have parameters, but that's preferable to
+               displaying a mangled name.  */
+            if (demangled == NULL)
+            {
+                if (func == NULL)
+                    func_name = _("<unknown function>");
+                else
+                    func_name = SYMBOL_PRINT_NAME (func);
+            }
+            else
+                func_name = demangled;
+        }
+    }
+    else
+        func_name = _("<unknown function>");
+
+    printf_filtered(_("Frame of function: %s"), func_name);
+    if (sal.symtab)
+        printf_filtered(_(" (%s:%d)"), sal.symtab->filename, sal.line);
+    printf_filtered(NEW_LINE);
+
+    if (demangled != NULL)
+        xfree (demangled);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                       local functions called from gdb                      */
+/* -------------------------------------------------------------------------- */
+
+/*  Standard register type for the ARC platform.
+    It would be builtin_type_uint32 until we consider the DSP extensions.  */
 
 static struct type *
 arc_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  return builtin_type_uint32;
+    return builtin_type_uint32;
 }
 
 
-void printFrameInfo(struct arc_unwind_cache * info)
-{
-#ifdef ARC_DEBUG
-  printf("-------------------\n");
-  printf("%lx \n",info );
-  printf("prev_sp = %lx \n",info->prev_sp);
-  printf("prev_pc = %lx \n",info->prev_pc);
-  printf("frame_base is %lx \n",info->frame_base);
-  printf("framesize is %lx \n",info->framesize);
-  printf("Blink offset %lx \n",info->blink_offset);
-  printf("sp_offset = %lx \n",info->sp_offset );
-  printf("fp_offset is %lx \n",info->fp_offset);
-  printf("is_leaf = %d, uses_fp=%d",info->is_leaf, info->uses_fp);
-#endif
-}
-
-/* Print the instruction state returned 
-   by the disassembler . Used for internal
-   debugging only 
-*/
-
-void printInsnState(struct arcDisState state)
-{
-#ifdef ARC_DEBUG
-  printf("---------------------------------\n");
-  printf("Instruction Length %d\n", state.instructionLen);
-  printf("Opcode [0x%x] : Cond [%x]\n", state._opcode, state._cond);
-  printf("Words 1 [%lx] : 2 [%lx]\n", state.words[0], state.words[1]);
-  printf("ea present [%x] : memload [%x]\n", state._ea_present, state._mem_load);
-  printf("Load length [%d]:\n", state._load_len);
-  printf("Address writeback [%d]\n", state._addrWriteBack);
-  printf("ea reg1 is [%x] offset [%x] \n", state.ea_reg1, state._offset);
-  printf("ea reg2 is [%x] \n", state.ea_reg2);
-  printf("operands buffer is %s \n", state.operandBuffer);
-  printf("SourceType is %d \n",state.sourceType);
-  printf("Flow is %d\n",state.flow);
-  printf("Branch is %d,'%c'\n",state.isBranch, state.isBranch);
-#endif
-}
-
-
-/* Scan the prologue and update the 
- * corresponding frame cache for the frame unwinder for unwinding
- * frames without debug info . In such a situation GDB attempts to 
- * parse the prologue for this purpose . This currently would attempt
- * to parse the prologue generated by our gcc 2.95 .(We should support 
- * Metaware generated binaries at some suitable point of time )
- * This function is called with the pc where gdb stopped , the next_frame 
- * to be filled in (if need be?) and the existing cached info . 
-
- * scan_prologue is called by our unwinder as well 
- * as from skip_prologue in the case that it cannot detect 
- * the end of the prologue. next_frame is set to NULL if we are called from 
- * arc_skip_prologue in an attempt to discover the end of the prologue. In
- * such a case we don't fill the frame info that is passed to us :-)
-
- * Todos. 
- * 1. Support 32 bit normal frames generated by GCC 2.95 .
- * 2. Support 16 and 32 bit mixed frames generated by GCC 2.95
- * 3. Support 32 bit normal variadic function frames by GCC 2.95
- * 4. Support 32 bit normal frames from GCC 3.4.x with variadic args
- * 5. Support 16 and 32 bit normal frames from GCC 3.4.x with variadic args
- * 6. Support 16 and 32 bit mixed frames generated by GCC 3.4.x 
- * 7. Support Metaware generated prologues .( The difference is 
- * in the use of thunks to identify the saving and restoring of 
- * callee saves :-) May have to do some hackery even in next_pc. 
- * since the call is going to create its own set of problems 
- * with our stack setup :-( 
- * We attempt to use the disassembler interface from the opcodes
- * library to do our disassembling .
-
- * The usual 32 bit normal 
- * gcc -O0 prologue looks like this. 
-
- * Complete Prologue for all GCC frames (Cases #1 to #6 in Todos above)
-
- * sub  sp, sp, limm    ; space for variadic arguments.
- * st.a blink, [sp,-4]  ; push blink (if not a leaf function) 
- * sub  sp, sp , limm   ; (optional space creation for callee saves )
- * st   r13, [sp]    ; pushes of all callee saves.
- * st   r14, [sp,4]  ; pushes of more callee saves.
- * XXXX
- * st.a fp , [sp,-4]  ; push fp (if fp has to be saved ) 
- * mov  fp , sp ; Set the current frame up correctly 
- * sub  sp , sp , #immediate ; Create space for local vars on the stack.
- */
-
-
-
-/* Macros to be used with disassembling the prologue 
- * and update the frame info.The *FI macros are to update
- * the frame info and the ACT macros are to actually do the 
- * action on a corresponding match. 
- *
-*/
-#define CHECKOPDSTRING(targetcheck,searchstring)  \
-                               if(strstr(targetcheck,searchstring) == targetcheck)  \
-                                     {continue;}
-
-#define CHECKOPDSTRINGANDACT(targetcheck,searchstring,action)  \
-                               if(strstr(targetcheck,searchstring) == targetcheck)  \
-                                     {\
-                                       action;\
-				       continue;}
-
-
-/* The frame info changes by changing the decrementing
-   the sp_offset and setting the leaf function to be NIL; 
-   Also the offset of the blink register from the previous
-   value of sp is calculated. Finally this can be updated 
-   as 
-   info->blink_offset = info-> prev_sp + info->blink_offset ;
-   Also the addition below is coz the offsets are usually negative 
-*/
-
-#define PUSHBLINKACT do { \
-                          if(info) \
-                            {      \
-                              info->sp_offset += current_instr._offset; \
-                              info->blink_offset = info->sp_offset ; \
-                              info->is_leaf = 0;\
-                            }}while(0);
-                      
-
-#define ISPUSHBLINK(state) CHECKOPDSTRING(state.operandBuffer,"blink") 
-#define ISPUSHBLINKFI(state) CHECKOPDSTRINGANDACT(state.operandBuffer,"blink",PUSHBLINKACT) 
-
-
-#define PUSHFPACT    do { \
-                          if(info)  \
-                            {       \
-                               info->sp_offset += current_instr._offset ; \
-                               info->fp_offset = -info->sp_offset; \
-                            }}while(0);
-                             
-#define ISPUSHFP(state)    CHECKOPDSTRING(state.operandBuffer,"fp")
-#define ISPUSHFPFI(state)    CHECKOPDSTRINGANDACT(state.operandBuffer,"fp",PUSHFPACT)
-#define ISINSTRUCTION(insnname,searchstring)    !strcmp(insnname,searchstring)
-
-
-
-#define UPDATEFPACT    do {\
-                             if(info) {\
-					 info->uses_fp = 1;\
-			       }}while(0);
-
-
-
-#define ISUPDATEFPFI(state)  \
- if(ISINSTRUCTION(state.instrBuffer,"mov")) \
-{ \
-  CHECKOPDSTRINGANDACT(state.operandBuffer,"fp,sp",UPDATEFPACT); \
-}
-
-
-
-#define ISUPDATEFP(state)  \
- if(ISINSTRUCTION(state.instrBuffer,"mov")) \
-{ \
-  CHECKOPDSTRING(state.operandBuffer,"fp,sp") \
-}
-
-
-
-#define ISSUBSP(state)   \
-if(ISINSTRUCTION(state.instrBuffer,"sub"))\
-{ \
-  CHECKOPDSTRING(state.operandBuffer,"sp,sp") \
-}
-
-#define UPDATESTACKSPACE(state) do { \
-                                 if(info){ \
-/* Eat up sp,sp */  \
-                                      int tmp = atoi(state.operandBuffer + 6); \
-                                      info->sp_offset -= tmp; \
-                                        }}while(0);
-
-
-#define ISSUBSPFI(state)   \
-if(ISINSTRUCTION(state.instrBuffer,"sub") \
-   || ISINSTRUCTION(state.instrBuffer,"sub_s"))\
-{ \
-  CHECKOPDSTRINGANDACT(state.operandBuffer,"sp,sp",UPDATESTACKSPACE(state)) \
-}
-
-/*Function to scan the prologue of a A4 binary
-
-ARCtangent-A4 Prolog
- The stack back-trace data structure is a 16-byte structure which is
-  used to save the return register (blink, 4 bytes), the frame pointer
-  register (fp, 4-bytes) and 8-bytes is reserved.
- 
- The compiler-generated prolog code does the following:
-  --> Allocates space for register arguments in case of variadic function
-        (functions with variable argument lists)
-  --> Saves the return address register (blink)
-  --> Saves the caller's frame pointer (fp), if required, and
-        sets the new frame pointer to this location
-  --> Decrements the stack pointer to account for the new stack frame
-  --> Saves required non-volatile general-purpose registers into the
-        register save area
-  --> Stores the arguments above the stack back-trace data structure
-
-
-  Demo Patterns:
-     st         blink,[sp,4] ; Saves the return address
-     st         fp,[sp] ; Saves the callers frame pointer
-     mov        fp,sp   ; Saves 
-     sub        sp,sp,24
-
-0xa  538e7e20     sub        sp,sp,32     ; Space for variadic args
-0x2  100e3e04     st         blink,[sp,4] ; Saves the return address
-0x2  100e3600     st         fp,[sp]      ; Saves the callers frame pointer
-0xc  636e3800     mov        fp,sp        ; Resets stack pointer to fp
-0xa  538e7e18     sub        sp,sp,24     ; Decrements sp to add for new
-                                          ; stack frame
-0x2  100d81fc     st         r0,[fp,-4]   ; Stores the args 
-0x2  100d83f8     st         r1,[fp,-8]   ; ----"-------
-     ...
-
-*/
-
-/* FIXMEA:
-called from arc_skip_prologue as
-     skip_pc = arc_scan_prologue(pc,NULL,NULL);
-        Then it is supposed to return the first valid pc
-	after the prologue
-
-   Prologue analysis does the rest...  
-   Currently our scan prologue does not
-    support getting input for the frame unwinder
-
-  
-  pc = frame_func_unwind(next_frame);
-  arc_scan_prologue (pc, next_frame, info);
-
-*/
-
-#ifdef ARC4_JTAG
-static CORE_ADDR 
-a4_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
-		    struct arc_unwind_cache *info)
-{
-  /* End of prologue */
-  CORE_ADDR prologue_ends_pc = pc;
-  int i = 0;
-  struct arcDisState current_instr, instr_in_delay;
-  int insn_length;
-
-  /* Initializations to use the opcodes 
-   * library .
-   */
-  
-  struct disassemble_info di;
-
-  unsigned int saved_regs_mask = 0;
-  /* An arbitrary length on the length of the 
-     prologue. If next_frame is NULL this means that there was 
-     no debug info and we are called from arc_skip_prologue
-  */
-  /*FIXMEANOW: pc + 64 is probably the max size of the prologue*/
-  CORE_ADDR final_pc = (next_frame)?frame_pc_unwind(next_frame):pc+(16*4);
-  
-  
-
-
-  if (info)
-    {
-      /* All functions start as leaf functions until 
-	 we identify push blink 
-      */
-      info->is_leaf = 1;
-    }
-  
-
-
-  /* Initializations to use the opcodes 
-   * library .
-   */
-  init_disassemble_info(&di, gdb_stderr, fprintf_unfiltered);
-  di.arch = gdbarch_bfd_arch_info(current_gdbarch)->arch;
-  di.mach = gdbarch_bfd_arch_info(current_gdbarch)->mach;
-  di.endian = gdbarch_byte_order(current_gdbarch);
-  di.read_memory_func = target_read_memory;
-  
-  
-  for (prologue_ends_pc= pc;
-       prologue_ends_pc< final_pc; 
-       prologue_ends_pc += current_instr.instructionLen ) /*FIXMEA: This could as
-							    well be 4 */
-    {
-      current_instr = a4AnalyzeInstr(prologue_ends_pc, &di);
-      printInsnState(current_instr);
-#ifdef ARC_DEBUG
-      printf("Prologue PC: %d\n", prologue_ends_pc);
-      printf("Final PC: %d\n", final_pc);
-#endif
-
-
-      if (current_instr._opcode == 0x2)
-	{
-	  // Saves the return address    st blink,[sp,4]   0x100e3e04
-	  // Save the callers fp         st fp,[sp]        0x100e3600
-	  // Saves the args              st rX,[fp, #imm]  0x100d8xxx
-	  if (current_instr.ea_reg1 == 28)
-	    {
-	      if( strstr(current_instr.operandBuffer,"blink") == current_instr.operandBuffer)
-		{
-                  if(info)
-		    {      
-		      info->sp_offset += current_instr._offset;
- //		      info->blink_offset = info->sp_offset ;
-		      info->blink_offset = current_instr._offset;
-		      info->is_leaf = 0;
-
-#ifdef ARC_DEBUG
-		      printf("Blink instruction:\n");
-		      printFrameInfo(info);
-#endif
-		    }
-		  continue;
-		}
-	      else
-		if(strstr(current_instr.operandBuffer,"fp") == current_instr.operandBuffer)
-		{
-		  if(info)
-		    {
-/* 		      info->sp_offset += current_instr._offset ; */
-/* 		      info->fp_offset = info->sp_offset; */
-		      info->fp_offset = 0;
-		    }
-		  continue;
-		}
-	    }
-	  else if (current_instr.ea_reg1 == 27)
-	    {
-	      /* Saving of arguments onto the stack using the
-		 frame pointer (r27).  */
-	      if(info)
-		{
-		  // Save regs offsets 
-		}
-#ifdef ARC_DEBUG	      
-	      printf(" Saving registers onto stack\n%s\n",current_instr.operandBuffer);
-#endif	      
-	      continue;
-	    }
-	  //	  ISPUSHBLINK(current_instr);
-	}
-      else if (current_instr._opcode == 0xc)
-	{
-	  // Resets stack pointer to fp
-	  // 0x636e3800
-	  //	  636e3800     mov        fp,sp
-	  if (current_instr.words[0] == 0x636e3800)
-	    {
-	      if (info)
-		{
-		  info->uses_fp = 1;
-		}
-	      continue;
-	    }
-	}
-      else if (current_instr._opcode == 0xa)
-	{
-	  // Decrements stackpointer to add for new stack frame
-	  // 0x538e7e18   sub        sp,sp,#imm
-	  // 538e7e20     sub        sp,sp,32
-	  if( current_instr.words[0] == 0x538e7e20)
-	    {
-	      //sub sp,sp, 32  //// variadic
-	      if (info)
-		{
-		  int tmp = atoi(current_instr.operandBuffer + 6); 
-		  info->sp_offset -= tmp; 
-		}
-	      continue;
-	    }
-	  else if((current_instr.words[0] & 0xffffff00) == 0x538e7e00)
-	    {
-	      // sub sp,sp,xx
-	      if(info)
-		{
-		  int tmp = atoi(current_instr.operandBuffer + 6); 
-		  info->sp_offset -= tmp; 
-		}
-	      continue;
-	    }
-	}
-
-      /* Found a instruction that is not in
-         the prologue*/
-#ifdef ARC_DEBUG
-      printf("End of Prologue reached \n");
-#endif
-      break;
-    }
-
-  /* Means we were called from skip_prologue */
-  if((next_frame == NULL)&& (info == NULL))
-    {
-      return prologue_ends_pc;
-    }
-
-
-  info->framesize = -info->sp_offset;
-  /* Compute the previous frame's stack pointer (which is also the
-     frame's ID's stack address), and this frame's base pointer.  */
-  if(info->uses_fp)
-    {
-
-      ULONGEST this_base;
-      /* The SP was moved to the FP.  This indicates that a new frame
-         was created.  Get THIS frame's FP value by unwinding it from
-         the next frame.  */
-      frame_unwind_unsigned_register(next_frame, ARC_FP_REGNUM,
-				     &this_base);
-      info->frame_base = this_base;
-      info->saved_regs[ARC_FP_REGNUM].addr = info->frame_base;
-
-      /* The previous sp is the current frame base + the offset of the
-	 fp in the current frame */
-      info->prev_sp = info->frame_base + info->fp_offset;
-      for(i = 13; i < 26 ; i++ )
-	{
-	  if(saved_regs_mask & (1 << i))
-	    info->saved_regs[i].addr += info->frame_base ;
-	}
-      
-      printFrameInfo(info);
-   
-    }
-  else
-    {
-      ULONGEST this_base;
-      /* Assume that the FP is this frame's SP but with that pushed
-         stack space added back.  */
-      frame_unwind_unsigned_register (next_frame, ARC_SP_REGNUM, &this_base);
-      info->frame_base = this_base;
-
-      /* In such a case it would be the previous SP + the size of the current frame */
-      info->prev_sp = info->frame_base + info->framesize;
-     
-    }
-  
-
-  if(!info->is_leaf)
-    {
-
-      /* Usually blink is saved before the callee save registers and
-	 below the space created for variadic arguments  . We maintain
-	 info->blink_offset as negative when we stored it initially
-       */
-      info->saved_regs[ARC_BLINK_REGNUM].addr = info->prev_sp + info->blink_offset;
-#ifdef ARC_DEBUG
-      printf("blink offset is [%x] \n",info->blink_offset);
-#endif
-    }
-      
-    /* The PC is found in blink (the actual register or located on the stack).  */
-  // FIXMEA:
-  //info->saved_regs[ARC_STATUS_REGNUM] |= (info->saved_regs[ARC_BLINK_REGNUM] & 0xffffff)>>2;
-  info->saved_regs[ARC_STATUS_REGNUM] = info->saved_regs[ARC_BLINK_REGNUM];
-  return prologue_ends_pc;
-
-}
-#endif
-
-static CORE_ADDR 
-arc_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
-		    struct arc_unwind_cache *info)
-{
-#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf("\narc_scan_prologue called\n");
-#endif
-#else
-  /* End of prologue */
-  CORE_ADDR prologue_ends_pc = pc;
-  int i = 0;
-  struct arcDisState current_instr, instr_in_delay;
-  int insn_length;
-
-  /* Initializations to use the opcodes 
-   * library .
-   */
-  
-  struct disassemble_info di;
-
-  unsigned int saved_regs_mask = 0;
-  /* An arbitrary length on the length of the 
-     prologue. If next_frame is NULL this means that there was 
-     no debug info and we are called from arc_skip_prologue
-  */
-  CORE_ADDR final_pc = (next_frame)?frame_pc_unwind(next_frame):pc+64; 
-  
-  
-
-
-  if (info)
-    {
-      /* All functions start as leaf functions until 
-	 we identify push blink 
-      */
-      info->is_leaf = 1;
-      
-    }
-  
-
-
-  /* Initializations to use the opcodes 
-   * library .
-   */
-  init_disassemble_info(&di, gdb_stderr, fprintf_unfiltered);
-  di.arch = gdbarch_bfd_arch_info(current_gdbarch)->arch;
-  di.mach = gdbarch_bfd_arch_info(current_gdbarch)->mach;
-  di.endian = gdbarch_byte_order(current_gdbarch);
-  di.read_memory_func = target_read_memory;
-  
-  
-  for(prologue_ends_pc= pc; prologue_ends_pc< final_pc; 
-      prologue_ends_pc += current_instr.instructionLen )
-    {
-      current_instr = arcAnalyzeInstr(prologue_ends_pc, &di);
-      printInsnState(current_instr);
-        /* Might be a push or a pop */
-      if(current_instr._opcode == 0x3)
-	{
-	  if(current_instr._addrWriteBack)
-	    {
-	      /* This is a st.a  */
-	      if((current_instr.ea_reg1 == 28) &&
-		 (current_instr._offset == -4))
-		{
-		  
-		  /* This is a push something at sp */
-		  /* Is it a push of the blink */
-		  ISPUSHBLINKFI(current_instr);
-		  /* Is it a push for fp */
-		  ISPUSHFPFI(current_instr);
-		  
-		}
-	      
-	    } 
-	  else
-	    {
-	      /* Is this a store of some register onto 
-		 the stack using the stack pointer.*/
-	      if(current_instr.ea_reg1 == 28)
-		{
-		  if(current_instr.sourceType == ARC_REGISTER )
-		    {
-		      /* R13..R26 are the callee saved registers.  [R27 (fp)
-			 is also a callee saved register, but it's usually
-			 pushed using st.a and so handled in the st.a case
-			 above.]  */
-		      if((current_instr.source_operand.registerNum > 12 
-			  && current_instr.source_operand.registerNum <= 26))
-			{
-			  if(info)
-			    {
-			      printFrameInfo(info);
-			      /* Save up the offsets for the correct instruction */
-			      info->saved_regs[current_instr.source_operand.registerNum].addr
-				= - info->sp_offset - current_instr._offset;
-			      saved_regs_mask |= (1 << current_instr.source_operand.registerNum);
-			    }
-			  continue;
-			}
-		      
-		    }		  
-		  
-		}
-	      /* Is this the store of some register on the 
-		 stack using the frame pointer. We check 
-		 for argument registers getting saved and
-		 restored.
-	      */
-	      if(current_instr.ea_reg1 == 27)
-		if((current_instr.source_operand.registerNum <= 7))
-		  {
-		    /* Saving argument registers.Don't save them in saved_regs, just skip. 
-		     */
-		    continue;
-		  }
-		
-	      
-	      
-	    }
-	}
-
-      if(current_instr._opcode == 0x4)
-	{
-	  /* A major opcode 0x4 instruction */
-	  /* We are usually interested in a 
-	     mov or a sub */
-	  ISUPDATEFPFI(current_instr);
-	  ISSUBSPFI(current_instr);
-	}
-      if(current_instr._opcode == 0x18)
-	{
-	  /* sub_s sp,sp,constant */
-	  ISSUBSPFI(current_instr);
-	  /* push_s blink */
-	  if(strcmp(current_instr.instrBuffer,"push_s") == 0)
-	    {
-	      if(strcmp(current_instr.operandBuffer,"blink") == 0)
-		{
-		  if(info) 
-		    {   
-		      info->sp_offset += 4; 
-		      info->blink_offset = info->sp_offset ; 
-		      info->is_leaf = 0;
-		    }
-		  continue;
-		}
-	    }
-	}
-
-      /* If we reach here . we have 
-       * reached end of the prologue
-       */
-      break;
-      
-    }
-  
-  /* Means we were called from skip_prologue */
-  if((next_frame == NULL)&& (info == NULL))
-    {
-      return prologue_ends_pc;
-    }
-  
-  
-  info->framesize = -info->sp_offset;
-  /* Compute the previous frame's stack pointer (which is also the
-     frame's ID's stack address), and this frame's base pointer.  */
-  if(info->uses_fp)
-    {
-
-      ULONGEST this_base;
-      /* The SP was moved to the FP.  This indicates that a new frame
-         was created.  Get THIS frame's FP value by unwinding it from
-         the next frame.  */
-      frame_unwind_unsigned_register(next_frame, ARC_FP_REGNUM,
-				     &this_base);
-      info->frame_base = this_base;
-      info->saved_regs[ARC_FP_REGNUM].addr = info->frame_base;
-
-      /* The previous sp is the current frame base + the offset of the 
-	 fp in the current frame */
-      info->prev_sp = info->frame_base + info->fp_offset;
-      for(i = 13; i < 26 ; i++ )
-	{
-	  if(saved_regs_mask & (1 << i))
-	    info->saved_regs[i].addr += info->frame_base ;
-	}
-      
-      printFrameInfo(info);
-   
-    }
-  else
-    {
-      ULONGEST this_base;      
-      /* Assume that the FP is this frame's SP but with that pushed
-         stack space added back.  */
-      frame_unwind_unsigned_register (next_frame, ARC_SP_REGNUM, &this_base);
-      info->frame_base = this_base;
-
-      /* In such a case it would be the previous SP + the size of the current frame */
-      info->prev_sp = info->frame_base + info->framesize;
-     
-    }
-  
-
-  if(!info->is_leaf)
-    {
-
-      /* Usually blink is saved before the callee save registers and 
-	 below the space created for variadic arguments  . We maintain
-	 info->blink_offset as negative when we stored it initially
-       */
-      info->saved_regs[ARC_BLINK_REGNUM].addr = info->prev_sp + info->blink_offset;
-#ifdef ARC_DEBUG
-      printf("blink offset is [%x] \n",info->blink_offset);
-#endif
-    }
-      
-    /* The PC is found in blink (the actual register or located on the stack).  */
-  info->saved_regs[PC_REGNUM] = info->saved_regs[ARC_BLINK_REGNUM];
-  /*info->saved_regs[ARC_PC_REGNUM] = info->saved_regs[ARC_BLINK_REGNUM];*/
-  return prologue_ends_pc;
-#endif
-}
-
-
-/* Skip the prologue for the function at pc. 
- * This is done by checking from the line  
- * information picked up during dwarf reading
- * FIXME: more stuff to be added when we 
- * parse the prologue.
- */
+/* Skip the prologue for the function at pc.
+   Returns the address of the first instruction after the prologue. */
 
 static CORE_ADDR
-arc_skip_prologue (CORE_ADDR pc)
+arc_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  //#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_skip_prologue called\n");
-#endif
-  // FIXMEA: cleanup #else
-  unsigned long inst;
-  unsigned long addend = 4;
-  CORE_ADDR skip_pc = pc;
-  CORE_ADDR func_addr, func_end = 0;
-  char *func_name;
-  struct symtab_and_line sal;
+    CORE_ADDR function_addr, function_end = 0;
+    char     *function_name;
 
-  /* If we're in a dummy frame, don't even try to skip the prologue.  */
-  if (deprecated_pc_in_call_dummy (pc))
-    return pc;
+   /* This is done by checking from the line information read from the DWARF,
+      if possible; otherwise, we scan the function prologue to find its end.  */
 
-  /* See what the symbol table says.  */
+    ENTERMSG;
 
-  if (find_pc_partial_function (pc, &func_name, &func_addr, &func_end))
+    /* If we're in a dummy frame, don't even try to skip the prologue.  */
+    if (deprecated_pc_in_call_dummy (pc))
+        return pc;
+
+    /* See what the symbol table says.  */
+    if (find_pc_partial_function (pc, &function_name, &function_addr, &function_end))
     {
-      struct symbol *sym;
+        /* Found a function.  */
+        struct symbol *sym = lookup_symbol (function_name, NULL, VAR_DOMAIN, NULL, NULL);
 
-      /* Found a function.  */
-      sym = lookup_symbol (func_name, NULL, VAR_DOMAIN, NULL, NULL);
-      if (sym && SYMBOL_LANGUAGE (sym) != language_asm)
+        if ((sym != NULL) && SYMBOL_LANGUAGE (sym) != language_asm)
         {
-	  /* Don't use this trick for assembly source files.  */
-	  sal = find_pc_line (func_addr, 0);
-	  if ((sal.line != 0) && (sal.end < func_end))
-	    return sal.end;
+            /* Don't use this trick for assembly source files.  */
+            struct symtab_and_line sal = find_pc_line (function_addr, 0);
+
+            if ((sal.line != 0) && (sal.end < function_end))
+                return sal.end;
         }
     }
-  
-#ifdef ARC4_JTAG 
-  skip_pc = a4_scan_prologue(pc, NULL, NULL);
-#else
-  skip_pc = arc_scan_prologue(pc,NULL,NULL);
-#endif  
-  return skip_pc;		/* End of prologue */
 
-  //#endif
-}
-
-/* Breakpoint from pc. Return whatever is in the tdep 
- * structure. The tdep structure is changed depending 
- * on the correct target / architecture chosen. 
- */
-
-static const unsigned char *
-arc_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
-{
-
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
-  *lenptr = tdep->arc_breakpoint_size;
-  return tdep->arc_breakpoint_insn;
+    /* Find the address of the first instruction after the prologue by scanning
+       through it - no other information is needed, so pass NULL for the other
+       parameters.  */
+    return scan_prologue(pc, NULL, NULL);
 }
 
 
-/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
-   dummy frame.  The frame ID's base needs to match the TOS value
-   saved by save_dummy_frame_tos(), and the PC match the dummy frame's
-   breakpoint. */
-
-static struct frame_id
-arc_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
-{
-  return frame_id_build (arc_unwind_sp (gdbarch, next_frame),
-			 frame_pc_unwind (next_frame));
-}
-
-/* The workhorse : frame_unwind_cache for the ARC700 platform .
- */
-static struct arc_unwind_cache *
-arc_frame_unwind_cache  (struct frame_info *next_frame,
-			 void **this_prologue_cache)
-{
-  //#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_frame_unwind_cache called\n ");
-#endif
-  //#else
-  CORE_ADDR pc;
-  struct arc_unwind_cache *info;
-  int i;
-
- 
-  if ((*this_prologue_cache))
-    return (*this_prologue_cache);
-  
-  info = FRAME_OBSTACK_ZALLOC (struct arc_unwind_cache);
-  (*this_prologue_cache) = info;
-  info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
-
-  /* Zero all fields.  */
-  info->blink_offset = 0;
-  info->prev_pc = 0;
-  info->prev_sp = 0;
-  info->frame_base = 0;
-  info->framesize = 0;
-  info->sp_offset = 0;
-  info->fp_offset = 0;
-  info->prev_pc = 0;
-  info->is_leaf = 0;
-  info->uses_fp = 0;
-
-  /* Prologue analysis does the rest...  */
-  /* Currently our scan prologue does not
-   * support getting input for the frame unwinder
-   */ 
-  
-  pc = frame_func_unwind(next_frame);
-#ifdef ARC4_JTAG
-  a4_scan_prologue (pc, next_frame, info);
-#else
-  arc_scan_prologue (pc, next_frame, info);
-#endif
-
-  return info;
-  //#endif
-}
-
-
-
-/*
- * Construct frame id for the normal frame 
- */
+/* Construct frame id for the normal frame.  */
 
 static void
 arc_frame_this_id (struct frame_info *next_frame,
-		    void **this_prologue_cache,
-		    struct frame_id *this_id)
+                   void             **this_prologue_cache,
+                   struct frame_id   *this_id)
 {
-  // FIXMEA: cleanup #ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\n arc_frame_this_id called()\n  ");
+    ENTERMSG;
+
+    /* FIXME: to what should *this_id be set if the frame base can not be found? */
+
+    {
+        /* Find the entry point of the function which owns the frame.  */
+        CORE_ADDR entrypoint = frame_func_unwind (next_frame, NORMAL_FRAME);
+
+        /* This is meant to halt the backtrace at the entry point (_start)
+           (it assumes that there is no code at a lower address).  */
+        if (entrypoint > gdbarch_tdep (current_gdbarch)->lowest_pc)
+        {
+            UnwindCache *info = frame_unwind_cache (next_frame, this_prologue_cache);
+            CORE_ADDR    base = info->prev_sp;
+
+            /* Hopefully the prologue analysis either correctly determined the
+               frame's base (which is the SP from the previous frame), or set
+               that base to "NULL".  */
+
+            if (base != 0)
+            {
+                /* Build the ID from the frame base address.  */
+                *this_id = frame_id_build (base, entrypoint);
+
+#if 0
+                printf("*** Frame ID: %x ==> (%x %x %x)\n",
+                       base,
+                       this_id->stack_addr,
+                       this_id->code_addr,
+                       this_id->special_addr);
 #endif
-  //#else
-
-  struct arc_unwind_cache *info
-    = arc_frame_unwind_cache (next_frame, this_prologue_cache);
-  CORE_ADDR base;
-  CORE_ADDR func;
-  struct frame_id id;
-
-  /* The FUNC is easy.  */
-  func = frame_func_unwind (next_frame);
-
- /* This is meant to halt the backtrace at the entry point (_start).  */
-  if (func <= gdbarch_tdep (current_gdbarch)->lowest_pc)
-    return;
-  
-  /* Hopefully the prologue analysis either correctly determined the
-     frame's base (which is the SP from the previous frame), or set
-     that base to "NULL".  */
-  base = info->prev_sp;
-  if (base == 0)
-    return;
-
-  id = frame_id_build (base, func);
-
-  (*this_id) = id;
-  //#endif
-
+            }
+        }
+    }
 }
 
 
-/* 
- * Unwind and obtain the register information 
- */
+/* Unwind and obtain the register information.  */
+
 static void
 arc_frame_prev_register (struct frame_info *next_frame,
-			  void **this_prologue_cache,
-			  int regnum, int *optimizedp,
-			  enum lval_type *lvalp, CORE_ADDR *addrp,
-			  int *realnump, void *bufferp)
+                         void             **this_prologue_cache,
+                         int                regnum,
+                         int               *optimized,
+                         enum lval_type    *lval,
+                         CORE_ADDR         *addr,
+                         int               *realnum,
+                         gdb_byte          *buffer)
 {
-  // FIXMEA:
-  //#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\n arc_frame_prev_register() called for regnum %d\n ",regnum );
-#endif
-  //#else
-  struct arc_unwind_cache *info
-    = arc_frame_unwind_cache (next_frame, this_prologue_cache);
+    ENTERARGS("regnum %d ", regnum);
 
-
-  /* If we are asked to unwind the PC, then we need to return blink
-     instead.  The saved value of PC points into this frame's
-     prologue, not the next frame's resume location.  */
-#ifdef ARC4_JTAG
-  if (regnum == ARC_STATUS_REGNUM)
-#else
-  if (regnum == PC_REGNUM)
-#endif
-    regnum = ARC_BLINK_REGNUM;
-
-  /* SP is generally not saved to the stack, but this frame is
-     identified by NEXT_FRAME's stack pointer at the time of the call.
-     The value was already reconstructed into PREV_SP.  */
-  if (regnum == ARC_SP_REGNUM)
     {
-      *lvalp = not_lval;
-      if (bufferp)
-	store_unsigned_integer (bufferp, 4, info->prev_sp);
-      return;
+        UnwindCache *info = frame_unwind_cache (next_frame, this_prologue_cache);
+
+        /* If we are asked to unwind the PC, then we need to return blink
+           instead: the saved value of PC points into this frame's function's prologue,
+           not the next frame's function's resume location.  */
+        if (regnum == ARC_PC_REGNUM)
+            regnum = ARC_BLINK_REGNUM;
+
+        /* SP is generally not saved to the stack, but this frame is identified
+           by next_frame's stack pointer at the time of the call. The value was
+           already reconstructed into prev_sp.  */
+        if (regnum == ARC_SP_REGNUM)
+        {
+            /* This value is not an L-value, i.e. it can not be changed, because
+               it is implicit in the structure of the call-chain.  */
+            *lval = not_lval;
+
+            if (buffer)
+                store_unsigned_integer (buffer, BYTES_IN_REGISTER, info->prev_sp);
+            return;
+        }
+
+        trad_frame_get_prev_register (next_frame,
+                                      info->saved_regs,
+                                      regnum,
+                                      optimized,
+                                      lval,
+                                      addr,
+                                      realnum,
+                                      buffer);
+
+        DEBUG("-*-*-*\n Regnum = %d, buffer = %p\n", regnum, buffer);
     }
-
-
-  trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
-				optimizedp, lvalp, addrp, realnump, bufferp);
-
-
-#ifdef ARC_DEBUG
-  printf("-*-*-*\n Regnum =%d, realnump=%d,%d \n",regnum, (char *)(bufferp), *((char*)bufferp));
-#endif
-  //#endif
 }
 
 
+/* This function is passed to gdb to enable it to unwind frames.  */
 
-
-static const struct frame_unwind arc_frame_unwind = {
-  NORMAL_FRAME,
-  arc_frame_this_id,
-  arc_frame_prev_register
-};
-
-const struct frame_unwind *
+static const struct frame_unwind *
 arc_frame_sniffer (struct frame_info *next_frame)
 {
-  return &arc_frame_unwind;
+    static const struct frame_unwind arc_frame_unwind =
+    {
+        NORMAL_FRAME,                // type
+        arc_frame_this_id,           // this_id
+        arc_frame_prev_register,     // prev_register
+        NULL,                        // unwind_data
+        NULL,                        // sniffer
+        NULL,                        // prev_pc
+        NULL                         // dealloc_cache
+    };
+
+    return &arc_frame_unwind;
 }
 
 
-/* read-only registers */
+/* Get the breakpoint which is appropriate for address at which it is to be set.
+
+   Return whatever is in the ARC-private tdep structure (this has been set up
+   according to the correct target / architecture chosen).
+
+   Fortunately, the ARC processor does not have separate instruction sets (like
+   the ARM's normal 32-bit and 16-bit Thumb instructions), so the bp instruction
+   to be used does not depend on the address (although the ARC does have both
+   16- and 32-bit instructions, they may be freely intermixed).  */
+
+static const unsigned char *
+arc_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
+{
+    struct gdbarch_tdep *tdep = gdbarch_tdep       (gdbarch);
+    int    end                = gdbarch_byte_order (gdbarch);
+
+    /* Return the breakpoint instruction length.  */
+    *lenptr = (int) tdep->breakpoint_size;
+
+    /* Return the breakpoint instruction code.  */
+    if (end == BFD_ENDIAN_LITTLE)
+        return tdep->le_breakpoint_instruction;
+    if (end == BFD_ENDIAN_BIG)
+        return tdep->be_breakpoint_instruction;
+
+    internal_error (__FILE__, __LINE__, "target endianness is not known");
+}
+
+
+/* Determine whether the given register is a member of the given group.
+
+   Returns 0, 1, or -1:
+      0 means the register is not in the group.
+      1 means the register is in the group.
+     -1 means the tdep has nothing to say about this register and group.  */
+
 static int
-arc_cannot_store_register (int regno)
+arc_register_reggroup_p (struct gdbarch  *gdbarch,
+                         int              regnum,
+                         struct reggroup *group)
 {
-  if(
-#ifndef ARC4_JTAG
-     regno == ARC_EFA_REGNUM ||
-     regno == ARC_ERET_REGNUM ||
-     regno == ARC_STATUS32_L1_REGNUM ||
-     regno == ARC_STATUS32_L2_REGNUM ||
-     regno == ARC_ERSTATUS_REGNUM ||
-#endif
-     regno == ARC_ILINK1_REGNUM ||
-     regno == ARC_ILINK2_REGNUM 
-     )
-    {
-      /* No warning should be printed.  arc_cannot_store_register being
-	 called does not imply that someone is actually writing to regnum.  */
+    struct gdbarch_tdep *tdep        = gdbarch_tdep (gdbarch);
+    int                  tdep_answer = tdep->register_reggroup_p (regnum, group);
 
-      /*warning("writing to read-only register: %s\n", arc_register_name(regno));*/
-      return 1;
+    /* If the configuration-specific tdep knows about this register.  */
+    if (tdep_answer != -1)
+        return tdep_answer;
+
+    if (group == all_reggroup)
+        return 1;
+
+    if (group == save_reggroup || group == restore_reggroup)
+    {
+        /* Don't save/restore read-only registers.  */
+	return (!gdbarch_cannot_store_register(current_gdbarch, regnum));
     }
-  return 0;
+
+    if (group == system_reggroup)
+    {
+        if (regnum == ARC_ILINK1_REGNUM ||
+            regnum == ARC_ILINK2_REGNUM)
+            return 1;
+
+        return 0;
+    }
+
+    internal_error(__FILE__, __LINE__, _("bad register group"));
+    return 0;
 }
 
-/* Returns true if the insn at PC is a branch. *fall_thru is the address of
-   the next insn.  *target is the branch target. */
-static int
-arc_next_pc(CORE_ADDR pc, CORE_ADDR *fall_thru, CORE_ADDR *target)
-{
-#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_next_pc called\n");
-#endif
-#else
-  struct arcDisState instr, instr_d;
-  int insn_length;
-  struct disassemble_info di;
-  int two_targets = 0;
-  
-  init_disassemble_info(&di, NULL, NULL);
-  di.arch = gdbarch_bfd_arch_info(current_gdbarch)->arch;
-  di.mach = gdbarch_bfd_arch_info(current_gdbarch)->mach;
-  di.endian = gdbarch_byte_order(current_gdbarch);
-  di.read_memory_func = target_read_memory;
-  
-  instr = arcAnalyzeInstr(pc, &di);
 
-  *fall_thru = pc + instr.instructionLen;
-
-#ifdef ARC_DEBUG
-  printf("--- arc_next_pc(%x) = %x, isBranch = %d, tcnt = %d [%x], flow = %s (%d), "
-	 "reg for indirect jump = %d, nullifyMode = %s\n",
-	 pc, *fall_thru, instr.isBranch, instr.tcnt, instr.targets[0],
-	 (instr.flow == direct_jump || instr.flow == direct_call) ? "direct" : "indirect",
-	 instr.flow,
-	 instr.register_for_indirect_jump,
-	 (instr.nullifyMode == BR_exec_always ? "delay slot" : "no delay"));
-#endif
-
-  if(instr.isBranch)
-    {
-      two_targets = 1;
-      
-      if(instr.flow == direct_jump || instr.flow == direct_call)
-	*target = instr.targets[0];
-      else
-	regcache_cooked_read(current_regcache,
-			     arc_binutils_reg_to_regnum(instr.register_for_indirect_jump),
-			     target);
-    }
-
-  /* for instructions with delay slots, the fall thru is not the instruction
-     immediately after the branch instruction, but the one after that */
-  if(instr.isBranch && instr.nullifyMode == BR_exec_always)
-    {
-      instr_d = arcAnalyzeInstr(*fall_thru, &di);
-      *fall_thru += instr_d.instructionLen;
-    }
-
-  /* zero-overhead loops:
-        if(status32[L] == 0 && next_pc == lp_end && lp_count > 1)
-          next_pc = lp_start;
-  */
-  {
-    unsigned int lp_end, lp_start, lp_count, status32;
-
-    regcache_cooked_read(current_regcache, ARC_LP_START_REGNUM, &lp_start);
-    regcache_cooked_read(current_regcache, ARC_LP_END_REGNUM, &lp_end);
-    regcache_cooked_read(current_regcache, ARC_LP_COUNT_REGNUM, &lp_count);
-#ifndef ARC4_JTAG    
-    regcache_cooked_read(current_regcache, ARC_STATUS32_REGNUM, &status32);
-#endif
-
-    if( !(status32 & ARC_STATUS32_L) && *fall_thru == lp_end && lp_count > 1)
-      {
-	two_targets = 1;
-	*target = lp_start;
-      }
-  }
-  
-  return two_targets;
-#endif //
-}
-
-/* this is called with insert_breakpoints_p = 1 before single-stepping and
-   with insert_breakpoints_p = 0 after the step */
-void
-arc_software_single_step(enum target_signal ignore, int insert_breakpoints_p)
-{
-#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_software_single_step called\n" );
-#endif
-#else
-  typedef char binsn_quantum[BREAKPOINT_MAX];
-
-  static CORE_ADDR fall_thru, branch_target;
-  static binsn_quantum break_mem[2];
-  static char two_breakpoints;
-  CORE_ADDR pc;
-
-  {
-#ifdef ARC_DEBUG
-    unsigned int efa, ret;
-    regcache_cooked_read(current_regcache, ARC_EFA_REGNUM, &efa);
-    //    regcache_cooked_read(current_regcache, ARC_RET_REGNUM, &ret);
-    
-    printf("--- arc_software_single_step, efa = %x, ret = %x, (%s)\n", efa, ret,
-	   (insert_breakpoints_p ? "add" : "remove"));
-#endif
-  }
-  
-  if (insert_breakpoints_p)
-    {
-      pc = read_pc ();
-      two_breakpoints = arc_next_pc (pc, &fall_thru, &branch_target);
-
-      if (two_breakpoints && branch_target == pc) 
-	{
-	  warning ("Cannot single-step branch-to-self or single instruction zero overhead loop,\n"
-		   "    Stepping across it.");
-	  /* Don't insert/remove the branch-target breakpoint.  */
-	  two_breakpoints = 0;
-	}
-      
-      target_insert_breakpoint (fall_thru, break_mem[0]);
-      if(two_breakpoints)
-	target_insert_breakpoint (branch_target, break_mem[1]);
-    }
-  else
-    {
-      target_remove_breakpoint (fall_thru, break_mem[0]);
-      if(two_breakpoints)
-	target_remove_breakpoint (branch_target, break_mem[1]);
-    }
-#endif
-}
-
-/*
- * mapping from binutils/gcc register number to
- * GDB register number ("regnum")
- */
-static int
-arc_binutils_reg_to_regnum (int reg)
-{
-#ifdef ARC4_JTAG
-    if (reg >= 0 && reg <= 26)
-    return reg;
-  else if (reg == 27)			     /* fp */
-    return ARC_FP_REGNUM;
-  else if (reg == 28)			     /* sp */
-    return ARC_SP_REGNUM;
-  else if (reg == 29)			     /* ilink1 */
-    return ARC_ILINK1_REGNUM;
-  else if (reg == 30)			     /* ilink2 */
-    return ARC_ILINK2_REGNUM;
-  else if (reg == 31)			     /* blink */
-    return ARC_BLINK_REGNUM;
-
-#else
-  /* from gcc/config/arc/arc.h */
-
-  if (reg >= 0 && reg <= 26)
-    return reg;
-  else if (reg == 27)			     /* fp */
-    return ARC_FP_REGNUM;
-  else if (reg == 28)			     /* sp */
-    return ARC_SP_REGNUM;
-  else if (reg == 29)			     /* ilink1 */
-    return ARC_ILINK1_REGNUM;
-  else if (reg == 30)			     /* ilink2 */
-    return ARC_ILINK2_REGNUM;
-  else if (reg == 31)			     /* blink */
-    return ARC_BLINK_REGNUM;
-  else if (reg >= 32 && reg <= 59)	     /* reserved */
-    ;
-  else if (reg == 60)			     /* lp_count */
-    return ARC_LP_COUNT_REGNUM;
-  else if (reg == 61)			     /* reserved */
-    ;
-  else if (reg == 62)			     /* no such register */
-    ;
-/*   else if (reg == 63)			     /\* PCL *\/ */
-/*     return ARC_RET_REGNUM; */
-
-#endif
-  warning ("Unmapped register #%d encountered\n", reg);
-  return -1; 
-}
-
+/* This function is used by the DWARF-2 frame sniffer.
+   It is the architecture-specific register state initialization function:
+   it tells gdb how to find certain registers in the DWARF-2 Call Frame Information.  */
 
 static void
-arc_add_reggroups (struct gdbarch *gdbarch)
+arc_dwarf2_frame_init_reg (struct gdbarch                *gdbarch,
+                           int                            regnum,
+                           struct dwarf2_frame_state_reg *reg,
+                           struct frame_info             *info)
 {
-  reggroup_add (gdbarch, general_reggroup);
-  reggroup_add (gdbarch, all_reggroup);
-  reggroup_add (gdbarch, system_reggroup);
-}
+//  ENTERARGS("Regno no:%d, 0x%x", regnum, (unsigned int) regnum);
 
-int
-arc_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
-			  struct reggroup *group)
-{
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
-  int tdep_answer;
-  
-  tdep_answer = tdep->register_reggroup_p (regnum, group);
-  if(tdep_answer != -1)
-    return tdep_answer;
-  
-  if (group == all_reggroup)
-    return 1;
-  else if (group == save_reggroup || group == restore_reggroup)
-    {
-      /* don't save/restore read-only registers. */
-      return (!arc_cannot_store_register(regnum)); 
-    }
-  else if (group == general_reggroup)
-    {
-#ifndef ARC4_JTAG
-      if (regnum == ARC_STATUS32_REGNUM)
-	return 0;
-#endif
-      return 1;
-    }
-  else
-    {
-      internal_error(__FILE__, __LINE__, "bad register group");
-    }
-}
+    /* Make sure that we know the number of the PC!  */
+    arc_check_pc_defined(gdbarch);
 
-
-
-static void
-arc_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
-                            struct dwarf2_frame_state_reg *reg)
-{
-#ifdef ARC4_JTAG
-  // FIXMEA: Clean up.  if ( debug_arc_jtag_target_message)
-#ifdef ARC_DEBUG  
-  printf ("\n arc_dwarf2_frame_init_reg called.\n Regno no:%d,0x%x\n",regnum,regnum);
-#endif
     /* The return address column.  */
-  if (regnum == ARC_STATUS_REGNUM)
-    reg->how = DWARF2_FRAME_REG_RA;
-  
-  /* The call frame address.  */
-  if (regnum == ARC_SP_REGNUM)
-    reg->how = DWARF2_FRAME_REG_CFA;
+    if (regnum == ARC_PC_REGNUM)
+        reg->how = DWARF2_FRAME_REG_RA;
 
-#else
-  /* The return address column.  */
-  if (regnum == PC_REGNUM)
-    reg->how = DWARF2_FRAME_REG_RA;
-  
-  /* The call frame address.  */
-  if (regnum == ARC_SP_REGNUM)
-    reg->how = DWARF2_FRAME_REG_CFA;
-#endif
+    /* The call frame address.  */
+    if (regnum == ARC_SP_REGNUM)
+        reg->how = DWARF2_FRAME_REG_CFA;
 }
 
+
+/* Unwind the frame to find the previous frame's PC.  */
+
 static CORE_ADDR
 arc_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 {
-  ULONGEST pc;
-#ifdef ARC4_JTAG
-  frame_unwind_unsigned_register (next_frame, ARC_STATUS_REGNUM, &pc);
-  pc = pc & 0x00ffffff;
-  pc = pc << 2;
-#else
-  frame_unwind_unsigned_register (next_frame, PC_REGNUM, &pc);
-#endif
-  return pc;
+    ULONGEST pc;
+
+    /* Make sure that we know the number of the PC!  */
+    arc_check_pc_defined(gdbarch);
+
+    pc = frame_unwind_register_unsigned (next_frame, ARC_PC_REGNUM);
+
+    DEBUG("unwind PC: 0x%08lx\n", (unsigned long) pc);
+
+    return (CORE_ADDR) pc;
 }
 
+
+/* Unwind the frame to find the previous frame's SP.  */
+
 static CORE_ADDR
 arc_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
 {
-  ULONGEST sp;
-  frame_unwind_unsigned_register (next_frame, SP_REGNUM, &sp);
-  return sp;
+    ULONGEST sp;
+
+    sp  = frame_unwind_register_unsigned (next_frame, ARC_SP_REGNUM);
+
+    DEBUG("unwind SP: 0x%08lx\n", (unsigned long) sp);
+
+    return (CORE_ADDR) sp;
 }
 
 
+/* This function returns the convention used by the ABI for returning a result
+   of the given type from a function; it may also be required to:
 
-static void
-arc_extract_return_value (struct type *type, struct regcache *regcache,
-			  void *valbuf)
-{
-  //#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_extract_return_value called\n");
-#endif
-  //#else
-  ULONGEST val;
-  int len = TYPE_LENGTH (type);
-  
-  if (len <= 4)
-    {
-      /* Get the return value from R0.  */
-      regcache_cooked_read_unsigned (regcache, ARC_RETURN1_REGNUM, &val);
-      store_unsigned_integer (valbuf, len, val);
-    }
-  else if (len <= 8)
-    {
-      /* Get the return value from R0 and R1.  */
-      /* R0 holds the lower-order bytes */
-      regcache_cooked_read_unsigned (regcache, ARC_RETURN1_REGNUM, &val);
-      store_unsigned_integer (valbuf, 4, val);
-      regcache_cooked_read_unsigned (regcache, ARC_RETURN2_REGNUM, &val);
-      store_unsigned_integer ((char *)valbuf + 4, len - 4, val);
-    }
-  else
-    error ("arc_extract_return_value: type length too large");
-  //#endif
-}
+     a) set the return value (this is for the situation where the debugger user
+        has issued a "return <value>" command to request immediate return from
+        the current function with the given result; or
 
-static void
-arc_store_return_value (struct type *type, struct regcache *regcache,
-			const void *valbuf)
-{
-  //#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_store_return_value called\n ");
-#endif
-  //#else
-  ULONGEST val;
-  int len = TYPE_LENGTH (type);
-  
-  if (len <= 4)
-    {
-      /* Put the return value in R0.  */
-      val = extract_unsigned_integer (valbuf, len);
-      regcache_cooked_write_unsigned (regcache, ARC_RETURN1_REGNUM, val);
-    }
-  else if (len <= 8)
-    {
-      /* Put the return value in R10 and R11.  */
-      val = extract_unsigned_integer (valbuf, 4);
-      regcache_cooked_write_unsigned (regcache, ARC_RETURN1_REGNUM, val);
-      val = extract_unsigned_integer ((char *)valbuf + 4, len - 4);
-      regcache_cooked_write_unsigned (regcache, ARC_RETURN2_REGNUM, val);
-    }
-  else
-    error ("arc_store_return_value: type length too large.");
-  //#endif
-}
+     b) get the return value ((this is for the situation where the debugger user
+        has executed a "call <function>" command to execute the specified
+        function in the target program, and that function has a non-void result
+        which must be returned to the user.
 
-
-static enum return_value_convention
-arc_return_value (struct gdbarch *gdbarch, struct type *valtype,
-		  struct regcache *regcache, void *readbuf,
-		  const void *writebuf)
-{
-  //#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_return_value called");
-#endif
-  //#else
-  /* This will change with the ABI */
-  int struct_return = (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ||
-		       TYPE_CODE (valtype) == TYPE_CODE_UNION ||
-		       TYPE_LENGTH (valtype) > 8);
-  
-
-  if (writebuf != NULL)
-    {
-      gdb_assert (!struct_return);
-      arc_store_return_value (valtype, regcache, writebuf);
-    }
-
-  if (readbuf != NULL)
-    {
-      gdb_assert (!struct_return);
-      arc_extract_return_value (valtype, regcache, readbuf);
-    }
-
-  if (struct_return)
-    return RETURN_VALUE_STRUCT_CONVENTION;
-  else
-    return RETURN_VALUE_REGISTER_CONVENTION;
-  //#endif
-}
-
-/* Signal Trampoline Frame Unwinder. These 
- * unwinders allow frame unwinding to happen 
- * from within signal handlers. 
+  Parameters:
+      gdbarch : gdbarch structure for the backend to use if needed
+      valtype : the information for the return type of the function
+      regcache: the register cache to be used for altered register values
+      readbuf : if non-NULL, read the return value into this buffer
+      writebuf: if non-NULL, write the return value from this buffer
  */
 
-static struct arc_unwind_cache *
-arc_sigtramp_frame_cache (struct frame_info *next_frame,
-			  void **this_cache)
+static enum return_value_convention
+arc_return_value (struct gdbarch  *gdbarch,
+                  struct type     *valtype,
+                  struct regcache *regcache,
+                  gdb_byte        *readbuf,
+                  const gdb_byte  *writebuf)
 {
-  // FIXMEA: cleanup#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_sigtramp_frame_cache called");
-#endif
-  //#else
-  struct arc_unwind_cache *cache;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
-  CORE_ADDR addr;
-  char buf[4];
+    ENTERARGS("readbuf = %p, writebuf = %p", readbuf, writebuf);
 
-  if (*this_cache)
-    return *this_cache;
-
-  cache = FRAME_OBSTACK_ZALLOC (struct arc_unwind_cache);
-  (*this_cache) = cache;
-  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
-
-  /* Zero all fields.  */
-  cache->blink_offset = 0;
-  cache->prev_pc = 0;
-  cache->prev_sp = 0;
-  cache->frame_base = 0;
-  cache->framesize = 0;
-  cache->sp_offset = 0;
-  cache->fp_offset = 0;
-  cache->prev_pc = 0;
-  cache->is_leaf = 0;
-  cache->uses_fp = 0;
-
-  
-  frame_unwind_register (next_frame, SP_REGNUM, buf);
-  cache->frame_base = extract_unsigned_integer (buf, 4);
-
-  addr = tdep->sigcontext_addr (next_frame);
-  if (tdep->sc_reg_offset)
     {
-      int i;
-      
-      for (i = 0; i < tdep->sc_num_regs; i++)
-	if (tdep->sc_reg_offset[i] != -1)
-	  cache->saved_regs[i].addr = addr + tdep->sc_reg_offset[i];
+        /* If the return type is a struct, or a union, or would occupy more
+           than two registers, the ABI uses the "struct return convention": the
+           calling function passes a hidden first parameter to the callee (in R0).
+           That parameter is the address at which the value being returned
+           should be stored.  Otherwise, the result is returned in registers.  */
+        Boolean is_struct_return = (TYPE_CODE   (valtype) == TYPE_CODE_STRUCT ||
+                                    TYPE_CODE   (valtype) == TYPE_CODE_UNION  ||
+                                    TYPE_LENGTH (valtype) > 2 * BYTES_IN_REGISTER);
+
+        /* case a) */
+        if (writebuf != NULL)
+        {
+            /* gdb should not ask us to set a struct return value: it should
+               know the struct return location and write the value there
+               itself.  */
+            gdb_assert (!is_struct_return);
+            store_return_value (valtype, regcache, writebuf);
+        }
+
+        /* case b) */
+        if (readbuf != NULL)
+        {
+            /* gdb should not ask us to get a struct return value: it should
+               know the struct return location and read the value from there
+               itself.  */
+            gdb_assert (!is_struct_return);
+            extract_return_value (valtype, regcache, readbuf);
+        }
+
+        return (is_struct_return) ? RETURN_VALUE_STRUCT_CONVENTION
+                                  : RETURN_VALUE_REGISTER_CONVENTION;
+    }
+}
+
+
+/* Assuming that next_frame->prev is a dummy, return the frame ID of that dummy
+   frame.  The frame ID's base needs to match the TOS value saved by
+   save_dummy_frame_tos() (!!!! WHAT IS THIS???), and the PC to match the dummy
+   frame's breakpoint.  */
+
+static struct frame_id
+arc_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
+{
+    return frame_id_build (arc_unwind_sp (gdbarch, next_frame),
+                           frame_pc_unwind (next_frame));
+}
+
+
+/* Signal Trampoline Frame Unwinder.
+   These unwinders allow frame unwinding to happen from within signal handlers.  */
+
+static UnwindCache *
+arc_sigtramp_frame_cache (struct frame_info *next_frame,
+                          void             **this_cache)
+{
+    ENTERMSG;
+
+    if (*this_cache == NULL)
+    {
+        struct gdbarch_tdep *tdep  = gdbarch_tdep (current_gdbarch);
+        UnwindCache         *cache = create_cache(next_frame);
+        gdb_byte             buf[BYTES_IN_REGISTER];
+
+        *this_cache = cache;
+
+        /* Get the stack pointer and use it as the frame base.  */
+        frame_unwind_register (next_frame, ARC_SP_REGNUM, buf);
+        cache->frame_base = (CORE_ADDR) extract_unsigned_integer (buf, BYTES_IN_REGISTER);
+
+        /* If the ARC-private target-dependent info has a table of offsets of
+           saved register contents within a O/S signal context structure.  */
+        if (tdep->sc_reg_offset)
+        {
+            /* Find the address of the sigcontext structure.  */
+            CORE_ADDR    addr = tdep->sigcontext_addr (next_frame);
+            unsigned int i;
+
+            /* For each register, if its contents have been saved within the
+               sigcontext structure, determine the address of those contents.  */
+            for (i = 0; i < tdep->sc_num_regs; i++)
+                if (tdep->sc_reg_offset[i] != REGISTER_NOT_PRESENT)
+                    cache->saved_regs[i].addr = (LONGEST) (addr + tdep->sc_reg_offset[i]);
+        }
     }
 
-  return cache;
-  //#endif
+    return *this_cache;
 }
 
+
+/* Construct id for the given frame.  */
+
 static void
-arc_sigtramp_frame_this_id (struct frame_info *next_frame, void **this_cache,
-			    struct frame_id *this_id)
+arc_sigtramp_frame_this_id (struct frame_info *next_frame,
+                            void             **this_cache,
+                            struct frame_id   *this_id)
 {
-  //FIXMEA: cleanup #ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_sigtramp_frame_this_id called");
-#endif
-  //#else
-  struct arc_unwind_cache *cache = 
-    arc_sigtramp_frame_cache (next_frame, this_cache);
-  
-  (*this_id) = frame_id_build (cache->frame_base, frame_pc_unwind (next_frame));
-  //#endif
+    UnwindCache *cache;
+
+    ENTERMSG;
+
+    cache = arc_sigtramp_frame_cache (next_frame, this_cache);
+
+    *this_id = frame_id_build (cache->frame_base, frame_pc_unwind (next_frame));
 }
 
+
+/* Retrieve the value of the register in the frame.  */
+
 static void
 arc_sigtramp_frame_prev_register (struct frame_info *next_frame,
-				  void **this_cache,
-				  int regnum, int *optimizedp,
-				  enum lval_type *lvalp, CORE_ADDR *addrp,
-				  int *realnump, void *valuep)
+                                  void             **this_cache,
+                                  int                regnum,
+                                  int               *optimizedp,
+                                  enum lval_type    *lvalp,
+                                  CORE_ADDR         *addrp,
+                                  int               *realnump,
+                                  gdb_byte          *valuep)
 {
-  // FIXMEA: cleanup#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_sigtramp_frame_prev_register called");
-#endif
-  //#else
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+    ENTERMSG;
 
-  /* Make sure we've initialized the cache.  */ 
-  struct arc_unwind_cache *cache = 
-    arc_sigtramp_frame_cache (next_frame, this_cache);
+    {
+        struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
 
-  /* on a signal, the PC is in ret */
-#ifdef ARC4_JTAG
-  if (regnum == ARC_STATUS_REGNUM)
-#else
-  if(regnum == PC_REGNUM)
-#endif
-    regnum = tdep->pc_regnum_in_sigcontext;
-  
-  trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
-				optimizedp, lvalp, addrp, realnump, valuep);
-  //#endif
+        /* Make sure we've initialized the cache.  */
+        UnwindCache *cache = arc_sigtramp_frame_cache (next_frame, this_cache);
+
+        /* On a signal, the PC is in ret.  */
+        if (regnum == ARC_PC_REGNUM)
+            regnum = tdep->pc_regnum_in_sigcontext;
+
+        trad_frame_get_prev_register (next_frame,
+                                      cache->saved_regs,
+                                      regnum,
+                                      optimizedp,
+                                      lvalp,
+                                      addrp,
+                                      realnump,
+                                      valuep);
+    }
 }
 
 
-static const struct frame_unwind arc_sigtramp_frame_unwind =
-{
-  SIGTRAMP_FRAME,
-  arc_sigtramp_frame_this_id,
-  arc_sigtramp_frame_prev_register
-};
-
-const struct frame_unwind *
+static const struct frame_unwind *
 arc_sigtramp_frame_sniffer (struct frame_info *next_frame)
 {
-  //FIXMEA: cleanup#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG  
-  printf ("\narc_sigtramp_frame_sniffer called() ");
-#endif
-  //#else
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
+    ENTERMSG;
 
-  /* We shouldn't even bother if we don't have a sigcontext_addr
-     handler.  */
-  if (tdep->sigcontext_addr == NULL)
-    return NULL;
-
-  if (tdep->sigtramp_p != NULL)
     {
-      if (tdep->sigtramp_p (next_frame))
-	{
-	  return &arc_sigtramp_frame_unwind;
-	}
+        struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
+
+        /* We don't even bother if we don't have a sigcontext_addr handler.  */
+        if ((tdep->sigcontext_addr != NULL) &&
+            (tdep->is_sigtramp     != NULL) &&
+            tdep->is_sigtramp (next_frame))
+        {
+            static const struct frame_unwind arc_sigtramp_frame_unwind =
+            {
+                SIGTRAMP_FRAME,                   // type
+                arc_sigtramp_frame_this_id,       // this_id
+                arc_sigtramp_frame_prev_register, // prev_register
+                NULL,                             // unwind_data
+                NULL,                             // sniffer
+                NULL,                             // prev_pc
+                NULL                              // dealloc_cache
+            };
+
+            return &arc_sigtramp_frame_unwind;
+        }
+
+        return NULL;
     }
-
-  return NULL;
-  //#endif
 }
 
 
+/* Allow calls to be made to functions defined in the debuggee (A.K.A dummy calls).
 
-/* Allow calls to be made to functions defined in the debuggee. 
-   a.k.a dummy calls 
-*/
-/* When arguments must be pushed onto the stack, they go on in reverse
-   order.  The below implements a FILO (stack) to do this.  
-   Copied from d10v-tdep.c.  */
-
-struct stack_item
-{
-  int len;
-  struct stack_item *prev;
-  void *data;
-};
-
-static struct stack_item *
-push_stack_item (struct stack_item *prev, void *contents, int len)
-{
-  struct stack_item *si;
-  si = xmalloc (sizeof (struct stack_item));
-  si->data = xmalloc (len);
-  si->len = len;
-  si->prev = prev;
-  memcpy (si->data, contents, len);
-  return si;
-}
-
-static struct stack_item *
-pop_stack_item (struct stack_item *si)
-{
-  struct stack_item *dead = si;
-  si = si->prev;
-  xfree (dead->data);
-  xfree (dead);
-  return si;
-}
-
-
-
-
-/* arc_push_dummy_call :
- *  gdbarch  : gdbarch structure for the backend to use if needed.
- *  function : 
- *  regcache : 
- *  bp_addr  : Return address for the breakpoint.
- *  sp       : Current value of sp.
- *  struct_return: struct_return is 1 if structures are returned by 
- *                 the function.
- *  struct_addr: Hidden address for returning a struct.
- */
-
+   Parameters:
+      gdbarch      : gdbarch structure for the backend to use if needed.
+      function     : the function to be called
+      regcache     : the register cache to be used for altered register values
+      bp_addr      : return address for the breakpoint.
+      nargs        : the number of arguments to the function
+      args         : the arguments to be passed to the function
+      sp           : current value of SP.
+      struct_return: 1 if structures are returned by the function.
+      struct_addr  : hidden address for returning a struct.  */
 
 static CORE_ADDR
-arc_push_dummy_call(struct gdbarch *gdbarch, struct value *function,
-		     struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
-		     struct value **args, CORE_ADDR sp, int struct_return,
-		     CORE_ADDR struct_addr)
+arc_push_dummy_call (struct gdbarch  *gdbarch,
+                     struct value    *function,
+                     struct regcache *regcache,
+                     CORE_ADDR        bp_addr,
+                     int              nargs,
+                     struct value   **args,
+                     CORE_ADDR        sp,
+                     int              struct_return,
+                     CORE_ADDR        struct_addr)
 
 {
-  //#ifdef ARC4_JTAG
-#ifdef ARC_DEBUG
-  printf ("\narc_push_dummy_call called");
-#endif
-  // #else
-  int stack_alloc;
-  int stack_offset;
-  int argreg;
-  int argnum;
+    int arg_reg = ARC_ABI_FIRST_ARGUMENT_REGISTER;
 
-  CORE_ADDR regval;
-  struct stack_item *si = NULL;
+    ENTERARGS("nargs = %d, struct_return = %d", nargs, struct_return);
 
+    /* Push the return address.  */
+    regcache_cooked_write_unsigned (regcache, ARC_BLINK_REGNUM, bp_addr);
 
-  /* Push the return address.  */
-#ifdef ARC4_JTAG
-  CORE_ADDR modified_bp_addr;
-  modified_bp_addr = arc_debug_fetch_regs(ARC_STATUS_REGNUM);
-  regcache_raw_collect(regcache, ARC_STATUS_REGNUM, &modified_bp_addr);
-  modified_bp_addr = modified_bp_addr & 0xff000000;
-  bp_addr = bp_addr >>2;
-  modified_bp_addr |= bp_addr;
-  regcache_cooked_write_unsigned (regcache, ARC_BLINK_REGNUM, modified_bp_addr);
-#else
-  regcache_cooked_write_unsigned (regcache, ARC_BLINK_REGNUM, bp_addr);
-#endif
+    DEBUG("set BLINK = %X\n", (unsigned int) bp_addr);
 
-  /* Are we returning a value using a structure return or a normal value
-     return?  struct_addr is the address of the reserved space for the return
-     structure to be written on the stack.
-  */
-  /* FIXME:: Ramana :: What about 4 byte structures returned in r0 as
-     claimed by Metaware. 
-  */
-  
-  /* Now load as many as possible of the first arguments into registers,
-     and push the rest onto the stack.  */
-  argreg = ARC_ARG0_REGNUM;
- 
-  if (struct_return)
+    /* Are we returning a value using a structure return instead of a normal
+       value return? If so, struct_addr is the address of the reserved space
+       for the return structure to be written on the stack, and that address
+       is passed to that function as a hidden first argument.  */
+
+    if (struct_return)
     {
-      regcache_cooked_write_unsigned (regcache, ARC_ARG0_REGNUM, struct_addr);
-      argreg++;
-#ifdef ARC4_JTAG
-      sp = sp - 16;
-#endif
+        /* Pass the return address in the first argument register.  */
+        regcache_cooked_write_unsigned (regcache, arg_reg, struct_addr);
+
+        DEBUG("struct return address 0x%08lX passed in R%d", struct_addr, arg_reg);
+
+        arg_reg++;
     }
 
-  stack_offset = 0;
-
-  for (argnum = 0; argnum < nargs; argnum++)
+    /* If the function has arguments.  */
+    if (nargs > 0)
     {
-      int len;
-      char *val;
-      int reg_demand;
-      int i;
-      
-      len = TYPE_LENGTH (VALUE_TYPE (args[argnum]));
-      val = (char *) VALUE_CONTENTS (args[argnum]);
-      
-      /* How may registers worth of storage do we need for this argument?  */
-      reg_demand = (len / 4) + (len % 4 != 0 ? 1 : 0);
-        
-      if (argreg + reg_demand - 1 <= ARC_ARG7_REGNUM)
+        Boolean      big_endian  = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG;
+        unsigned int total_space = 0;
+        gdb_byte    *memory_image;
+        gdb_byte    *data;
+        int          i;
+
+        /* How much space do the arguments occupy in total?
+           N.B. must round each argument's size up to an integral number of words.  */
+        for (i = 0; i < nargs; i++)
         {
-          /* Data passed by value.  Fits in available register(s).  */
-          for (i = 0; i < reg_demand; i++)
+            unsigned int len   = TYPE_LENGTH (value_type (args[i]));
+            unsigned int space = ROUND_UP_TO_WORDS(len);
+
+            total_space += space;
+
+            DEBUG("function arg[%d]: %d bytes -> %d\n", i, len, space);
+        }
+
+        /* Allocate a buffer to hold a memory image of the arguments.  */
+        memory_image = XCALLOC((size_t) total_space, gdb_byte);
+        if (memory_image == NULL)
+        {
+            /* could not do the call! */
+            return 0;
+        }
+
+        /* Now copy all of the arguments into the buffer, correctly aligned.  */
+        data = memory_image;
+        for (i = 0; i < nargs; i++)
+        {
+            unsigned int len    = TYPE_LENGTH (value_type (args[i]));
+            unsigned int space  = ROUND_UP_TO_WORDS(len);
+            gdb_byte*    actual = data;
+            unsigned int w;
+
+            /* Parameters smaller than a word are normally aligned by gcc to the
+               least significant byte, so if we have a big-endian target we put
+               the data at the end of the word rather than at the start.  */
+            if ((len < BYTES_IN_WORD) && big_endian)
+               actual += BYTES_IN_WORD - len;
+
+            (void) memcpy(actual, value_contents (args[i]), (size_t) len);
+
+            DEBUG("function arg[%d] =", i);
+            for (w = 0; w < space / BYTES_IN_WORD; w++)
+                DEBUG(" 0x%08X", *((int*) data + w));
+            DEBUG("\n");
+
+            data += space;
+        }
+
+        /* Now load as much as possible of the memory image into registers.  */
+        data = memory_image;
+        while (arg_reg <= ARC_ABI_LAST_ARGUMENT_REGISTER)
+        {
+            ARC_RegisterContents contents = *(ARC_RegisterContents*) data;
+
+            DEBUG("passing 0x%08X in register R%d\n", (unsigned int) contents, arg_reg);
+
+            /* Convert to target byte order if necessary.  */
+            if (HOST_AND_TARGET_ENDIANNESS_DIFFER(gdbarch))
             {
-              regcache_cooked_write_unsigned (regcache, argreg, 
-					      *(unsigned long *) val);
-              argreg++;
-              val += 4;
+                contents = __bswap_32(contents);
+                DEBUG("byte-swapped to 0x%08X\n", contents);
             }
+
+            regcache_cooked_write_unsigned (regcache,
+                                            arg_reg,
+                                            (ULONGEST) contents);
+
+            data        += BYTES_IN_REGISTER;
+            total_space -= BYTES_IN_REGISTER;
+
+            /* If all the data is now in registers.  */
+            if (total_space == 0)
+                break;
+
+            arg_reg++;
         }
-      else if (argreg <= ARC_ARG7_REGNUM)
+
+        /* If there is any data left, push it onto the stack (in a single write operation).  */
+        if (total_space > 0)
         {
-          /* Data passed by value. Does not fit in available register(s).
-             Use the register(s) first, then the stack.  */
-          for (i = 0; i < reg_demand; i++)
-            {
-              if (argreg <= ARC_ARG7_REGNUM)
-                {
-		  regcache_cooked_write_unsigned (regcache, argreg, 
-						  *(unsigned long *) val);
-                  argreg++;
-                  val += 4;
-                }
-              else
-                {
-		  /* Push item for later so that pushed arguments
-		     come in the right order.  */
-		  si = push_stack_item (si, val, 4);
-                  val += 4;
-                }
-            }
+            DEBUG("passing %d bytes on stack\n", total_space);
+
+            sp -= total_space;
+            write_memory (sp, data, (int) total_space);
         }
-      else if (len > (2 * 4))
-        {
-	  /* FIXME */
-	  internal_error (__FILE__, __LINE__, "We don't do this");
-        }
-      else
-        {
-          /* Data passed by value.  No available registers.  Put it on
-             the stack.  */
-	   si = push_stack_item (si, val, len);
-        }
+
+        xfree(memory_image);
     }
 
-  while (si)
-    {
-      /* fp_arg must be word-aligned (i.e., don't += len) to match
-	 the function prologue.  */
-      sp = (sp - si->len) & ~3;
-#ifdef ARC4_JTAG
-      write_memory (sp + 16, si->data, si->len);
-#else
-      write_memory (sp, si->data, si->len);
-#endif
-      si = pop_stack_item (si);
-    }
+    /* Finally, update the SP register.  */
+    regcache_cooked_write_unsigned (regcache, ARC_SP_REGNUM, sp);
 
-  /* Finally, update the SP register.  */
-  regcache_cooked_write_unsigned (regcache, ARC_SP_REGNUM, sp);
+    DEBUG("set SP = %X\n", (unsigned int) sp);
 
-  return sp;
-  //#endif
+    return sp;
 }
 
-/* Align Frame */
+
+/* Align frame.  */
+
 static CORE_ADDR
 arc_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
 {
-  /* Align to the normal alignment on the stack).  */
-  return sp & ~3;
+    /* Align to the normal alignment on the stack).  */
+    return WORD_ALIGNED(sp);
 }
 
 
 /* Print interesting information about the floating point processor
    (if present) or emulator.  */
+
 static void
 arc_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
-		      struct frame_info *frame, const char *args)
+                      struct frame_info *frame, const char *args)
 {
-  printf("Software FPU \n");
+    printf(_("Software FPU\n"));
 }
 
 
 /* Set the main_name to "_main" if required.
    This is set as an observer of inferior_created.  */
+
 static void
 arc_set_main_name (struct target_ops *objfile, int from_tty)
 {
-  struct minimal_symbol *umainsym, *mainsym;
+    /* Old ARC toolchains prepend an underscore to symbol names.  If there is
+       an _main but no main, then we're probably debugging a binary that was
+       made with the old toolchain.  */
+    struct minimal_symbol *umainsym = lookup_minimal_symbol ("_main", NULL, NULL);
+    struct minimal_symbol *mainsym  = lookup_minimal_symbol ("main",  NULL, NULL);
 
-  /* Old ARC toolchains prepend an underscore to symbol names.  If there is
-     an _main but no main, then we're probably debugging a binary that was
-     made with the old toolchain.  */
-  umainsym = lookup_minimal_symbol ("_main", NULL, NULL);
-  mainsym = lookup_minimal_symbol ("main", NULL, NULL);
-  if(umainsym && !mainsym)
+    if ((umainsym != NULL) && (mainsym == NULL))
     {
-      set_main_name ("_main");
+        set_main_name ("_main");
     }
 
-  /* If we don't have any symbols, the default, i.e. "main", will get used.  */
+    /* If we don't have any symbols, the default, i.e. "main", will get used.  */
 }
 
 
-/* The following piece of code is borrowed from d10v */
-static void
-a4_address_to_pointer (struct type *type, void *buf, CORE_ADDR addr)
+/* This initialization function is called by gdb.
+   See gdbarch.h for a description of its parameters.  */
+
+static struct gdbarch*
+arc_gdbarch_init (struct gdbarch_info  info,
+                  struct gdbarch_list *arches)
 {
-#ifdef ARC4_JTAG
-  if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
-      || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD)
-    store_unsigned_integer (buf, TYPE_LENGTH (type), (addr>>2) & 0xffffff);
-  else
-    store_unsigned_integer (buf, TYPE_LENGTH (type), addr);
+    /* Allocate the ARC-private target-dependent information structure, and the
+       gdb target-independent information structure.  */
+    struct gdbarch_tdep *tdep    = xmalloc (sizeof (struct gdbarch_tdep));
+    struct gdbarch      *gdbarch = gdbarch_alloc (&info, tdep);
+
+    memset(tdep, 0, sizeof(*tdep));
+
+    /* Put stuff in gdbarch. */
+
+    /* Breakpoint manipulation.  */
+    set_gdbarch_breakpoint_from_pc  (gdbarch, arc_breakpoint_from_pc);
+    set_gdbarch_decr_pc_after_break (gdbarch, 0);
+
+    info.osabi = CONFIG_OSABI;
+    gdbarch_init_osabi(info, gdbarch);
+
+    /* Characters are unsigned by default.  */
+    set_gdbarch_char_signed (gdbarch, 0);
+
+    set_gdbarch_sp_regnum        (gdbarch, ARC_SP_REGNUM);
+    set_gdbarch_register_type    (gdbarch, arc_register_type);
+    set_gdbarch_print_float_info (gdbarch, arc_print_float_info);
+
+    /* Advance PC across function entry code.  */
+    set_gdbarch_skip_prologue (gdbarch, arc_skip_prologue);
+
+    /* Hook in the Dwarf-2 frame sniffer.  */
+    dwarf2_frame_set_init_reg   (gdbarch, arc_dwarf2_frame_init_reg);
+    frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
+
+    /* Signal frames.  */
+    frame_unwind_append_sniffer (gdbarch, arc_sigtramp_frame_sniffer);
+
+    /* The stack grows downward.  */
+    set_gdbarch_inner_than      (gdbarch, core_addr_lessthan);
+    set_gdbarch_unwind_pc       (gdbarch, arc_unwind_pc);
+    set_gdbarch_unwind_sp       (gdbarch, arc_unwind_sp);
+    set_gdbarch_unwind_dummy_id (gdbarch, arc_unwind_dummy_id);
+    frame_unwind_append_sniffer (gdbarch, arc_frame_sniffer);
+    set_gdbarch_return_value    (gdbarch, arc_return_value);
+
+    /* Add the ARC register groups.  */
+    reggroup_add (gdbarch, general_reggroup);
+    reggroup_add (gdbarch, all_reggroup);
+    reggroup_add (gdbarch, system_reggroup);
+
+    set_gdbarch_register_reggroup_p (gdbarch, arc_register_reggroup_p);
+
+    set_gdbarch_cannot_step_breakpoint (gdbarch, 1);
+    set_gdbarch_frame_align(gdbarch, arc_frame_align);
+
+    /* Dummy Frame handling.  */
+    set_gdbarch_push_dummy_call     (gdbarch, arc_push_dummy_call);
+    set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
+
+    /* N.B. we do not want to call arcompact_get_disassembler at this point, as we do
+            not as yet have an executable file, so do not know whether we want
+            the disassembler for the A4 architecture (still supported by the
+            opcodes library!) or the one for the ARCompact architecture; also,
+            it is better to pass the arcompact_get_disassembler function a valid bfd
+            structure, rather than a faked one, so that it can read the ARC-
+            specific sections in the ELF file (for whatever reason...).
+
+            So just set up a dummy disassembler at this point (gdb requires that
+            *some* disassembler is defined for an architecture), and set up a
+            callback which will set up the appropriate disassembler once an
+            executable file has been selected for debugging.  */
+
+#if 0
+    {
+        /* The arc libopcodes wants abfd so that it can find out what CPU
+           extensions are there.  */
+        bfd abfd;
+
+        abfd.sections = NULL;
+
+        set_gdbarch_print_insn(gdbarch, arcompact_get_disassembler(&abfd));
+    }
 #endif
+    set_gdbarch_print_insn(gdbarch, dummy_disassembler);
+    (void) observer_attach_new_objfile(set_disassembler);
+
+    /* Set main_name to _main if necessary.  Ideally we'd want a hook that
+       gets called when symbols are loaded, but it seems there isn't one; so
+       we'll use this.  This will not work if the user does "target remote
+       ..." and then "add-symbol-file ...".  */
+    (void) observer_attach_inferior_created (arc_set_main_name);
+
+    /* Initialize the target-dependent modules (if any).  */
+    CONFIG_INIT_TDEP
+
+    /* Return a pointer to the new object - indicates that a new architecture
+       has been created.  */
+    return gdbarch;
 }
 
-static CORE_ADDR
-a4_pointer_to_address (struct type *type, const void *buf)
-{
-#ifdef ARC4_JTAG  
-  CORE_ADDR addr = extract_unsigned_integer (buf, TYPE_LENGTH(type));
-  /* Is it a code address?  */
-  if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
-      || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD
-      || TYPE_CODE_SPACE (TYPE_TARGET_TYPE (type)))
-    return ((addr<<2) & 0x2ffffff);
-  else
-    return addr;
-#endif
-}
-
-static struct gdbarch *
-arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
-{
-  struct gdbarch_tdep *tdep;
-  struct gdbarch *gdbarch;
-
-  tdep = xmalloc (sizeof (struct gdbarch_tdep));
-  gdbarch = gdbarch_alloc (&info, tdep);
-  
-  /* Fixme :: Worry about default initialization of breakpoints 
-     for the ARC platform. In our case currently this is handled
-     out of arc-linux-tdep.c for default arc linux breakpoints.
-  */
-
-  info.osabi = CONFIG_OSABI;
-  gdbarch_init_osabi(info, gdbarch);
-  
-  /* Put stuff in gdbarch. */
-
-  /* Characters are unsigned by default */
-  set_gdbarch_char_signed (gdbarch, 0);
-
-  set_gdbarch_print_float_info (gdbarch, arc_print_float_info);
-  set_gdbarch_sp_regnum (gdbarch, ARC_SP_REGNUM);
-  set_gdbarch_register_type (gdbarch, arc_register_type);  
-
-  set_gdbarch_cannot_store_register (gdbarch, arc_cannot_store_register);
-
-
-  /* Advance PC across function entry code.  */
-  set_gdbarch_skip_prologue (gdbarch, arc_skip_prologue);
-
-  
-  /* Hook in the Dwarf-2 frame sniffer.  */
-  set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arc_binutils_reg_to_regnum);
-  dwarf2_frame_set_init_reg (gdbarch, arc_dwarf2_frame_init_reg);
-  frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
-
-  /* signal frames */
-  frame_unwind_append_sniffer (gdbarch, arc_sigtramp_frame_sniffer);
-
-
-
-  /* The stack grows downward.  */
-  set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
-
-  set_gdbarch_unwind_pc (gdbarch, arc_unwind_pc);
-  set_gdbarch_unwind_sp (gdbarch, arc_unwind_sp);
-  set_gdbarch_unwind_dummy_id (gdbarch, arc_unwind_dummy_id);
-  frame_unwind_append_sniffer (gdbarch, arc_frame_sniffer);
- 
-
-  set_gdbarch_return_value (gdbarch, arc_return_value);
-
-  /* Add the arc register groups.  */
-  arc_add_reggroups (gdbarch);
-  set_gdbarch_register_reggroup_p (gdbarch, arc_register_reggroup_p);
-  
-  /* Breakpoint manipulation.  */
-  set_gdbarch_breakpoint_from_pc (gdbarch, arc_breakpoint_from_pc);
-  set_gdbarch_frame_align(gdbarch,arc_frame_align);
-
-  /* Dummy Frame handling */
-  set_gdbarch_push_dummy_call (gdbarch, arc_push_dummy_call);
-  set_gdbarch_call_dummy_location (gdbarch,AT_ENTRY_POINT);
-  
-  /* Disassembly.  */
-  {
-    /* the arc libopcodes wants abfd so that it can find out what CPU
-       extensions are there */
-    bfd abfd;
-    abfd.sections = NULL;
-
-
-#ifndef ARC4_JTAG
-    set_gdbarch_print_insn(gdbarch, arcompact_get_disassembler(&abfd));
-#else
-    set_gdbarch_print_insn(gdbarch, arc_get_disassembler(&abfd));
-#endif
-  }
-
-#ifdef ARC4_JTAG  
-  set_gdbarch_address_to_pointer (gdbarch, a4_address_to_pointer);
-  set_gdbarch_pointer_to_address (gdbarch, a4_pointer_to_address);
-#endif
-  //#ifndef ARC4_JTAG
-  /* Set main_name to _main if necessary.  Ideally we'd want a hook that
-     gets called when symbols are loaded, but it seems there isn't one; so
-     we'll use this.  This will not work if the user does "target remote
-     ..." and then "add-symbol-file ..."  */
-  observer_attach_inferior_created (arc_set_main_name);
-  //#endif
-
-#ifdef ARC4_JTAG
-  //  set_gdbarch_write_pc (gdbarch, a4_write_pc);
-#endif
-
-  CONFIG_INIT_TDEP (gdbarch);
-  
-  return gdbarch;
-}
 
 static void
 arc_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
 {
+    /* Do nothing.  */
 }
 
+
+/* -------------------------------------------------------------------------- */
+/*                     local functions implementing commands                  */
+/* -------------------------------------------------------------------------- */
+
+/* <command>  [ <frame> ]
+   Display annotated stack frame.  */
+
+static void
+arc_show_stack_frame_command (char *arg, int from_tty)
+{
+    struct frame_info *fi;
+    gdb_byte           value[MAX_REGISTER_SIZE];
+    CORE_ADDR          pc, fp, sp, old_sp;
+    CORE_ADDR          addr;
+    enum lval_type     lval;
+    int                optimized;
+    int                realnum;
+    int                frame_size;
+    unsigned int      *frame_contents;
+    LocalVariable     *variables;
+    unsigned int       num_variables;
+
+    /* Find the frame.  */
+    fi = parse_frame_specification_1 (arg, _("No stack."), NULL);
+    gdb_assert(fi != NULL);
+
+    /* Find out PC, FP and SP for the frame.  */
+    pc = get_frame_pc(fi);
+    sp = get_frame_sp(fi);
+    get_frame_register(fi, ARC_FP_REGNUM, value);
+    fp = (CORE_ADDR) extract_unsigned_integer (value, BYTES_IN_REGISTER);
+
+    DEBUG("*** PC = %x, FP = %x, SP = %x\n", (unsigned int) pc, (unsigned int) fp, (unsigned int) sp);
+
+    if (pc == 0)
+    {
+        warning(_("invalid frame"));
+        return;
+    }
+
+    frame_register_unwind (fi, ARC_SP_REGNUM, &optimized, &lval, &addr, &realnum, value);
+    old_sp = (CORE_ADDR) extract_unsigned_integer (value, BYTES_IN_REGISTER);
+
+    /* Find the local variables and parameters.  */
+    variables = find_local_variables(fi, &num_variables);
+
+    printf_filtered(NEW_LINE);
+    identify_frame(fi);
+
+    DEBUG(_("\n\n*** FRAME: 0x%x .. 0x%x\n\n"), (unsigned int) sp, (unsigned int) (old_sp - 1));
+
+    frame_size = (int) (old_sp - sp);
+
+    frame_contents = xmalloc((size_t) frame_size);
+
+    if (frame_contents)
+    {
+        /* Read all of the frame's contents from target memory.  */
+        if (target_read_memory(sp, (gdb_byte*) frame_contents, frame_size) == 0)
+        {
+            int          numregs       = ARC_TOTAL_REGS;
+            int          i             = frame_size / BYTES_IN_WORD - 1;
+            unsigned int the_same      = 0;
+            unsigned int previous_word = 0;
+            Boolean      first_word    = TRUE;
+            Boolean      is_following_element;
+            Boolean      elements_are_word_sized;
+
+            addr = old_sp - BYTES_IN_WORD;
+
+            printf_filtered(NEW_LINE);
+
+            /* Traverse the frame from high address to low address, one word at a time.  */
+            while (i >= 0)
+            {
+                unsigned int this_word = frame_contents[i];
+                Boolean      print     = first_word;        /* Always print the first word. */
+                char         line[256];
+                int          n;
+
+                /* Start with a blank line.  */
+                (void) memset(line, (int) ' ', sizeof(line));
+
+                /* Does FP and/or SP address this particular stack location?  */
+                if (addr == sp && fp == sp)
+                {
+                    (void) strcpy(line + 14, _("SP/FP ===> "));
+                    line[25] = ' ';
+                    print = TRUE;
+                }
+                else if (addr == sp)
+                {
+                    (void) strcpy(line + 17, _("SP ===> "));
+                    line[25] = ' ';
+                    print = TRUE;
+                }
+                else if (addr == fp)
+                {
+                    (void) strcpy(line + 17, _("FP ===> "));
+                    line[25] = ' ';
+                    print = TRUE;
+                }
+
+                /* Does this stack location hold a local variable or parameter?  */
+                if ((add_local_name(line + 38,
+                                    addr,
+                                    variables,
+                                    num_variables,
+                                    &is_following_element,
+                                    &elements_are_word_sized)))
+                {
+                    /* Yes - so we want to print it (but this may be revised below!).  */
+                    print = TRUE;
+                }
+                else
+                {
+                    int r;
+
+                    /* Does this location hold a saved register?  */
+                    for (r = 0; r < numregs; r++)
+                    {
+                        if (r != ARC_SP_REGNUM &&
+                            gdbarch_register_reggroup_p (current_gdbarch, r, all_reggroup))
+                        {
+                            CORE_ADDR saved_addr;
+
+                            /* Find out the location of the saved register without
+                               fetching the corresponding value.  */
+                            frame_register_unwind (fi, r, &optimized, &lval, &saved_addr, &realnum, NULL);
+
+                            if (!optimized && lval == lval_memory && saved_addr == addr)
+                            {
+                                (void) sprintf(line + 38, _("saved register '%s'"), gdbarch_register_name(current_gdbarch, r));
+                                print = TRUE;
+                                break;
+                            }
+                        }
+                    }
+                }
+
+                /* Do we think we need to print out the line?  */
+                if (print)
+                {
+                    /* If the location is a non-zeroth word-sized array element,
+                       and this word is the same as the previous word.  */
+                    if (is_following_element && elements_are_word_sized && (this_word == previous_word))
+                    {
+                        /* No need to print it - one more word the same!  */
+                        the_same++;
+                        print = FALSE;
+                    }
+                }
+                else
+                {
+                    /* N.B. this will not be the first word (since print is FALSE) */
+
+                    /* This location does not hold anything "interesting",  but
+                       if this word is not the same as the previous word, we
+                       want to print it. */
+                    if (this_word == previous_word)
+                        the_same++;
+                    else
+                        print = TRUE;
+                }
+
+                /* OK, now we really know whether we need to print out the line.  */
+                if (print)
+                {
+                    n = sprintf(line, _("0x%08X:"), (unsigned int) addr);
+                    line[n] = ' ';
+
+                    n = sprintf(line + 25, "%08X", this_word);
+                    line[25 + n] = ' ';
+
+                    n = (int) sizeof(line) - 1;
+                    while (line[n] == ' ') n--;
+                    line[n + 1] = '\0';
+
+                    /* If we did not print the previous word because it was the
+                       same as the word before, but not the same as any preceding
+                       words, print it now (there is no point in outputting a
+                       message which says simply "... 1 words omitted" - we might
+                       just as well print out the word!  */
+                    if (the_same == 1)
+                        printf_filtered(_("0x%08X:              %08X\n"), (unsigned int) addr + BYTES_IN_WORD, previous_word);
+                    else if (the_same != 0)
+                        /* 2 or more words the same... */
+                        printf_filtered(_("... %u words omitted\n"), the_same);
+
+                    /* Now print out the line with the current word (and other information).  */
+                    printf_filtered(_("%s\n"), line);
+
+                    /* No words omitted.  */
+                    the_same = 0;
+                }
+
+                first_word    = FALSE;
+                previous_word = this_word;
+
+                addr -= BYTES_IN_WORD;
+                i--;
+            }
+
+            printf_filtered(NEW_LINE);
+        }
+
+        xfree(frame_contents);
+    }
+
+    xfree(variables);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the module. This function is called from the gdb core on start-up.  */
+
 void
 _initialize_arc_tdep (void)
 {
-  gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
+    /* Register the ARC processor architecture with gdb, providing an
+       initialization function and a dump function; 'bfd_arch_arc' is
+       an enumeration value specifically denoting the ARC architecture.  */
+    gdbarch_register(bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
+
+    /* Register ARC-specific commands with gdb.  */
+
+    add_setshow_boolean_cmd(DEBUG_COMMAND,
+                            no_class,
+                            &arc_debug_target,
+                            _("Set whether to print ARC debug messages.\n"),
+                            _("Show whether to print ARC debug messages.\n"),
+                            _("If set debug messages are printed.\n"),
+                            NULL,
+                            NULL,
+                            &setlist,
+                            &showlist);
+
+    (void) add_cmd(SHOW_FRAME_COMMAND,
+                   class_obscure,
+                   arc_show_stack_frame_command,
+                   _("Display the stack frame with annotation.\n"
+                     SHOW_FRAME_COMMAND_USAGE
+                     "<FRAME> may be the number or address of a frame.\n"),
+                   &cmdlist);
 }
 
+
+/* Initialize the info structure to enable the disassembler to be used.  */
+
+void
+arc_initialize_disassembler (struct disassemble_info *info)
+{
+    /* N.B. this type cast is not strictly correct: the return types differ!  */
+    init_disassemble_info(info, gdb_stdout, (fprintf_ftype) fprintf_filtered);
+    info->arch             = gdbarch_bfd_arch_info(current_gdbarch)->arch;
+    info->mach             = gdbarch_bfd_arch_info(current_gdbarch)->mach;
+    info->endian           = gdbarch_byte_order   (current_gdbarch);
+    info->read_memory_func = read_memory_for_disassembler;
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
index 4251eb4..8f33072 100644
--- a/gdb/arc-tdep.h
+++ b/gdb/arc-tdep.h
@@ -1,109 +1,148 @@
-/* Target dependent code for ARC700, for GDB, the GNU debugger.
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
 
-   Authors: 
-      Soam Vasani <soam.vasani@codito.com>
-      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+   Authors:
+      Soam Vasani          <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+      Richard Stuckey      <richard.stuckey@arc.com>
 
    This file is part of GDB.
-   
+
    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
+   the Free Software Foundation; either version 3 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.  
-*/
-enum arc700_api_regnums
-  {
-    ARC_ARG0_REGNUM     =        0,
-    ARC_ARG1_REGNUM     =        1,
-    ARC_ARG2_REGNUM     =        2,
-    ARC_ARG3_REGNUM     =        3,
-    ARC_ARG4_REGNUM     =        4,
-    ARC_ARG5_REGNUM     =        5,
-    ARC_ARG6_REGNUM     =        6,
-    ARC_ARG7_REGNUM     =        7,
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-    /* When a return value is stored in registers, is in either r0 or in
-       (r1,r0).  Used in arc_extract_return_value */
-    ARC_RETURN1_REGNUM	=	 0,
-    ARC_RETURN2_REGNUM 	=	 1
-  };
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines some target-dependent information which is    */
+/*     specific to the ARC gdb port.                                          */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_TDEP_H
+#define ARC_TDEP_H
+
+/* ARC header files */
+#include "arc-support.h"
 
 
-
-enum ARCProcessorVersion
-  {
-    UNSUPPORTED,
-    ARCompact,
-    ARC600,
-    ARC700,
-    A5,
-    A4,
-  };
+#define ARC_PC_REGNUM       (gdbarch_pc_regnum       (current_gdbarch))
+#define ARC_NUM_REGS        (gdbarch_num_regs        (current_gdbarch))
+#define ARC_NUM_PSEUDO_REGS (gdbarch_num_pseudo_regs (current_gdbarch))
+#define ARC_TOTAL_REGS      (ARC_NUM_REGS + ARC_NUM_PSEUDO_REGS)
 
 
-enum ARCExtensionsSupportedInformation
-  {
-    ARC700_MMU
-  };
+#define ARC_MAX_CORE_REGS                      64
+#define ARC_FIRST_EXTENSION_CORE_REGISTER      32
+#define ARC_LAST_EXTENSION_CORE_REGISTER       59
+#define ARC_NUM_EXTENSION_CORE_REGS            (ARC_LAST_EXTENSION_CORE_REGISTER - ARC_FIRST_EXTENSION_CORE_REGISTER + 1)
+#define ARC_NUM_STANDARD_CORE_REGS             (ARC_MAX_CORE_REGS - ARC_NUM_EXTENSION_CORE_REGS)
 
 
+#define IS_EXTENSION_CORE_REGISTER(hw_regnum)  (ARC_FIRST_EXTENSION_CORE_REGISTER <= (hw_regnum) && (hw_regnum) <= ARC_LAST_EXTENSION_CORE_REGISTER)
 
-typedef struct ARCProcessorInformation
-{
-  enum ARCProcessorVersion arcprocessorversion;
-  enum ARCExtensionsSupportedInformation extensionsSupported;
 
-}ARCVariantsInfo;
+/* ARC processor ABI-related registers:
+      R0  .. R7  are the registers used to pass arguments in function calls
+      R13 .. R26 are the callee-saved registers
+      when a return value is stored in registers it is in either R0 or in the pair (R0,R1).  */
+
+#define ARC_ABI_GLOBAL_POINTER                 26
+#define ARC_ABI_FRAME_POINTER                  27
+#define ARC_ABI_STACK_POINTER                  28
+
+#define ARC_ABI_FIRST_CALLEE_SAVED_REGISTER    13
+#define ARC_ABI_LAST_CALLEE_SAVED_REGISTER     26
+
+#define ARC_ABI_FIRST_ARGUMENT_REGISTER         0
+#define ARC_ABI_LAST_ARGUMENT_REGISTER          7
+#define ARC_ABI_REGISTER_PARAMETER_SPACE        ((ARC_ABI_LAST_ARGUMENT_REGISTER - ARC_ABI_FIRST_ARGUMENT_REGISTER + 1) * BYTES_IN_REGISTER)
+
+#define ARC_ABI_RETURN_REGNUM                   0
+#define ARC_ABI_RETURN_LOW_REGNUM               0
+#define ARC_ABI_RETURN_HIGH_REGNUM              1
+
+#define IS_ARGUMENT_REGISTER(hw_regnum)         (ARC_ABI_FIRST_ARGUMENT_REGISTER <= (hw_regnum) && (hw_regnum) <= ARC_ABI_LAST_ARGUMENT_REGISTER)
+
+
+/* This type is completed in the files arc-elf32-tdep.h and arc-linux-tdep.h,
+   as apppropriate for the arc-elf2 and arc-uclinux builds of gdb.  */
+typedef struct arc_variant_info ARC_VariantsInfo;
+
+
+#define REGISTER_NOT_PRESENT   (-1)   // special value for sc_reg_offset[reg]
+
+
+/* N.B. this assumes that the host is little-endian!  */
+#define HOST_AND_TARGET_ENDIANNESS_DIFFER(arch)    (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG)
+
+
+/* This structure holds target-dependent information.
+
+   N.B. this type is used in the target-independent gdb code, but it is treated
+        as an opaque (or private) type: the only use of it is by pointers to
+        objects of this type (passed as parameters or returned as results, or
+        held in other structures); it is only the ARC-specific modules that
+        have knowledge of the structure of this type and access its fields.  */
 
 struct gdbarch_tdep
 {
-  /* Detect sigtramp.  */
-  int (*sigtramp_p) (struct frame_info *);
-  
-  /* Get address of sigcontext for sigtramp.  */
-  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
+    /* Detect sigtramp.  */
+    Boolean (*is_sigtramp) (struct frame_info*);
 
-  /* Offset of registers in `struct sigcontext'.  */
-  int *sc_reg_offset;
-  int sc_num_regs;
+    /* Get address of sigcontext for sigtramp.  */
+    CORE_ADDR (*sigcontext_addr) (struct frame_info*);
 
-  /* In our linux target, gdbarch_pc_regnum points to stop_pc, which is a
-     register that's made-up by the kernel and does not actually exist.
-     stop_pc is NOT saved in the sigcontext; what is saved is the ret
-     "register".  Since ret is a linux-only register, it's regnum is visible
-     only in arc-linux-tdep.c; hence initialize pc_regnum_in_sigcontext in
-     arc-linux-tdep.c.  */
-  int pc_regnum_in_sigcontext;
+    /* Offset of registers in `struct sigcontext'.  */
+    const int   *sc_reg_offset;
+    unsigned int sc_num_regs;
 
-  /* Returns false, true, or -1; -1 means the tdep has nothing to say about this
-     register and group.  */
-  int (*register_reggroup_p) (int, struct reggroup *);
-  
-  /* Breakpoint instruction to be used */
-  unsigned char * arc_breakpoint_insn;
-  int arc_breakpoint_size;
+    /* In our linux target, gdbarch_pc_regnum points to stop_pc, which is a
+       register that is made up by the kernel and does not actually exist.
+       stop_pc is NOT saved in the sigcontext; what is saved is the ret
+       "register".  Since ret is a linux-only register, its regnum is visible
+       only in arc-linux-tdep.c; hence initialize pc_regnum_in_sigcontext in
+       arc-linux-tdep.c.  */
+    int pc_regnum_in_sigcontext;
 
-  /* For stopping backtraces.  */
-  CORE_ADDR lowest_pc;
-  
-  /* ARC Processor variant information.  */
-  ARCVariantsInfo * arc_processor_variant_info ;
+    /* Returns 0, 1, or -1:
+          0 means the register is not in the group.
+          1 means the register is in the group.
+         -1 means the tdep has nothing to say about this register and group.  */
+    int (*register_reggroup_p) (int regnum, struct reggroup *group);
 
+    /* Breakpoint instruction to be used.  */
+    const unsigned char *be_breakpoint_instruction;
+    const unsigned char *le_breakpoint_instruction;
+    unsigned int         breakpoint_size;
+
+    /* For stopping backtraces.  */
+    CORE_ADDR lowest_pc;
+
+    /* ARC processor variant information (may be NULL).  */
+    ARC_VariantsInfo *processor_variant_info;
 };
 
 
-void arc_software_single_step(enum target_signal ignore, int insert_breakpoints_p);
+/* Utility functions used by other ARC-specific modules.  */
 
+void arc_initialize_disassembler (struct disassemble_info *info);
+
+/* A global debug flag.  */
+extern Boolean arc_debug_target;
+
+#endif /* ARC_TDEP_H */
+/******************************************************************************/
diff --git a/gdb/arc-xiss.c b/gdb/arc-xiss.c
new file mode 100755
index 0000000..2319f36
--- /dev/null
+++ b/gdb/arc-xiss.c
@@ -0,0 +1,1787 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey      <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module creates an instance of a gdb 'target_ops' structure which  */
+/*     contains information and operations for debugging using the ARC xISS   */
+/*     (Fast Instruction Set Simulator) as the target.                        */
+/*                                                                            */
+/* Instruction Tracing:                                                       */
+/*     Two different kind of instruction tracing are supported:               */
+/*                                                                            */
+/*     1) a minimal trace which records only the address of each instruction  */
+/*        which is executed;                                                  */
+/*                                                                            */
+/*     2) a more detailed trace which includes the ordinal number of the      */
+/*        instruction in the trace, condition code settings, instruction      */
+/*        address, instruction disassembly, and the values of source and      */
+/*        destination operands.                                               */
+/*                                                                            */
+/*     The minimal trace is recorded by the xISS in an internal buffer whose  */
+/*     size may be determined by the gdb user; this buffer wraps around, so   */
+/*     that only the addresses of the most recently executed instructions are */
+/*     held. This data may then be saved to a file for subsequent inspection. */
+/*     The trace data is written in an encoding which gives a reduction in    */
+/*     size of approximately 80% compared to the raw data.                    */
+/*                                                                            */
+/*     See the manual                                                         */
+/*                                                                            */
+/*                           ARC GDB-Insight                                  */
+/*                     GNU Debugger With Insight GUI                          */
+/*                           Getting Started                                  */
+/*                                6009-001                                    */
+/*                                                                            */
+/*     for full information on how to use these trace facilities.             */
+/*                                                                            */
+/* Usage:                                                                     */
+/*     The module exports a function _initialize_arc_xiss: the call to this   */
+/*     function is generated by the gdb build mechanism, so this function     */
+/*     should not be explicitly called.                                       */
+/*                                                                            */
+/******************************************************************************/
+
+/* gdb configuration file */
+#include "config.h"
+
+/* This macro should be defined in the configuration file only if the arcint.h
+   file is available.  */
+#ifdef HAVE_LIBXISS
+
+/* system header files */
+#include <unistd.h>
+#include <errno.h>
+#include <dlfcn.h>
+
+/* gdb header files */
+#include "defs.h"
+#include "inferior.h"
+#include "disasm.h"
+#include "gdbcmd.h"
+#include "objfiles.h"
+#include "libiberty.h"
+#include "completer.h"
+#include "gdb_assert.h"
+
+/* ARC header files */
+#include "config/arc/tm-embed.h"
+#include "arc-xiss.h"
+#include "arc-tdep.h"
+#include "arc-elf32-tdep.h"
+#include "arc-architecture.h"
+#include "arc-inst-tracing.h"
+#include "arc-registers.h"
+
+/* This must be defined before arcint.h is included.  */
+#define OEM_USE_OF_DEBUGGER_HEADER_FILES 1
+
+/* This defines the interface by which the xISS is accessed.  */
+#include "arcint.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+typedef struct ARC* (*ARC_Interface)(void);
+
+typedef enum
+{
+   XISS_HALTED,
+   XISS_STEPPED,
+   XISS_TO_BE_RUN
+} ExecutionStatus;
+
+
+/* N.B. this is taken from arcint.cpp; there must be a better way of doing this!  */
+struct ARC
+{
+    ARC_functab *pftp;     /* Pointer to interface function table.  */
+};
+
+typedef void* WatchpointCookie;
+
+typedef struct _association
+{
+    WatchpointCookie cookie;
+    CORE_ADDR        addr;
+    int              length;
+    int              type;
+} Association;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define ARC_TARGET_NAME                    "arcxiss"
+#define ARC_INTERFACE                      "get_ARC_interface"
+
+#define SAVE_TRACE_TO_FILE_COMMAND         "arc-xiss-save-trace"
+#define EMPTY_TRACE_BUFFER_COMMAND         "arc-xiss-empty-trace-buffer"
+#define LIST_TRACE_COMMAND                 "arc-xiss-list-trace"
+
+#define SAVE_TRACE_TO_FILE_COMMAND_USAGE   "Usage: " SAVE_TRACE_TO_FILE_COMMAND " <FILE>\n"
+#define EMPTY_TRACE_BUFFER_COMMAND_USAGE   "Usage: " EMPTY_TRACE_BUFFER_COMMAND "\n"
+#define LIST_TRACE_COMMAND_USAGE           "Usage: " LIST_TRACE_COMMAND         " [ FROM=<VALUE> ] [ TO=<VALUE> ] [ <FILE> ]\n"
+
+
+/* N.B. the xISS does not currently use the context parameter supplied for
+        memory read/write operations, so its value is irrelevant.  */
+#define XISS_CONTEXT                       0
+
+
+/* The gdb target operations structure for this target.  */
+static struct target_ops xISS_target_ops;
+
+/* A set of pointers to operations for reading/writing registers/memory in the
+   xISS target. */
+static TargetOperations operations;
+
+/* Handles for access to the xISS target.  */
+static void        *xISS_DLL_handle;
+static struct ARC  *xiss_instance;
+static ARC_functab *xISS_functions;
+
+/* The status of program execution on the xISS target.  */
+static ExecutionStatus xISS_executionStatus;
+
+/* Data for handling instruction tracing.  */
+static Boolean xISS_trace_instructions;
+static char   *xiss_trace_file;
+static int     xiss_trace_buffer_size;
+
+/* This is the table for associating watchpoint details with watchpoint cookies.  */
+static Association *associations;
+static unsigned int num_associations;
+
+/* The address of data to which access caused a watchpoint to trigger.  */
+static CORE_ADDR stopped_data_address;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define EXTRACT(argument, type, result)                                    \
+{                                                                          \
+    struct expression *expr  = parse_expression(argument);                 \
+    struct value      *val   = evaluate_expression(expr);                  \
+    struct cleanup    *chain = make_cleanup(free_current_contents, &expr); \
+                                                                           \
+    result = *(type*) (value_contents (val));                              \
+    result ## _specified = TRUE;                                           \
+    do_cleanups (chain);                                                   \
+}
+
+/* This macro must cope with the cases:
+     var = value
+     var =value
+     var= value
+     var=value       */
+#define GET_PARAMETER(var)                                      \
+    if (strncasecmp(argv[i], #var "=", sizeof(#var)) == 0)      \
+    {                                                           \
+        if (argv[i][sizeof(#var)] == '\0')                      \
+        {                                                       \
+            i++;                                                \
+            if (argv[i] == NULL)                                \
+                invalid = TRUE;                                 \
+            else                                                \
+            {                                                   \
+                EXTRACT(argv[i], Ordinal, var)                  \
+                i++;                                            \
+            }                                                   \
+        }                                                       \
+        else                                                    \
+        {                                                       \
+            EXTRACT(argv[i] + sizeof(#var), Ordinal, var)       \
+            i++;                                                \
+        }                                                       \
+    }                                                           \
+    else if (strcasecmp(argv[i], #var) == 0)                    \
+    {                                                           \
+        i++;                                                    \
+        if (argv[i] == NULL)                                    \
+            invalid = TRUE;                                     \
+        else                                                    \
+        {                                                       \
+            if (argv[i][0] == '=')                              \
+            {                                                   \
+                if (argv[i][1] == '\0')                         \
+                {                                               \
+                    i++;                                        \
+                    if (argv[i] == NULL)                        \
+                        invalid = TRUE;                         \
+                    else                                        \
+                    {                                           \
+                        EXTRACT(argv[i], Ordinal, var)          \
+                        i++;                                    \
+                    }                                           \
+                }                                               \
+                else                                            \
+                {                                               \
+                    EXTRACT(argv[i] + 1, Ordinal, var)          \
+                    i++;                                        \
+                }                                               \
+            }                                                   \
+            else                                                \
+                invalid = TRUE;                                 \
+        }                                                       \
+    }
+
+
+#define CHECK_RANGE(source)                                                               \
+{                                                                                         \
+    if (from_specified)                                                                   \
+    {                                                                                     \
+        if (from < first || from > last)                                                  \
+        {                                                                                 \
+            warning(_("%s contains instruction range %llu .. %llu - using %llu as FROM"), \
+                    source, first, last, first);                                          \
+            gdb_flush(gdb_stderr);                                                        \
+            from = first;                                                                 \
+        }                                                                                 \
+    }                                                                                     \
+    else                                                                                  \
+        from = first;                                                                     \
+                                                                                          \
+    if (to_specified)                                                                     \
+    {                                                                                     \
+        if (to < first || to > last)                                                      \
+        {                                                                                 \
+            warning(_("%s contains instruction range %llu .. %llu - using %llu as TO"),   \
+                    source, first, last, last);                                           \
+            gdb_flush(gdb_stderr);                                                        \
+            to = last;                                                                    \
+        }                                                                                 \
+    }                                                                                     \
+    else                                                                                  \
+        to = last;                                                                        \
+}
+
+
+#define XISS_PROPERTY(key,value)   xISS_functions->process_property(xiss_instance, key, value)
+
+#define IS_SUPPORTED(flag)         ((xISS_functions->supports_feature(xiss_instance) & (flag)) != 0)
+
+#define XISS_AUX_REG(hw_regno)     ((ARC_REG_TYPE) hw_regno + (ARC_REG_TYPE) AUX_BASE)
+#define XISS_CORE_REG(hw_regno)    ((ARC_REG_TYPE) hw_regno)
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------------- */
+/* 1)                    functions for watchpoint table                       */
+/* -------------------------------------------------------------------------- */
+
+/* These functions implement a linear lookup table which associate an xISS
+   watchpoint cookie with the watchpoint's address, length and type; this is
+   not very efficient, but is quite sufficient for relatively small numbers of
+   watchpoints.  If we should need to handle large numbers of watchpoints
+   efficiently, a more sophisticated data structure may be required.  */
+
+
+/* Add an association to the table.  */
+
+static void
+associate (WatchpointCookie cookie, CORE_ADDR addr, int length, int type)
+{
+    Association *new  = NULL;
+    unsigned int i;
+
+    for (i = 0; i < num_associations; i++)
+    {
+        Association *association = &associations[i];
+
+        if (association->cookie == NULL)
+        {
+            new = association;
+            break;
+        }
+    }
+
+    if (new == NULL)
+    {
+        Association *new_associations = xrealloc(associations, sizeof(Association) * (num_associations + 1));
+
+        if (new_associations == NULL)
+            nomem(0);
+
+        associations = new_associations;
+        new = &new_associations[num_associations];
+        num_associations++;
+    }
+
+    new->cookie = cookie;
+    new->addr   = addr;
+    new->length = length;
+    new->type   = type;
+}
+
+
+/* Remove an association from the table, returning the cookie. */
+
+static WatchpointCookie
+disassociate (CORE_ADDR addr, int length, int type)
+{
+    unsigned int i;
+
+    for (i = 0; i < num_associations; i++)
+    {
+        Association *association = &associations[i];
+
+        if (association->addr   == addr   &&
+            association->length == length &&
+            association->type   == type)
+        {
+            WatchpointCookie cookie = association->cookie;
+
+            association->cookie = NULL;
+            return cookie;
+        }
+    }
+
+    return NULL;
+}
+
+
+/* Find the address associated with a cookie.  */
+
+static CORE_ADDR
+find (WatchpointCookie cookie)
+{
+    unsigned int i;
+
+    for (i = 0; i < num_associations; i++)
+    {
+        Association *association = &associations[i];
+
+        if (association->cookie == cookie)
+            return association->addr;
+    }
+
+    return 0;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 2)                functions for reading/writing registers                  */
+/* -------------------------------------------------------------------------- */
+
+/* N.B. the register contents returned by these functions, or supplied to them,
+        are in host byte order - the arcint.cpp interface to the xISS requires
+        this.  */
+
+/* Read a core register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : set to the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the read fails
+
+   Result: TRUE if the register contents are read. */
+
+static Boolean
+read_xiss_core_register (ARC_RegisterNumber    hw_regno,
+                         ARC_RegisterContents *contents,
+                         Boolean               warn_on_failure)
+{
+    unsigned long value;
+    int           result = xISS_functions->read_reg(xiss_instance, XISS_CORE_REG(hw_regno), &value);
+
+    if (result == 1)
+    {
+        *contents = (ARC_RegisterContents) value;
+        DEBUG("Read value 0x%08X from core register %d\n", *contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_core_warning(ERROR_ON_READING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+
+/* Write a core register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : set to the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the write fails
+
+   Result: TRUE if the register contents are written. */
+
+static Boolean
+write_xiss_core_register (ARC_RegisterNumber   hw_regno,
+                          ARC_RegisterContents contents,
+                          Boolean              warn_on_failure)
+{
+    int result = xISS_functions->write_reg(xiss_instance, XISS_CORE_REG(hw_regno), (unsigned long) contents);
+
+    if (result == 1)
+    {
+        DEBUG("Written value 0x%08X to core register %d\n", contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_core_warning(ERROR_ON_WRITING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+
+/* Read an auxiliary register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : set to the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the read fails
+
+   Result: TRUE if the register contents are read. */
+
+static Boolean
+read_xiss_aux_register (ARC_RegisterNumber    hw_regno,
+                        ARC_RegisterContents *contents,
+                        Boolean               warn_on_failure)
+{
+    unsigned long value;
+    int           result = xISS_functions->read_reg(xiss_instance, XISS_AUX_REG(hw_regno), &value);
+
+    if (result == 1)
+    {
+        *contents = (ARC_RegisterContents) value;
+        DEBUG("Read value 0x%08X from auxiliary register %d\n", *contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_aux_warning(ERROR_ON_READING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+
+/* Write an auxiliary register on the target.
+
+   Parameters:
+      hw_regno       : the ARC hardware number of the register
+      value          : the contents of the register
+      warn_on_failure: TRUE if a warning should be issued if the write fails
+
+   Result: TRUE if the register contents are written. */
+
+static Boolean
+write_xiss_aux_register (ARC_RegisterNumber   hw_regno,
+                         ARC_RegisterContents contents,
+                         Boolean              warn_on_failure)
+{
+    ARC_AuxRegisterDefinition *def = arc_find_aux_register_by_hw_number(hw_regno);
+    int                        result;
+
+    if (def)
+        contents = arc_write_value(def, contents);
+
+    result = xISS_functions->write_reg(xiss_instance, XISS_AUX_REG(hw_regno), (unsigned long) contents);
+
+    if (result == 1)
+    {
+        DEBUG("Written value 0x%08X to auxiliary register %d\n", contents, hw_regno);
+        return TRUE;
+    }
+
+    if (warn_on_failure)
+        arc_elf32_aux_warning(ERROR_ON_WRITING_REGISTER, hw_regno);
+    return FALSE;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 3)                functions for reading/writing memory                     */
+/* -------------------------------------------------------------------------- */
+
+/* These functions should NOT be used within this module: they are intended
+   purely for use by the arc-memory module for reading/writing multiple words
+   of data at word-aligned addresses.  */
+
+static unsigned int
+read_words (ARC_Address  address,
+            ARC_Byte    *data,
+            unsigned int words)
+{
+    DEBUG("reading %u words from 0x%08X in xISS\n", words, address);
+
+    gdb_assert(IS_WORD_ALIGNED(address));
+
+    return (unsigned int) xISS_functions->read_memory
+                              (xiss_instance,
+                               (unsigned long) address,
+                                               data,
+                               (unsigned long) words * BYTES_IN_WORD,
+                                               XISS_CONTEXT);
+}
+
+
+static unsigned int
+write_words (ARC_Address  address,
+             ARC_Byte    *data,
+             unsigned int words)
+{
+    gdb_assert(IS_WORD_ALIGNED(address));
+
+    DEBUG("writing %u words to 0x%08X in xISS\n", words, address);
+
+    return (unsigned int) xISS_functions->write_memory
+                              (xiss_instance,
+                               (unsigned long) address,
+                                               data,
+                               (unsigned long) words * BYTES_IN_WORD,
+                                               XISS_CONTEXT);
+}
+
+
+static unsigned int
+write_pattern (ARC_Address  address,
+               ARC_Word     pattern,
+               unsigned int words)
+{
+    gdb_assert(IS_WORD_ALIGNED(address));
+
+    DEBUG("writing pattern 0x%08X repeated %u times to 0x%08X in xISS\n", pattern, words, address);
+
+    return (unsigned int) xISS_functions->fill_memory
+                              (xiss_instance,
+                               (unsigned long) address,
+                                               &pattern,
+                                               BYTES_IN_WORD,
+                               (unsigned int)  words,
+                                               XISS_CONTEXT);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 4)                   functions for xISS interface management               */
+/* -------------------------------------------------------------------------- */
+
+/* Open the interface to the debug target.
+
+   Parameters:
+      systemfile: the .xis file defining the simulated target
+      from_tty  : non-zero if the 'target' command was issued at the terminal
+*/
+
+static Boolean
+open_xISS_interface (const char *systemfile, int from_tty)
+{
+    const char   *xiss_home = getenv("XISS_HOME");
+    char          library[FILENAME_MAX];
+    ARC_Interface arc_interface;
+
+    if (xiss_home == NULL)
+        error(_("Environment variable XISS_HOME is not set"));
+
+    /* Construct the path to the xISS .so file.  */
+    (void) snprintf(library, sizeof(library), "%s/lib/libxiss.so", xiss_home);
+
+    /* Try to dynamically load the shared object library containing the xISS.  */
+    xISS_DLL_handle = dlopen(library, RTLD_LAZY);
+
+    if (xISS_DLL_handle == NULL)
+    {
+        const char *diagnostic = dlerror();
+
+        if (strstr(diagnostic, library))
+            error(_("Can not open xISS shared library %s"), diagnostic);
+        else
+            error(_("Can not open xISS shared library %s: %s"), library, diagnostic);
+    }
+
+    /* Find the function in the library which will create an instacne of the xISS.  */
+    arc_interface = dlsym(xISS_DLL_handle, ARC_INTERFACE);
+
+    if (arc_interface ==  NULL)
+        error(_("Can not find function %s in xISS shared library %s"), ARC_INTERFACE, library);
+
+    /* Create an xISS instance.  */
+    xiss_instance = arc_interface();
+
+    if (xiss_instance == NULL)
+        error(_("Can not create instance of xISS"));
+
+    /* Get a pointer to the table of functions provided by the interface.  */
+    xISS_functions = xiss_instance->pftp;
+
+    DEBUG("xISS interface        : %s\n", xISS_functions->id(xiss_instance));
+    DEBUG("xISS interface version: %d\n", xISS_functions->version(xiss_instance));
+
+    /* Tell the xISS what system file to use to define the simulated target.  */
+    if (XISS_PROPERTY("xiss_sys", systemfile) != 1)
+        error(_("xISS could not process 'xiss_sys' property"));
+
+    if (IS_SUPPORTED(ARC_FEATURE_fill_memory))
+        operations.fill_memory = write_pattern;
+
+    (void) xISS_functions->prepare_for_new_program(xiss_instance, 1);
+
+    /* This is somewhat inelegant, but commands read from scripts in the gdb
+       testsuite are regarded as though they were being input interactively
+       (i.e. from_tty is 1), and interactive queries may be made (such as
+       asking the user whether the program currently being debugged should be
+       killed first) - and these queries hang the tests!
+
+       So, if the environment variable is set, assume that the gdb test suite is
+       being run, so that no such queries will be made.
+
+       It is not possible to make this check in the top-level command handler
+       loop, as the output from some other commands (e.g. 'file') depend on the
+       from_tty parameter passed to them, and the gdb test scripts expect to get
+       the interactive version of the output!  */
+    target_preopen(from_tty && (getenv("ARC_GDB_TEST") == NULL));
+
+    return TRUE;
+}
+
+
+/* Close the JTAG interface to the debug target.
+
+   Parameter:
+      resume: TRUE if program execution on the target should be allowed to resume.  */
+
+static void
+close_xISS_interface (Boolean resume)
+{
+    /* If we have a target connected.  */
+    if (xiss_instance != NULL)
+    {
+        /* It is meaningless to resume execution of the xISS.  */
+        arc_elf32_close(FALSE);
+
+        /* If we are doing instruction tracing.  */
+        if (xiss_trace_file)
+        {
+            /* Ensure that the trace file is closed.  */
+            if (XISS_PROPERTY("trace_file", "") != 1)
+                error(_("xISS could not process 'trace_file' property"));
+        }
+
+        /* Close the connection.  */
+        xISS_functions->destroy(xiss_instance);
+
+        /* Close the library.  */
+        if (dlclose(xISS_DLL_handle) != 0)
+            warning(_("error on closing xISS shared library: %s"), dlerror());
+
+        xiss_instance   = NULL;
+        xISS_functions  = NULL;
+        xISS_DLL_handle = NULL;
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 5)                functions for starting/stopping the processor            */
+/* -------------------------------------------------------------------------- */
+
+/* Run the xISS for whatever quantum of instructions that it executes.  */
+static void
+run_processor (void)
+{
+    int result = xISS_functions->run(xiss_instance);
+
+    if (result == 0)
+        warning(_("could not run"));
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 6)       local functions called from outside this module (from gdb)        */
+/* -------------------------------------------------------------------------- */
+
+/* Connect to the xISS target.
+
+   Parameters:
+      args    : user arguments to the 'target' command
+      from_tty: non-zero if the 'target' command was issued at the terminal
+
+   The arguments may be: <XIS_system_file>
+
+   If the name of a system file is not specified, a file 'default.xis' is
+   assumed.  */
+
+static void
+arc_xISS_open (char *args, int from_tty)
+{
+    char *systemfile = (args) ? args : "default.xis";
+
+    ENTERARGS("\"%s\" (%d)", (args) ? args : "", from_tty);
+
+    if (access(systemfile, R_OK) != 0)
+    {
+        char *file = getenv("XISS_SYSTEM_FILE");
+
+        if (file == NULL)
+            error(_("Invalid xISS system file '%s': %s"), systemfile, strerror(errno));
+        else
+            if (access(file, R_OK) != 0)
+                error(_("Invalid xISS system file '%s': %s"), file, strerror(errno));
+            else
+                systemfile = file;
+    }
+
+    arc_program_is_loaded = FALSE;
+
+    xISS_trace_instructions = FALSE;
+    xiss_trace_file         = NULL;
+    xISS_executionStatus    = XISS_HALTED;
+    xiss_trace_buffer_size  = 0;
+
+    num_associations = 0;
+    associations     = NULL;
+
+    /* Find any well-known aux register numbers that we will need.  */
+    arc_elf32_find_register_numbers();
+
+    /* Just to be sure that it is not in the target stack...  */
+    (void) unpush_target (&xISS_target_ops);
+
+    /* Now try to open the xISS interface.  */
+    if (open_xISS_interface(systemfile, from_tty))
+    {
+        (void) push_target (&xISS_target_ops);
+
+        if (from_tty)
+            printf_filtered (_("Connected to the " ARC_TARGET_NAME " target.\n"));
+    }
+    else
+        error(_("Can not connect to target"));
+}
+
+
+/* Close the connection to the target.  */
+
+static void
+arc_xISS_close (int quitting)    /* Ignored.  */
+{
+    ENTERMSG;
+
+    close_xISS_interface(FALSE);
+
+    xfree(associations);
+    associations     = NULL;
+    num_associations = 0;
+}
+
+
+/* Cause the inferior on the debug target to resume execution, sending a signal
+   if necessary.
+
+   Parameters:
+      ptid  : the thread id of the thread to be resumed (ignored)
+      step  : 1 means single step, 0 run freely.
+      signal: the number of the signal to be sent
+
+   N.B. signals are not supported.  */
+
+static void
+arc_xISS_resume (ptid_t ptid, int step, enum target_signal signal)
+{
+    ENTERARGS("%d, %d, %d", ptid.pid, step, signal);
+
+    if (signal != TARGET_SIGNAL_0)
+        error(_("Signals are not supported by the " ARC_TARGET_NAME " target"));
+
+    if (step)
+    {
+        int result = xISS_functions->step(xiss_instance);
+
+        if (result == 0)
+            error(_("Can not single-step"));
+        else
+            xISS_executionStatus = XISS_STEPPED;
+    }
+    else
+        xISS_executionStatus = XISS_TO_BE_RUN;
+
+    LEAVEMSG;
+}
+
+
+/* Wait for execution on the target to halt (for whatever reason).
+
+   Parameters :
+      ptid  : ignored
+      status: set to indicate status at end of the wait
+*/
+
+static ptid_t
+arc_xISS_wait (ptid_t ptid, struct target_waitstatus *status)
+{
+    ENTERARGS("xISS execution status: %d", xISS_executionStatus);
+
+    /* What was done the last time that execution was resumed?  */
+    switch (xISS_executionStatus)
+    {
+        case XISS_STEPPED:
+            DEBUG("processor has stepped\n");
+            status->kind      = TARGET_WAITKIND_STOPPED;
+            status->value.sig = TARGET_SIGNAL_TRAP;
+            break;
+
+        case XISS_TO_BE_RUN:
+            arc_elf32_execute(status,
+                              run_processor,
+                              NULL,
+                              NULL);
+
+            if (status->kind == TARGET_WAITKIND_EXITED)
+                target_mark_exited (&xISS_target_ops);
+            break;
+
+        case XISS_HALTED:
+            break;
+    }
+
+    LEAVEMSG;
+
+    return inferior_ptid;
+}
+
+
+/* This gets called just before store_regs.  */
+
+static void
+arc_xISS_prepare_to_store (struct regcache *regcache)
+{
+    ENTERMSG;
+}
+
+
+static void
+arc_xISS_files_info (struct target_ops *target)
+{
+    /* Do nothing.  */
+    ENTERMSG;
+}
+
+
+/* Heavy duty arsenal. Kill the process.  */
+
+static void
+arc_xISS_kill (void)
+{
+  ENTERMSG;
+
+  target_mourn_inferior ();
+}
+
+
+/* Load the program into memory via the xISS interface.  */
+
+static void
+arc_xISS_load (char *args, int from_tty)
+{
+    /* The program will be downloaded to the simulator.  */
+    (void) xISS_functions->prepare_for_new_program(xiss_instance, 1);
+
+    arc_elf32_load_program(args, from_tty);
+
+    /* Tell xISS that program is fully loaded.  */
+    if (XISS_PROPERTY("download_complete", "1") != 1)
+        error(_("xISS could not process 'download_complete' property"));
+
+    /* We now have a program ready for execution on the target.  */
+}
+
+
+/* Create the inferior that will be executed upon the target.
+
+   Parameters :
+      exec_file: the executable file containing the program to be executed
+      args     : the command line arguments to be passed to the program
+      env      : the environment (name/value pairs) for the program
+      from_tty : ignored
+ */
+
+static void
+arc_xISS_create_inferior (char *exec_file, char *args, char **env, int from_tty)
+{
+    arc_elf32_create_inferior(exec_file, args, env, &xISS_target_ops);
+}
+
+
+/* Mourn the inferior.  */
+
+static void
+arc_xISS_mourn_inferior (void)
+{
+    ENTERMSG;
+
+//  (void) unpush_target (&xISS_target_ops);
+
+    /* N.B. we must delete all breakpoints from the target here: the gdb core
+            function generic_mourn_inferior marks all breakpoints as not being
+            inserted on the target, with the result that subsequent calls to
+            remove_breakpoints will NOT remove any breakpoints that are set on
+            the target; this means that if target execution is re-started, gdb
+            will attempt to re-insert the breakpoints, which causes a problem
+            with software breakpoints: the target insert_breakpoint function
+            reads the code at the b/p address (which is the s/w b/p instruction)
+            and saves it as the "overwritten" code - so when the breakpoint is
+            subsequently removed, the b/p instruction is written back to the
+            b/p address again!  That is not what is desired...  */
+    (void) remove_breakpoints();
+    generic_mourn_inferior();
+    current_target.to_has_execution = 0;
+}
+
+
+/* Check whether the given thread is alive.  */
+
+static int
+arc_xISS_thread_alive (ptid_t ptid)
+{
+    ENTERMSG;
+
+    /* We only have one thread.  */
+    return 1;
+}
+
+
+/* Check whether our debug target is runnable: return 1 if it is, 0 otherwise. */
+
+static int arc_xISS_can_run (void)
+{
+    /* If we are connected to the xISS i/f, and a program is loaded.  */
+    return (xiss_instance != NULL) && arc_program_is_loaded;
+}
+
+
+/* We do not support asynchronous execution of the target program (i.e. commands
+   like 'run' or 'continue' or 'step' can not be executed in background mode
+   by appending a '&' to them) so we do not need to implement the target stop
+   operation (called by the 'interrupt' command); interrupting a running program
+   is handled by the Ctrl-C mechanism.  */
+
+#if 0
+static void
+arc_xISS_stop (void)
+{
+    ENTERMSG;
+}
+#endif
+
+
+/* Check if we can set a "hardware" watchpoint of type TYPE.  TYPE is
+   one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint, or
+   bp_hardware_breakpoint.  COUNT is the number of such watchpoints used so far
+   (including this one).  OTHERTYPE is the total number of "hardware" breakpoints
+   and watchpoints of other types that are "already" set
+   (0 if type == bp_hardware_breakpoint).
+
+   Result:   0 if hardware watchpoints are not supported
+            -1 if there are not enough hardware watchpoints
+             1 if there are enough hardware watchpoints
+
+   N.B. this is not what is stated in target.h, but it does conform to the use
+        made of this function's result in breakpoint.c!  */
+
+static int
+arc_xISS_can_use_hw_breakpoint (int type, int count, int othertype)
+{
+    ENTERARGS("type %d, count %d", type, count);
+
+    switch (type)
+    {
+         case bp_hardware_watchpoint:
+         case bp_read_watchpoint:
+         case bp_watchpoint:     /* This means bp_write_watchpoint.  */
+             return 1;
+         case bp_hardware_breakpoint:
+             return 0;
+         default:
+             return 0;
+    }
+}
+
+
+/* Insert a "hardware" watchpoint on the target.
+
+   Parameters:
+      addr  : the start address of the region of memory to be watched
+      length: the length in bytes of the region of memory
+      type  : 0 => write, 1 => read, 2 => read/write
+
+   Returns 0 for success, -1 for failure.  */
+
+static int
+arc_xISS_insert_watchpoint (CORE_ADDR addr, int length, int type)
+{
+    WatchpointCookie cookie;
+    unsigned int     options;
+
+    ENTERARGS("0x%08X:%d %d", (unsigned int) addr, length, type);
+
+    gdb_assert(length > 0);
+
+    switch (type)
+    {
+        case 0:
+            options = ARC_WATCHPOINT_write;
+            break;
+        case 1:
+            options = ARC_WATCHPOINT_read;
+            break;
+        case 2:
+            options = ARC_WATCHPOINT_read | ARC_WATCHPOINT_write;
+            break;
+        default:
+            internal_error (__FILE__, __LINE__, _("invalid watchpoint type: %d"), type);
+    }
+
+    if (xISS_functions->set_mem_watchpoint2(xiss_instance, (unsigned long) addr, length, options, &cookie) == 1)
+    {
+        associate(cookie, addr, length, type);
+        return 0;
+    }
+
+    return 1;
+}
+
+
+/* Remove a "hardware" watchpoint from the target.
+
+   Parameters:
+      addr  : the start address of the region of memory being watched
+      length: the length in bytes of the region of memory
+      type  : 0 => write, 1 => read, 2 => read/write
+
+   Returns 0 for success, non-zero for failure.  */
+
+static int
+arc_xISS_remove_watchpoint (CORE_ADDR addr, int length, int type)
+{
+    WatchpointCookie cookie = disassociate(addr, length, type);
+
+    ENTERARGS("0x%x:%d %d", (unsigned int) addr, length, type);
+
+    if (cookie != NULL)
+        return (xISS_functions->remove_watchpoint(xiss_instance, cookie) == 1) ? 0 : 1;
+    return 1;
+}
+
+
+/* Returns non-zero if the execution of the target program has been stopped by
+   the trigger of a "hardware" watchpoint (i.e. on memory read or write), zero
+   otherwise.  */
+
+static int
+arc_xISS_stopped_by_watchpoint (void)
+{
+    WatchpointCookie cookie;
+
+    ENTERMSG;
+
+    if (xISS_functions->stopped_at_watchpoint2(xiss_instance, &cookie) == 1)
+    {
+        /* Regrettably, the arcint i/f does not provide a well-defined means for
+           finding out the address of the data which was accessed - to do this
+           we have had to define a special property which returns the required
+           address!  */
+        int result = XISS_PROPERTY("watchpoint", "return_hit_address");
+
+        if (result == 0)
+        {
+            DEBUG("xISS could not process 'watchpoint/return_hit_address' property");
+
+            /* The most we can do now is retrieve the start address of the
+               watchpoint which was triggered...
+               N.B. we must retrieve the watchpoint address here, rather than in
+                    the arc_xISS_stopped_data_address function, as gdb deletes
+                    all breakpoint and watchpoints from the target as soon as
+                    execution is halted, which removes the cookie from the table!  */
+            stopped_data_address = find(cookie);
+        }
+        else
+            stopped_data_address = (CORE_ADDR) result;
+
+        return 1;
+    }
+
+    return 0;
+}
+
+
+/* Get the address of the data that was read/written causing a h/w watchpoint to
+   trigger; the address is returned in the '*addr' parameter.
+   Returns 0 for failure, non-zero for success.  */
+
+static int
+arc_xISS_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr)
+{
+    ENTERMSG;
+
+    DEBUG("data addr: 0x%08X\n", (unsigned int) stopped_data_address);
+    *addr = stopped_data_address;
+
+    return 1;
+}
+
+
+/* Can a h/w watchpoint 'length' bytes long be set at address 'addr' in target memory?  */
+
+static int
+arc_xISS_region_ok_for_hw_watchpoint (CORE_ADDR addr, int length)
+{
+    /* As far as we know, we can set a h/w watchpoint anywhere.  */
+    return 1;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 7)                   functions for instruction tracing                     */
+/* -------------------------------------------------------------------------- */
+
+/* Display the instruction at the given address and ordinal position in the
+   instruction trace. */
+
+static void
+display_instruction (Ordinal ordinal, unsigned int address)
+{
+    /* N.B. must use fprintf_filtered here, rather than fprintf_unfiltered, as
+            gdb_print_insn calls fprintf_filtered, and if we mix the use of the
+            two we can get garbled output!  */
+    fprintf_filtered(gdb_stdout, "<0x%016llX>       0x%08X      ", ordinal, address);
+    (void) gdb_print_insn((CORE_ADDR) address, gdb_stdout, NULL);
+    fprintf_filtered(gdb_stdout, "\n");
+}
+
+
+/* Get the ordinal position of the first instruction in the trace buffer in the
+   sequence of executed instructions from the xISS; return 0 if this number cannot
+   be obtained.  */
+
+static Ordinal
+get_instruction_trace_start (void)
+{
+    /* N.B. XISS_PROPERTY returns 0 if the property is not handled.  */
+    int     start_low  = XISS_PROPERTY("instruction_trace", "return_start_count_low");
+    int     start_high = XISS_PROPERTY("instruction_trace", "return_start_count_high");
+    Ordinal start      = ((Ordinal) start_high) << 32 | (Ordinal) start_low;
+
+    DEBUG("get_instruction_trace_start : %llu\n", start);
+
+    return start;
+}
+
+
+/* Encode the instruction trace buffer retrieved from the xISS: the buffer
+   'trace' contains 'length' entries which are all PC values.  The data is
+   recorded in the currently open trace file in a packed format.  */
+
+static void
+encode_instruction_trace (unsigned int trace[], int length)
+{
+    unsigned int lastPC = trace[0];
+    int          i;
+
+    /* Store the first entry in the buffer as an absolute address.  */
+    arc_encode_PC(ABSOLUTE_31_BITS, lastPC / 2);
+
+    /* Look at all the remaining entries, comparing each with the previous one.  */
+    for (i = 1; i < length; i++)
+    {
+        unsigned int thisPC = trace[i];
+        int          delta  = (int) thisPC - (int) lastPC;
+
+        /* Encode the difference in the PC as a relative offset, if possible.
+           Offsets of 0 (branch to current address), 2, 4, 6 and 8 (instruction
+           sizes + optional immediate size) are handled as special cases.  */
+
+        if (delta == 0)
+            arc_encode_PC(NO_CHANGE, 0);
+        else if (delta == 2)
+            arc_encode_PC(PLUS_16_BITS, 0);
+        else if (delta == 4)
+            arc_encode_PC(PLUS_32_BITS, 0);
+        else if (delta == 6)
+            arc_encode_PC(PLUS_48_BITS, 0);
+        else if (delta == 8)
+            arc_encode_PC(PLUS_64_BITS, 0);
+        else if (0 < delta && delta <= MAX_DELTA)
+            arc_encode_PC(DELTA_16_BIT_POSITIVE, ENCODE_DELTA(delta));
+        else if (0 > delta && delta >= -MAX_DELTA)
+            arc_encode_PC(DELTA_16_BIT_NEGATIVE, ENCODE_DELTA(-delta));
+        else
+            arc_encode_PC(ABSOLUTE_31_BITS, thisPC / 2);
+
+        lastPC = thisPC;
+    }
+
+    /* Useful tracing code: dump buffer as raw binary.  */
+#if 0
+    {
+        int binary = open("trace.binary", O_CREAT | O_WRONLY, 0666);
+
+        if (binary == -1)
+            warning(_("could not open file trace.binary"));
+        else
+        {
+            (void) write(binary, trace, length * sizeof(unsigned int));
+            (void) close(binary);
+        }
+    }
+#endif
+}
+
+
+/* Decode the instruction trace buffer retrieved from a file. This is the inverse
+   of the encoding performed by the 'encode_instruction_trace' function.
+   The instruction at each PC value decoded is disassembled and displayed only if
+   its ordinal position in the trace is in the range given by the 'from' and 'to'
+   parameters.  */
+
+static void
+decode_instruction_trace (Ordinal from, Ordinal to, Ordinal ordinal)
+{
+    ARC_ProgramCounterEncoding encoding;
+    unsigned int               thisPC = 0;
+    unsigned int               lastPC = 0;
+    unsigned int               value;
+
+    while (arc_decode_PC(&encoding, &value))
+    {
+        switch (encoding)
+        {
+            case NO_CHANGE:
+                break;
+            case PLUS_16_BITS:
+                thisPC += 2;
+                break;
+            case PLUS_32_BITS:
+                thisPC += 4;
+                break;
+            case PLUS_48_BITS:
+                thisPC += 6;
+                break;
+            case PLUS_64_BITS:
+                thisPC += 8;
+                break;
+            case DELTA_16_BIT_POSITIVE:
+                thisPC += DECODE_DELTA(value);
+                break;
+            case DELTA_16_BIT_NEGATIVE:
+                thisPC -= DECODE_DELTA(value);
+                break;
+            case ABSOLUTE_31_BITS:
+                thisPC = value * 2;
+                break;
+        }
+
+        if (from <= ordinal && ordinal <= to)
+            display_instruction(ordinal, thisPC);
+
+        lastPC = thisPC;
+        ordinal++;
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 8)                   helper routines for added commands                    */
+/* -------------------------------------------------------------------------- */
+
+/* Check that the xISS target is actually connected.  */
+
+static void
+check_connected (void)
+{
+    if (xiss_instance == NULL)
+        error(_("Target " ARC_TARGET_NAME " is not connected"));
+}
+
+
+/* Set the size of the buffer to be used by the xISS for instruction trace data.  */
+
+static void
+set_trace_buffer_size (int size)
+{
+    char sz[20];
+
+    (void) snprintf(sz, sizeof(sz), "%d", size);
+
+    if (XISS_PROPERTY("trace_buffer_size", sz) != 1)
+        error(_("xISS could not process 'trace_buffer_size' property"));
+}
+
+
+/* Tell the xISS to switch instruction tracing on or off.  */
+
+static void
+set_xiss_trace (char                    *args,
+                int                      from_tty,
+                struct cmd_list_element *e)
+{
+    check_connected();
+
+    if (XISS_PROPERTY("trace", (xISS_trace_instructions) ? "on" : "off") != 1)
+        error(_("xISS could not process 'trace' property"));
+}
+
+
+/* Show the status of xISS instruction tracing.  */
+
+static void
+show_xiss_trace (struct ui_file          *file,
+                 int                      from_tty,
+                 struct cmd_list_element *c,
+                 const char              *value)
+{
+    /* Value will be either "on" or "off".  */
+    fprintf_filtered(file,
+                     _("xISS instruction tracing is %s.\n"),
+                     value);
+}
+
+
+/* Tell the xISS to write the instruction trace to the file whose name is held
+   in the xiss_trace_file global variable.  */
+
+static void
+set_xiss_trace_file (char                    *args,
+                     int                      from_tty,
+                     struct cmd_list_element *e)
+{
+    check_connected();
+
+    if (xiss_trace_file)
+    {
+        if (XISS_PROPERTY("trace_file", xiss_trace_file) != 1)
+            error(_("xISS could not process 'trace_file' property"));
+    }
+}
+
+
+/* Show the name of the trace file (if any) which is currently receiving
+   instruction tracing output from the xISS.  */
+
+static void
+show_xiss_trace_file (struct ui_file          *file,
+                      int                      from_tty,
+                      struct cmd_list_element *c,
+                      const char              *value)
+{
+    if (*value == '\0')
+        fprintf_filtered(file,
+                         _("No output file is set for xISS instruction tracing.\n"));
+    else
+        fprintf_filtered(file,
+                         _("The output file for xISS instruction tracing is '%s'.\n"),
+                         value);
+}
+
+
+/* Set the size of the buffer used by the xISS for instruction trace data.  */
+
+static void
+set_xiss_trace_buffer_size (char                    *args,
+                            int                      from_tty,
+                            struct cmd_list_element *e)
+{
+    check_connected();
+
+    if (xiss_trace_buffer_size < 0)
+        error(_("Trace buffer size must be non-negative"));
+
+    set_trace_buffer_size(xiss_trace_buffer_size);
+}
+
+
+/* Show the size of the buffer used by the xISS for instruction trace data.  */
+
+static void
+show_xiss_trace_buffer_size (struct ui_file          *file,
+                             int                      from_tty,
+                             struct cmd_list_element *c,
+                             const char              *value)
+{
+    fprintf_filtered(file,
+                     _("The buffer size for xISS instruction tracing is %s entries.\n"),
+                     value);
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 9)                  local functions implementing commands                  */
+/* -------------------------------------------------------------------------- */
+
+/* Command: <command> <filename>
+
+   Save the contents of the xISS instruction trace buffer to the named file.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+
+static void
+arc_save_trace_to_file_command (char *arg, int from_tty)
+{
+    int count;
+
+    if (!arg)
+    {
+        printf_filtered (_(SAVE_TRACE_TO_FILE_COMMAND_USAGE));
+        return;
+    }
+
+    check_connected();
+
+    count = xISS_functions->instruction_trace_count(xiss_instance);
+
+    if (count)
+    {
+        unsigned int *buffer;
+
+        if (access(arg, F_OK) == 0)
+            if (!query(_("File already exists. Do you wish to overwrite it?")))
+                return;
+
+        printf_unfiltered(_("%u instructions in trace buffer\n"), count);
+
+        buffer = xmalloc(count * sizeof(unsigned int));
+
+        if (buffer)
+        {
+            Ordinal first = get_instruction_trace_start();
+
+            xISS_functions->get_instruction_traces(xiss_instance, buffer);
+
+            if (arc_start_encoding(arg, first))
+            {
+                encode_instruction_trace(buffer, count);
+                arc_stop_encoding(first + (Ordinal) count - 1);
+            }
+
+            xfree(buffer);
+        }
+        else
+            warning(_("can not allocate buffer to hold instruction trace data"));
+    }
+    else
+        warning(_("no instruction trace data available"));
+}
+
+
+
+/* Command: <command>
+
+   Discard the contents of the xISS instruction trace buffer.  */
+
+static void
+arc_empty_trace_buffer (char *arg, int from_tty)
+{
+    if (arg)
+    {
+        printf_filtered (_(EMPTY_TRACE_BUFFER_COMMAND_USAGE));
+        return;
+    }
+
+    check_connected();
+
+    set_trace_buffer_size(0);
+    set_trace_buffer_size(xiss_trace_buffer_size);
+}
+
+
+/* Command: <command> [ FROM=<from> ] [ TO=<to> ] [ <FILE> ]
+
+   Display some or all of the instruction trace, either from the xISS trace
+   buffer or from a named file.  */
+
+static void
+arc_list_trace (char *arg, int from_tty)
+{
+    char   *file           = NULL;
+    Boolean from_specified = FALSE;
+    Boolean to_specified   = FALSE;
+    Ordinal from           = 0;
+    Ordinal to             = 0;
+    Ordinal first;
+    Ordinal last;
+
+    /* Do we have arguments to the command?  */
+    if (arg)
+    {
+        char  **argv    = buildargv (arg);
+        Boolean invalid = FALSE;
+        int     i       = 0;
+
+        if (argv == NULL)
+            nomem (0);
+
+        while (argv[i] != NULL)
+        {
+//          printf("argv[%d] = %s\n", i, argv[i]);
+
+                GET_PARAMETER(from)
+            else
+                GET_PARAMETER(to)
+            else
+            {
+                /* Assume the argument is the file name.  */
+                file = xstrdup(argv[i]);
+                i++;
+            }
+        }
+
+        freeargv(argv);
+
+        if (invalid)
+        {
+            printf_filtered (_(LIST_TRACE_COMMAND_USAGE));
+            return;
+        }
+
+        DEBUG("FROM = %llu\n", from);
+        DEBUG("TO   = %llu\n", to);
+
+        if (from > to)
+            error("FROM (%lld) > TO (%lld)", from, to);
+    }
+
+    /* If we must get the instruction trace from a file.  */
+    if (file)
+    {
+        /* Try to open the named file and start decoding its contents.  */
+        if (arc_start_decoding(file, &first, &last))
+        {
+            CHECK_RANGE("file")
+            decode_instruction_trace(from, to, first);
+            arc_stop_decoding();
+        }
+
+        xfree(file);
+    }
+    else
+    {
+        unsigned int count;
+
+        check_connected();
+
+        /* Get the number of entries in the xISS instruction trace buffer.  */
+        count = (unsigned int) xISS_functions->instruction_trace_count(xiss_instance);
+
+        if (count > 0)
+        {
+            unsigned int *buffer = xmalloc(count * sizeof(unsigned int));
+
+            if (buffer)
+            {
+                Ordinal i;
+
+                first = get_instruction_trace_start();
+                last  = first + (Ordinal) count - 1;
+
+                CHECK_RANGE("trace buffer")
+
+                /* Get the contents of the xISS instruction trace buffer.  */
+                xISS_functions->get_instruction_traces(xiss_instance, buffer);
+
+                /* Display the required range of the trace.  */
+                for (i = from; i <= to; i++)
+                    display_instruction(i, buffer[(int) (i - from)]);
+
+                xfree(buffer);
+            }
+            else
+                warning(_("can not allocate buffer to hold instruction trace data"));
+        }
+        else
+            warning(_("no instruction trace data available"));
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* 10)                         initialization functions                       */
+/* -------------------------------------------------------------------------- */
+
+/*  Initialize the xISS target operations.  */
+
+static void
+initialize_xISS_target_ops (void)
+{
+    ENTERMSG;
+
+    xISS_target_ops.to_data = &operations;
+
+    xISS_target_ops.to_shortname = ARC_TARGET_NAME;
+    xISS_target_ops.to_longname  = "xISS debug target (ARC Processors)";
+    xISS_target_ops.to_doc       = "xISS (Fast Instruction Set Simulator) debug target (ARC Processors)";
+
+    xISS_target_ops.to_open   = arc_xISS_open;
+    xISS_target_ops.to_close  = arc_xISS_close;
+    xISS_target_ops.to_resume = arc_xISS_resume;
+    xISS_target_ops.to_wait   = arc_xISS_wait;
+
+    xISS_target_ops.to_fetch_registers  = arc_elf32_fetch_registers;
+    xISS_target_ops.to_store_registers  = arc_elf32_store_registers;
+    xISS_target_ops.to_prepare_to_store = arc_xISS_prepare_to_store;
+    xISS_target_ops.to_xfer_partial     = arc_elf32_xfer_partial;
+    xISS_target_ops.to_files_info       = arc_xISS_files_info;
+
+    xISS_target_ops.to_can_use_hw_breakpoint       = arc_xISS_can_use_hw_breakpoint;
+//  xISS_target_ops.to_insert_hw_breakpoint        = arc_xISS_insert_hw_breakpoint;
+//  xISS_target_ops.to_remove_hw_breakpoint        = arc_xISS_remove_hw_breakpoint;
+    xISS_target_ops.to_insert_watchpoint           = arc_xISS_insert_watchpoint;
+    xISS_target_ops.to_remove_watchpoint           = arc_xISS_remove_watchpoint;
+    xISS_target_ops.to_stopped_by_watchpoint       = arc_xISS_stopped_by_watchpoint;
+    xISS_target_ops.to_stopped_data_address        = arc_xISS_stopped_data_address;
+    xISS_target_ops.to_region_ok_for_hw_watchpoint = arc_xISS_region_ok_for_hw_watchpoint;
+
+    xISS_target_ops.to_insert_breakpoint = arc_elf32_insert_breakpoint;
+    xISS_target_ops.to_remove_breakpoint = arc_elf32_remove_breakpoint;
+
+    xISS_target_ops.to_kill = arc_xISS_kill;
+    xISS_target_ops.to_load = arc_xISS_load;
+
+    xISS_target_ops.to_create_inferior   = arc_xISS_create_inferior;
+    xISS_target_ops.to_mourn_inferior    = arc_xISS_mourn_inferior;
+    xISS_target_ops.to_thread_alive      = arc_xISS_thread_alive;
+//  xISS_target_ops.to_stop              = arc_xISS_stop;
+    xISS_target_ops.to_can_run           = arc_xISS_can_run;
+    xISS_target_ops.to_terminal_inferior = NULL;
+
+    xISS_target_ops.to_stratum = process_stratum;
+
+    xISS_target_ops.to_has_all_memory = 1;
+    xISS_target_ops.to_has_memory     = 1;
+    xISS_target_ops.to_has_stack      = 0;  /* Defer setting this until the program has been loaded.  */
+    xISS_target_ops.to_has_registers  = 1;
+    xISS_target_ops.to_has_execution  = 0;  /* Defer setting this until the program has been started.  */
+
+    xISS_target_ops.to_magic = OPS_MAGIC;
+}
+#endif /* HAVE_LIBXISS */
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the module.  This function is called from the gdb core on start-up.  */
+
+/* N.B. the initialization function must be defined even if the rest of this
+        module is excluded, as the call to it from the gdb start-up code is
+        generated by the build mechanism without regard to any conditional
+        compilation!  */
+
+void
+_initialize_arc_xiss (void)
+{
+#ifdef HAVE_LIBXISS
+    struct cmd_list_element *cmnd;
+
+    ENTERMSG;
+
+    operations.read_core_register       = read_xiss_core_register;
+    operations.write_core_register      = write_xiss_core_register;
+    operations.read_auxiliary_register  = read_xiss_aux_register;
+    operations.write_auxiliary_register = write_xiss_aux_register;
+    operations.read_memory              = read_words;
+    operations.write_memory             = write_words;
+    operations.fill_memory              = NULL;
+
+    initialize_xISS_target_ops ();
+    add_target (&xISS_target_ops);
+
+    /* Register ARC-specific commands with gdb.  */
+
+    (void) add_setshow_boolean_cmd
+              ("arc-xiss-trace",
+               class_trace,
+               &xISS_trace_instructions,
+               _("Set whether the xISS should trace instructions.\n"),
+               _("Show whether the xISS should trace instructions.\n"),
+               NULL,
+               set_xiss_trace,
+               show_xiss_trace,
+               &setlist,
+               &showlist);
+
+    add_setshow_optional_filename_cmd
+              ("arc-xiss-trace-file",
+               class_trace,
+               &xiss_trace_file,
+               _("Set the output file for xISS instruction tracing.\n"),
+               _("Show the output file for xISS instruction tracing.\n"),
+               NULL,
+               set_xiss_trace_file,
+               show_xiss_trace_file,
+               &setlist,
+               &showlist);
+
+    (void) add_setshow_zinteger_cmd
+              ("arc-xiss-trace-buffer-size",
+               class_trace,
+               &xiss_trace_buffer_size,
+               _("Set the size of the trace buffer for xISS instruction tracing.\n"),
+               _("Show the size of the trace buffer for xISS instruction tracing.\n"),
+               NULL,
+               set_xiss_trace_buffer_size,
+               show_xiss_trace_buffer_size,
+               &setlist,
+               &showlist);
+
+    cmnd = add_cmd
+              (SAVE_TRACE_TO_FILE_COMMAND,
+               class_trace,
+               arc_save_trace_to_file_command,
+               _("Save the contents of the xISS instruction trace buffer to a file.\n"
+               SAVE_TRACE_TO_FILE_COMMAND_USAGE
+               "<FILE> is a file to hold the xISS instruction trace buffer contents.\n"),
+               &cmdlist);
+    set_cmd_completer (cmnd, filename_completer);
+
+    (void) add_cmd
+              (EMPTY_TRACE_BUFFER_COMMAND,
+               class_trace,
+               arc_empty_trace_buffer,
+               _("Empty xISS instruction trace buffer.\n"
+               EMPTY_TRACE_BUFFER_COMMAND_USAGE),
+               &cmdlist);
+
+    cmnd = add_cmd
+              (LIST_TRACE_COMMAND,
+               class_trace,
+               arc_list_trace,
+               _("Display xISS instruction trace.\n"
+               LIST_TRACE_COMMAND_USAGE),
+               &cmdlist);
+    set_cmd_completer (cmnd, filename_completer);
+
+#endif /* HAVE_LIBXISS */
+}
+
+/******************************************************************************/
diff --git a/gdb/arc-xiss.h b/gdb/arc-xiss.h
new file mode 100755
index 0000000..a79030b
--- /dev/null
+++ b/gdb/arc-xiss.h
@@ -0,0 +1,41 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
+
+   Copyright 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines some operations provided by the ARC xISS      */
+/*     module.                                                                */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_XISS_H
+#define ARC_XISS_H
+
+
+/* Currently none.  */
+
+
+#endif /* ARC_XISS_H */
+/******************************************************************************/
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 019f4c8..3f5981d 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -93,6 +93,10 @@
 
 static void break_command_1 (char *, int, int);
 
+// begin ARC
+static void watch_range_command_1 (unsigned int, unsigned int, int, int);
+// end ARC
+
 static void mention (struct breakpoint *);
 
 struct breakpoint *set_raw_breakpoint (struct symtab_and_line, enum bptype);
@@ -842,6 +846,13 @@
   struct bp_location *loc;
   bpstat bs;
 
+// begin ARC
+  /* If this is a range watchpoint.  */
+  if (b->exp == NULL)
+      /* There is no need to change it.  */
+      return;
+// end ARC
+
   unlink_locations_from_global_list (b);
   for (loc = b->loc; loc;)
     {
@@ -1017,6 +1028,9 @@
   /* Initialize the target-specific information.  */
   memset (&bpt->target_info, 0, sizeof (bpt->target_info));
   bpt->target_info.placed_address = bpt->address;
+// begin ARC
+  bpt->target_info.range = bpt->length;
+// end ARC
 
   if (bpt->loc_type == bp_loc_software_breakpoint
       || bpt->loc_type == bp_loc_hardware_breakpoint)
@@ -2103,6 +2117,30 @@
   do_cleanups (old_chain);
 }
 
+// begin ARC
+static void
+check_range (struct breakpoint *bp, enum async_reply_reason reason)
+{ 
+  CORE_ADDR addr;
+
+  if (target_stopped_data_address (&current_target, &addr))
+    {
+      if (addr >= bp->loc->address &&
+          addr <  bp->loc->address + bp->loc->length)
+        {
+          if (ui_out_is_mi_like_p (uiout))
+            ui_out_field_string
+              (uiout, "reason",
+               async_reason_lookup (reason));
+          mention (bp);
+          ui_out_text(uiout, "triggered by access at address ");
+          ui_out_field_core_addr(uiout, "", addr);
+          ui_out_text (uiout, "\n");
+        }
+    }
+}
+// end ARC
+
 /* This is the normal print function for a bpstat.  In the future,
    much of this logic could (should?) be moved to bpstat_stop_status,
    by having it set different print_it values.
@@ -2221,76 +2259,103 @@
 
     case bp_watchpoint:
     case bp_hardware_watchpoint:
-      if (bs->old_val != NULL)
-	{
-	  annotate_watchpoint (b->number);
-	  if (ui_out_is_mi_like_p (uiout))
-	    ui_out_field_string
-	      (uiout, "reason",
-	       async_reason_lookup (EXEC_ASYNC_WATCHPOINT_TRIGGER));
-	  mention (b);
-	  ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-	  ui_out_text (uiout, "\nOld value = ");
-	  value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
-	  ui_out_field_stream (uiout, "old", stb);
-	  ui_out_text (uiout, "\nNew value = ");
-	  value_print (b->val, stb->stream, 0, Val_pretty_default);
-	  ui_out_field_stream (uiout, "new", stb);
-	  do_cleanups (ui_out_chain);
-	  ui_out_text (uiout, "\n");
-	  value_free (bs->old_val);
-	  bs->old_val = NULL;
-	}
+// begin ARC
+      if (b->exp)
+        {
+// end ARC
+          if (bs->old_val != NULL)
+	    {
+	      annotate_watchpoint (b->number);
+	      if (ui_out_is_mi_like_p (uiout))
+	        ui_out_field_string
+	          (uiout, "reason",
+	           async_reason_lookup (EXEC_ASYNC_WATCHPOINT_TRIGGER));
+	      mention (b);
+	      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
+	      ui_out_text (uiout, "\nOld value = ");
+	      value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
+	      ui_out_field_stream (uiout, "old", stb);
+	      ui_out_text (uiout, "\nNew value = ");
+	      value_print (b->val, stb->stream, 0, Val_pretty_default);
+	      ui_out_field_stream (uiout, "new", stb);
+	      do_cleanups (ui_out_chain);
+	      ui_out_text (uiout, "\n");
+	      value_free (bs->old_val);
+	      bs->old_val = NULL;
+	    }
+// begin ARC
+        }
+      else
+        check_range(b, EXEC_ASYNC_WATCHPOINT_TRIGGER);
+// end ARC
       /* More than one watchpoint may have been triggered.  */
       return PRINT_UNKNOWN;
       break;
 
     case bp_read_watchpoint:
-      if (ui_out_is_mi_like_p (uiout))
-	ui_out_field_string
-	  (uiout, "reason",
-	   async_reason_lookup (EXEC_ASYNC_READ_WATCHPOINT_TRIGGER));
-      mention (b);
-      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-      ui_out_text (uiout, "\nValue = ");
-      value_print (b->val, stb->stream, 0, Val_pretty_default);
-      ui_out_field_stream (uiout, "value", stb);
-      do_cleanups (ui_out_chain);
-      ui_out_text (uiout, "\n");
+// begin ARC
+      if (b->exp)
+        {
+// end ARC
+          if (ui_out_is_mi_like_p (uiout))
+	    ui_out_field_string
+	      (uiout, "reason",
+	       async_reason_lookup (EXEC_ASYNC_READ_WATCHPOINT_TRIGGER));
+          mention (b);
+          ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
+          ui_out_text (uiout, "\nValue = ");
+          value_print (b->val, stb->stream, 0, Val_pretty_default);
+          ui_out_field_stream (uiout, "value", stb);
+          do_cleanups (ui_out_chain);
+          ui_out_text (uiout, "\n");
+// begin ARC
+        }
+      else
+        check_range(b, EXEC_ASYNC_READ_WATCHPOINT_TRIGGER);
+// end ARC
       return PRINT_UNKNOWN;
       break;
 
     case bp_access_watchpoint:
-      if (bs->old_val != NULL)     
-	{
-	  annotate_watchpoint (b->number);
-	  if (ui_out_is_mi_like_p (uiout))
-	    ui_out_field_string
-	      (uiout, "reason",
-	       async_reason_lookup (EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
-	  mention (b);
-	  ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-	  ui_out_text (uiout, "\nOld value = ");
-	  value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
-	  ui_out_field_stream (uiout, "old", stb);
-	  value_free (bs->old_val);
-	  bs->old_val = NULL;
-	  ui_out_text (uiout, "\nNew value = ");
-	}
-      else 
-	{
-	  mention (b);
-	  if (ui_out_is_mi_like_p (uiout))
-	    ui_out_field_string
-	      (uiout, "reason",
-	       async_reason_lookup (EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
-	  ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-	  ui_out_text (uiout, "\nValue = ");
-	}
-      value_print (b->val, stb->stream, 0,Val_pretty_default);
-      ui_out_field_stream (uiout, "new", stb);
-      do_cleanups (ui_out_chain);
-      ui_out_text (uiout, "\n");
+// begin ARC
+      if (b->exp)
+        {
+// end ARC
+          if (bs->old_val != NULL)     
+	    {
+	      annotate_watchpoint (b->number);
+	      if (ui_out_is_mi_like_p (uiout))
+	        ui_out_field_string
+	          (uiout, "reason",
+	           async_reason_lookup (EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
+	      mention (b);
+	      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
+	      ui_out_text (uiout, "\nOld value = ");
+	      value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
+	      ui_out_field_stream (uiout, "old", stb);
+	      value_free (bs->old_val);
+	      bs->old_val = NULL;
+	      ui_out_text (uiout, "\nNew value = ");
+	    }
+          else 
+	    {
+	      mention (b);
+	      if (ui_out_is_mi_like_p (uiout))
+	        ui_out_field_string
+	          (uiout, "reason",
+	           async_reason_lookup (EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
+	      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
+	      ui_out_text (uiout, "\nValue = ");
+	    }
+          value_print (b->val, stb->stream, 0,Val_pretty_default);
+          ui_out_field_stream (uiout, "new", stb);
+          do_cleanups (ui_out_chain);
+          ui_out_text (uiout, "\n");
+// begin ARC
+        }
+      else
+        check_range(b, EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER);
+// end ARC
       return PRINT_UNKNOWN;
       break;
 
@@ -2529,6 +2594,11 @@
 
   b = bs->breakpoint_at->owner;
 
+// begin ARC
+  if (b->exp == NULL)
+     return WP_VALUE_CHANGED;
+// end ARC
+
   if (b->exp_valid_block == NULL)
     within_current_scope = 1;
   else
@@ -2667,7 +2737,17 @@
 	&& b->type != bp_catch_exec)	/* a non-watchpoint bp */
       {
 	if (bl->address != bp_addr) 	/* address doesn't match */
-	  continue;
+// begin ARC
+          {
+            /* is the address within the b/p range? */
+            if (bp_addr < b->loc->address ||
+                bp_addr > b->loc->address + b->loc->length - 1)
+// end ARC
+              continue;
+// begin ARC
+          }
+// end ARC
+
 	if (overlay_debugging		/* unmapped overlay section */
 	    && section_is_overlay (bl->section) 
 	    && !section_is_mapped (bl->section))
@@ -2764,86 +2844,107 @@
 	struct value *v;
 	int must_check_value = 0;
 
- 	if (b->type == bp_watchpoint)
-	  /* For a software watchpoint, we must always check the
-	     watched value.  */
-	  must_check_value = 1;
-	else if (b->watchpoint_triggered == watch_triggered_yes)
-	  /* We have a hardware watchpoint (read, write, or access)
-	     and the target earlier reported an address watched by
-	     this watchpoint.  */
-	  must_check_value = 1;
-	else if (b->watchpoint_triggered == watch_triggered_unknown
-		 && b->type == bp_hardware_watchpoint)
-	  /* We were stopped by a hardware watchpoint, but the target could
-	     not report the data address.  We must check the watchpoint's
-	     value.  Access and read watchpoints are out of luck; without
-	     a data address, we can't figure it out.  */
-	  must_check_value = 1;
+// begin ARC
+        if (b->exp == NULL)
+          {
+            CORE_ADDR addr;
 
- 	if (must_check_value)
-	  {
-	    char *message = xstrprintf ("Error evaluating expression for watchpoint %d\n",
-					b->number);
-	    struct cleanup *cleanups = make_cleanup (xfree, message);
-	    int e = catch_errors (watchpoint_check, bs, message,
-				  RETURN_MASK_ALL);
-	    do_cleanups (cleanups);
-	    switch (e)
+            if (!target_stopped_data_address (&current_target, &addr))
+               continue;
+
+            if (addr >= b->loc->address &&
+                addr < b->loc->address + b->loc->length)
+              {
+                /* Stop.  */
+                ++(b->hit_count);
+              }
+          }
+        else
+          {
+// end ARC
+ 	    if (b->type == bp_watchpoint)
+	      /* For a software watchpoint, we must always check the
+	         watched value.  */
+	      must_check_value = 1;
+	    else if (b->watchpoint_triggered == watch_triggered_yes)
+	      /* We have a hardware watchpoint (read, write, or access)
+	         and the target earlier reported an address watched by
+	         this watchpoint.  */
+	      must_check_value = 1;
+	    else if (b->watchpoint_triggered == watch_triggered_unknown
+		     && b->type == bp_hardware_watchpoint)
+	      /* We were stopped by a hardware watchpoint, but the target could
+	         not report the data address.  We must check the watchpoint's
+	         value.  Access and read watchpoints are out of luck; without
+	         a data address, we can't figure it out.  */
+	      must_check_value = 1;
+
+ 	    if (must_check_value)
 	      {
-	      case WP_DELETED:
-		/* We've already printed what needs to be printed.  */
-		bs->print_it = print_it_done;
-		/* Stop.  */
-		break;
-	      case WP_VALUE_CHANGED:
-		if (b->type == bp_read_watchpoint)
-		  {
-		    /* Don't stop: read watchpoints shouldn't fire if
-		       the value has changed.  This is for targets
-		       which cannot set read-only watchpoints.  */
-		    bs->print_it = print_it_noop;
-		    bs->stop = 0;
-		    continue;
-		  }
-		++(b->hit_count);
-		break;
-	      case WP_VALUE_NOT_CHANGED:
-		if (b->type == bp_hardware_watchpoint
-		    || b->type == bp_watchpoint)
-		  {
-		    /* Don't stop: write watchpoints shouldn't fire if
-		       the value hasn't changed.  */
-		    bs->print_it = print_it_noop;
-		    bs->stop = 0;
-		    continue;
-		  }
-		/* Stop.  */
-		++(b->hit_count);
-		break;
-	      default:
-		/* Can't happen.  */
-	      case 0:
-		/* Error from catch_errors.  */
-		printf_filtered (_("Watchpoint %d deleted.\n"), b->number);
-		if (b->related_breakpoint)
-		  b->related_breakpoint->disposition = disp_del_at_next_stop;
-		b->disposition = disp_del_at_next_stop;
-		/* We've already printed what needs to be printed.  */
-		bs->print_it = print_it_done;
-		break;
+	        char *message = xstrprintf ("Error evaluating expression for watchpoint %d\n",
+					    b->number);
+	        struct cleanup *cleanups = make_cleanup (xfree, message);
+	        int e = catch_errors (watchpoint_check, bs, message,
+				      RETURN_MASK_ALL);
+	        do_cleanups (cleanups);
+	        switch (e)
+	          {
+	          case WP_DELETED:
+		    /* We've already printed what needs to be printed.  */
+		    bs->print_it = print_it_done;
+		    /* Stop.  */
+		    break;
+	          case WP_VALUE_CHANGED:
+		    if (b->type == bp_read_watchpoint)
+		      {
+		        /* Don't stop: read watchpoints shouldn't fire if
+		           the value has changed.  This is for targets
+		           which cannot set read-only watchpoints.  */
+		        bs->print_it = print_it_noop;
+		        bs->stop = 0;
+		        continue;
+		      }
+		    ++(b->hit_count);
+		    break;
+	          case WP_VALUE_NOT_CHANGED:
+		    if (b->type == bp_hardware_watchpoint
+		        || b->type == bp_watchpoint)
+		      {
+		        /* Don't stop: write watchpoints shouldn't fire if
+		           the value hasn't changed.  */
+		        bs->print_it = print_it_noop;
+		        bs->stop = 0;
+		        continue;
+		      }
+		    /* Stop.  */
+		    ++(b->hit_count);
+		    break;
+	          default:
+		    /* Can't happen.  */
+	          case 0:
+		    /* Error from catch_errors.  */
+		    printf_filtered (_("Watchpoint %d deleted.\n"), b->number);
+		    if (b->related_breakpoint)
+		      b->related_breakpoint->disposition = disp_del_at_next_stop;
+		    b->disposition = disp_del_at_next_stop;
+		    /* We've already printed what needs to be printed.  */
+		    bs->print_it = print_it_done;
+		    break;
+	          }
 	      }
-	  }
-	else	/* must_check_value == 0 */
-	  {
-	    /* This is a case where some watchpoint(s) triggered, but
-	       not at the address of this watchpoint, or else no
-	       watchpoint triggered after all.  So don't print
-	       anything for this watchpoint.  */
-	    bs->print_it = print_it_noop;
-	    bs->stop = 0;
-            continue;
-	  }
+	    else	/* must_check_value == 0 */
+	      {
+	        /* This is a case where some watchpoint(s) triggered, but
+	           not at the address of this watchpoint, or else no
+	           watchpoint triggered after all.  So don't print
+	           anything for this watchpoint.  */
+	        bs->print_it = print_it_noop;
+	        bs->stop = 0;
+                continue;
+	      }
+// begin ARC
+          }
+// end ARC
       }
     else
       {
@@ -3464,14 +3565,31 @@
       case bp_hardware_watchpoint:
       case bp_read_watchpoint:
       case bp_access_watchpoint:
-	/* Field 4, the address, is omitted (which makes the columns
-	   not line up too nicely with the headers, but the effect
-	   is relatively readable).  */
-	if (addressprint)
-	  ui_out_field_skip (uiout, "addr");
-	annotate_field (5);
-	print_expression (b->exp, stb->stream);
-	ui_out_field_stream (uiout, "what", stb);
+// begin ARC
+        if (b->exp)
+          {
+// end ARC
+	    /* Field 4, the address, is omitted (which makes the columns
+	       not line up too nicely with the headers, but the effect
+	       is relatively readable).  */
+	    if (addressprint)
+	      ui_out_field_skip (uiout, "addr");
+	    annotate_field (5);
+	    print_expression (b->exp, stb->stream);
+	    ui_out_field_stream (uiout, "what", stb);
+// begin ARC
+          }
+        else
+          {
+            /* exp_string has format "<address>:<bytes>" */
+            char* colon = strchr(b->exp_string, ':');
+            *colon = 0;
+            ui_out_field_string(uiout, "addr", b->exp_string);
+            ui_out_field_string(uiout, "what", colon+1);
+            ui_out_text(uiout, "-byte range");
+            *colon = ':';
+          }
+// end ARC
 	break;
 
       case bp_catch_load:
@@ -3546,7 +3664,18 @@
 	    if (b->loc == NULL || loc->shlib_disabled)
 	      ui_out_field_string (uiout, "addr", "<PENDING>");
 	    else
-	      ui_out_field_core_addr (uiout, "addr", loc->address);
+// begin ARC
+              {
+// end ARC
+	        ui_out_field_core_addr (uiout, "addr", loc->address);
+// begin ARC
+                if (b->exp == NULL && b->loc->length > 0)
+                  {
+                    ui_out_field_int(uiout, "what",  b->loc->length);
+                    ui_out_text(uiout, "-byte range ");
+                  }
+              }
+// end ARC
 	  }
 	annotate_field (5);
 	if (!header_of_multiple)
@@ -4764,7 +4893,14 @@
 	ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "wpt");
 	ui_out_field_int (uiout, "number", b->number);
 	ui_out_text (uiout, ": ");
-	print_expression (b->exp, stb->stream);
+// begin ARC
+        if (b->exp)
+// end ARC
+          print_expression (b->exp, stb->stream);
+// begin ARC
+        else
+          ui_out_text (uiout, b->exp_string);
+// end ARC
 	ui_out_field_stream (uiout, "exp", stb);
 	do_cleanups (ui_out_chain);
 	break;
@@ -4773,7 +4909,14 @@
 	ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-rwpt");
 	ui_out_field_int (uiout, "number", b->number);
 	ui_out_text (uiout, ": ");
-	print_expression (b->exp, stb->stream);
+// begin ARC
+        if (b->exp)
+// end ARC
+          print_expression (b->exp, stb->stream);
+// begin ARC
+        else
+          ui_out_text (uiout, b->exp_string);
+// end ARC
 	ui_out_field_stream (uiout, "exp", stb);
 	do_cleanups (ui_out_chain);
 	break;
@@ -4782,7 +4925,14 @@
 	ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-awpt");
 	ui_out_field_int (uiout, "number", b->number);
 	ui_out_text (uiout, ": ");
-	print_expression (b->exp, stb->stream);
+// begin ARC
+        if (b->exp)
+// end ARC
+          print_expression (b->exp, stb->stream);
+// begin ARC
+        else
+          ui_out_text (uiout, b->exp_string);
+// end ARC
 	ui_out_field_stream (uiout, "exp", stb);
 	do_cleanups (ui_out_chain);
 	break;
@@ -4850,6 +5000,10 @@
 	    {
 	      printf_filtered (" at ");
 	      fputs_filtered (paddress (b->loc->address), gdb_stdout);
+// begin ARC
+              if (b->exp == NULL && b->loc->length > 0)
+                printf_filtered(" covering %u bytes", b->loc->length);
+// end ARC
 	    }
 	  if (b->source_file)
 	    printf_filtered (": file %s, line %d.",
@@ -5536,12 +5690,28 @@
   break_command_1 (arg, 0, from_tty);
 }
 
+// begin ARC
+void
+watch_range_command (unsigned int address, unsigned int bytes, int accessflag, int from_tty)
+{
+    watch_range_command_1 (address, bytes, accessflag, from_tty);
+}
+// end ARC
+
 void
 tbreak_command (char *arg, int from_tty)
 {
   break_command_1 (arg, BP_TEMPFLAG, from_tty);
 }
 
+// begin ARC
+void
+hbreak_command_wrapper (char *arg, int from_tty)
+{
+  hbreak_command (arg, from_tty);
+}
+// end ARC
+
 static void
 hbreak_command (char *arg, int from_tty)
 {
@@ -5837,6 +6007,81 @@
   mention (b);
 }
 
+
+// begin ARC
+/* accessflag:  hw_write:   watch write, 
+                hw_read:    watch read, 
+                hw_access:  watch access (read or write)
+                hw_execute: execute access */
+static void
+watch_range_command_1 (unsigned int address, unsigned int bytes, int accessflag, int from_tty)
+{
+  struct breakpoint *b;
+  struct symtab_and_line sal;
+  int i, other_type_used, target_resources_ok;
+  enum bptype bp_type;
+  enum target_hw_bp_type wp_type;
+  char exp[50];
+
+  (void) sprintf(exp, "0x%08X:%u", address, bytes);
+
+  init_sal (&sal);  /* initialize to zeroes */
+
+  if (accessflag == hw_read)
+    {
+      bp_type = bp_read_watchpoint;
+      wp_type = hw_read;
+    }
+  else if (accessflag == hw_access)
+    {
+      bp_type = bp_access_watchpoint;
+      wp_type = hw_access;
+    }
+  else if (accessflag == hw_write)
+    {
+      bp_type = bp_hardware_watchpoint;
+      wp_type = hw_write;
+    }
+  else
+    {
+      bp_type = bp_hardware_breakpoint;
+      wp_type = hw_execute;
+    }
+
+  i = hw_watchpoint_used_count (bp_type, &other_type_used);
+  target_resources_ok = 
+     TARGET_CAN_USE_HARDWARE_WATCHPOINT (bp_type, i, other_type_used);
+  if (target_resources_ok == 0 && bp_type != bp_hardware_watchpoint)
+      error (_("Target does not support this type of hardware watchpoint."));
+  if (target_resources_ok < 0 && bp_type != bp_hardware_watchpoint)
+   error (_("Target can only support one kind of HW watchpoint at a time."));
+
+
+  /* Now set up the breakpoint.  */
+  b = set_raw_breakpoint (sal, bp_type);
+  set_breakpoint_count (breakpoint_count + 1);
+  b->number = breakpoint_count;
+  b->disposition = disp_donttouch;
+  b->exp = NULL;
+  b->exp_valid_block = NULL;
+  b->exp_string = xstrdup(exp);
+  b->val = NULL;
+  //b->cond = NULL;   6.8 has removed this element?
+  b->cond_string = 0;
+  b->loc->address = (CORE_ADDR) address;
+  b->loc->requested_address = b->loc->address;
+  b->loc->length = bytes;
+
+  b->loc->watchpoint_type = wp_type;
+
+  memset (&b->watchpoint_frame, 0, sizeof (b->watchpoint_frame));
+
+  mention (b);
+}
+// end ARC
+
+
+
 /* Return count of locations need to be watched and can be handled
    in hardware.  If the watchpoint can not be handled
    in hardware return zero.  */
@@ -7911,8 +8156,18 @@
 
   *bpt_p = deprecated_insert_raw_breakpoint (next_pc);
   if (*bpt_p == NULL)
-    error (_("Could not insert single-step breakpoint at 0x%s"),
-	     paddr_nz (next_pc));
+    {
+      /* richards/2008/10/27 ARC bug fix: if setting the (second)
+       * b/p failed, we must unset the first
+       *
+       * gdb bug: 9649
+       */
+      if (single_step_breakpoints[0] != NULL)
+         remove_single_step_breakpoints ();
+
+      error (_("Could not insert single-step breakpoint at 0x%s"),
+	       paddr_nz (next_pc));
+    }
 }
 
 /* Remove and delete any breakpoints used for software single step.  */
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index 41730c0..a741f86 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -175,6 +175,11 @@
 
 struct bp_target_info
 {
+// begin ARC
+  /* Range breakpoints added */
+  unsigned int range;
+//end ARC
+
   /* Address at which the breakpoint was placed.  This is normally the
      same as ADDRESS from the bp_location, except when adjustment
      happens in gdbarch_breakpoint_from_pc.  The most common form of
@@ -272,8 +277,8 @@
      is not a special value for this field.  Valid for all types except
      bp_loc_other.  */
   CORE_ADDR address;
-
-  /* For hardware watchpoints, the size of data ad ADDRESS being watches.  */
+  
+  /* For hardware watchpoints, the size of data at ADDRESS being watched.  */
   int length;
 
   /* Type of hardware watchpoint. */
@@ -702,6 +707,10 @@
 
 extern void break_command (char *, int);
 
+// begin ARC
+extern void watch_range_command (unsigned int, unsigned int, int, int);
+//end ARC
+
 extern void hbreak_command_wrapper (char *, int);
 extern void thbreak_command_wrapper (char *, int);
 extern void rbreak_command_wrapper (char *, int);
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c
index e6fbe3f..dac4345 100644
--- a/gdb/cli/cli-script.c
+++ b/gdb/cli/cli-script.c
@@ -287,8 +287,15 @@
 
   cmdlines = c->user_commands;
   if (cmdlines == 0)
+  {
     /* Null command */
+// begin ARC
+   /* If there are no user commands to be executed, execute the
+      callback function instead.  */
+    c->func(c, NULL, 0);
+// end ARC
     return;
+  }
 
   if (++user_call_depth > max_user_call_depth)
     error (_("Max user call depth exceeded -- command aborted."));
diff --git a/gdb/config.in b/gdb/config.in
index b6aba7d..f5fa97b 100644
--- a/gdb/config.in
+++ b/gdb/config.in
@@ -45,6 +45,12 @@
 /* Define to the default OS ABI for this configuration. */
 #undef GDB_OSABI_DEFAULT
 
+/* targetfile */
+#undef GDB_TM_FILE
+
+/* hostfile */
+#undef GDB_XM_FILE
+
 /* Define to 1 if you have `alloca', as a function or macro. */
 #undef HAVE_ALLOCA
 
@@ -152,6 +158,15 @@
 /* Define if you have the expat library. */
 #undef HAVE_LIBEXPAT
 
+/* Define if you have the ARC xISS library. */
+#undef HAVE_LIBXISS
+
+/* Define if you are building the ARC bare-board debugger. */
+#undef ARC_ELF32_TARGET
+
+/* Define if you are building the ARC Linux debugger. */
+#undef ARC_LINUX_TARGET
+
 /* Define to 1 if you have the `m' library (-lm). */
 #undef HAVE_LIBM
 
diff --git a/gdb/config/arc/a4-jtag.mt b/gdb/config/arc/a4-jtag.mt
deleted file mode 100644
index e3907ba..0000000
--- a/gdb/config/arc/a4-jtag.mt
+++ /dev/null
@@ -1,3 +0,0 @@
-# Target: ARC embedded system
-TDEPFILES= arc-tdep.o arc-jtag.o arc-jtag-tdep.o arc-jtag-ops.o
-DEPRECATED_TM_FILE= tm-a4-jtag.h
diff --git a/gdb/config/arc/arc.mt b/gdb/config/arc/arc.mt
deleted file mode 100644
index cb98a49..0000000
--- a/gdb/config/arc/arc.mt
+++ /dev/null
@@ -1,4 +0,0 @@
-# Target: arc processor
-TDEPFILES= arc-tdep.o monitor.o arc-rom.o dsrec.o remote-arc-sdi.o
-SIM_OBS = remote-sim.o
-SIM = ../sim/arc/libsim.a
diff --git a/gdb/config/arc/embed.mt b/gdb/config/arc/embed.mt
deleted file mode 100644
index a6d47a2..0000000
--- a/gdb/config/arc/embed.mt
+++ /dev/null
@@ -1,3 +0,0 @@
-# Target: ARC embedded system
-TDEPFILES= arc-tdep.o arc-jtag.o arc-jtag-tdep.o arc-jtag-ops.o
-DEPRECATED_TM_FILE= tm-embed.h
diff --git a/gdb/config/arc/linux.mt b/gdb/config/arc/linux.mt
deleted file mode 100644
index 0c5f000..0000000
--- a/gdb/config/arc/linux.mt
+++ /dev/null
@@ -1,3 +0,0 @@
-# Target: ARC based machine running GNU/Linux
-DEPRECATED_TM_FILE= tm-linux.h
-TDEPFILES= arc-tdep.o arc-linux-tdep.o solib.o solib-svr4.o solib-legacy.o corelow.o
diff --git a/gdb/config/arc/tm-a4-jtag.h b/gdb/config/arc/tm-a4-jtag.h
deleted file mode 100644
index dc5ab71..0000000
--- a/gdb/config/arc/tm-a4-jtag.h
+++ /dev/null
@@ -1,103 +0,0 @@
-#define ARC4_JTAG 1
-#define CONFIG_OSABI		GDB_OSABI_UNKNOWN
-
-struct gdbarch *arc_jtag_init (struct gdbarch *gdbarch);
-#define CONFIG_INIT_TDEP	arc_jtag_init
-
-/* The core regnums here are the same as the hardware register numbers.  We
-   cannot do that for aux registers, because the aux regs on the h/w do not
-   have contiguous numbers.  */
-enum arc4_jtag_regnums
-  {
-    ARC_FP_REGNUM       = 27,
-    ARC_SP_REGNUM           ,
-    ARC_ILINK1_REGNUM	    ,
-    ARC_ILINK2_REGNUM	    ,
-    ARC_BLINK_REGNUM        ,
-    /* Extension core regs are 32..59 inclusive.  */
-    ARC_LP_COUNT_REGNUM = 60,
-    /* 61 is reserved, 62 is not a real register.  */
-    ARC_PCL_REGNUM      = 63,
-
-    /* Now the aux registers.  */
-    
-    ARC_STATUS_REGNUM   	= 64,
-    ARC_SEMAPHORE_REGNUM	    ,
-    ARC_LP_START_REGNUM		    ,
-    ARC_LP_END_REGNUM		    ,
-    ARC_IDENTITY_REGNUM		    ,
-    ARC_DEBUG_REGNUM		    ,
-#ifndef ARC4_JTAG
-    ARC_PC_REGNUM		    ,
-    ARC_STATUS32_REGNUM		    ,
-    ARC_STATUS32_L1_REGNUM	    ,
-    ARC_STATUS32_L2_REGNUM	    ,
-
-    ARC_COUNT0_REGNUM               , 
-    ARC_CONTROL0_REGNUM		    , 
-    ARC_LIMIT0_REGNUM               , 
-    ARC_INT_VECTOR_BASE_REGNUM	    , 
-    ARC_AUX_MACMODE_REGNUM	    , 
-    ARC_AUX_IRQ_LV12_REGNUM	    , 
-
-    ARC_COUNT1_REGNUM                ,
-    ARC_CONTROL1_REGNUM		     ,
-    ARC_LIMIT1_REGNUM		     ,
-    ARC_AUX_IRQ_LEV_REGNUM	     ,
-    ARC_AUX_IRQ_HINT_REGNUM	     ,
-    ARC_ERET_REGNUM		     ,
-    ARC_ERBTA_REGNUM		     ,
-    ARC_ERSTATUS_REGNUM		     ,
-    ARC_ECR_REGNUM		     ,
-    ARC_EFA_REGNUM		     ,
-    ARC_ICAUSE1_REGNUM		     ,
-    ARC_ICAUSE2_REGNUM		     ,
-    ARC_AUX_IENABLE_REGNUM	     ,
-    ARC_AUX_ITRIGGER_REGNUM	     ,
-    ARC_XPU_REGNUM                   ,
-    ARC_BTA_REGNUM		     ,
-    ARC_BTA_L1_REGNUM		     ,
-    ARC_BTA_L2_REGNUM		     ,
-    ARC_AUX_IRQ_PULSE_CANCEL_REGNUM  ,
-    ARC_AUX_IRQ_PENDING_REGNUM       ,
-
-    /* Build configuration registers.  */
-    ARC_BCR_0_REGNUM		    , 
-    ARC_BCR_1_REGNUM		    , 
-    ARC_BCR_2_REGNUM		    , 
-    ARC_BCR_3_REGNUM		    , 
-    ARC_BCR_4_REGNUM		    , 
-    ARC_BCR_5_REGNUM		    , 
-    ARC_BCR_6_REGNUM		    , 
-    ARC_BCR_7_REGNUM		    , 
-    ARC_BCR_8_REGNUM		    , 
-    ARC_BCR_9_REGNUM		    , 
-    ARC_BCR_A_REGNUM		    , 
-    ARC_BCR_B_REGNUM		    , 
-    ARC_BCR_C_REGNUM		    , 
-    ARC_BCR_D_REGNUM		    , 
-    ARC_BCR_E_REGNUM		    , 
-    ARC_BCR_F_REGNUM		    , 
-    ARC_BCR_10_REGNUM		    , 
-    ARC_BCR_11_REGNUM		    , 
-    ARC_BCR_12_REGNUM		    ,
-    				
-    ARC_BCR_13_REGNUM		    ,
-    ARC_BCR_14_REGNUM		     ,
-    ARC_BCR_15_REGNUM		     ,
-    ARC_BCR_16_REGNUM		     ,
-    ARC_BCR_17_REGNUM		     ,
-    ARC_BCR_18_REGNUM		     ,
-    ARC_BCR_19_REGNUM		     ,
-    ARC_BCR_1A_REGNUM		     ,
-    ARC_BCR_1B_REGNUM		     ,
-    ARC_BCR_1C_REGNUM		     ,
-    ARC_BCR_1D_REGNUM		     ,
-    ARC_BCR_1E_REGNUM		     ,
-    ARC_BCR_1F_REGNUM		     ,
-
-#endif    
-    ARC_NR_REGS
-
-  };
-
diff --git a/gdb/config/arc/tm-embed.h b/gdb/config/arc/tm-embed.h
index 9ac1c1a..5cd7271 100644
--- a/gdb/config/arc/tm-embed.h
+++ b/gdb/config/arc/tm-embed.h
@@ -1,101 +1,77 @@
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-#define CONFIG_OSABI		GDB_OSABI_UNKNOWN
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
 
-struct gdbarch *arc_jtag_init (struct gdbarch *gdbarch);
-#define CONFIG_INIT_TDEP	arc_jtag_init
+   Contributed by ARC International (www.arc.com)
 
-/* The core regnums here are the same as the hardware register numbers.  We
-   cannot do that for aux registers, because the aux regs on the h/w do not
-   have contiguous numbers.  */
+   Authors:
+      Codito Technologies Pvt. Ltd.
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines register numbers for the arc-elf32            */
+/*     configuration of the ARC gdb.                                          */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_TM_EMBED_H
+#define ARC_TM_EMBED_H
+
+#include "gdbarch.h"
+#include "arc-elf32-tdep.h"
+#include "arc-registers.h"
+
+
+#define CONFIG_OSABI        GDB_OSABI_UNKNOWN
+
+#define CONFIG_INIT_TDEP    (void) arc_elf32_initialize (gdbarch, arches);
+
+
+/* These are hardware register numbers (i.e. NOT gdb register numbers). */
 enum arc700_jtag_regnums
-  {
-    ARC_FP_REGNUM       = 27,
-    ARC_SP_REGNUM           ,
-    ARC_ILINK1_REGNUM	    ,
-    ARC_ILINK2_REGNUM	    ,
-    ARC_BLINK_REGNUM        ,
-    /* Extension core regs are 32..59 inclusive.  */
+{
+    /* Regnums 0 .. 26 are R0 .. R26 */
+
+    ARC_FP_REGNUM = 27,
+    ARC_SP_REGNUM,
+    ARC_ILINK1_REGNUM,
+    ARC_ILINK2_REGNUM,
+    ARC_BLINK_REGNUM,
+
+    /* Extension core regs are R32 .. R59 inclusive.  */
+
     ARC_LP_COUNT_REGNUM = 60,
+
     /* 61 is reserved, 62 is not a real register.  */
-    ARC_PCL_REGNUM      = 63,
+    ARC_PCL_REGNUM = 63,
 
-    /* Now the aux registers.  */
-    
-    ARC_STATUS_REGNUM   	= 64,
-    ARC_SEMAPHORE_REGNUM	    ,
-    ARC_LP_START_REGNUM		    ,
-    ARC_LP_END_REGNUM		    ,
-    ARC_IDENTITY_REGNUM		    ,
-    ARC_DEBUG_REGNUM		    ,
-    ARC_PC_REGNUM		    ,
-    ARC_STATUS32_REGNUM		    ,
-    ARC_STATUS32_L1_REGNUM	    ,
-    ARC_STATUS32_L2_REGNUM	    ,
-
-    ARC_COUNT0_REGNUM               , 
-    ARC_CONTROL0_REGNUM		    , 
-    ARC_LIMIT0_REGNUM               , 
-    ARC_INT_VECTOR_BASE_REGNUM	    , 
-    ARC_AUX_MACMODE_REGNUM	    , 
-    ARC_AUX_IRQ_LV12_REGNUM	    , 
-
-    ARC_COUNT1_REGNUM                ,
-    ARC_CONTROL1_REGNUM		     ,
-    ARC_LIMIT1_REGNUM		     ,
-    ARC_AUX_IRQ_LEV_REGNUM	     ,
-    ARC_AUX_IRQ_HINT_REGNUM	     ,
-    ARC_ERET_REGNUM		     ,
-    ARC_ERBTA_REGNUM		     ,
-    ARC_ERSTATUS_REGNUM		     ,
-    ARC_ECR_REGNUM		     ,
-    ARC_EFA_REGNUM		     ,
-    ARC_ICAUSE1_REGNUM		     ,
-    ARC_ICAUSE2_REGNUM		     ,
-    ARC_AUX_IENABLE_REGNUM	     ,
-    ARC_AUX_ITRIGGER_REGNUM	     ,
-    ARC_XPU_REGNUM                   ,
-    ARC_BTA_REGNUM		     ,
-    ARC_BTA_L1_REGNUM		     ,
-    ARC_BTA_L2_REGNUM		     ,
-    ARC_AUX_IRQ_PULSE_CANCEL_REGNUM  ,
-    ARC_AUX_IRQ_PENDING_REGNUM       ,
-
-    /* Build configuration registers.  */
-    ARC_BCR_0_REGNUM		    , 
-    ARC_BCR_1_REGNUM		    , 
-    ARC_BCR_2_REGNUM		    , 
-    ARC_BCR_3_REGNUM		    , 
-    ARC_BCR_4_REGNUM		    , 
-    ARC_BCR_5_REGNUM		    , 
-    ARC_BCR_6_REGNUM		    , 
-    ARC_BCR_7_REGNUM		    , 
-    ARC_BCR_8_REGNUM		    , 
-    ARC_BCR_9_REGNUM		    , 
-    ARC_BCR_A_REGNUM		    , 
-    ARC_BCR_B_REGNUM		    , 
-    ARC_BCR_C_REGNUM		    , 
-    ARC_BCR_D_REGNUM		    , 
-    ARC_BCR_E_REGNUM		    , 
-    ARC_BCR_F_REGNUM		    , 
-    ARC_BCR_10_REGNUM		    , 
-    ARC_BCR_11_REGNUM		    , 
-    ARC_BCR_12_REGNUM		    ,
-    				
-    ARC_BCR_13_REGNUM		    ,
-    ARC_BCR_14_REGNUM		     ,
-    ARC_BCR_15_REGNUM		     ,
-    ARC_BCR_16_REGNUM		     ,
-    ARC_BCR_17_REGNUM		     ,
-    ARC_BCR_18_REGNUM		     ,
-    ARC_BCR_19_REGNUM		     ,
-    ARC_BCR_1A_REGNUM		     ,
-    ARC_BCR_1B_REGNUM		     ,
-    ARC_BCR_1C_REGNUM		     ,
-    ARC_BCR_1D_REGNUM		     ,
-    ARC_BCR_1E_REGNUM		     ,
-    ARC_BCR_1F_REGNUM		     ,
+   /* end marker: this is not a register, but its integer value gives the number
+    * of registers
+    */
+    ARC_REG_END_MARKER
+};
 
 
-    ARC_NR_REGS
-  };
+#define ARC_NR_PSEUDO_REGS      0
+#define ARC_NR_REGS             (int) (arc_core_register_count(gdbarch) + \
+                                       arc_aux_register_count (gdbarch))
 
+#endif /* ARC_TM_EMBED_H */
+/******************************************************************************/
diff --git a/gdb/config/arc/tm-linux.h b/gdb/config/arc/tm-linux.h
index 18b1240..15b0d9e8 100644
--- a/gdb/config/arc/tm-linux.h
+++ b/gdb/config/arc/tm-linux.h
@@ -1,35 +1,87 @@
-#include "config/tm-linux.h"
+/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
 
-#define CONFIG_OSABI		GDB_OSABI_LINUX
+   Copyright 2005, 2008, 2009 Free Software Foundation, Inc.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Codito Technologies Pvt. Ltd.
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines register numbers for the arc-linux-uclibc     */
+/*     configuration of the ARC gdb.                                          */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_TM_LINUX_H
+#define ARC_TM_LINUX_H
+
+#include "arc-linux-tdep.h"
+
+
+#define CONFIG_OSABI        GDB_OSABI_LINUX
 
 /* Do nothing.  */
-#define CONFIG_INIT_TDEP	{}
+#define CONFIG_INIT_TDEP    {}
+
 
 enum arc700_linux_regnums
-  {
-    /* Regnums 0..26 are R0..R26 */
-    ARC_BTA_REGNUM	=	27,
-    ARC_LP_START_REGNUM =	28,
-    ARC_LP_END_REGNUM   =	29,
-    ARC_LP_COUNT_REGNUM =	30,
-    ARC_STATUS32_REGNUM =	31,
-    ARC_BLINK_REGNUM    =	32,
-    ARC_FP_REGNUM 	=	33,
-    ARC_SP_REGNUM 	=	34,
-    ARC_EFA_REGNUM      =	35,
-    ARC_RET_REGNUM      =	36,
-    ARC_ORIG_R8_REGNUM  =	37,
-    ARC_STOP_PC_REGNUM  =	38
-  };
+{
+    /* Regnums 0 .. 26 are R0 .. R26 */
+    ARC_BTA_REGNUM      = 27,
+    ARC_LP_START_REGNUM = 28,
+    ARC_LP_END_REGNUM   = 29,
+    ARC_LP_COUNT_REGNUM = 30,
+    ARC_STATUS32_REGNUM = 31,
+    ARC_BLINK_REGNUM    = 32,
+    ARC_FP_REGNUM       = 33,
+    ARC_SP_REGNUM       = 34,
+    ARC_EFA_REGNUM      = 35,
+    ARC_RET_REGNUM      = 36,
+    ARC_ORIG_R8_REGNUM  = 37,
+    ARC_STOP_PC_REGNUM  = 38,
 
-#define ARC_NR_REGS	39
+   /* end marker: this is not a register, but its integer value gives the number
+    * of registers
+    */
+    ARC_REG_END_MARKER
+};
 
-/* Pseudo-regs.  */
-#define ARC_ILINK1_REGNUM   	(NUM_REGS)
-#define ARC_ILINK2_REGNUM   	(NUM_REGS+1)
-#define ARC_ERET_REGNUM     	(NUM_REGS+2)
-#define ARC_STATUS32_L1_REGNUM 	(NUM_REGS+3)
-#define ARC_STATUS32_L2_REGNUM 	(NUM_REGS+4)
-#define ARC_ERSTATUS_REGNUM 	(NUM_REGS+5)
 
-#define ARC_NR_PSEUDO_REGS	6
+/* Pseudo-registers.  */
+
+enum arc700_linux_pseudo_regnums
+{
+    ARC_ILINK1_REGNUM = (int) ARC_REG_END_MARKER,
+    ARC_ILINK2_REGNUM,
+    ARC_ERET_REGNUM,
+    ARC_STATUS32_L1_REGNUM,
+    ARC_STATUS32_L2_REGNUM,
+    ARC_ERSTATUS_REGNUM
+};
+
+
+#define ARC_NR_PSEUDO_REGS      6
+#define ARC_NR_REGS             (int) ARC_REG_END_MARKER
+
+
+#endif /* ARC_TM_LINUX_H */
+/******************************************************************************/
diff --git a/gdb/configure b/gdb/configure
index e0f36b2..c39040b 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -313,7 +313,7 @@
 ac_subdirs_all="$ac_subdirs_all gdbtk"
 ac_subdirs_all="$ac_subdirs_all multi-ice"
 ac_subdirs_all="$ac_subdirs_all gdbserver"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir PACKAGE subdirs TARGET_OBS AWK INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S RANLIB ac_ct_RANLIB YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_MAJOR_VERSION TCL_MINOR_VERSION TCL_CC TCL_DEFS TCL_SHLIB_CFLAGS TCL_SHLIB_LD TCL_SHLIB_LD_LIBS TCL_SHLIB_SUFFIX TCL_DL_LIBS TCL_LD_FLAGS TCL_LD_SEARCH_FLAGS TCL_CC_SEARCH_FLAGS TCL_COMPAT_OBJS TCL_RANLIB TCL_BUILD_LIB_SPEC TCL_LIB_SPEC TCL_LIB_VERSIONS_OK TK_VERSION TK_DEFS TK_BUILD_INCLUDES TK_XINCLUDES TK_XLIBSW TK_BUILD_LIB_SPEC TK_LIB_SPEC TCLHDIR TKHDIR ITCLHDIR ITKHDIR ITCL_VERSION ITCL_DEFS ITCL_BUILD_INCLUDES ITCL_BUILD_LIB_SPEC ITCL_LIB_SPEC ITK_VERSION ITK_DEFS ITK_BUILD_INCLUDES ITK_BUILD_LIB_SPEC ITK_LIB_SPEC X_CFLAGS X_LDFLAGS X_LIBS TCL_DEPS TK_DEPS ITCLLIB ITCL_DEPS ITKLIB ITK_DEPS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBICONV LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir PACKAGE subdirs TARGET_OBS AWK INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S RANLIB ac_ct_RANLIB YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT XISS_INCLUDES ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_MAJOR_VERSION TCL_MINOR_VERSION TCL_CC TCL_DEFS TCL_SHLIB_CFLAGS TCL_SHLIB_LD TCL_SHLIB_LD_LIBS TCL_SHLIB_SUFFIX TCL_DL_LIBS TCL_LD_FLAGS TCL_LD_SEARCH_FLAGS TCL_CC_SEARCH_FLAGS TCL_COMPAT_OBJS TCL_RANLIB TCL_BUILD_LIB_SPEC TCL_LIB_SPEC TCL_LIB_VERSIONS_OK TK_VERSION TK_DEFS TK_BUILD_INCLUDES TK_XINCLUDES TK_XLIBSW TK_BUILD_LIB_SPEC TK_LIB_SPEC TCLHDIR TKHDIR ITCLHDIR ITKHDIR ITCL_VERSION ITCL_DEFS ITCL_BUILD_INCLUDES ITCL_BUILD_LIB_SPEC ITCL_LIB_SPEC ITK_VERSION ITK_DEFS ITK_BUILD_INCLUDES ITK_BUILD_LIB_SPEC ITK_LIB_SPEC X_CFLAGS X_LDFLAGS X_LIBS TCL_DEPS TK_DEPS ITCLLIB ITCL_DEPS ITKLIB ITK_DEPS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBICONV LIBOBJS LTLIBOBJS'
 ac_subst_files='host_makefile_frag'
 
 # Initialize some variables set by options.
@@ -884,6 +884,7 @@
   --with-gnu-ld           assume the C compiler uses GNU ld default=no
   --with-libexpat-prefix[=DIR]  search for libexpat in DIR/include and DIR/lib
   --without-libexpat-prefix     don't search for libexpat in includedir and libdir
+  --with-xiss             include xiss support (auto/yes/no)
   --without-included-regex don't use included regex; this is the default
                           on systems with version 2 of the GNU C library
                           (use with caution on other system)
@@ -5573,9 +5574,179 @@
 fi
 
 
+echo "$as_me:$LINENO: checking for inflate" >&5
+echo $ECHO_N "checking for inflate... $ECHO_C" >&6
+if test "${ac_cv_func_inflate+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define inflate to an innocuous variant, in case <limits.h> declares inflate.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define inflate innocuous_inflate
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char inflate (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef inflate
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char inflate ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_inflate) || defined (__stub___inflate)
+choke me
+#else
+char (*f) () = inflate;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != inflate;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_inflate=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_inflate=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_inflate" >&5
+echo "${ECHO_T}$ac_cv_func_inflate" >&6
+if test $ac_cv_func_inflate = yes; then
+  :
+else
+
+echo "$as_me:$LINENO: checking for inflate in -lz" >&5
+echo $ECHO_N "checking for inflate in -lz... $ECHO_C" >&6
+if test "${ac_cv_lib_z_inflate+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char inflate ();
+int
+main ()
+{
+inflate ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_z_inflate=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_z_inflate=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_z_inflate" >&5
+echo "${ECHO_T}$ac_cv_lib_z_inflate" >&6
+if test $ac_cv_lib_z_inflate = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBZ 1
+_ACEOF
+
+  LIBS="-lz $LIBS"
+
+fi
+
+fi
+
+
 # We need to link with -lw to get `wctype' on Solaris before Solaris
 # 2.6.  Solaris 2.6 and beyond have this function in libc, and have a
-# libw that some versions of the GNU linker cannot hanle (GNU ld 2.9.1
+# libw that some versions of the GNU linker cannot handle (GNU ld 2.9.1
 # is known to have this problem).  Therefore we avoid libw if we can.
 echo "$as_me:$LINENO: checking for wctype" >&5
 echo $ECHO_N "checking for wctype... $ECHO_C" >&6
@@ -7228,6 +7399,52 @@
   fi
 fi
 
+
+
+# Check whether --with-xiss or --without-xiss was given.
+if test "${with_xiss+set}" = set; then
+  withval="$with_xiss"
+
+else
+  with_xiss=auto
+fi;
+echo "$as_me:$LINENO: checking whether to use xiss" >&5
+echo $ECHO_N "checking whether to use xiss... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $with_xiss" >&5
+echo "${ECHO_T}$with_xiss" >&6
+
+if test "${with_xiss}" = yes; then
+  HAVE_LIBXISS=yes
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBXISS 1
+_ACEOF
+
+  XISS_INCLUDES="-I${with_xiss_prefix}/include"
+
+else
+  { echo "$as_me:$LINENO: WARNING: xiss support disabled; target arcxiss will be unavailable." >&5
+echo "$as_me: WARNING: xiss support disabled; target arcxiss will be unavailable." >&2;}
+  HAVE_LIBXISS=no
+fi
+
+
+if test "${target}" = "arc-unknown-elf32"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ARC_ELF32_TARGET 1
+_ACEOF
+
+fi
+if test "${target}" = "arc-unknown-linux-uclibc"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ARC_LINUX_TARGET 1
+_ACEOF
+
+fi
+
+
 # ------------------------- #
 # Checks for header files.  #
 # ------------------------- #
@@ -22997,7 +23214,7 @@
 CFLAGS="$CFLAGS -I${srcdir}/../include -I../bfd -I${srcdir}/../bfd"
 LDFLAGS="$LDFLAGS -L../bfd -L../libiberty"
 intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'`
-LIBS="$LIBS -lbfd -liberty $intl"
+LIBS="$LIBS -lbfd -liberty $intl -lz"
 echo "$as_me:$LINENO: checking for ELF support in BFD" >&5
 echo $ECHO_N "checking for ELF support in BFD... $ECHO_C" >&6
 if test "${gdb_cv_var_elf+set}" = set; then
@@ -24235,7 +24452,7 @@
 /usr/openwin/share/include'
 
 if test "$ac_x_includes" = no; then
-  # Guess where to find include files, by looking for Intrinsic.h.
+  # Guess where to find include files, by looking for Xlib.h.
   # First, try using that file with no special directory specified.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -24243,7 +24460,7 @@
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <X11/Intrinsic.h>
+#include <X11/Xlib.h>
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
@@ -24270,7 +24487,7 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
   for ac_dir in $ac_x_header_dirs; do
-  if test -r "$ac_dir/X11/Intrinsic.h"; then
+  if test -r "$ac_dir/X11/Xlib.h"; then
     ac_x_includes=$ac_dir
     break
   fi
@@ -24284,18 +24501,18 @@
   # See if we find them without any special options.
   # Don't add to $LIBS permanently.
   ac_save_LIBS=$LIBS
-  LIBS="-lXt $LIBS"
+  LIBS="-lX11 $LIBS"
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <X11/Intrinsic.h>
+#include <X11/Xlib.h>
 int
 main ()
 {
-XtMalloc (0)
+XrmInitialize ()
   ;
   return 0;
 }
@@ -25524,6 +25741,7 @@
 s,@HAVE_LIBEXPAT@,$HAVE_LIBEXPAT,;t t
 s,@LIBEXPAT@,$LIBEXPAT,;t t
 s,@LTLIBEXPAT@,$LTLIBEXPAT,;t t
+s,@XISS_INCLUDES@,$XISS_INCLUDES,;t t
 s,@ALLOCA@,$ALLOCA,;t t
 s,@CONFIG_LDFLAGS@,$CONFIG_LDFLAGS,;t t
 s,@TARGET_SYSTEM_ROOT@,$TARGET_SYSTEM_ROOT,;t t
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 39246aa..8380c04 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -381,9 +381,12 @@
 # We might need to link with -lm; most simulators need it.
 AC_CHECK_LIB(m, main)
 
+AC_CHECK_FUNC(inflate, [],
+  [AC_CHECK_LIB(z, inflate)])
+
 # We need to link with -lw to get `wctype' on Solaris before Solaris
 # 2.6.  Solaris 2.6 and beyond have this function in libc, and have a
-# libw that some versions of the GNU linker cannot hanle (GNU ld 2.9.1
+# libw that some versions of the GNU linker cannot handle (GNU ld 2.9.1
 # is known to have this problem).  Therefore we avoid libw if we can.
 AC_CHECK_FUNC(wctype, [],
   [AC_CHECK_LIB(w, wctype)])
@@ -477,6 +480,32 @@
   fi
 fi
 
+
+AC_ARG_WITH(xiss,
+  AS_HELP_STRING([--with-xiss], [include xiss support (auto/yes/no)]),
+  [], [with_xiss=auto])
+AC_MSG_CHECKING([whether to use xiss])
+AC_MSG_RESULT([$with_xiss])
+
+if test "${with_xiss}" = yes; then
+  HAVE_LIBXISS=yes
+  AC_DEFINE(HAVE_LIBXISS, 1, [Define if you have the xISS library.])
+  XISS_INCLUDES="-I${with_xiss_prefix}/include"
+  AC_SUBST(XISS_INCLUDES)
+else
+  AC_MSG_WARN([xiss support disabled; target arcxiss will be unavailable.])
+  HAVE_LIBXISS=no
+fi
+
+
+if test "${target}" = "arc-unknown-elf32"; then
+  AC_DEFINE(ARC_ELF32_TARGET, 1, [Define if you are building the ARC bare-board debugger.])
+fi
+if test "${target}" = "arc-unknown-linux-uclibc"; then
+  AC_DEFINE(ARC_LINUX_TARGET, 1, [Define if you are building the ARC Linux debugger.])
+fi
+
+
 # ------------------------- #
 # Checks for header files.  #
 # ------------------------- #
@@ -1414,7 +1443,7 @@
 CFLAGS="$CFLAGS -I${srcdir}/../include -I../bfd -I${srcdir}/../bfd"
 LDFLAGS="$LDFLAGS -L../bfd -L../libiberty"
 intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'`
-LIBS="$LIBS -lbfd -liberty $intl"
+LIBS="$LIBS -lbfd -liberty $intl -lz"
 AC_CACHE_CHECK([for ELF support in BFD], gdb_cv_var_elf,
 [AC_TRY_LINK(
 [#include <stdlib.h>
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index ccfe674..6a15d39 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -61,15 +61,19 @@
 	;;
 
 arc*-*-linux*)
+	# Target: ARC Linux based targets
 	gdb_target_obs="arc-tdep.o arc-linux-tdep.o solib.o solib-svr4.o \
-			solib-legacy.o corelow.o"
+			corelow.o"
 	build_gdbserver=yes
 	;;
-arc-a4-*)
-	gdb_target_obs="arc-tdep.o arc-jtag.o arc-jtag-tdep.o arc-jtag-ops.o"
-	;;
+
 arc*-*-*)
-	gdb_target_obs="arc-tdep.o arc-jtag.o arc-jtag-tdep.o arc-jtag-ops.o"
+	# Target: ARC elf32 based target
+	gdb_target_obs="arc-tdep.o arc-jtag.o arc-elf32-tdep.o arc-jtag-ops.o \
+			arc-jtag-actionpoints.o arc-remote-fileio.o arc-xiss.o \
+			arc-registers.o arc-architecture.o arc-board.o \
+			arc-memory.o arc-arguments.o arc-gpio.o arc-inst-tracing.o"
+	gdb_sim=../sim/arc/libsim.a
 	;;
 
 am33_2.0*-*-linux*)
diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi
index e4c99d8..f1a9de5 100644
--- a/gdb/doc/observer.texi
+++ b/gdb/doc/observer.texi
@@ -98,6 +98,23 @@
 The target's register contents have changed.
 @end deftypefun
 
+@deftypefun void target_pre_connect (struct target_ops *@var{target})
+Connection to the target is about to be performed.
+@end deftypefun
+
+@deftypefun void target_post_connect (struct target_ops *@var{target})
+Ccnnection to the target has just been performed.
+@end deftypefun
+
+@deftypefun void target_post_disconnect (struct target_ops *@var{target})
+Disconnection from the target has just been performed.
+@end deftypefun
+
+@deftypefun void target_updated (struct target_ops *@var{target})
+The target has been updated.
+@end deftypefun
+
+
 @deftypefun void executable_changed (void *@var{unused_args})
 The executable being debugged by GDB has changed: The user decided
 to debug a different program, or the program he was debugging has
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index 8db1b68..c4cd9f3 100644
--- a/gdb/dwarf2-frame.c
+++ b/gdb/dwarf2-frame.c
@@ -592,10 +592,6 @@
 	      fs->regs.reg[reg].loc.offset = -offset;
 	      break;
 
-	    case DW_CFA_MWARC_info:
-	      /* Ignored.  */
-	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);
-	      break;
 	    default:
 	      internal_error (__FILE__, __LINE__, _("Unknown CFI encountered."));
 	    }
@@ -1719,8 +1715,6 @@
 	  augmentation += 2;
 	}
 
-      if (augmentation[0] == 'H' && augmentation [1] == 'C')
-      augmentation += 2;
       cie->code_alignment_factor =
 	read_unsigned_leb128 (unit->abfd, buf, &bytes_read);
       buf += bytes_read;
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 7deb08e..bf589a2 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -265,8 +265,89 @@
   return retval;
 }
 
+// begin ARC
+static CORE_ADDR
+dwarf2_find_address (struct symbol *var, struct frame_info *frame,
+                     gdb_byte *data, unsigned short size,
+                     struct objfile *objfile)
+{
+  struct gdbarch *arch = get_frame_arch (frame);
+  struct value *retval;
+  struct dwarf_expr_baton baton;
+  struct dwarf_expr_context *ctx;
+  CORE_ADDR address;
+
+  /* optimised out */
+  if (size == 0)
+     return 0;
+
+  baton.frame   = frame;
+  baton.objfile = objfile;
+
+  ctx = new_dwarf_expr_context ();
+  ctx->baton           = &baton;
+  ctx->read_reg        = dwarf_expr_read_reg;
+  ctx->read_mem        = dwarf_expr_read_mem;
+  ctx->get_frame_base  = dwarf_expr_frame_base;
+  ctx->get_tls_address = dwarf_expr_tls_address;
+
+  dwarf_expr_eval (ctx, data, size);
+  if (ctx->num_pieces > 0)
+    {
+      /* what should we do here? */
+      address = 0;
+    }
+  else if (ctx->in_reg)
+    address = 0;
+  else
+    address = dwarf_expr_fetch (ctx, 0);
+
+  free_dwarf_expr_context (ctx);
+
+  return address;
+}
 
 
+static unsigned int
+dwarf2_find_size (struct symbol *var, struct frame_info *frame,
+                  gdb_byte *data, unsigned short size,
+                  struct objfile *objfile)
+{
+  struct gdbarch *arch = get_frame_arch (frame);
+  struct dwarf_expr_baton baton;
+  struct dwarf_expr_context *ctx;
+  unsigned int sz;
+
+  /* optimised out */
+  if (size == 0)
+     return 0;
+
+  baton.frame   = frame;
+  baton.objfile = objfile;
+
+  ctx = new_dwarf_expr_context ();
+  ctx->baton           = &baton;
+  ctx->read_reg        = dwarf_expr_read_reg;
+  ctx->read_mem        = dwarf_expr_read_mem;
+  ctx->get_frame_base  = dwarf_expr_frame_base;
+  ctx->get_tls_address = dwarf_expr_tls_address;
+
+  dwarf_expr_eval (ctx, data, size);
+  if (ctx->num_pieces > 0)
+    {
+      /* what should we do here? */
+      sz = 0;
+    }
+  else if (ctx->in_reg)
+    sz = 0;
+  else
+    sz = TYPE_LENGTH (SYMBOL_TYPE (var));
+
+  free_dwarf_expr_context (ctx);
+
+  return sz;
+}
+// end ARC
 
 
 /* Helper functions and baton for dwarf2_loc_desc_needs_frame.  */
@@ -434,6 +515,30 @@
   return val;
 }
 
+// begin ARC
+/* Return the address of SYMBOL in FRAME using the DWARF-2 expression
+   evaluator to calculate the location.  */
+static CORE_ADDR
+locexpr_get_variable_address (struct symbol *symbol, struct frame_info *frame)
+{
+  struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
+
+  return dwarf2_find_address (symbol, frame, dlbaton->data, dlbaton->size,
+                              dlbaton->objfile);
+}
+
+/* Return the size of SYMBOL in FRAME using the DWARF-2 expression
+   evaluator to calculate the location.  */
+static unsigned int
+locexpr_get_variable_size(struct symbol *symbol, struct frame_info *frame)
+{
+  struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
+
+  return dwarf2_find_size (symbol, frame, dlbaton->data, dlbaton->size,
+                           dlbaton->objfile);
+}
+// end ARC
+
 /* Return non-zero iff we need a frame to evaluate SYMBOL.  */
 static int
 locexpr_read_needs_frame (struct symbol *symbol)
@@ -516,6 +621,10 @@
    evaluator.  */
 const struct symbol_ops dwarf2_locexpr_funcs = {
   locexpr_read_variable,
+// begin ARC
+  locexpr_get_variable_address,
+  locexpr_get_variable_size,
+// end ARC
   locexpr_read_needs_frame,
   locexpr_describe_location,
   locexpr_tracepoint_var_ref
@@ -551,6 +660,46 @@
   return val;
 }
 
+// begin ARC
+/* Return the address of SYMBOL in FRAME using the DWARF-2 expression
+   evaluator to calculate the location.  */
+static CORE_ADDR
+loclist_get_variable_address (struct symbol *symbol, struct frame_info *frame)
+{ 
+  struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
+  struct value *val;
+  gdb_byte *data;
+  size_t size;
+
+  data = find_location_expression (dlbaton, &size,
+                                   frame ? get_frame_address_in_block (frame)
+                                   : 0);
+  if (data == NULL)
+      return 0;
+
+  return dwarf2_find_address(symbol, frame, data, size, dlbaton->objfile);
+}
+
+/* Return the size of SYMBOL in FRAME using the DWARF-2 expression
+   evaluator to calculate the location.  */
+static unsigned int
+loclist_get_variable_size(struct symbol *symbol, struct frame_info *frame)
+{
+  struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
+  struct value *val;
+  gdb_byte *data;
+  size_t size;
+
+  data = find_location_expression (dlbaton, &size,
+                                   frame ? get_frame_address_in_block (frame)
+                                   : 0);
+  if (data == NULL)
+      return 0;
+
+  return dwarf2_find_size(symbol, frame, data, size, dlbaton->objfile);
+}
+// end ARC
+
 /* Return non-zero iff we need a frame to evaluate SYMBOL.  */
 static int
 loclist_read_needs_frame (struct symbol *symbol)
@@ -594,6 +743,10 @@
    evaluator and location lists.  */
 const struct symbol_ops dwarf2_loclist_funcs = {
   loclist_read_variable,
+// begin ARC
+  loclist_get_variable_address,
+  loclist_get_variable_size,
+// end ARC
   loclist_read_needs_frame,
   loclist_describe_location,
   loclist_tracepoint_var_ref
diff --git a/gdb/exec.c b/gdb/exec.c
index 7648b03..2ffeba4 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -31,7 +31,7 @@
 #include "value.h"
 #include "exec.h"
 #include "observer.h"
-#include "arch-utils.c"
+#include "arch-utils.h"    /* richards ARC 23/9/08: change .c to .h   gdb bug: 9888 */
 
 #include <fcntl.h>
 #include "readline/readline.h"
diff --git a/gdb/features/arc-a5-cpu.xml b/gdb/features/arc-a5-cpu.xml
new file mode 100644
index 0000000..7ff602b
--- /dev/null
+++ b/gdb/features/arc-a5-cpu.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target version="1.0">
+<architecture>A5</architecture>
+<feature name="org.gnu.gdb.arc.registers">
+
+  <auxregister name="STATUS"               description="Status (obsolete)"                           number="0x0"   mask ="0xFEFFFFFF" access="RO">
+     <field name="PC" description="program counter (PC[25:2])"    size="24" offset="0"  access="RO" />
+     <field name="H"  description="halt bit"                      size="1"  offset="25" access="RO"  >
+         <meaning value="1" description="processor is halted"/>
+     </field>
+     <field name="E1" description="interrupt mask bit"            size="1"  offset="26" access="RO" />
+     <field name="E2" description="interrupt mask bit"            size="1"  offset="27" access="RO" />
+     <field name="V"  description="overflow flag"                 size="1"  offset="28" access="RO" />
+     <field name="C"  description="carry flag"                    size="1"  offset="29" access="RO" />
+     <field name="N"  description="negative flag"                 size="1"  offset="30" access="RO" />
+     <field name="Z"  description="zero flag"                     size="1"  offset="31" access="RO" />
+  </auxregister>
+
+  <auxregister name="SEMAPHORE"            description="Semaphore"                                   number="0x1"   mask ="0x0000000F" access="RW">
+     <field name="S0"  description="inter-process/host semaphore 0" size="1"  offset="0" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+     <field name="S1"  description="inter-process/host semaphore 1" size="1"  offset="1" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+     <field name="S2"  description="inter-process/host semaphore 2" size="1"  offset="2" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+     <field name="S3"  description="inter-process/host semaphore 3" size="1"  offset="3" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="LP_START"             description="Loop Start"                                  number="0x2"   mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="LP_END"               description="Loop End"                                    number="0x3"   mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="IDENTITY"             description="Identity"                                    number="0x4"   mask ="0xFFFFFFFF" access="RO">
+     <field name="CHIPID" description="unique chip identifier"     size="16" offset="16" access="RO" />
+     <field name="ARCNUM" description="additional identity number" size= "8" offset= "8" access="RO" />
+     <field name="ARCVER" description="basecase version number"    size= "8" offset= "0" access="RO" />
+  </auxregister>
+
+  <auxregister name="DEBUG"                description="Debug"                                       number="0x5"   mask ="0xF0800802" access="RW">
+     <field name ="FH" description="force halt"      size="1" offset="1"  access="WO"/>
+     <field name ="IS" description="single step"     size="1" offset="11" access="RW">
+         <meaning value="1" description="single instruction stepping is in force"/>
+     </field>
+     <field name ="ZZ" description="sleep mode"      size="1" offset="23" access="RO">
+         <meaning value="1" description="processor is in sleep mode"/>
+     </field>
+     <field name ="BH" description="breakpoint halt" size="1" offset="29" access="RO">
+         <meaning value="1" description="a BRK instruction has been triggered"/>
+     </field>
+     <field name ="SH" description="self halt"       size="1" offset="30" access="RO">
+         <meaning value="1" description="processor has halted itself"/>
+     </field>
+     <field name ="LD" description="load pending"    size="1" offset="31" access="RO">
+         <meaning value="1" description="a delayed load is waiting to complete"/>
+     </field>
+
+<!-- for testing
+     <field name ="LD" description="duplicate!"  size="1" offset="10" access="RO"/>
+     <field name ="OV" description="overlap!"    size="3" offset="27" access="RO"/>
+     <field name ="BG" description="too big!"    size="8" offset="27" access="RO"/>
+ -->
+  </auxregister>
+
+  <auxregister name="PC"                   description="program counter"                             number="0x6"   mask ="0xFFFFFFFE" access="RW"/>
+
+  <auxregister name="STATUS32"             description="status flags"                                number="0xA"   mask ="0x00001FFF" access="RW" >
+     <field name="H"  description="halt bit"               size="1"  offset= "0" access="RO" >
+         <meaning value="1" description="processor is halted"/>
+     </field>
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW" >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW" >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+  </auxregister>
+
+  <auxregister name="STATUS32_L1"          description="STATUS32 register in case of L1 interrupts"  number="0xB"   mask ="0x00001FFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW"  >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW"  >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+  </auxregister>
+
+  <auxregister name="STATUS32_L2"          description="STATUS32 register in case of L2 interrupts"  number="0xC"   mask ="0x00001FFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW" >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW" >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+  </auxregister>
+
+  <auxregister name="COUNT0"               description="Processor Timer 0 Count Value"               number="0x21"  mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="CONTROL0"             description="Processor Timer 0 Control Value"             number="0x22"  mask ="0x0000000F" access="RW" >
+     <field name="IE"  description="Interrupt Enable flag"  size="1"  offset="0" access="RW" >
+         <meaning value="1" description="interrupt will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="NH"  description="Not Halted mode flag"   size="1"  offset="1" access="RW" >
+         <meaning value="0" description="timer counts every clock cycle"/>
+         <meaning value="1" description="timer counts clock cycles only when processor is running"/>
+     </field>
+     <field name="W"  description="Watchdog mode flag"      size="1"  offset="2" access="RW" >
+         <meaning value="1" description="system Reset signal will be generated after timer reaches limit condition"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="LIMIT0"               description="Processor Timer 0 Limit Value"               number="0x23"  mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="INT_VECTOR_BASE"      description="Interrupt Vector Base Register"              number="0x25"  mask ="0xFFFFFC00" access="RW"/>
+
+  <auxregister name="AUX_MACMODE"          description="Aux MAC Mode"                                number="0x41"  mask ="0xFFFFFFFF" access="RW" >
+     <field name="CS"  description="" size="1"  offset="1" access="RW"  >
+     </field>
+     <field name="S2"  description="channel 2 saturation flag" size="1"  offset="4" access="RO" >
+         <meaning value="1" description="channel 2 has saturated"/>
+     </field>
+     <field name="S1"  description="channel 1 saturation flag" size="1"  offset="9" access="RO" >
+         <meaning value="1" description="channel 1 has saturated"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_LV12"         description="Aux IRQ Level 2"                             number="0x43"  mask ="0x00000003" access="RW" >
+     <field name="L1"  description="level 1 interrupt status bit" size="1"  offset="0" access="RW" >
+         <meaning value="1" description="level 1 interrupt has been taken"/>
+     </field>
+     <field name="L2"  description="level 2 interrupt status bit" size="1"  offset="1" access="RW" >
+         <meaning value="1" description="level 2 interrupt has been taken"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="COUNT1"               description="Processor Timer 1 Count Value"               number="0x100" mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="CONTROL1"             description="Processor Timer 1 Control Value"             number="0x101" mask ="0x0000000F" access="RW" >
+     <field name="IE"  description="Interrupt Enable flag"  size="1"  offset="0" access="RW" >
+         <meaning value="1" description="interrupt will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="NH"  description="Not Halted mode flag"   size="1"  offset="1" access="RW" >
+         <meaning value="0" description="timer counts every clock cycle"/>
+         <meaning value="1" description="timer counts clock cycles only when processor is running"/>
+     </field>
+     <field name="W"  description="Watchdog mode flag"      size="1"  offset="2" access="RW" >
+         <meaning value="1" description="system Reset signal will be generated after timer reaches limit condition"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="LIMIT1"               description="Processor Timer 1 Limit Value"               number="0x102" mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="AUX_IRQ_LEV"          description="Interrupt Level programming"                 number="0x200" mask ="0xFFFFFFF8" access="RW" >
+     <field name="reserved" onwrite="0" size="3"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_HINT"         description="Software Triggered Interrupt"                number="0x201" mask ="0x0000001F" access="RW"/>
+
+  <!-- cache control registers -->
+
+  <!-- N.B. are the Invalidation registers write-only? -->
+
+  <auxregister name="IC_IVIC"             description="Instruction Cache Invalidation Register"      number="0x10" mask ="0xFFFFFFFF" access="WO"/>
+  <auxregister name="IC_CTRL"             description="Instruction Cache Control Register"           number="0x11" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="DC_IVDC"             description="Data Cache Invalidation Register"             number="0x47" mask ="0xFFFFFFFF" access="WO"/>
+  <auxregister name="DC_CTRL"             description="Data Cache Control Register"                  number="0x48" mask ="0xFFFFFFFF" access="RW"/>
+
+
+  <!-- actionpoint 0 registers -->
+
+  <auxregister name="AMV0"                description="Actionpoint 0 Match Value Register"           number="0x220" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="AMM0"                description="Actionpoint 0 Match Mask Register"            number="0x221" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="AC0"                 description="Actionpoint 0 Control Register"               number="0x222" mask ="0xFFFFFFFF" access="RW"/>
+
+
+  <!-- Build Configuration Registers -->
+
+  <bcr name="BCR_VER"              description="Build Configuration Registers Version"          number="0x60"  mask="0xFFFFFFFF"/>
+  <bcr name="DCCM_BASE_BUILD"      description="Base Address for Data Closely Coupled Memory"   number="0x61"  mask="0xFFFFFFFF"/>
+  <bcr name="CRC_BASE_BUILD"       description="CRC Unit BCR"                                   number="0x62"  mask="0xFFFFFFFF"/>
+  <bcr name="DVBF_BUILD"           description="Dual Viterbi Instruction BCR"                   number="0x64"  mask="0xFFFFFFFF"/>
+  <bcr name="TEL_INSTR_BUILD"      description="Extended Arithmetic Instructions BCR"           number="0x65"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x66"  mask="0xFFFFFFFF"/>
+  <bcr name="MEMSUBSYS"            description="Memory Subsystem BCR"                           number="0x67"  mask="0xFFFFFFFF"/>
+  <bcr name="VECBASE_AC_BUILD"     description="Interrupt Vector Base BCR"                      number="0x68"  mask="0xFFFFFFFF"/> 
+  <bcr name="P_BASE_ADDRESS"       description="Peripheral Base Address"                        number="0x69"  mask="0xFFFFFFFF"/> 
+  <bcr name="unused"               description="unused"                                         number="0x6A"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6B"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6C"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6D"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6E"  mask="0xFFFFFFFF"/>
+  <bcr name="MMU_BUILD"            description="Memory Management Unit BCR"                     number="0x6F"  mask="0xFFFFFFFF"/>
+  <bcr name="ARCANGEL_BUILD"       description="ARCAngel BCR"                                   number="0x70"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x71"  mask="0xFFFFFFFF"/>
+  <bcr name="DCACHE_BUILD"         description="Data Cache BCR"                                 number="0x72"  mask="0xFFFFFFFF"/>
+  <bcr name="MADI_BUILD"           description="Multiple ARC Debug Interface"                   number="0x73"  mask="0xFFFFFFFF"/>
+  <bcr name="DCCM_BUILD"           description="Data Closely Coupled Memory BCR"                number="0x74"  mask="0xFFFFFFFF"/>
+  <bcr name="TIMER_BUILD"          description="Timers BCR"                                     number="0x75"  mask="0xFFFFFFFF"/>
+  <bcr name="AP_BUILD"             description="Actionpoints BCR"                               number="0x76"  mask="0xFFFFFFFF"/>
+  <bcr name="ICACHE_BUILD"         description="Instruction Cache BCR"                          number="0x77"  mask="0xFFFFFFFF"/>
+  <bcr name="ICCM_BUILD"           description="Instruction Closely Coupled Memory BCR"         number="0x78"  mask="0xFFFFFFFF"/>
+  <bcr name="DSPRAM_BUILD"         description="DSP RAM BCR"                                    number="0x79"  mask="0xFFFFFFFF"/>
+  <bcr name="MAC_BUILD"            description="MAC Unit BCR"                                   number="0x7A"  mask="0xFFFFFFFF"/>
+  <bcr name="MULTIPLY_BUILD"       description="(32 X 32) Multiply Unit BCR"                    number="0x7B"  mask="0xFFFFFFFF"/>
+  <bcr name="SWAP_BUILD"           description="SWAP BCR"                                       number="0x7C"  mask="0xFFFFFFFF"/>
+  <bcr name="NORM_BUILD"           description="NORM Unit BCR"                                  number="0x7D"  mask="0xFFFFFFFF"/>
+  <bcr name="MINMAX_BUILD"         description="Minmax Unit BCR"                                number="0x7E"  mask="0xFFFFFFFF"/>
+  <bcr name="BARREL_BUILD"         description="Barrel Shifter BCR"                             number="0x7F"  mask="0xFFFFFFFF"/> 
+
+<!-- for testing
+
+  <auxregister name="TEST"   description="any old bucket of bits"   number="0x99999" mask ="0xFFFFFFFF" access="RW">
+     <field name ="AA"        description=""    size="1" offset="5"  access="RO">
+         <meaning value="0" description="value is 0"/>
+         <meaning value="1" description="value is 1"/>
+     </field>
+     <field name ="BBBB"      description=""    size="3" offset="8"  access="RO">
+         <meaning value="0" description="value is 0"/>
+         <meaning value="1" description="value is 1"/>
+         <meaning value="3" description="value is 3"/>
+         <meaning value="7" description="value is 7"/>
+     </field>
+     <field name ="CCCCCCCCC" description=""    size="8" offset="17" access="RO">
+     </field>
+  </auxregister>
+ -->
+
+</feature>
+</target>
diff --git a/gdb/features/arc-registers.dtd b/gdb/features/arc-registers.dtd
new file mode 100644
index 0000000..b050fa0
--- /dev/null
+++ b/gdb/features/arc-registers.dtd
@@ -0,0 +1,71 @@
+<!-- Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- The root element of an ARC registers description is <target>.  -->
+
+<!-- Auxiliary Registers  -->
+
+<!ELEMENT target	(architecture?, feature*)>
+<!ATTLIST target
+	version		CDATA	#FIXED "1.0">
+
+<!ELEMENT architecture	(#PCDATA)>
+
+<!ELEMENT feature	(auxregister*,bcr*,ecr*)>
+<!ATTLIST feature
+	name		ID	#REQUIRED>
+
+<!ELEMENT auxregister	(field*)>
+<!ATTLIST auxregister
+	name		CDATA	#REQUIRED
+	description	CDATA   #IMPLIED
+	number		CDATA	#REQUIRED
+	mask		CDATA	#IMPLIED
+	access		(RO | RW | WO) 'RW'
+	>
+
+<!ELEMENT field		(meaning*)>
+<!ATTLIST field
+	name		CDATA	#REQUIRED
+	description	CDATA	#IMPLIED
+	onwrite		CDATA	#IMPLIED
+	offset		CDATA   #REQUIRED
+	size		CDATA   #REQUIRED
+	access		(RO | RW | WO) 'RW'
+	>
+
+<!ELEMENT meaning		EMPTY>
+<!ATTLIST meaning
+	description	CDATA	#REQUIRED
+	value		CDATA   #REQUIRED
+	>
+
+<!-- Build Configuration Registers  -->
+
+<!ELEMENT bcr      (bcrfield*)>
+<!ATTLIST bcr
+        name            CDATA   #REQUIRED
+        description     CDATA   #IMPLIED
+        number          CDATA   #REQUIRED
+        mask            CDATA   #IMPLIED
+        >
+
+<!ELEMENT bcrfield         >
+<!ATTLIST bcrfield
+        name            CDATA   #REQUIRED
+        description     CDATA   #IMPLIED
+        offset          CDATA   #REQUIRED
+        size            CDATA   #REQUIRED
+       >
+
+<!-- Extension Core Registers  -->
+
+<!ELEMENT ecr>
+<!ATTLIST ecr
+        number          CDATA   #REQUIRED
+        mask            CDATA   #IMPLIED
+	access		(RO | RW | WO) 'RW'
+        >
diff --git a/gdb/features/arc600-cpu.xml b/gdb/features/arc600-cpu.xml
new file mode 100644
index 0000000..1ecaee4
--- /dev/null
+++ b/gdb/features/arc600-cpu.xml
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target version="1.0">
+<architecture>ARC600</architecture>
+<feature name="org.gnu.gdb.arc.registers">
+
+  <auxregister name="STATUS"               description="Status (obsolete)"                           number="0x0"   mask ="0xFEFFFFFF" access="RO">
+     <field name="PC" description="program counter (PC[25:2])"    size="24" offset="0"  access="RO" />
+     <field name="H"  description="halt bit"                      size="1"  offset="25" access="RO"  >
+         <meaning value="1" description="processor is halted"/>
+     </field>
+     <field name="E1" description="interrupt mask bit"            size="1"  offset="26" access="RO" />
+     <field name="E2" description="interrupt mask bit"            size="1"  offset="27" access="RO" />
+     <field name="V"  description="overflow flag"                 size="1"  offset="28" access="RO" />
+     <field name="C"  description="carry flag"                    size="1"  offset="29" access="RO" />
+     <field name="N"  description="negative flag"                 size="1"  offset="30" access="RO" />
+     <field name="Z"  description="zero flag"                     size="1"  offset="31" access="RO" />
+  </auxregister>
+
+  <auxregister name="SEMAPHORE"            description="Semaphore"                                   number="0x1"   mask ="0x0000000F" access="RW">
+     <field name="S0"  description="inter-process/host semaphore 0" size="1"  offset="0" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+     <field name="S1"  description="inter-process/host semaphore 1" size="1"  offset="1" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+     <field name="S2"  description="inter-process/host semaphore 2" size="1"  offset="2" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+     <field name="S3"  description="inter-process/host semaphore 3" size="1"  offset="3" access="RW" >
+         <meaning value="1" description="semaphore has been obtained"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="LP_START"             description="Loop Start"                                  number="0x2"   mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="LP_END"               description="Loop End"                                    number="0x3"   mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="IDENTITY"             description="Identity"                                    number="0x4"   mask ="0xFFFFFFFF" access="RO">
+     <field name="CHIPID" description="unique chip identifier"     size="16" offset="16" access="RO" />
+     <field name="ARCNUM" description="additional identity number" size= "8" offset= "8" access="RO" />
+     <field name="ARCVER" description="basecase version number"    size= "8" offset= "0" access="RO" />
+  </auxregister>
+
+  <auxregister name="DEBUG"                description="Debug"                                       number="0x5"   mask ="0xF0800802" access="RW">
+     <field name ="FH" description="force halt"      size="1" offset="1"  access="WO"/>
+     <field name ="IS" description="single step"     size="1" offset="11" access="RW">
+         <meaning value="1" description="single instruction stepping is in force"/>
+     </field>
+     <field name ="ZZ" description="sleep mode"      size="1" offset="23" access="RO">
+         <meaning value="1" description="processor is in sleep mode"/>
+     </field>
+     <field name ="BH" description="breakpoint halt" size="1" offset="29" access="RO">
+         <meaning value="1" description="a BRK instruction has been triggered"/>
+     </field>
+     <field name ="SH" description="self halt"       size="1" offset="30" access="RO">
+         <meaning value="1" description="processor has halted itself"/>
+     </field>
+     <field name ="LD" description="load pending"    size="1" offset="31" access="RO">
+         <meaning value="1" description="a delayed load is waiting to complete"/>
+     </field>
+
+<!-- for testing
+     <field name ="LD" description="duplicate!"  size="1" offset="10" access="RO"/>
+     <field name ="OV" description="overlap!"    size="3" offset="27" access="RO"/>
+     <field name ="BG" description="too big!"    size="8" offset="27" access="RO"/>
+ -->
+  </auxregister>
+
+  <auxregister name="PC"                   description="program counter"                             number="0x6"   mask ="0xFFFFFFFE" access="RW"/>
+
+  <auxregister name="STATUS32"             description="status flags"                                number="0xA"   mask ="0x00001FFF" access="RW" >
+     <field name="H"  description="halt bit"               size="1"  offset= "0" access="RO" >
+         <meaning value="1" description="processor is halted"/>
+     </field>
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW" >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW" >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+  </auxregister>
+
+  <auxregister name="STATUS32_L1"          description="STATUS32 register in case of L1 interrupts"  number="0xB"   mask ="0x00001FFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW"  >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW"  >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+  </auxregister>
+
+  <auxregister name="STATUS32_L2"          description="STATUS32 register in case of L2 interrupts"  number="0xC"   mask ="0x00001FFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW" >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW" >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+  </auxregister>
+
+  <auxregister name="COUNT0"               description="Processor Timer 0 Count Value"               number="0x21"  mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="CONTROL0"             description="Processor Timer 0 Control Value"             number="0x22"  mask ="0x0000000F" access="RW" >
+     <field name="IE"  description="Interrupt Enable flag"  size="1"  offset="0" access="RW" >
+         <meaning value="1" description="interrupt will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="NH"  description="Not Halted mode flag"   size="1"  offset="1" access="RW" >
+         <meaning value="0" description="timer counts every clock cycle"/>
+         <meaning value="1" description="timer counts clock cycles only when processor is running"/>
+     </field>
+     <field name="W"  description="Watchdog mode flag"      size="1"  offset="2" access="RW" >
+         <meaning value="1" description="system Reset signal will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="IP"  description="Interrupt Pending flag" size="1"  offset="3" access="RW" >
+         <meaning value="0" description="timer 0 interrupt line is low"  />
+         <meaning value="1" description="timer 0 interrupt line is high" />
+     </field>
+  </auxregister>
+
+  <auxregister name="LIMIT0"               description="Processor Timer 0 Limit Value"               number="0x23"  mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="INT_VECTOR_BASE"      description="Interrupt Vector Base Register"              number="0x25"  mask ="0xFFFFFC00" access="RW"/>
+
+  <auxregister name="AUX_MACMODE"          description="Aux MAC Mode"                                number="0x41"  mask ="0xFFFFFFFF" access="RW" >
+     <field name="CS"  description="" size="1"  offset="1" access="RW"  >
+     </field>
+     <field name="S2"  description="channel 2 saturation flag" size="1"  offset="4" access="RO" >
+         <meaning value="1" description="channel 2 has saturated"/>
+     </field>
+     <field name="S1"  description="channel 1 saturation flag" size="1"  offset="9" access="RO" >
+         <meaning value="1" description="channel 1 has saturated"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_LV12"         description="Aux IRQ Level 2"                             number="0x43"  mask ="0x00000003" access="RW" >
+     <field name="L1"  description="level 1 interrupt status bit" size="1"  offset="0" access="RW" >
+         <meaning value="1" description="level 1 interrupt has been taken"/>
+     </field>
+     <field name="L2"  description="level 2 interrupt status bit" size="1"  offset="1" access="RW" >
+         <meaning value="1" description="level 2 interrupt has been taken"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="COUNT1"               description="Processor Timer 1 Count Value"               number="0x100" mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="CONTROL1"             description="Processor Timer 1 Control Value"             number="0x101" mask ="0x0000000F" access="RW" >
+     <field name="IE"  description="Interrupt Enable flag"  size="1"  offset="0" access="RW" >
+         <meaning value="1" description="interrupt will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="NH"  description="Not Halted mode flag"   size="1"  offset="1" access="RW" >
+         <meaning value="0" description="timer counts every clock cycle"/>
+         <meaning value="1" description="timer counts clock cycles only when processor is running"/>
+     </field>
+     <field name="W"  description="Watchdog mode flag"      size="1"  offset="2" access="RW" >
+         <meaning value="1" description="system Reset signal will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="IP"  description="Interrupt Pending flag" size="1"  offset="3" access="RW" >
+         <meaning value="0" description="timer 1 interrupt line is low"  />
+         <meaning value="1" description="timer 1 interrupt line is high" />
+     </field>
+  </auxregister>
+
+  <auxregister name="LIMIT1"               description="Processor Timer 1 Limit Value"               number="0x102" mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="AUX_IRQ_LEV"          description="Interrupt Level programming"                 number="0x200" mask ="0xFFFFFFF8" access="RW" >
+     <field name="reserved" onwrite="0" size="3"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_HINT"         description="Software Triggered Interrupt"                number="0x201" mask ="0x0000001F" access="RW"/>
+
+  <!-- cache control registers -->
+
+  <!-- N.B. are the Invalidation registers write-only? -->
+
+  <auxregister name="IC_IVIC"             description="Instruction Cache Invalidation Register"      number="0x10" mask ="0xFFFFFFFF" access="WO"/>
+  <auxregister name="IC_CTRL"             description="Instruction Cache Control Register"           number="0x11" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="DC_IVDC"             description="Data Cache Invalidation Register"             number="0x47" mask ="0xFFFFFFFF" access="WO"/>
+  <auxregister name="DC_CTRL"             description="Data Cache Control Register"                  number="0x48" mask ="0xFFFFFFFF" access="RW"/>
+
+
+  <!-- actionpoint 0 registers -->
+
+  <auxregister name="AMV0"                description="Actionpoint 0 Match Value Register"           number="0x220" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="AMM0"                description="Actionpoint 0 Match Mask Register"            number="0x221" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="AC0"                 description="Actionpoint 0 Control Register"               number="0x222" mask ="0xFFFFFFFF" access="RW"/>
+
+
+  <!-- Build Configuration Registers -->
+
+  <bcr name="BCR_VER"              description="Build Configuration Registers Version"          number="0x60"  mask="0xFFFFFFFF"/>
+  <bcr name="DCCM_BASE_BUILD"      description="Base Address for Data Closely Coupled Memory"   number="0x61"  mask="0xFFFFFFFF"/>
+  <bcr name="CRC_BASE_BUILD"       description="CRC Unit BCR"                                   number="0x62"  mask="0xFFFFFFFF"/>
+  <bcr name="DVBF_BUILD"           description="Dual Viterbi Instruction BCR"                   number="0x64"  mask="0xFFFFFFFF"/>
+  <bcr name="TEL_INSTR_BUILD"      description="Extended Arithmetic Instructions BCR"           number="0x65"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x66"  mask="0xFFFFFFFF"/>
+  <bcr name="MEMSUBSYS"            description="Memory Subsystem BCR"                           number="0x67"  mask="0xFFFFFFFF"/>
+  <bcr name="VECBASE_AC_BUILD"     description="Interrupt Vector Base BCR"                      number="0x68"  mask="0xFFFFFFFF"/> 
+  <bcr name="P_BASE_ADDRESS"       description="Peripheral Base Address"                        number="0x69"  mask="0xFFFFFFFF"/> 
+  <bcr name="unused"               description="unused"                                         number="0x6A"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6B"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6C"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6D"  mask="0xFFFFFFFF"/>
+  <bcr name="RF_BUILD"             description="Core Registers BCR"                             number="0x6E"  mask="0xFFFFFFFF"/>
+  <bcr name="MMU_BUILD"            description="Memory Management Unit BCR"                     number="0x6F"  mask="0xFFFFFFFF"/>
+  <bcr name="ARCANGEL_BUILD"       description="ARCAngel BCR"                                   number="0x70"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x71"  mask="0xFFFFFFFF"/>
+  <bcr name="DCACHE_BUILD"         description="Data Cache BCR"                                 number="0x72"  mask="0xFFFFFFFF"/>
+  <bcr name="MADI_BUILD"           description="Multiple ARC Debug Interface"                   number="0x73"  mask="0xFFFFFFFF"/>
+  <bcr name="DCCM_BUILD"           description="Data Closely Coupled Memory BCR"                number="0x74"  mask="0xFFFFFFFF"/>
+  <bcr name="TIMER_BUILD"          description="Timers BCR"                                     number="0x75"  mask="0xFFFFFFFF"/>
+  <bcr name="AP_BUILD"             description="Actionpoints BCR"                               number="0x76"  mask="0xFFFFFFFF"/>
+  <bcr name="ICACHE_BUILD"         description="Instruction Cache BCR"                          number="0x77"  mask="0xFFFFFFFF"/>
+  <bcr name="ICCM_BUILD"           description="Instruction Closely Coupled Memory BCR"         number="0x78"  mask="0xFFFFFFFF"/>
+  <bcr name="DSPRAM_BUILD"         description="DSP RAM BCR"                                    number="0x79"  mask="0xFFFFFFFF"/>
+  <bcr name="MAC_BUILD"            description="MAC Unit BCR"                                   number="0x7A"  mask="0xFFFFFFFF"/>
+  <bcr name="MULTIPLY_BUILD"       description="(32 X 32) Multiply Unit BCR"                    number="0x7B"  mask="0xFFFFFFFF"/>
+  <bcr name="SWAP_BUILD"           description="SWAP BCR"                                       number="0x7C"  mask="0xFFFFFFFF"/>
+  <bcr name="NORM_BUILD"           description="NORM Unit BCR"                                  number="0x7D"  mask="0xFFFFFFFF"/>
+  <bcr name="MINMAX_BUILD"         description="Minmax Unit BCR"                                number="0x7E"  mask="0xFFFFFFFF"/>
+  <bcr name="BARREL_BUILD"         description="Barrel Shifter BCR"                             number="0x7F"  mask="0xFFFFFFFF"/> 
+
+<!-- for testing
+
+  <auxregister name="TEST"   description="any old bucket of bits"   number="0x99999" mask ="0xFFFFFFFF" access="RW">
+     <field name ="AA"        description=""    size="1" offset="5"  access="RO">
+         <meaning value="0" description="value is 0"/>
+         <meaning value="1" description="value is 1"/>
+     </field>
+     <field name ="BBBB"      description=""    size="3" offset="8"  access="RO">
+         <meaning value="0" description="value is 0"/>
+         <meaning value="1" description="value is 1"/>
+         <meaning value="3" description="value is 3"/>
+         <meaning value="7" description="value is 7"/>
+     </field>
+     <field name ="CCCCCCCCC" description=""    size="8" offset="17" access="RO">
+     </field>
+  </auxregister>
+ -->
+
+</feature>
+</target>
diff --git a/gdb/features/arc700-cpu.xml b/gdb/features/arc700-cpu.xml
new file mode 100644
index 0000000..5fa97d2
--- /dev/null
+++ b/gdb/features/arc700-cpu.xml
@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target version="1.0">
+<architecture>ARC700</architecture>
+<feature name="org.gnu.gdb.arc.registers">
+
+  <auxregister name="STATUS"               description="Status (obsolete)"                           number="0x0"   mask ="0xFEFFFFFF" access="RO">
+     <field name="PC" description="program counter (PC[25:2])"    size="24" offset="0"  access="RO" />
+     <field name="H"  description="halt bit"                      size="1"  offset="25" access="RO"  >
+         <meaning value="1" description="processor is halted"/>
+     </field>
+     <field name="E1" description="interrupt mask bit"            size="1"  offset="26" access="RO" />
+     <field name="E2" description="interrupt mask bit"            size="1"  offset="27" access="RO" />
+     <field name="V"  description="overflow flag"                 size="1"  offset="28" access="RO" />
+     <field name="C"  description="carry flag"                    size="1"  offset="29" access="RO" />
+     <field name="N"  description="negative flag"                 size="1"  offset="30" access="RO" />
+     <field name="Z"  description="zero flag"                     size="1"  offset="31" access="RO" />
+  </auxregister>
+
+  <auxregister name="LP_START"             description="Loop Start"                                  number="0x2"   mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="LP_END"               description="Loop End"                                    number="0x3"   mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="IDENTITY"             description="Identity"                                    number="0x4"   mask ="0xFFFFFFFF" access="RO">
+     <field name="CHIPID" description="unique chip identifier"     size="16" offset="16" access="RO" />
+     <field name="ARCNUM" description="additional identity number" size= "8" offset= "8" access="RO" />
+     <field name="ARCVER" description="basecase version number"    size= "8" offset= "0" access="RO" />
+  </auxregister>
+
+  <auxregister name="DEBUG"                description="Debug"                                       number="0x5"   mask ="0xF0800802" access="RW">
+     <field name ="FH" description="force halt"      size="1" offset="1"  access="WO"/>
+     <field name ="IS" description="single step"     size="1" offset="11" access="RW">
+         <meaning value="1" description="single instruction stepping is in force"/>
+     </field>
+     <field name ="ZZ" description="sleep mode"      size="1" offset="23" access="RO">
+         <meaning value="1" description="processor is in sleep mode"/>
+     </field>
+     <field name ="UB" description="user mode BRK"   size="1" offset="28" access="RW">
+         <meaning value="0" description="BRK instructions can not be used in User mode"/>
+         <meaning value="1" description="BRK instructions can be used in User mode"/>
+     </field>
+     <field name ="BH" description="breakpoint halt" size="1" offset="29" access="RO">
+         <meaning value="1" description="a BRK instruction has been triggered"/>
+     </field>
+     <field name ="SH" description="self halt"       size="1" offset="30" access="RO">
+         <meaning value="1" description="processor has halted itself"/>
+     </field>
+     <field name ="LD" description="load pending"    size="1" offset="31" access="RO">
+         <meaning value="1" description="a delayed load is waiting to complete"/>
+     </field>
+
+<!-- for testing
+     <field name ="LD" description="duplicate!"  size="1" offset="10" access="RO"/>
+     <field name ="OV" description="overlap!"    size="3" offset="27" access="RO"/>
+     <field name ="BG" description="too big!"    size="8" offset="27" access="RO"/>
+ -->
+  </auxregister>
+
+  <auxregister name="PC"                   description="program counter"                             number="0x6"   mask ="0xFFFFFFFE" access="RW"/>
+
+  <auxregister name="STATUS32"             description="status flags"                                number="0xA"   mask ="0x00001FFF" access="RW" >
+     <field name="H"  description="halt bit"               size="1"  offset= "0" access="RO" >
+         <meaning value="1" description="processor is halted"/>
+     </field>
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW" >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW" >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="A1" description="level 1 interrupt bit"  size="1"  offset= "3" access="RO" >
+         <meaning value="1" description="a level 1 interrupt service routine is active"/>
+     </field>
+     <field name="A2" description="level 2 interrupt bit"  size="1"  offset= "4" access="RO" >
+         <meaning value="1" description="a level 2 interrupt service routine is active"/>
+     </field>
+     <field name="AE" description="exception bit"          size="1"  offset= "5" access="RO" >
+         <meaning value="1" description="an exception is active"/>
+     </field>
+     <field name="DE" description="delay slot bit"         size="1"  offset= "6" access="RO" >
+         <meaning value="1" description="instruction addressed by PC32 is in the delay slot of a taken branch"/>
+     </field>
+     <field name="U"  description="User mode bit"          size="1"  offset= "7" access="RW" >
+         <meaning value="0" description="processor is in Kernel mode"/>
+         <meaning value="1" description="processor is in User mode"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+     <field name="L"  description="zero overhead loop bit" size="1"  offset="12" access="RO"  >
+         <meaning value="0" description="zero overhead loop mechanism is enabled"/>
+         <meaning value="1" description="zero overhead loop mechanism is disabled"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="STATUS32_L1"          description="STATUS32 register in case of L1 interrupts"  number="0xB"   mask ="0x00001FFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW"  >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW"  >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="A1" description="level 1 interrupt bit"  size="1"  offset= "3" access="RO"  >
+         <meaning value="1" description="a level 1 interrupt service routine is active"/>
+     </field>
+     <field name="A2" description="level 2 interrupt bit"  size="1"  offset= "4" access="RO" >
+         <meaning value="1" description="a level 2 interrupt service routine is active"/>
+     </field>
+     <field name="AE" description="exception bit"          size="1"  offset= "5" access="RO" >
+         <meaning value="1" description="an exception is active"/>
+     </field>
+     <field name="DE" description="delay slot bit"         size="1"  offset= "6" access="RO" >
+         <meaning value="1" description="instruction addressed by PC32 is in the delay slot of a taken branch"/>
+     </field>
+     <field name="U"  description="User mode bit"          size="1"  offset= "7" access="RW"  >
+         <meaning value="0" description="processor is in Kernel mode"/>
+         <meaning value="1" description="processor is in User mode"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+     <field name="L"  description="zero overhead loop bit" size="1"  offset="12" access="RO"  >
+         <meaning value="0" description="zero overhead loop mechanism is enabled"/>
+         <meaning value="1" description="zero overhead loop mechanism is disabled"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="STATUS32_L2"          description="STATUS32 register in case of L2 interrupts"  number="0xC"   mask ="0x00001FFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+     <field name="E1" description="level 1 interrupt mask bit" size="1"  offset= "1" access="RW" >
+         <meaning value="0" description="level 1 interrupts are enabled"/>
+         <meaning value="1" description="level 1 interrupts are disabled"/>
+     </field>
+     <field name="E2" description="level 2 interrupt mask bit" size="1"  offset= "2" access="RW" >
+         <meaning value="0" description="level 2 interrupts are enabled"/>
+         <meaning value="1" description="level 2 interrupts are disabled"/>
+     </field>
+     <field name="A1" description="level 1 interrupt bit"  size="1"  offset= "3" access="RO" >
+         <meaning value="1" description="a level 1 interrupt service routine is active"/>
+     </field>
+     <field name="A2" description="level 2 interrupt bit"  size="1"  offset= "4" access="RO" >
+         <meaning value="1" description="a level 2 interrupt service routine is active"/>
+     </field>
+     <field name="AE" description="exception bit"          size="1"  offset= "5" access="RO" >
+         <meaning value="1" description="an exception is active"/>
+     </field>
+     <field name="DE" description="delay slot bit"         size="1"  offset= "6" access="RO" >
+         <meaning value="1" description="instruction addressed by PC32 is in the delay slot of a taken branch"/>
+     </field>
+     <field name="U"  description="User mode bit"          size="1"  offset= "7" access="RW"  >
+         <meaning value="0" description="processor is in Kernel mode"/>
+         <meaning value="1" description="processor is in User mode"/>
+     </field>
+     <field name="V"  description="overflow flag"          size="1"  offset= "8" access="RO" />
+     <field name="C"  description="carry flag"             size="1"  offset= "9" access="RO" />
+     <field name="N"  description="negative flag"          size="1"  offset="10" access="RO" />
+     <field name="Z"  description="zero flag"              size="1"  offset="11" access="RO" />
+     <field name="L"  description="zero overhead loop bit" size="1"  offset="12" access="RO"  >
+         <meaning value="0" description="zero overhead loop mechanism is enabled"  />
+         <meaning value="1" description="zero overhead loop mechanism is disabled" />
+     </field>
+  </auxregister>
+
+  <auxregister name="COUNT0"               description="Processor Timer 0 Count Value"               number="0x21"  mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="CONTROL0"             description="Processor Timer 0 Control Value"             number="0x22"  mask ="0x0000000F" access="RW" >
+     <field name="IE"  description="Interrupt Enable flag"  size="1"  offset="0" access="RW" >
+         <meaning value="1" description="interrupt will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="NH"  description="Not Halted mode flag"   size="1"  offset="1" access="RW" >
+         <meaning value="0" description="timer counts every clock cycle"/>
+         <meaning value="1" description="timer counts clock cycles only when processor is running"/>
+     </field>
+     <field name="W"  description="Watchdog mode flag"      size="1"  offset="2" access="RW" >
+         <meaning value="1" description="system Reset signal will be generated after timer reaches limit condition"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="LIMIT0"               description="Processor Timer 0 Limit Value"               number="0x23"  mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="INT_VECTOR_BASE"      description="Interrupt Vector Base Register"              number="0x25"  mask ="0xFFFFFC00" access="RW"/>
+
+  <auxregister name="AUX_MACMODE"          description="Aux MAC Mode"                                number="0x41"  mask ="0xFFFFFFFF" access="RW" >
+     <field name="CS"  description="" size="1"  offset="1" access="RW"  >
+     </field>
+     <field name="S2"  description="channel 2 saturation flag" size="1"  offset="4" access="RO" >
+         <meaning value="1" description="channel 2 has saturated"/>
+     </field>
+     <field name="S1"  description="channel 1 saturation flag" size="1"  offset="9" access="RO" >
+         <meaning value="1" description="channel 1 has saturated"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_LV12"         description="Aux IRQ Level 2"                             number="0x43"  mask ="0x00000003" access="RW" >
+     <field name="L1"  description="level 1 interrupt status bit" size="1"  offset="0" access="RW" >
+         <meaning value="1" description="level 1 interrupt has been taken"/>
+     </field>
+     <field name="L2"  description="level 2 interrupt status bit" size="1"  offset="1" access="RW" >
+         <meaning value="1" description="level 2 interrupt has been taken"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="COUNT1"               description="Processor Timer 1 Count Value"               number="0x100" mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="CONTROL1"             description="Processor Timer 1 Control Value"             number="0x101" mask ="0x0000000F" access="RW" >
+     <field name="IE"  description="Interrupt Enable flag"  size="1"  offset="0" access="RW" >
+         <meaning value="1" description="interrupt will be generated after timer reaches limit condition"/>
+     </field>
+     <field name="NH"  description="Not Halted mode flag"   size="1"  offset="1" access="RW" >
+         <meaning value="0" description="timer counts every clock cycle"/>
+         <meaning value="1" description="timer counts clock cycles only when processor is running"/>
+     </field>
+     <field name="W"  description="Watchdog mode flag"      size="1"  offset="2" access="RW" >
+         <meaning value="1" description="system Reset signal will be generated after timer reaches limit condition"/>
+     </field>
+  </auxregister>
+
+  <auxregister name="LIMIT1"               description="Processor Timer 1 Limit Value"               number="0x102" mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="AUX_IRQ_LEV"          description="Interrupt Level programming"                 number="0x200" mask ="0xFFFFFFF8" access="RW" >
+     <field name="reserved" onwrite="0" size="3"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_HINT"         description="Software Triggered Interrupt"                number="0x201" mask ="0x0000001F" access="RW"/>
+
+  <auxregister name="ERET"                 description="Exception Return"                            number="0x400" mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="ERBTA"                description="Exception BTA"                               number="0x401" mask ="0xFFFFFFFE" access="RW"/>
+
+  <auxregister name="ERSTATUS"             description="Exception Return Status"                     number="0x402" mask ="0x00001FFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="ECR"                  description="Exception Cause Register"                    number="0x403" mask ="0x00FFFFFF" access="RO">
+     <field name="Vector Number" description=""                         size="8" offset="16" access="RO" />
+     <field name="Cause Code"    description="exact cause of exception" size="8" offset="8"  access="RO" />
+     <field name="Parameter"     description="additional information"   size="8" offset="0"  access="RO" />
+  </auxregister>
+  <auxregister name="EFA"                  description="Exception Fault Address"                     number="0x404" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="ICAUSE1"              description="Interrupt Cause (Level 1)"                   number="0x40A" mask ="0x0000001F" access="RO"/>
+  <auxregister name="ICAUSE2"              description="Interrupt Cause (Level 2)"                   number="0x40B" mask ="0x0000001F" access="RO"/>
+
+  <auxregister name="AUX_IENABLE"          description="Interrupt Mask Programming"                  number="0x40C" mask ="0xFFFFFFF8" access="RW" >
+     <field name="reserved" onwrite="7" size="3"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="AUX_ITRIGGER"         description="Interrupt Sensitivity Programming"           number="0x40D" mask ="0xFFFFFFF8" access="RW" >
+     <field name="reserved" onwrite="7" size="3"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="XPU"                  description="User Mode Extension Permissions"             number="0x410" mask ="0xFFFFFFFF" access="RW"/>
+
+  <auxregister name="BTA"                  description="Branch Target Address"                       number="0x412" mask ="0xFFFFFFFE" access="RO" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RO" />
+  </auxregister>
+
+  <auxregister name="BTA_L1"               description="Branch Target Address in Level 1"            number="0x413" mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="BTA_L2"               description="Branch Target Address in Level 2"            number="0x414" mask ="0xFFFFFFFE" access="RW" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="RW" />
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_PULSE_CANCEL" description="Interrupt Pulse Cancel"                      number="0x415" mask ="0xFFFFFFFA" access="WO" >
+     <field name="reserved" onwrite="0" size="1"  offset="0" access="WO" />
+     <field name="reserved" onwrite="0" size="1"  offset="2" access="WO" />
+  </auxregister>
+
+  <auxregister name="AUX_IRQ_PENDING"      description="Interrupt Pending Register"                  number="0x416" mask ="0xFFFFFFF8" access="RO"/>
+
+
+  <!-- cache control registers -->
+
+  <auxregister name="IC_IVIC"             description="Instruction Cache Invalidation Register"      number="0x10" mask ="0xFFFFFFFF" access="WO"/>
+  <auxregister name="IC_CTRL"             description="Instruction Cache Control Register"           number="0x11" mask ="0x0000003F" access="RW" >
+     <field name="DC"       description="enables/disables the cache"      size="1"  offset="0" access="RW"  >
+         <meaning value="0" description="cache is enabled"  />
+         <meaning value="1" description="cache is disabled" />
+     </field>
+     <field name="EB"       description="enables/disables cache bypass"   size="1"  offset="1" access="RO" >
+         <meaning value="0" description="bypass is disabled" />
+         <meaning value="1" description="bypass is enabled"  />
+     </field>
+     <field name="reserved" onwrite="0"    size="1"  offset="2" />
+     <field name="SB"       description="success of last cache operation" size="1"  offset="3" access="RW"  >
+         <meaning value="0" description="last cache operation failed"    />
+         <meaning value="1" description="last cache operation succeeded" />
+     </field>
+     <field name="RA"       description="replacement algorithm"           size="1"  offset="4" access="RO"  >
+         <meaning value="0" description="random replacement" />
+     </field>
+     <field name="AT"       description="address debug type"              size="1"  offset="5" access="RW"  >
+         <meaning value="0" description="Direct Cache RAM Access"     />
+         <meaning value="1" description="Cache Controlled RAM Access" />
+     </field>
+     <field name="reserved" onwrite="0"                                   size="26" offset="6" />
+  </auxregister>
+  <auxregister name="DC_IVDC"             description="Data Cache Invalidation Register"             number="0x47" mask ="0x00000001" access="WO" >
+     <field name="IV"       description="invalidates the entire cache"    size="1"  offset="0" access="WO"  >
+         <meaning value="0" description="no action"            />
+         <meaning value="1" description="invalidate the cache" />
+     </field>
+     <field name="reserved" onwrite="0"    size="31"  offset="1" />
+  </auxregister>
+  <auxregister name="DC_CTRL"             description="Data Cache Control Register"                  number="0x48" mask ="0x000001FF" access="RW" >
+     <field name="DC"       description="enables/disables the cache"      size="1"  offset="0" access="RW"  >
+         <meaning value="0" description="cache is enabled"  />
+         <meaning value="1" description="cache is disabled" />
+     </field>
+     <field name="EB"       description="enables/disables cache bypass"   size="1"  offset="1" access="RO" >
+         <meaning value="0" description="bypass is disabled" />
+         <meaning value="1" description="bypass is enabled"  />
+     </field>
+     <field name="SB"       description="success of last cache operation" size="1"  offset="2" access="RW"  >
+         <meaning value="0" description="last cache operation failed"    />
+         <meaning value="1" description="last cache operation succeeded" />
+     </field>
+     <field name="RA"       description="replacement algorithm"           size="2"  offset="3" access="RO"  >
+         <meaning value="0" description="random replacement" />
+     </field>
+     <field name="AT"       description="address debug type"              size="1"  offset="5" access="RW"  >
+         <meaning value="0" description="Direct Cache RAM Access"     />
+         <meaning value="1" description="Cache Controlled RAM Access" />
+     </field>
+     <field name="IM"       description="invalidate mode"                 size="1"  offset="6" access="RW"  >
+         <meaning value="0" description="invalidate data cache only"                    />
+         <meaning value="1" description="invalidate data cache and flush dirty entries" />
+     </field>
+     <field name="LM"       description="lock mode"                       size="1"  offset="7" access="RW"  >
+         <meaning value="0" description="disable flush on locked entry" />
+         <meaning value="1" description="enable flush on locked entry"  />
+     </field>
+     <field name="FS"       description="flush status"                    size="1"  offset="8" access="RO"  >
+         <meaning value="0" description="idle"                           />
+         <meaning value="1" description="flush operation is in progress" />
+     </field>
+     <field name="reserved" onwrite="0"                                   size="23" offset="9" />
+  </auxregister>
+
+
+  <!-- actionpoint 0 registers -->
+
+  <auxregister name="AMV0"                description="Actionpoint 0 Match Value Register"           number="0x220" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="AMM0"                description="Actionpoint 0 Match Mask Register"            number="0x221" mask ="0xFFFFFFFF" access="RW"/>
+  <auxregister name="AC0"                 description="Actionpoint 0 Control Register"               number="0x222" mask ="0xFFFFFFFF" access="RW"/>
+
+
+  <!-- Build Configuration Registers -->
+
+  <bcr name="BCR_VER"              description="Build Configuration Registers Version"          number="0x60"  mask="0xFFFFFFFF"/>
+  <bcr name="DCCM_BASE_BUILD"      description="Base Address for Data Closely Coupled Memory"   number="0x61"  mask="0xFFFFFFFF"/>
+  <bcr name="CRC_BASE_BUILD"       description="CRC Unit BCR"                                   number="0x62"  mask="0xFFFFFFFF"/>
+  <bcr name="BTA_LINK_BUILD"       description="Interrupt Link Registers available for BTA"     number="0x63"  mask="0xFFFFFFFF"/>
+  <bcr name="DVBF_BUILD"           description="Dual Viterbi Instruction BCR"                   number="0x64"  mask="0xFFFFFFFF"/>
+  <bcr name="TEL_INSTR_BUILD"      description="Extended Arithmetic Instructions BCR"           number="0x65"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x66"  mask="0xFFFFFFFF"/>
+  <bcr name="MEMSUBSYS"            description="Memory Subsystem BCR"                           number="0x67"  mask="0xFFFFFFFF"/>
+  <bcr name="VECBASE_AC_BUILD"     description="Interrupt Vector Base BCR"                      number="0x68"  mask="0xFFFFFFFF"/> 
+  <bcr name="P_BASE_ADDRESS"       description="Peripheral Base Address"                        number="0x69"  mask="0xFFFFFFFF"/> 
+  <bcr name="unused"               description="unused"                                         number="0x6A"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6B"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6C"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x6D"  mask="0xFFFFFFFF"/>
+  <bcr name="RF_BUILD"             description="Core Registers BCR"                             number="0x6E"  mask="0xFFFFFFFF"/>
+  <bcr name="MMU_BUILD"            description="Memory Management Unit BCR"                     number="0x6F"  mask="0xFFFFFFFF"/>
+  <bcr name="ARCANGEL_BUILD"       description="ARCAngel BCR"                                   number="0x70"  mask="0xFFFFFFFF"/>
+  <bcr name="unused"               description="unused"                                         number="0x71"  mask="0xFFFFFFFF"/>
+  <bcr name="DCACHE_BUILD"         description="Data Cache BCR"                                 number="0x72"  mask="0xFFFFFFFF"/>
+  <bcr name="MADI_BUILD"           description="Multiple ARC Debug Interface"                   number="0x73"  mask="0xFFFFFFFF"/>
+  <bcr name="DCCM_BUILD"           description="Data Closely Coupled Memory BCR"                number="0x74"  mask="0xFFFFFFFF"/>
+  <bcr name="TIMER_BUILD"          description="Timers BCR"                                     number="0x75"  mask="0xFFFFFFFF"/>
+  <bcr name="AP_BUILD"             description="Actionpoints BCR"                               number="0x76"  mask="0xFFFFFFFF"/>
+  <bcr name="ICACHE_BUILD"         description="Instruction Cache BCR"                          number="0x77"  mask="0xFFFFFFFF"/>
+  <bcr name="ICCM_BUILD"           description="Instruction Closely Coupled Memory BCR"         number="0x78"  mask="0xFFFFFFFF"/>
+  <bcr name="DSPRAM_BUILD"         description="DSP RAM BCR"                                    number="0x79"  mask="0xFFFFFFFF"/>
+  <bcr name="MAC_BUILD"            description="MAC Unit BCR"                                   number="0x7A"  mask="0xFFFFFFFF"/>
+  <bcr name="MULTIPLY_BUILD"       description="(32 X 32) Multiply Unit BCR"                    number="0x7B"  mask="0xFFFFFFFF"/>
+  <bcr name="SWAP_BUILD"           description="SWAP BCR"                                       number="0x7C"  mask="0xFFFFFFFF"/>
+  <bcr name="NORM_BUILD"           description="NORM Unit BCR"                                  number="0x7D"  mask="0xFFFFFFFF"/>
+  <bcr name="MINMAX_BUILD"         description="Minmax Unit BCR"                                number="0x7E"  mask="0xFFFFFFFF"/>
+  <bcr name="BARREL_BUILD"         description="Barrel Shifter BCR"                             number="0x7F"  mask="0xFFFFFFFF"/> 
+
+<!-- for testing
+
+  <auxregister name="TEST"   description="any old bucket of bits"   number="0x99999" mask ="0xFFFFFFFF" access="RW">
+     <field name ="AA"        description=""    size="1" offset="5"  access="RO">
+         <meaning value="0" description="value is 0"/>
+         <meaning value="1" description="value is 1"/>
+     </field>
+     <field name ="BBBB"      description=""    size="3" offset="8"  access="RO">
+         <meaning value="0" description="value is 0"/>
+         <meaning value="1" description="value is 1"/>
+         <meaning value="3" description="value is 3"/>
+         <meaning value="7" description="value is 7"/>
+     </field>
+     <field name ="CCCCCCCCC" description=""    size="8" offset="17" access="RO">
+     </field>
+  </auxregister>
+ -->
+
+</feature>
+</target>
diff --git a/gdb/gdb-events.c b/gdb/gdb-events.c
index d688475..f24ece5 100644
--- a/gdb/gdb-events.c
+++ b/gdb/gdb-events.c
@@ -122,6 +122,18 @@
   current_event_hooks->architecture_changed ();
 }
 
+// begin ARC
+void
+reg_architecture_changed_event (void)
+{
+  if (gdb_events_debug)
+    fprintf_unfiltered (gdb_stdlog, "reg_architecture_changed_event\n");
+  if (!current_event_hooks->reg_architecture_changed)
+    return;
+  current_event_hooks->reg_architecture_changed ();
+}
+// end ARC
+
 struct gdb_events *
 deprecated_set_gdb_event_hooks (struct gdb_events *vector)
 {
@@ -148,6 +160,9 @@
   tracepoint_delete,
   tracepoint_modify,
   architecture_changed,
+// begin ARC
+  reg_architecture_changed,
+// end ARC
   nr_gdb_events
 };
 
@@ -271,6 +286,16 @@
   append (event);
 }
 
+// begin ARC
+static void
+queue_reg_architecture_changed (void)
+{
+  struct event *event = XMALLOC (struct event);
+  event->type = reg_architecture_changed;
+  append (event);
+}
+// end ARC
+
 void
 gdb_events_deliver (struct gdb_events *vector)
 {
@@ -319,6 +344,11 @@
 	case architecture_changed:
 	  vector->architecture_changed ();
 	  break;
+// begin ARC
+	case reg_architecture_changed:
+	  vector->reg_architecture_changed ();
+	  break;
+// end ARC
 	}
       delivering_events = event->next;
       xfree (event);
@@ -337,6 +367,9 @@
   queue_event_hooks.tracepoint_delete = queue_tracepoint_delete;
   queue_event_hooks.tracepoint_modify = queue_tracepoint_modify;
   queue_event_hooks.architecture_changed = queue_architecture_changed;
+// begin ARC
+  queue_event_hooks.reg_architecture_changed = queue_reg_architecture_changed;
+// end ARC
 
   add_setshow_zinteger_cmd ("event", class_maintenance,
 			    &gdb_events_debug, _("\
diff --git a/gdb/gdb-events.h b/gdb/gdb-events.h
index 9c38c0a..5a6dd4a 100644
--- a/gdb/gdb-events.h
+++ b/gdb/gdb-events.h
@@ -55,6 +55,9 @@
 typedef void (gdb_events_tracepoint_delete_ftype) (int number);
 typedef void (gdb_events_tracepoint_modify_ftype) (int number);
 typedef void (gdb_events_architecture_changed_ftype) (void);
+// begin ARC
+typedef void (gdb_events_reg_architecture_changed_ftype) (void);
+// end ARC
 
 
 /* gdb-events: object. */
@@ -68,6 +71,9 @@
     gdb_events_tracepoint_delete_ftype *tracepoint_delete;
     gdb_events_tracepoint_modify_ftype *tracepoint_modify;
     gdb_events_architecture_changed_ftype *architecture_changed;
+// begin ARC 
+    gdb_events_reg_architecture_changed_ftype *reg_architecture_changed;
+// end ARC
   };
 
 
@@ -81,6 +87,9 @@
 extern void tracepoint_delete_event (int number);
 extern void tracepoint_modify_event (int number);
 extern void architecture_changed_event (void);
+// begin ARC 
+extern void reg_architecture_changed_event (void);
+// end ARC
 
 /* Install custom gdb-events hooks.  */
 extern struct gdb_events *deprecated_set_gdb_event_hooks (struct gdb_events *vector);
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index d967ff5..f7fe7d4 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -330,7 +330,7 @@
 
 reg-arc.o : reg-arc.c $(regdef_h)
 reg-arc.c : $(srcdir)/../regformats/reg-arc.dat $(regdat_sh)
-	sh $(regdat_sh) $(srcdir)/../regformats/reg-arc.dat reg-arc.c
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-arc.dat reg-arc.c
 reg-arm.o : reg-arm.c $(regdef_h)
 reg-arm.c : $(srcdir)/../regformats/reg-arm.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-arm.dat reg-arm.c
diff --git a/gdb/gdbserver/build_gdbserver.sh b/gdb/gdbserver/build_gdbserver.sh
new file mode 100755
index 0000000..bdf886f
--- /dev/null
+++ b/gdb/gdbserver/build_gdbserver.sh
@@ -0,0 +1,6 @@
+#Bash script to build gdbserver
+export CFLAGS="-mA7 -static -O0"
+export LDFLAGS="-mA7"
+export CC=arc-linux-uclibc-gcc
+./configure --host=i386-redhat-linux-gnu --target=arc-linux-uclibc
+make
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index c0d246b..c3c2d56 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -26,11 +26,16 @@
 # Input is taken from the "${target}" variable.
 
 case "${target}" in
-  arc*-*-linux*)	srv_regobj=reg-arc.o
-			srv_tgtobj="linux-low.o linux-arc-low.o"
-			srv_linux_usrregs=yes
-			srv_linux_thread_db=yes
-			;;
+  arc*-*-linux*)       srv_regobj=reg-arc.o
+                       srv_tgtobj="linux-low.o linux-arc-low.o"
+                       srv_linux_usrregs=yes
+                       srv_linux_thread_db=yes
+                       ;;
+  arc*-*)              srv_regobj=reg-arc.o
+                       srv_tgtobj="linux-low.o linux-arc-low.o"
+                       srv_linux_usrregs=yes
+                       srv_linux_thread_db=yes
+                       ;;       
   arm*-*-linux*)	srv_tgtobj="linux-low.o linux-arm-low.o"
 			srv_linux_usrregs=yes
 			srv_linux_regsets=yes
diff --git a/gdb/gdbserver/linux-arc-low.c b/gdb/gdbserver/linux-arc-low.c
index 28c7ead..c5faa1d 100644
--- a/gdb/gdbserver/linux-arc-low.c
+++ b/gdb/gdbserver/linux-arc-low.c
@@ -113,7 +113,7 @@
 {
   unsigned long insn;
 
-  (*the_target->read_memory) (where, (char *) &insn, arc_breakpoint_len);
+  (*the_target->read_memory) (where, (unsigned char *) &insn, arc_breakpoint_len);
   if (insn == arc_breakpoint)
     return 1;
 
@@ -141,7 +141,7 @@
   arc_cannot_store_register,
   arc_get_pc,
   arc_set_pc,
-  (const char *) &arc_breakpoint,
+  (const unsigned char *) &arc_breakpoint,
   arc_breakpoint_len,
   arc_reinsert_addr,
   0,
diff --git a/gdb/gdbserver/proc-service.c b/gdb/gdbserver/proc-service.c
index 065bfdf..fc7bc19 100644
--- a/gdb/gdbserver/proc-service.c
+++ b/gdb/gdbserver/proc-service.c
@@ -28,6 +28,7 @@
 #include "linux-low.h"
 
 #include "gdb_proc_service.h"
+typedef unsigned long paddr_t;
 
 typedef struct ps_prochandle *gdb_ps_prochandle_t;
 typedef void *gdb_ps_read_buf_t;
@@ -61,7 +62,7 @@
 
 ps_err_e
 ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
-		   const char *name, psaddr_t *sym_addr)
+		   const char *name, paddr_t *sym_addr)
 {
   CORE_ADDR addr;
   char *uscorename;
@@ -89,7 +90,8 @@
 	return PS_NOSYM;
     }
 
-  *sym_addr = (psaddr_t) (unsigned long) addr;
+  *sym_addr = (paddr_t) (unsigned long) addr;
+
   return PS_OK;
 }
 
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index 496334c..2e049ee 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -169,9 +169,7 @@
       }
 #endif
 
-/* #ifdef HAVE_SGTTY */
-      /* soam */
-#if 0
+#ifdef HAVE_SGTTY
       {
 	struct sgttyb sg;
 
@@ -773,8 +771,7 @@
       c1 = fromhex (readchar ());
       c2 = fromhex (readchar ());
 
-/*       if (csum == (c1 << 4) + c2) */
-      if(1)				     /* (soam) for testing */
+      if (csum == (c1 << 4) + c2)
 	break;
 
       fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
diff --git a/gdb/gpio.h b/gdb/gpio.h
deleted file mode 100644
index 86aa4ca..0000000
--- a/gdb/gpio.h
+++ /dev/null
@@ -1,38 +0,0 @@
-struct GPIO_ioctl {
-    // This is used for general input and output in the same ioctl.
-    // inlen is replaced by the number of input bytes consumed.
-    // inlen is always even and represents a number of pairs:
-    //	[0/1/2,value]: write value to port_base+0/1/2.
-    //	[0x80/0x81/0x82, --]: read value from port_base+0/1/2
-    //	and append result to outbuf.
-    // Thus one can intermix read and write in the same ioctl.
-    unsigned inlen; char *inbuf;
-    // outlen is replaced by # of output bytes written.
-    unsigned outlen; char *outbuf;
-    };
-
-// IO control numbers
-
-// Linux kernel uses 0x54XX for special purposes.  Avoid such.
-// We'll pick large numbers.
-// We don't use the linux convention of dividing the IOC into a bunch
-// of bit fields.  We can always switch to this later, as the
-// IOC 0 returns the driver version (which IOC value will never change).
-
-#define GPIO_IOC_VERSION 0	// returns version
-#define GPIO_IOC_BASE 0xaa3a0000	// Intended for use on ARCangel 3!
-
-// Switch base address of parallel port.  0x3f8 is assumed.
-// WARNING!  You can write on any port whatsoever with this driver.
-// BE CAREFUL!
-#define GPIO_IOC_SET_PORT_BASE 	(GPIO_IOC_BASE+1) // cmd, arg=port base
-
-// General input/output ioctl.  See GPIO_ioctl struct.
-#define GPIO_IOC_DO_IO  	(GPIO_IOC_BASE+2) // cmd, arg=GPIO_ioctl *
-
-// For emergency purposes in case the driver is goofed up.
-#define GPIO_IOC_HARDRESET 	(GPIO_IOC_BASE+3) // cmd, no arg
-
-// Do you have an antiquated parallel port?  You might need to ask
-// the driver to use outb_p and inb_p (_p = pause).  Default is not to.
-#define GPIO_IOC_SET_PAUSE 	(GPIO_IOC_BASE+4) // arg = 1 => use pause; o/wise not.
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 972f9e2..4e76260 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -1603,15 +1603,25 @@
 	    continue;
 	}
 
-      /* If the register name is empty, it is undefined for this
-         processor, so don't display anything.  */
-      if (gdbarch_register_name (gdbarch, i) == NULL
-	  || *(gdbarch_register_name (gdbarch, i)) == '\0')
-	continue;
+      {
+        /* richards ARC 29/10/27 gdb bug: 9884
+           call the gdbarch_register_name once only!
+         */
+        const char* name = gdbarch_register_name (gdbarch, i);
 
-      fputs_filtered (gdbarch_register_name (gdbarch, i), file);
-      print_spaces_filtered (15 - strlen (gdbarch_register_name
-					  (gdbarch, i)), file);
+        /* If the register name is empty, it is undefined for this
+           processor, so don't display anything.  */
+        if (name == NULL || *name == '\0')
+	  continue;
+
+        fputs_filtered (name, file);
+
+        /* richards ARC 29/9/08 gdb bug: 9885
+           Some ARC register names are longer than 15 chars!
+           There should be a gdbarch_max_register_name_length function
+           which could be called here instead of using an integer literal.  */
+        print_spaces_filtered (22 - strlen (name), file);
+      }
 
       /* Get the data in raw format.  */
       if (! frame_register_read (frame, i, buffer))
diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c
index e51f272..9a961f4 100644
--- a/gdb/remote-fileio.c
+++ b/gdb/remote-fileio.c
@@ -24,441 +24,14 @@
 #include "gdbcmd.h"
 #include "remote.h"
 #include "gdb/fileio.h"
-#include "gdb_wait.h"
-#include "gdb_stat.h"
 #include "exceptions.h"
 #include "remote-fileio.h"
+#include "target-fileio.h"
 
-#include <fcntl.h>
-#include <sys/time.h>
-#ifdef __CYGWIN__
-#include <sys/cygwin.h>		/* For cygwin_conv_to_full_posix_path.  */
-#endif
 #include <signal.h>
 
-static struct {
-  int *fd_map;
-  int fd_map_size;
-} remote_fio_data;
-
-#define FIO_FD_INVALID		-1
-#define FIO_FD_CONSOLE_IN	-2
-#define FIO_FD_CONSOLE_OUT	-3
-
-static int remote_fio_system_call_allowed = 0;
-
-static int
-remote_fileio_init_fd_map (void)
-{
-  int i;
-
-  if (!remote_fio_data.fd_map)
-    {
-      remote_fio_data.fd_map = (int *) xmalloc (10 * sizeof (int));
-      remote_fio_data.fd_map_size = 10;
-      remote_fio_data.fd_map[0] = FIO_FD_CONSOLE_IN;
-      remote_fio_data.fd_map[1] = FIO_FD_CONSOLE_OUT;
-      remote_fio_data.fd_map[2] = FIO_FD_CONSOLE_OUT;
-      for (i = 3; i < 10; ++i)
-        remote_fio_data.fd_map[i] = FIO_FD_INVALID;
-    }
-  return 3;
-}
-
-static int
-remote_fileio_resize_fd_map (void)
-{
-  int i = remote_fio_data.fd_map_size;
-
-  if (!remote_fio_data.fd_map)
-    return remote_fileio_init_fd_map ();
-  remote_fio_data.fd_map_size += 10;
-  remote_fio_data.fd_map =
-    (int *) xrealloc (remote_fio_data.fd_map,
-		      remote_fio_data.fd_map_size * sizeof (int));
-  for (; i < remote_fio_data.fd_map_size; i++)
-    remote_fio_data.fd_map[i] = FIO_FD_INVALID;
-  return remote_fio_data.fd_map_size - 10;
-}
-
-static int
-remote_fileio_next_free_fd (void)
-{
-  int i;
-
-  for (i = 0; i < remote_fio_data.fd_map_size; ++i)
-    if (remote_fio_data.fd_map[i] == FIO_FD_INVALID)
-      return i;
-  return remote_fileio_resize_fd_map ();
-}
-
-static int
-remote_fileio_fd_to_targetfd (int fd)
-{
-  int target_fd = remote_fileio_next_free_fd ();
-  remote_fio_data.fd_map[target_fd] = fd;
-  return target_fd;
-}
-
-static int
-remote_fileio_map_fd (int target_fd)
-{
-  remote_fileio_init_fd_map ();
-  if (target_fd < 0 || target_fd >= remote_fio_data.fd_map_size)
-    return FIO_FD_INVALID;
-  return remote_fio_data.fd_map[target_fd];
-}
-
-static void
-remote_fileio_close_target_fd (int target_fd)
-{
-  remote_fileio_init_fd_map ();
-  if (target_fd >= 0 && target_fd < remote_fio_data.fd_map_size)
-    remote_fio_data.fd_map[target_fd] = FIO_FD_INVALID;
-}
-
-static int
-remote_fileio_oflags_to_host (long flags)
-{
-  int hflags = 0;
-
-  if (flags & FILEIO_O_CREAT)
-    hflags |= O_CREAT;
-  if (flags & FILEIO_O_EXCL)
-    hflags |= O_EXCL;
-  if (flags & FILEIO_O_TRUNC)
-    hflags |= O_TRUNC;
-  if (flags & FILEIO_O_APPEND)
-    hflags |= O_APPEND;
-  if (flags & FILEIO_O_RDONLY)
-    hflags |= O_RDONLY;
-  if (flags & FILEIO_O_WRONLY)
-    hflags |= O_WRONLY;
-  if (flags & FILEIO_O_RDWR)
-    hflags |= O_RDWR;
-/* On systems supporting binary and text mode, always open files in
-   binary mode. */
-#ifdef O_BINARY
-  hflags |= O_BINARY;
-#endif
-  return hflags;
-}
-
-static mode_t
-remote_fileio_mode_to_host (long mode, int open_call)
-{
-  mode_t hmode = 0;
-
-  if (!open_call)
-    {
-      if (mode & FILEIO_S_IFREG)
-	hmode |= S_IFREG;
-      if (mode & FILEIO_S_IFDIR)
-	hmode |= S_IFDIR;
-      if (mode & FILEIO_S_IFCHR)
-	hmode |= S_IFCHR;
-    }
-  if (mode & FILEIO_S_IRUSR)
-    hmode |= S_IRUSR;
-  if (mode & FILEIO_S_IWUSR)
-    hmode |= S_IWUSR;
-  if (mode & FILEIO_S_IXUSR)
-    hmode |= S_IXUSR;
-#ifdef S_IRGRP
-  if (mode & FILEIO_S_IRGRP)
-    hmode |= S_IRGRP;
-#endif
-#ifdef S_IWGRP
-  if (mode & FILEIO_S_IWGRP)
-    hmode |= S_IWGRP;
-#endif
-#ifdef S_IXGRP
-  if (mode & FILEIO_S_IXGRP)
-    hmode |= S_IXGRP;
-#endif
-  if (mode & FILEIO_S_IROTH)
-    hmode |= S_IROTH;
-#ifdef S_IWOTH
-  if (mode & FILEIO_S_IWOTH)
-    hmode |= S_IWOTH;
-#endif
-#ifdef S_IXOTH
-  if (mode & FILEIO_S_IXOTH)
-    hmode |= S_IXOTH;
-#endif
-  return hmode;
-}
-
-static LONGEST
-remote_fileio_mode_to_target (mode_t mode)
-{
-  mode_t tmode = 0;
-
-  if (S_ISREG(mode))
-    tmode |= FILEIO_S_IFREG;
-  if (S_ISDIR(mode))
-    tmode |= FILEIO_S_IFDIR;
-  if (S_ISCHR(mode))
-    tmode |= FILEIO_S_IFCHR;
-  if (mode & S_IRUSR)
-    tmode |= FILEIO_S_IRUSR;
-  if (mode & S_IWUSR)
-    tmode |= FILEIO_S_IWUSR;
-  if (mode & S_IXUSR)
-    tmode |= FILEIO_S_IXUSR;
-#ifdef S_IRGRP
-  if (mode & S_IRGRP)
-    tmode |= FILEIO_S_IRGRP;
-#endif
-#ifdef S_IWRGRP
-  if (mode & S_IWGRP)
-    tmode |= FILEIO_S_IWGRP;
-#endif
-#ifdef S_IXGRP
-  if (mode & S_IXGRP)
-    tmode |= FILEIO_S_IXGRP;
-#endif
-  if (mode & S_IROTH)
-    tmode |= FILEIO_S_IROTH;
-#ifdef S_IWOTH
-  if (mode & S_IWOTH)
-    tmode |= FILEIO_S_IWOTH;
-#endif
-#ifdef S_IXOTH
-  if (mode & S_IXOTH)
-    tmode |= FILEIO_S_IXOTH;
-#endif
-  return tmode;
-}
-
-static int
-remote_fileio_errno_to_target (int error)
-{
-  switch (error)
-    {
-      case EPERM:
-        return FILEIO_EPERM;
-      case ENOENT:
-        return FILEIO_ENOENT;
-      case EINTR:
-        return FILEIO_EINTR;
-      case EIO:
-        return FILEIO_EIO;
-      case EBADF:
-        return FILEIO_EBADF;
-      case EACCES:
-        return FILEIO_EACCES;
-      case EFAULT:
-        return FILEIO_EFAULT;
-      case EBUSY:
-        return FILEIO_EBUSY;
-      case EEXIST:
-        return FILEIO_EEXIST;
-      case ENODEV:
-        return FILEIO_ENODEV;
-      case ENOTDIR:
-        return FILEIO_ENOTDIR;
-      case EISDIR:
-        return FILEIO_EISDIR;
-      case EINVAL:
-        return FILEIO_EINVAL;
-      case ENFILE:
-        return FILEIO_ENFILE;
-      case EMFILE:
-        return FILEIO_EMFILE;
-      case EFBIG:
-        return FILEIO_EFBIG;
-      case ENOSPC:
-        return FILEIO_ENOSPC;
-      case ESPIPE:
-        return FILEIO_ESPIPE;
-      case EROFS:
-        return FILEIO_EROFS;
-      case ENOSYS:
-        return FILEIO_ENOSYS;
-      case ENAMETOOLONG:
-        return FILEIO_ENAMETOOLONG;
-    }
-  return FILEIO_EUNKNOWN;
-}
-
-static int
-remote_fileio_seek_flag_to_host (long num, int *flag)
-{
-  if (!flag)
-    return 0;
-  switch (num)
-    {
-      case FILEIO_SEEK_SET:
-        *flag = SEEK_SET;
-	break;
-      case FILEIO_SEEK_CUR:
-        *flag =  SEEK_CUR;
-	break;
-      case FILEIO_SEEK_END:
-        *flag =  SEEK_END;
-	break;
-      default:
-        return -1;
-    }
-  return 0;
-}
-
-static int
-remote_fileio_extract_long (char **buf, LONGEST *retlong)
-{
-  char *c;
-  int sign = 1;
-
-  if (!buf || !*buf || !**buf || !retlong)
-    return -1;
-  c = strchr (*buf, ',');
-  if (c)
-    *c++ = '\0';
-  else
-    c = strchr (*buf, '\0');
-  while (strchr ("+-", **buf))
-    {
-      if (**buf == '-')
-	sign = -sign;
-      ++*buf;
-    }
-  for (*retlong = 0; **buf; ++*buf)
-    {
-      *retlong <<= 4;
-      if (**buf >= '0' && **buf <= '9')
-        *retlong += **buf - '0';
-      else if (**buf >= 'a' && **buf <= 'f')
-        *retlong += **buf - 'a' + 10;
-      else if (**buf >= 'A' && **buf <= 'F')
-        *retlong += **buf - 'A' + 10;
-      else
-        return -1;
-    }
-  *retlong *= sign;
-  *buf = c;
-  return 0;
-}
-
-static int
-remote_fileio_extract_int (char **buf, long *retint)
-{
-  int ret;
-  LONGEST retlong;
-
-  if (!retint)
-    return -1;
-  ret = remote_fileio_extract_long (buf, &retlong);
-  if (!ret)
-    *retint = (long) retlong;
-  return ret;
-}
-
-static int
-remote_fileio_extract_ptr_w_len (char **buf, CORE_ADDR *ptrval, int *length)
-{
-  char *c;
-  LONGEST retlong;
-
-  if (!buf || !*buf || !**buf || !ptrval || !length)
-    return -1;
-  c = strchr (*buf, '/');
-  if (!c)
-    return -1;
-  *c++ = '\0';
-  if (remote_fileio_extract_long (buf, &retlong))
-    return -1;
-  *ptrval = (CORE_ADDR) retlong;
-  *buf = c;
-  if (remote_fileio_extract_long (buf, &retlong))
-    return -1;
-  *length = (int) retlong;
-  return 0;
-}
-
-/* Convert to big endian */
-static void
-remote_fileio_to_be (LONGEST num, char *buf, int bytes)
-{
-  int i;
-
-  for (i = 0; i < bytes; ++i)
-    buf[i] = (num >> (8 * (bytes - i - 1))) & 0xff;
-}
-
-static void
-remote_fileio_to_fio_uint (long num, fio_uint_t fnum)
-{
-  remote_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
-}
-
-static void
-remote_fileio_to_fio_mode (mode_t num, fio_mode_t fnum)
-{
-  remote_fileio_to_be (remote_fileio_mode_to_target(num), (char *) fnum, 4);
-}
-
-static void
-remote_fileio_to_fio_time (time_t num, fio_time_t fnum)
-{
-  remote_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
-}
-
-static void
-remote_fileio_to_fio_long (LONGEST num, fio_long_t fnum)
-{
-  remote_fileio_to_be (num, (char *) fnum, 8);
-}
-
-static void
-remote_fileio_to_fio_ulong (LONGEST num, fio_ulong_t fnum)
-{
-  remote_fileio_to_be (num, (char *) fnum, 8);
-}
-
-static void
-remote_fileio_to_fio_stat (struct stat *st, struct fio_stat *fst)
-{
-  LONGEST blksize;
-
-  /* `st_dev' is set in the calling function */
-  remote_fileio_to_fio_uint ((long) st->st_ino, fst->fst_ino);
-  remote_fileio_to_fio_mode (st->st_mode, fst->fst_mode);
-  remote_fileio_to_fio_uint ((long) st->st_nlink, fst->fst_nlink);
-  remote_fileio_to_fio_uint ((long) st->st_uid, fst->fst_uid);
-  remote_fileio_to_fio_uint ((long) st->st_gid, fst->fst_gid);
-  remote_fileio_to_fio_uint ((long) st->st_rdev, fst->fst_rdev);
-  remote_fileio_to_fio_ulong ((LONGEST) st->st_size, fst->fst_size);
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
-  blksize = st->st_blksize;
-#else
-  blksize = 512;
-#endif
-  remote_fileio_to_fio_ulong (blksize, fst->fst_blksize);
-#if HAVE_STRUCT_STAT_ST_BLOCKS
-  remote_fileio_to_fio_ulong ((LONGEST) st->st_blocks, fst->fst_blocks);
-#else
-  /* FIXME: This is correct for DJGPP, but other systems that don't
-     have st_blocks, if any, might prefer 512 instead of st_blksize.
-     (eliz, 30-12-2003)  */
-  remote_fileio_to_fio_ulong (((LONGEST) st->st_size + blksize - 1)
-			      / blksize,
-			      fst->fst_blocks);
-#endif
-  remote_fileio_to_fio_time (st->st_atime, fst->fst_atime);
-  remote_fileio_to_fio_time (st->st_mtime, fst->fst_mtime);
-  remote_fileio_to_fio_time (st->st_ctime, fst->fst_ctime);
-}
-
-static void
-remote_fileio_to_fio_timeval (struct timeval *tv, struct fio_timeval *ftv)
-{
-  remote_fileio_to_fio_time (tv->tv_sec, ftv->ftv_sec);
-  remote_fileio_to_fio_long (tv->tv_usec, ftv->ftv_usec);
-}
 
 static int remote_fio_ctrl_c_flag = 0;
-static int remote_fio_no_longjmp = 0;
 
 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
 static struct sigaction remote_fio_sa;
@@ -508,7 +81,7 @@
 {
   remote_fileio_sig_set (SIG_IGN);
   remote_fio_ctrl_c_flag = 1;
-  if (!remote_fio_no_longjmp)
+  if (!target_fio_no_longjmp)
     deprecated_throw_reason (RETURN_QUIT);
   remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
 }
@@ -543,30 +116,6 @@
   putpkt (buf);
 }
 
-static void
-remote_fileio_ioerror (void)
-{
-  remote_fileio_reply (-1, FILEIO_EIO);
-}
-
-static void
-remote_fileio_badfd (void)
-{
-  remote_fileio_reply (-1, FILEIO_EBADF);
-}
-
-static void
-remote_fileio_return_errno (int retcode)
-{
-  remote_fileio_reply (retcode,
-		       retcode < 0 ? remote_fileio_errno_to_target (errno) : 0);
-}
-
-static void
-remote_fileio_return_success (int retcode)
-{
-  remote_fileio_reply (retcode, 0);
-}
 
 /* Wrapper function for remote_write_bytes() which has the disadvantage to
    write only one packet, regardless of the requested number of bytes to
@@ -586,791 +135,11 @@
   return ret;
 }
 
-static void
-remote_fileio_func_open (char *buf)
-{
-  CORE_ADDR ptrval;
-  int length, retlength;
-  long num;
-  int flags, fd;
-  mode_t mode;
-  char *pathname;
-  struct stat st;
-
-  /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
-  if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  /* 2. Parameter: open flags */
-  if (remote_fileio_extract_int (&buf, &num))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  flags = remote_fileio_oflags_to_host (num);
-  /* 3. Parameter: open mode */
-  if (remote_fileio_extract_int (&buf, &num))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  mode = remote_fileio_mode_to_host (num, 1);
-
-  /* Request pathname using 'm' packet */
-  pathname = alloca (length);
-  retlength = remote_read_bytes (ptrval, (gdb_byte *) pathname, length);
-  if (retlength != length)
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-
-  /* Check if pathname exists and is not a regular file or directory.  If so,
-     return an appropriate error code.  Same for trying to open directories
-     for writing. */
-  if (!stat (pathname, &st))
-    {
-      if (!S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
-	{
-	  remote_fileio_reply (-1, FILEIO_ENODEV);
-	  return;
-	}
-      if (S_ISDIR (st.st_mode)
-	  && ((flags & O_WRONLY) == O_WRONLY || (flags & O_RDWR) == O_RDWR))
-	{
-	  remote_fileio_reply (-1, FILEIO_EISDIR);
-	  return;
-	}
-    }
-
-  remote_fio_no_longjmp = 1;
-  fd = open (pathname, flags, mode);
-  if (fd < 0)
-    {
-      remote_fileio_return_errno (-1);
-      return;
-    }
-
-  fd = remote_fileio_fd_to_targetfd (fd);
-  remote_fileio_return_success (fd);
-}
 
 static void
-remote_fileio_func_close (char *buf)
+set_ctrl_c_signal_handler(void)
 {
-  long num;
-  int fd;
-
-  /* Parameter: file descriptor */
-  if (remote_fileio_extract_int (&buf, &num))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  fd = remote_fileio_map_fd ((int) num);
-  if (fd == FIO_FD_INVALID)
-    {
-      remote_fileio_badfd ();
-      return;
-    }
-
-  remote_fio_no_longjmp = 1;
-  if (fd != FIO_FD_CONSOLE_IN && fd != FIO_FD_CONSOLE_OUT && close (fd))
-    remote_fileio_return_errno (-1);
-  remote_fileio_close_target_fd ((int) num);
-  remote_fileio_return_success (0);
-}
-
-static void
-remote_fileio_func_read (char *buf)
-{
-  long target_fd, num;
-  LONGEST lnum;
-  CORE_ADDR ptrval;
-  int fd, ret, retlength;
-  gdb_byte *buffer;
-  size_t length;
-  off_t old_offset, new_offset;
-
-  /* 1. Parameter: file descriptor */
-  if (remote_fileio_extract_int (&buf, &target_fd))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  fd = remote_fileio_map_fd ((int) target_fd);
-  if (fd == FIO_FD_INVALID)
-    {
-      remote_fileio_badfd ();
-      return;
-    }
-  /* 2. Parameter: buffer pointer */
-  if (remote_fileio_extract_long (&buf, &lnum))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  ptrval = (CORE_ADDR) lnum;
-  /* 3. Parameter: buffer length */
-  if (remote_fileio_extract_int (&buf, &num))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  length = (size_t) num;
-
-  switch (fd)
-    {
-      case FIO_FD_CONSOLE_OUT:
-	remote_fileio_badfd ();
-	return;
-      case FIO_FD_CONSOLE_IN:
-	{
-	  static char *remaining_buf = NULL;
-	  static int remaining_length = 0;
-
-	  buffer = (gdb_byte *) xmalloc (32768);
-	  if (remaining_buf)
-	    {
-	      remote_fio_no_longjmp = 1;
-	      if (remaining_length > length)
-		{
-		  memcpy (buffer, remaining_buf, length);
-		  memmove (remaining_buf, remaining_buf + length,
-			   remaining_length - length);
-		  remaining_length -= length;
-		  ret = length;
-		}
-	      else
-		{
-		  memcpy (buffer, remaining_buf, remaining_length);
-		  xfree (remaining_buf);
-		  remaining_buf = NULL;
-		  ret = remaining_length;
-		}
-	    }
-	  else
-	    {
-	      ret = ui_file_read (gdb_stdtargin, (char *) buffer, 32767);
-	      remote_fio_no_longjmp = 1;
-	      if (ret > 0 && (size_t)ret > length)
-		{
-		  remaining_buf = (char *) xmalloc (ret - length);
-		  remaining_length = ret - length;
-		  memcpy (remaining_buf, buffer + length, remaining_length);
-		  ret = length;
-		}
-	    }
-	}
-	break;
-      default:
-	buffer = (gdb_byte *) xmalloc (length);
-	/* POSIX defines EINTR behaviour of read in a weird way.  It's allowed
-	   for read() to return -1 even if "some" bytes have been read.  It
-	   has been corrected in SUSv2 but that doesn't help us much...
-	   Therefore a complete solution must check how many bytes have been
-	   read on EINTR to return a more reliable value to the target */
-	old_offset = lseek (fd, 0, SEEK_CUR);
-	remote_fio_no_longjmp = 1;
-	ret = read (fd, buffer, length);
-	if (ret < 0 && errno == EINTR)
-	  {
-	    new_offset = lseek (fd, 0, SEEK_CUR);
-	    /* If some data has been read, return the number of bytes read.
-	       The Ctrl-C flag is set in remote_fileio_reply() anyway */
-	    if (old_offset != new_offset)
-	      ret = new_offset - old_offset;
-	  }
-	break;
-    }
-
-  if (ret > 0)
-    {
-      retlength = remote_fileio_write_bytes (ptrval, buffer, ret);
-      if (retlength != ret)
-	ret = -1; /* errno has been set to EIO in remote_fileio_write_bytes() */
-    }
-
-  if (ret < 0)
-    remote_fileio_return_errno (-1);
-  else
-    remote_fileio_return_success (ret);
-
-  xfree (buffer);
-}
-
-static void
-remote_fileio_func_write (char *buf)
-{
-  long target_fd, num;
-  LONGEST lnum;
-  CORE_ADDR ptrval;
-  int fd, ret, retlength;
-  gdb_byte *buffer;
-  size_t length;
-
-  /* 1. Parameter: file descriptor */
-  if (remote_fileio_extract_int (&buf, &target_fd))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  fd = remote_fileio_map_fd ((int) target_fd);
-  if (fd == FIO_FD_INVALID)
-    {
-      remote_fileio_badfd ();
-      return;
-    }
-  /* 2. Parameter: buffer pointer */
-  if (remote_fileio_extract_long (&buf, &lnum))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  ptrval = (CORE_ADDR) lnum;
-  /* 3. Parameter: buffer length */
-  if (remote_fileio_extract_int (&buf, &num))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  length = (size_t) num;
-    
-  buffer = (gdb_byte *) xmalloc (length);
-  retlength = remote_read_bytes (ptrval, buffer, length);
-  if (retlength != length)
-    {
-      xfree (buffer);
-      remote_fileio_ioerror ();
-      return;
-    }
-
-  remote_fio_no_longjmp = 1;
-  switch (fd)
-    {
-      case FIO_FD_CONSOLE_IN:
-	remote_fileio_badfd ();
-	xfree (buffer);
-	return;
-      case FIO_FD_CONSOLE_OUT:
-	ui_file_write (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr,
-		       (char *) buffer, length);
-	gdb_flush (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr);
-	ret = length;
-	break;
-      default:
-	ret = write (fd, buffer, length);
-	if (ret < 0 && errno == EACCES)
-	  errno = EBADF; /* Cygwin returns EACCESS when writing to a R/O file.*/
-	break;
-    }
-
-  if (ret < 0)
-    remote_fileio_return_errno (-1);
-  else
-    remote_fileio_return_success (ret);
-
-  xfree (buffer);
-}
-
-static void
-remote_fileio_func_lseek (char *buf)
-{
-  long num;
-  LONGEST lnum;
-  int fd, flag;
-  off_t offset, ret;
-
-  /* 1. Parameter: file descriptor */
-  if (remote_fileio_extract_int (&buf, &num))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  fd = remote_fileio_map_fd ((int) num);
-  if (fd == FIO_FD_INVALID)
-    {
-      remote_fileio_badfd ();
-      return;
-    }
-  else if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
-    {
-      remote_fileio_reply (-1, FILEIO_ESPIPE);
-      return;
-    }
-
-  /* 2. Parameter: offset */
-  if (remote_fileio_extract_long (&buf, &lnum))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  offset = (off_t) lnum;
-  /* 3. Parameter: flag */
-  if (remote_fileio_extract_int (&buf, &num))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  if (remote_fileio_seek_flag_to_host (num, &flag))
-    {
-      remote_fileio_reply (-1, FILEIO_EINVAL);
-      return;
-    }
-  
-  remote_fio_no_longjmp = 1;
-  ret = lseek (fd, offset, flag);
-
-  if (ret == (off_t) -1)
-    remote_fileio_return_errno (-1);
-  else
-    remote_fileio_return_success (ret);
-}
-
-static void
-remote_fileio_func_rename (char *buf)
-{
-  CORE_ADDR old_ptr, new_ptr;
-  int old_len, new_len, retlength;
-  char *oldpath, *newpath;
-  int ret, of, nf;
-  struct stat ost, nst;
-
-  /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */
-  if (remote_fileio_extract_ptr_w_len (&buf, &old_ptr, &old_len))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  
-  /* 2. Parameter: Ptr to newpath / length incl. trailing zero */
-  if (remote_fileio_extract_ptr_w_len (&buf, &new_ptr, &new_len))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  
-  /* Request oldpath using 'm' packet */
-  oldpath = alloca (old_len);
-  retlength = remote_read_bytes (old_ptr, (gdb_byte *) oldpath, old_len);
-  if (retlength != old_len)
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  
-  /* Request newpath using 'm' packet */
-  newpath = alloca (new_len);
-  retlength = remote_read_bytes (new_ptr, (gdb_byte *) newpath, new_len);
-  if (retlength != new_len)
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  
-  /* Only operate on regular files and directories */
-  of = stat (oldpath, &ost);
-  nf = stat (newpath, &nst);
-  if ((!of && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode))
-      || (!nf && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode)))
-    {
-      remote_fileio_reply (-1, FILEIO_EACCES);
-      return;
-    }
-
-  remote_fio_no_longjmp = 1;
-  ret = rename (oldpath, newpath);
-
-  if (ret == -1)
-    {
-      /* Special case: newpath is a non-empty directory.  Some systems
-         return ENOTEMPTY, some return EEXIST.  We coerce that to be
-	 always EEXIST. */
-      if (errno == ENOTEMPTY)
-        errno = EEXIST;
-#ifdef __CYGWIN__
-      /* Workaround some Cygwin problems with correct errnos. */
-      if (errno == EACCES)
-        {
-	  if (!of && !nf && S_ISDIR (nst.st_mode))
-	    {
-	      if (S_ISREG (ost.st_mode))
-		errno = EISDIR;
-	      else
-		{
-		  char oldfullpath[PATH_MAX + 1];
-		  char newfullpath[PATH_MAX + 1];
-		  int len;
-
-		  cygwin_conv_to_full_posix_path (oldpath, oldfullpath);
-		  cygwin_conv_to_full_posix_path (newpath, newfullpath);
-		  len = strlen (oldfullpath);
-		  if (newfullpath[len] == '/'
-		      && !strncmp (oldfullpath, newfullpath, len))
-		    errno = EINVAL;
-		  else
-		    errno = EEXIST;
-		}
-	    }
-	}
-#endif
-
-      remote_fileio_return_errno (-1);
-    }
-  else
-    remote_fileio_return_success (ret);
-}
-
-static void
-remote_fileio_func_unlink (char *buf)
-{
-  CORE_ADDR ptrval;
-  int length, retlength;
-  char *pathname;
-  int ret;
-  struct stat st;
-
-  /* Parameter: Ptr to pathname / length incl. trailing zero */
-  if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  /* Request pathname using 'm' packet */
-  pathname = alloca (length);
-  retlength = remote_read_bytes (ptrval, (gdb_byte *) pathname, length);
-  if (retlength != length)
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-
-  /* Only operate on regular files (and directories, which allows to return
-     the correct return code) */
-  if (!stat (pathname, &st) && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
-    {
-      remote_fileio_reply (-1, FILEIO_ENODEV);
-      return;
-    }
-
-  remote_fio_no_longjmp = 1;
-  ret = unlink (pathname);
-
-  if (ret == -1)
-    remote_fileio_return_errno (-1);
-  else
-    remote_fileio_return_success (ret);
-}
-
-static void
-remote_fileio_func_stat (char *buf)
-{
-  CORE_ADDR statptr, nameptr;
-  int ret, namelength, retlength;
-  char *pathname;
-  LONGEST lnum;
-  struct stat st;
-  struct fio_stat fst;
-
-  /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
-  if (remote_fileio_extract_ptr_w_len (&buf, &nameptr, &namelength))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-
-  /* 2. Parameter: Ptr to struct stat */
-  if (remote_fileio_extract_long (&buf, &lnum))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  statptr = (CORE_ADDR) lnum;
-  
-  /* Request pathname using 'm' packet */
-  pathname = alloca (namelength);
-  retlength = remote_read_bytes (nameptr, (gdb_byte *) pathname, namelength);
-  if (retlength != namelength)
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-
-  remote_fio_no_longjmp = 1;
-  ret = stat (pathname, &st);
-
-  if (ret == -1)
-    {
-      remote_fileio_return_errno (-1);
-      return;
-    }
-  /* Only operate on regular files and directories */
-  if (!ret && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
-    {
-      remote_fileio_reply (-1, FILEIO_EACCES);
-      return;
-    }
-  if (statptr)
-    {
-      remote_fileio_to_fio_stat (&st, &fst);
-      remote_fileio_to_fio_uint (0, fst.fst_dev);
-      
-      retlength = remote_fileio_write_bytes (statptr,
-					     (gdb_byte *) &fst, sizeof fst);
-      if (retlength != sizeof fst)
-	{
-	  remote_fileio_return_errno (-1);
-	  return;
-	}
-    }
-  remote_fileio_return_success (ret);
-}
-
-static void
-remote_fileio_func_fstat (char *buf)
-{
-  CORE_ADDR ptrval;
-  int fd, ret, retlength;
-  long target_fd;
-  LONGEST lnum;
-  struct stat st;
-  struct fio_stat fst;
-  struct timeval tv;
-
-  /* 1. Parameter: file descriptor */
-  if (remote_fileio_extract_int (&buf, &target_fd))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  fd = remote_fileio_map_fd ((int) target_fd);
-  if (fd == FIO_FD_INVALID)
-    {
-      remote_fileio_badfd ();
-      return;
-    }
-  /* 2. Parameter: Ptr to struct stat */
-  if (remote_fileio_extract_long (&buf, &lnum))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  ptrval = (CORE_ADDR) lnum;
-
-  remote_fio_no_longjmp = 1;
-  if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
-    {
-      remote_fileio_to_fio_uint (1, fst.fst_dev);
-      st.st_mode = S_IFCHR | (fd == FIO_FD_CONSOLE_IN ? S_IRUSR : S_IWUSR);
-      st.st_nlink = 1;
-#ifdef HAVE_GETUID
-      st.st_uid = getuid ();
-#else
-      st.st_uid = 0;
-#endif
-#ifdef HAVE_GETGID
-      st.st_gid = getgid ();
-#else
-      st.st_gid = 0;
-#endif
-      st.st_rdev = 0;
-      st.st_size = 0;
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
-      st.st_blksize = 512;
-#endif
-#if HAVE_STRUCT_STAT_ST_BLOCKS
-      st.st_blocks = 0;
-#endif
-      if (!gettimeofday (&tv, NULL))
-	st.st_atime = st.st_mtime = st.st_ctime = tv.tv_sec;
-      else
-        st.st_atime = st.st_mtime = st.st_ctime = (time_t) 0;
-      ret = 0;
-    }
-  else
-    ret = fstat (fd, &st);
-
-  if (ret == -1)
-    {
-      remote_fileio_return_errno (-1);
-      return;
-    }
-  if (ptrval)
-    {
-      remote_fileio_to_fio_stat (&st, &fst);
-
-      retlength = remote_fileio_write_bytes (ptrval, (gdb_byte *) &fst, sizeof fst);
-      if (retlength != sizeof fst)
-	{
-	  remote_fileio_return_errno (-1);
-	  return;
-	}
-    }
-  remote_fileio_return_success (ret);
-}
-
-static void
-remote_fileio_func_gettimeofday (char *buf)
-{
-  LONGEST lnum;
-  CORE_ADDR ptrval;
-  int ret, retlength;
-  struct timeval tv;
-  struct fio_timeval ftv;
-
-  /* 1. Parameter: struct timeval pointer */
-  if (remote_fileio_extract_long (&buf, &lnum))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  ptrval = (CORE_ADDR) lnum;
-  /* 2. Parameter: some pointer value... */
-  if (remote_fileio_extract_long (&buf, &lnum))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  /* ...which has to be NULL */
-  if (lnum)
-    {
-      remote_fileio_reply (-1, FILEIO_EINVAL);
-      return;
-    }
-
-  remote_fio_no_longjmp = 1;
-  ret = gettimeofday (&tv, NULL);
-
-  if (ret == -1)
-    {
-      remote_fileio_return_errno (-1);
-      return;
-    }
-
-  if (ptrval)
-    {
-      remote_fileio_to_fio_timeval (&tv, &ftv);
-
-      retlength = remote_fileio_write_bytes (ptrval, (gdb_byte *) &ftv, sizeof ftv);
-      if (retlength != sizeof ftv)
-	{
-	  remote_fileio_return_errno (-1);
-	  return;
-	}
-    }
-  remote_fileio_return_success (ret);
-}
-
-static void
-remote_fileio_func_isatty (char *buf)
-{
-  long target_fd;
-  int fd;
-
-  /* Parameter: file descriptor */
-  if (remote_fileio_extract_int (&buf, &target_fd))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-  remote_fio_no_longjmp = 1;
-  fd = remote_fileio_map_fd ((int) target_fd);
-  remote_fileio_return_success (fd == FIO_FD_CONSOLE_IN ||
-  				fd == FIO_FD_CONSOLE_OUT ? 1 : 0);
-}
-
-static void
-remote_fileio_func_system (char *buf)
-{
-  CORE_ADDR ptrval;
-  int ret, length, retlength;
-  char *cmdline = NULL;
-
-  /* Parameter: Ptr to commandline / length incl. trailing zero */
-  if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
-    {
-      remote_fileio_ioerror ();
-      return;
-    }
-
-  if (length)
-    {
-      /* Request commandline using 'm' packet */
-      cmdline = alloca (length);
-      retlength = remote_read_bytes (ptrval, (gdb_byte *) cmdline, length);
-      if (retlength != length)
-	{
-	  remote_fileio_ioerror ();
-	  return;
-	}
-    }
-  
-  /* Check if system(3) has been explicitely allowed using the
-     `set remote system-call-allowed 1' command.  If length is 0,
-     indicating a NULL parameter to the system call, return zero to
-     indicate a shell is not available.  Otherwise fail with EPERM.  */
-  if (!remote_fio_system_call_allowed)
-    {
-      if (!length)
-	remote_fileio_return_success (0);
-      else
-	remote_fileio_reply (-1, FILEIO_EPERM);
-      return;
-    }
-
-  remote_fio_no_longjmp = 1;
-  ret = system (cmdline);
-
-  if (!length)
-    remote_fileio_return_success (ret);
-  else if (ret == -1)
-    remote_fileio_return_errno (-1);
-  else
-    remote_fileio_return_success (WEXITSTATUS (ret));
-}
-
-static struct {
-  char *name;
-  void (*func)(char *);
-} remote_fio_func_map[] = {
-  { "open", remote_fileio_func_open },
-  { "close", remote_fileio_func_close },
-  { "read", remote_fileio_func_read },
-  { "write", remote_fileio_func_write },
-  { "lseek", remote_fileio_func_lseek },
-  { "rename", remote_fileio_func_rename },
-  { "unlink", remote_fileio_func_unlink },
-  { "stat", remote_fileio_func_stat },
-  { "fstat", remote_fileio_func_fstat },
-  { "gettimeofday", remote_fileio_func_gettimeofday },
-  { "isatty", remote_fileio_func_isatty },
-  { "system", remote_fileio_func_system },
-  { NULL, NULL }
-};
-
-static int
-do_remote_fileio_request (struct ui_out *uiout, void *buf_arg)
-{
-  char *buf = buf_arg;
-  char *c;
-  int idx;
-
   remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
-
-  c = strchr (++buf, ',');
-  if (c)
-    *c++ = '\0';
-  else
-    c = strchr (buf, '\0');
-  for (idx = 0; remote_fio_func_map[idx].name; ++idx)
-    if (!strcmp (remote_fio_func_map[idx].name, buf))
-      break;
-  if (!remote_fio_func_map[idx].name)	/* ERROR: No such function. */
-    return RETURN_ERROR;
-  remote_fio_func_map[idx].func (c);
-  return 0;
 }
 
 /* Close any open descriptors, and reinitialize the file mapping.  */
@@ -1378,85 +147,28 @@
 void
 remote_fileio_reset (void)
 {
-  int ix;
-
-  for (ix = 0; ix != remote_fio_data.fd_map_size; ix++)
-    {
-      int fd = remote_fio_data.fd_map[ix];
-
-      if (fd >= 0)
-	close (fd);
-    }
-  if (remote_fio_data.fd_map)
-    {
-      free (remote_fio_data.fd_map);
-      remote_fio_data.fd_map = NULL;
-      remote_fio_data.fd_map_size = 0;
-    }
+  target_fileio_reset();
 }
 
 void
 remote_fileio_request (char *buf)
 {
-  int ex;
+  static struct file_io_operations operations =
+  {
+     remote_read_bytes,
+     remote_fileio_write_bytes,
+     remote_fileio_reply,
+     set_ctrl_c_signal_handler
+  };
 
   remote_fileio_sig_init ();
-
-  remote_fio_ctrl_c_flag = 0;
-  remote_fio_no_longjmp = 0;
-
-  ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf,
-			 RETURN_MASK_ALL);
-  switch (ex)
-    {
-      case RETURN_ERROR:
-	remote_fileio_reply (-1, FILEIO_ENOSYS);
-        break;
-      case RETURN_QUIT:
-        remote_fileio_reply (-1, FILEIO_EINTR);
-	break;
-      default:
-        break;
-    }
-
+  target_fileio_request(buf, &operations);
   remote_fileio_sig_exit ();
 }
 
-static void
-set_system_call_allowed (char *args, int from_tty)
-{
-  if (args)
-    {
-      char *arg_end;
-      int val = strtoul (args, &arg_end, 10);
-      if (*args && *arg_end == '\0')
-        {
-	  remote_fio_system_call_allowed = !!val;
-	  return;
-	}
-    }
-  error (_("Illegal argument for \"set remote system-call-allowed\" command"));
-}
-
-static void
-show_system_call_allowed (char *args, int from_tty)
-{
-  if (args)
-    error (_("Garbage after \"show remote system-call-allowed\" command: `%s'"), args);
-  printf_unfiltered ("Calling host system(3) call from target is %sallowed\n",
-		     remote_fio_system_call_allowed ? "" : "not ");
-}
-
 void
 initialize_remote_fileio (struct cmd_list_element *remote_set_cmdlist,
 			  struct cmd_list_element *remote_show_cmdlist)
 {
-  add_cmd ("system-call-allowed", no_class,
-	   set_system_call_allowed,
-	   _("Set if the host system(3) call is allowed for the target."),
-	   &remote_set_cmdlist);
-  add_cmd ("system-call-allowed", no_class,
-	   show_system_call_allowed,
-	   _("Show if the host system(3) call is allowed for the target."),
-	   &remote_show_cmdlist);
+  initialize_target_fileio(remote_set_cmdlist, remote_show_cmdlist);
 }
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index 918eab8..c3a8443 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -469,13 +469,17 @@
     }
   else
     argv = NULL;
-  sim_create_inferior (gdbsim_desc, exec_bfd, argv, env);
 
-  inferior_ptid = pid_to_ptid (42);
-  target_mark_running (&gdbsim_ops);
-  insert_breakpoints ();	/* Needed to get correct instruction in cache */
+  // ARC 12/01/09 check return status
+  // GDB Bug #9734
+  if (sim_create_inferior (gdbsim_desc, exec_bfd, argv, env) == SIM_RC_OK)
+    {
+      inferior_ptid = pid_to_ptid (42);
+      target_mark_running (&gdbsim_ops);
+      insert_breakpoints ();	/* Needed to get correct instruction in cache */
 
-  clear_proceed_status ();
+      clear_proceed_status ();
+    }
 }
 
 /* The open routine takes the rest of the parameters from the command,
diff --git a/gdb/stack.c b/gdb/stack.c
index 374848b..f151dc1 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -831,7 +831,8 @@
   {
     int i;
     for (i = 0; i < numargs; i++)
-      addrs[i] = value_as_address (args[0]);
+      addrs[i] = value_as_address (args[i]);  // ARC BUG FIX  29/9/08
+                                              // see http://sourceware.org/ml/gdb-patches/2009-01/msg00476.html
   }
 
   /* Assume that the single arg[0] is an address, use that to identify
@@ -892,8 +893,29 @@
   const char *pc_regname;
   int selected_frame_p;
   struct gdbarch *gdbarch;
+  CORE_ADDR pc;
 
   fi = parse_frame_specification_1 (addr_exp, "No stack.", &selected_frame_p);
+
+  /* richards ARC 22/9/2008
+   * Try to detect that an invalid frame has been selected (e.g. a frame
+   * number has been given, but there is no such frame on the stack);
+   * N.B. this works for the ARC gdb port, but 0 might be a valid code
+   *      address on other processors, so this needs more investigation!
+   *
+   * We should not try to submit this fix to the FSF until we know that it
+   * is generally valid.
+   *
+   * gdb bug: 9458
+   * ARC bug: 95315
+   */
+  pc = get_frame_pc (fi);
+  if (pc == 0)
+    {
+      warning("invalid frame");
+      return;
+    }
+
   gdbarch = get_frame_arch (fi);
 
   /* Name of the value returned by get_frame_pc().  Per comments, "pc"
@@ -914,7 +936,7 @@
   func = get_frame_function (fi);
   /* FIXME: cagney/2002-11-28: Why bother?  Won't sal.symtab contain
      the same value?  */
-  s = find_pc_symtab (get_frame_pc (fi));
+  s = find_pc_symtab (pc);
   if (func)
     {
       /* It seems appropriate to use SYMBOL_PRINT_NAME() here, to
diff --git a/gdb/symtab.h b/gdb/symtab.h
index c19e741..0d751a7 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -574,6 +574,26 @@
   struct value *(*read_variable) (struct symbol * symbol,
 				  struct frame_info * frame);
 
+// begin ARC
+  /* Return the address of the variable SYMBOL, relative to the stack
+     frame FRAME.  If the variable has been optimized out, return
+     zero.
+
+     Iff `read_needs_frame (SYMBOL)' is zero, then FRAME may be zero.  */
+
+  CORE_ADDR (*get_variable_address) (struct symbol * symbol,
+                                     struct frame_info * frame);
+
+  /* Return the size of the variable SYMBOL, relative to the stack
+     frame FRAME.  If the variable has been optimized out, return
+     zero.
+
+     Iff `read_needs_frame (SYMBOL)' is zero, then FRAME may be zero.  */
+
+  unsigned int (*get_variable_size) (struct symbol * symbol,
+                                     struct frame_info * frame);
+// end ARC
+
   /* Return non-zero if we need a frame to find the value of the SYMBOL.  */
   int (*read_needs_frame) (struct symbol * symbol);
 
diff --git a/gdb/target-fileio.c b/gdb/target-fileio.c
new file mode 100644
index 0000000..fdc64c9
--- /dev/null
+++ b/gdb/target-fileio.c
@@ -0,0 +1,1344 @@
+/* Target File-I/O communications
+
+   Copyright (C) 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "gdb_string.h"
+#include "gdbcmd.h"
+#include "gdb/fileio.h"
+#include "gdb_wait.h"
+#include "gdb_stat.h"
+#include "exceptions.h"
+#include "target-fileio.h"
+
+#include <fcntl.h>
+#include <sys/time.h>
+#ifdef __CYGWIN__
+#include <sys/cygwin.h>		/* For cygwin_conv_to_full_posix_path.  */
+#endif
+
+static struct {
+  int *fd_map;
+  int fd_map_size;
+} target_fio_data;
+
+#define FIO_FD_INVALID		-1
+#define FIO_FD_CONSOLE_IN	-2
+#define FIO_FD_CONSOLE_OUT	-3
+
+static int target_fio_system_call_allowed = 0;
+
+static int
+target_fileio_init_fd_map (void)
+{
+  int i;
+
+  if (!target_fio_data.fd_map)
+    {
+      target_fio_data.fd_map = (int *) xmalloc (10 * sizeof (int));
+      target_fio_data.fd_map_size = 10;
+      target_fio_data.fd_map[0] = FIO_FD_CONSOLE_IN;
+      target_fio_data.fd_map[1] = FIO_FD_CONSOLE_OUT;
+      target_fio_data.fd_map[2] = FIO_FD_CONSOLE_OUT;
+      for (i = 3; i < 10; ++i)
+        target_fio_data.fd_map[i] = FIO_FD_INVALID;
+    }
+  return 3;
+}
+
+static int
+target_fileio_resize_fd_map (void)
+{
+  int i = target_fio_data.fd_map_size;
+
+  if (!target_fio_data.fd_map)
+    return target_fileio_init_fd_map ();
+  target_fio_data.fd_map_size += 10;
+  target_fio_data.fd_map =
+    (int *) xrealloc (target_fio_data.fd_map,
+		      target_fio_data.fd_map_size * sizeof (int));
+  for (; i < target_fio_data.fd_map_size; i++)
+    target_fio_data.fd_map[i] = FIO_FD_INVALID;
+  return target_fio_data.fd_map_size - 10;
+}
+
+static int
+target_fileio_next_free_fd (void)
+{
+  int i;
+
+  for (i = 0; i < target_fio_data.fd_map_size; ++i)
+    if (target_fio_data.fd_map[i] == FIO_FD_INVALID)
+      return i;
+  return target_fileio_resize_fd_map ();
+}
+
+static int
+target_fileio_fd_to_targetfd (int fd)
+{
+  int target_fd =target_fileio_next_free_fd ();
+  target_fio_data.fd_map[target_fd] = fd;
+  return target_fd;
+}
+
+static int
+target_fileio_map_fd (int target_fd)
+{
+ target_fileio_init_fd_map ();
+  if (target_fd < 0 || target_fd >= target_fio_data.fd_map_size)
+    return FIO_FD_INVALID;
+  return target_fio_data.fd_map[target_fd];
+}
+
+static void
+target_fileio_close_target_fd (int target_fd)
+{
+ target_fileio_init_fd_map ();
+  if (target_fd >= 0 && target_fd < target_fio_data.fd_map_size)
+    target_fio_data.fd_map[target_fd] = FIO_FD_INVALID;
+}
+
+static int
+target_fileio_oflags_to_host (long flags)
+{
+  int hflags = 0;
+
+  if (flags & FILEIO_O_CREAT)
+    hflags |= O_CREAT;
+  if (flags & FILEIO_O_EXCL)
+    hflags |= O_EXCL;
+  if (flags & FILEIO_O_TRUNC)
+    hflags |= O_TRUNC;
+  if (flags & FILEIO_O_APPEND)
+    hflags |= O_APPEND;
+  if (flags & FILEIO_O_RDONLY)
+    hflags |= O_RDONLY;
+  if (flags & FILEIO_O_WRONLY)
+    hflags |= O_WRONLY;
+  if (flags & FILEIO_O_RDWR)
+    hflags |= O_RDWR;
+/* On systems supporting binary and text mode, always open files in
+   binary mode. */
+#ifdef O_BINARY
+  hflags |= O_BINARY;
+#endif
+  return hflags;
+}
+
+static mode_t
+target_fileio_mode_to_host (long mode, int open_call)
+{
+  mode_t hmode = 0;
+
+  if (!open_call)
+    {
+      if (mode & FILEIO_S_IFREG)
+	hmode |= S_IFREG;
+      if (mode & FILEIO_S_IFDIR)
+	hmode |= S_IFDIR;
+      if (mode & FILEIO_S_IFCHR)
+	hmode |= S_IFCHR;
+    }
+  if (mode & FILEIO_S_IRUSR)
+    hmode |= S_IRUSR;
+  if (mode & FILEIO_S_IWUSR)
+    hmode |= S_IWUSR;
+  if (mode & FILEIO_S_IXUSR)
+    hmode |= S_IXUSR;
+#ifdef S_IRGRP
+  if (mode & FILEIO_S_IRGRP)
+    hmode |= S_IRGRP;
+#endif
+#ifdef S_IWGRP
+  if (mode & FILEIO_S_IWGRP)
+    hmode |= S_IWGRP;
+#endif
+#ifdef S_IXGRP
+  if (mode & FILEIO_S_IXGRP)
+    hmode |= S_IXGRP;
+#endif
+  if (mode & FILEIO_S_IROTH)
+    hmode |= S_IROTH;
+#ifdef S_IWOTH
+  if (mode & FILEIO_S_IWOTH)
+    hmode |= S_IWOTH;
+#endif
+#ifdef S_IXOTH
+  if (mode & FILEIO_S_IXOTH)
+    hmode |= S_IXOTH;
+#endif
+  return hmode;
+}
+
+static LONGEST
+target_fileio_mode_to_target (mode_t mode)
+{
+  mode_t tmode = 0;
+
+  if (S_ISREG(mode))
+    tmode |= FILEIO_S_IFREG;
+  if (S_ISDIR(mode))
+    tmode |= FILEIO_S_IFDIR;
+  if (S_ISCHR(mode))
+    tmode |= FILEIO_S_IFCHR;
+  if (mode & S_IRUSR)
+    tmode |= FILEIO_S_IRUSR;
+  if (mode & S_IWUSR)
+    tmode |= FILEIO_S_IWUSR;
+  if (mode & S_IXUSR)
+    tmode |= FILEIO_S_IXUSR;
+#ifdef S_IRGRP
+  if (mode & S_IRGRP)
+    tmode |= FILEIO_S_IRGRP;
+#endif
+#ifdef S_IWRGRP
+  if (mode & S_IWGRP)
+    tmode |= FILEIO_S_IWGRP;
+#endif
+#ifdef S_IXGRP
+  if (mode & S_IXGRP)
+    tmode |= FILEIO_S_IXGRP;
+#endif
+  if (mode & S_IROTH)
+    tmode |= FILEIO_S_IROTH;
+#ifdef S_IWOTH
+  if (mode & S_IWOTH)
+    tmode |= FILEIO_S_IWOTH;
+#endif
+#ifdef S_IXOTH
+  if (mode & S_IXOTH)
+    tmode |= FILEIO_S_IXOTH;
+#endif
+  return tmode;
+}
+
+static int
+target_fileio_errno_to_target (int error)
+{
+  switch (error)
+    {
+      case EPERM:
+        return FILEIO_EPERM;
+      case ENOENT:
+        return FILEIO_ENOENT;
+      case EINTR:
+        return FILEIO_EINTR;
+      case EIO:
+        return FILEIO_EIO;
+      case EBADF:
+        return FILEIO_EBADF;
+      case EACCES:
+        return FILEIO_EACCES;
+      case EFAULT:
+        return FILEIO_EFAULT;
+      case EBUSY:
+        return FILEIO_EBUSY;
+      case EEXIST:
+        return FILEIO_EEXIST;
+      case ENODEV:
+        return FILEIO_ENODEV;
+      case ENOTDIR:
+        return FILEIO_ENOTDIR;
+      case EISDIR:
+        return FILEIO_EISDIR;
+      case EINVAL:
+        return FILEIO_EINVAL;
+      case ENFILE:
+        return FILEIO_ENFILE;
+      case EMFILE:
+        return FILEIO_EMFILE;
+      case EFBIG:
+        return FILEIO_EFBIG;
+      case ENOSPC:
+        return FILEIO_ENOSPC;
+      case ESPIPE:
+        return FILEIO_ESPIPE;
+      case EROFS:
+        return FILEIO_EROFS;
+      case ENOSYS:
+        return FILEIO_ENOSYS;
+      case ENAMETOOLONG:
+        return FILEIO_ENAMETOOLONG;
+    }
+  return FILEIO_EUNKNOWN;
+}
+
+static int
+target_fileio_seek_flag_to_host (long num, int *flag)
+{
+  if (!flag)
+    return 0;
+  switch (num)
+    {
+      case FILEIO_SEEK_SET:
+        *flag = SEEK_SET;
+	break;
+      case FILEIO_SEEK_CUR:
+        *flag =  SEEK_CUR;
+	break;
+      case FILEIO_SEEK_END:
+        *flag =  SEEK_END;
+	break;
+      default:
+        return -1;
+    }
+  return 0;
+}
+
+static int
+target_fileio_extract_long (char **buf, LONGEST *retlong)
+{
+  char *c;
+  int sign = 1;
+
+  if (!buf || !*buf || !**buf || !retlong)
+    return -1;
+  c = strchr (*buf, ',');
+  if (c)
+    *c++ = '\0';
+  else
+    c = strchr (*buf, '\0');
+  while (strchr ("+-", **buf))
+    {
+      if (**buf == '-')
+	sign = -sign;
+      ++*buf;
+    }
+  for (*retlong = 0; **buf; ++*buf)
+    {
+      *retlong <<= 4;
+      if (**buf >= '0' && **buf <= '9')
+        *retlong += **buf - '0';
+      else if (**buf >= 'a' && **buf <= 'f')
+        *retlong += **buf - 'a' + 10;
+      else if (**buf >= 'A' && **buf <= 'F')
+        *retlong += **buf - 'A' + 10;
+      else
+        return -1;
+    }
+  *retlong *= sign;
+  *buf = c;
+  return 0;
+}
+
+static int
+target_fileio_extract_int (char **buf, long *retint)
+{
+  int ret;
+  LONGEST retlong;
+
+  if (!retint)
+    return -1;
+  ret =target_fileio_extract_long (buf, &retlong);
+  if (!ret)
+    *retint = (long) retlong;
+  return ret;
+}
+
+static int
+target_fileio_extract_ptr_w_len (char **buf, CORE_ADDR *ptrval, int *length)
+{
+  char *c;
+  LONGEST retlong;
+
+  if (!buf || !*buf || !**buf || !ptrval || !length)
+    return -1;
+  c = strchr (*buf, '/');
+  if (!c)
+    return -1;
+  *c++ = '\0';
+  if (target_fileio_extract_long (buf, &retlong))
+    return -1;
+  *ptrval = (CORE_ADDR) retlong;
+  *buf = c;
+  if (target_fileio_extract_long (buf, &retlong))
+    return -1;
+  *length = (int) retlong;
+  return 0;
+}
+
+/* Convert to big endian */
+static void
+target_fileio_to_be (LONGEST num, char *buf, int bytes)
+{
+  int i;
+
+  for (i = 0; i < bytes; ++i)
+    buf[i] = (num >> (8 * (bytes - i - 1))) & 0xff;
+}
+
+static void
+target_fileio_to_fio_uint (long num, fio_uint_t fnum)
+{
+ target_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
+}
+
+static void
+target_fileio_to_fio_mode (mode_t num, fio_mode_t fnum)
+{
+ target_fileio_to_be (target_fileio_mode_to_target(num), (char *) fnum, 4);
+}
+
+static void
+target_fileio_to_fio_time (time_t num, fio_time_t fnum)
+{
+ target_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
+}
+
+static void
+target_fileio_to_fio_long (LONGEST num, fio_long_t fnum)
+{
+ target_fileio_to_be (num, (char *) fnum, 8);
+}
+
+static void
+target_fileio_to_fio_ulong (LONGEST num, fio_ulong_t fnum)
+{
+ target_fileio_to_be (num, (char *) fnum, 8);
+}
+
+static void
+target_fileio_to_fio_stat (struct stat *st, struct fio_stat *fst)
+{
+  LONGEST blksize;
+
+  /* `st_dev' is set in the calling function */
+ target_fileio_to_fio_uint ((long) st->st_ino, fst->fst_ino);
+ target_fileio_to_fio_mode (st->st_mode, fst->fst_mode);
+ target_fileio_to_fio_uint ((long) st->st_nlink, fst->fst_nlink);
+ target_fileio_to_fio_uint ((long) st->st_uid, fst->fst_uid);
+ target_fileio_to_fio_uint ((long) st->st_gid, fst->fst_gid);
+ target_fileio_to_fio_uint ((long) st->st_rdev, fst->fst_rdev);
+ target_fileio_to_fio_ulong ((LONGEST) st->st_size, fst->fst_size);
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+  blksize = st->st_blksize;
+#else
+  blksize = 512;
+#endif
+ target_fileio_to_fio_ulong (blksize, fst->fst_blksize);
+#if HAVE_STRUCT_STAT_ST_BLOCKS
+ target_fileio_to_fio_ulong ((LONGEST) st->st_blocks, fst->fst_blocks);
+#else
+  /* FIXME: This is correct for DJGPP, but other systems that don't
+     have st_blocks, if any, might prefer 512 instead of st_blksize.
+     (eliz, 30-12-2003)  */
+ target_fileio_to_fio_ulong (((LONGEST) st->st_size + blksize - 1)
+			      / blksize,
+			      fst->fst_blocks);
+#endif
+ target_fileio_to_fio_time (st->st_atime, fst->fst_atime);
+ target_fileio_to_fio_time (st->st_mtime, fst->fst_mtime);
+ target_fileio_to_fio_time (st->st_ctime, fst->fst_ctime);
+}
+
+static void
+target_fileio_to_fio_timeval (struct timeval *tv, struct fio_timeval *ftv)
+{
+ target_fileio_to_fio_time (tv->tv_sec, ftv->ftv_sec);
+ target_fileio_to_fio_long (tv->tv_usec, ftv->ftv_usec);
+}
+
+int target_fio_no_longjmp = 0;
+
+
+static void
+target_fileio_func_open (char *buf, struct file_io_operations *operations)
+{
+  CORE_ADDR ptrval;
+  int length, retlength;
+  long num;
+  int flags, fd;
+  mode_t mode;
+  char *pathname;
+  struct stat st;
+
+  /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
+  if (target_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
+    {
+      operations->ioerror ();
+      return;
+    }
+  /* 2. Parameter: open flags */
+  if (target_fileio_extract_int (&buf, &num))
+    {
+      operations->ioerror ();
+      return;
+    }
+  flags =target_fileio_oflags_to_host (num);
+  /* 3. Parameter: open mode */
+  if (target_fileio_extract_int (&buf, &num))
+    {
+      operations->ioerror ();
+      return;
+    }
+  mode =target_fileio_mode_to_host (num, 1);
+
+  /* Read pathname */
+  pathname = alloca (length);
+  retlength = operations->read_bytes (ptrval, (gdb_byte *) pathname, length);
+  if (retlength != length)
+    {
+      operations->ioerror ();
+      return;
+    }
+
+  /* Check if pathname exists and is not a regular file or directory.  If so,
+     return an appropriate error code.  Same for trying to open directories
+     for writing. */
+  if (!stat (pathname, &st))
+    {
+      if (!S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
+	{
+	  operations->reply (-1, FILEIO_ENODEV);
+	  return;
+	}
+      if (S_ISDIR (st.st_mode)
+	  && ((flags & O_WRONLY) == O_WRONLY || (flags & O_RDWR) == O_RDWR))
+	{
+	  operations->reply (-1, FILEIO_EISDIR);
+	  return;
+	}
+    }
+
+  target_fio_no_longjmp = 1;
+  fd = open (pathname, flags, mode);
+  if (fd < 0)
+    {
+      operations->return_errno (-1);
+      return;
+    }
+
+  fd =target_fileio_fd_to_targetfd (fd);
+  operations->return_success (fd);
+}
+
+static void
+target_fileio_func_close (char *buf, struct file_io_operations *operations)
+{
+  long num;
+  int fd;
+
+  /* Parameter: file descriptor */
+  if (target_fileio_extract_int (&buf, &num))
+    {
+      operations->ioerror ();
+      return;
+    }
+  fd =target_fileio_map_fd ((int) num);
+  if (fd == FIO_FD_INVALID)
+    {
+      operations->badfd ();
+      return;
+    }
+
+  target_fio_no_longjmp = 1;
+  if (fd != FIO_FD_CONSOLE_IN && fd != FIO_FD_CONSOLE_OUT && close (fd))
+    operations->return_errno (-1);
+ target_fileio_close_target_fd ((int) num);
+  operations->return_success (0);
+}
+
+static void
+target_fileio_func_read (char *buf, struct file_io_operations *operations)
+{
+  long target_fd, num;
+  LONGEST lnum;
+  CORE_ADDR ptrval;
+  int fd, ret, retlength;
+  gdb_byte *buffer;
+  size_t length;
+  off_t old_offset, new_offset;
+
+  /* 1. Parameter: file descriptor */
+  if (target_fileio_extract_int (&buf, &target_fd))
+    {
+      operations->ioerror ();
+      return;
+    }
+  fd =target_fileio_map_fd ((int) target_fd);
+  if (fd == FIO_FD_INVALID)
+    {
+      operations->badfd ();
+      return;
+    }
+  /* 2. Parameter: buffer pointer */
+  if (target_fileio_extract_long (&buf, &lnum))
+    {
+      operations->ioerror ();
+      return;
+    }
+  ptrval = (CORE_ADDR) lnum;
+  /* 3. Parameter: buffer length */
+  if (target_fileio_extract_int (&buf, &num))
+    {
+      operations->ioerror ();
+      return;
+    }
+  length = (size_t) num;
+
+  switch (fd)
+    {
+      case FIO_FD_CONSOLE_OUT:
+	operations->badfd ();
+	return;
+      case FIO_FD_CONSOLE_IN:
+	{
+	  static char *remaining_buf = NULL;
+	  static int remaining_length = 0;
+
+	  buffer = (gdb_byte *) xmalloc (32768);
+	  if (remaining_buf)
+	    {
+	      target_fio_no_longjmp = 1;
+	      if (remaining_length > length)
+		{
+		  memcpy (buffer, remaining_buf, length);
+		  memmove (remaining_buf, remaining_buf + length,
+			   remaining_length - length);
+		  remaining_length -= length;
+		  ret = length;
+		}
+	      else
+		{
+		  memcpy (buffer, remaining_buf, remaining_length);
+		  xfree (remaining_buf);
+		  remaining_buf = NULL;
+		  ret = remaining_length;
+		}
+	    }
+	  else
+	    {
+	      ret = ui_file_read (gdb_stdtargin, (char *) buffer, 32767);
+	      target_fio_no_longjmp = 1;
+	      if (ret > 0 && (size_t)ret > length)
+		{
+		  remaining_buf = (char *) xmalloc (ret - length);
+		  remaining_length = ret - length;
+		  memcpy (remaining_buf, buffer + length, remaining_length);
+		  ret = length;
+		}
+	    }
+	}
+	break;
+      default:
+	buffer = (gdb_byte *) xmalloc (length);
+	/* POSIX defines EINTR behaviour of read in a weird way.  It's allowed
+	   for read() to return -1 even if "some" bytes have been read.  It
+	   has been corrected in SUSv2 but that doesn't help us much...
+	   Therefore a complete solution must check how many bytes have been
+	   read on EINTR to return a more reliable value to the target */
+	old_offset = lseek (fd, 0, SEEK_CUR);
+	target_fio_no_longjmp = 1;
+	ret = read (fd, buffer, length);
+	if (ret < 0 && errno == EINTR)
+	  {
+	    new_offset = lseek (fd, 0, SEEK_CUR);
+	    /* If some data has been read, return the number of bytes read.
+	       The Ctrl-C flag is set in target_fileio_reply() anyway */
+	    if (old_offset != new_offset)
+	      ret = new_offset - old_offset;
+	  }
+	break;
+    }
+
+  if (ret > 0)
+    {
+      retlength = operations->write_bytes (ptrval, buffer, ret);
+      if (retlength != ret)
+	ret = -1; /* errno has been set to EIO in remote_write_bytes() */
+    }
+
+  if (ret < 0)
+    operations->return_errno (-1);
+  else
+    operations->return_success (ret);
+
+  xfree (buffer);
+}
+
+static void
+target_fileio_func_write (char *buf, struct file_io_operations *operations)
+{
+  long target_fd, num;
+  LONGEST lnum;
+  CORE_ADDR ptrval;
+  int fd, ret, retlength;
+  gdb_byte *buffer;
+  size_t length;
+
+  /* 1. Parameter: file descriptor */
+  if (target_fileio_extract_int (&buf, &target_fd))
+    {
+      operations->ioerror ();
+      return;
+    }
+  fd =target_fileio_map_fd ((int) target_fd);
+  if (fd == FIO_FD_INVALID)
+    {
+      operations->badfd ();
+      return;
+    }
+  /* 2. Parameter: buffer pointer */
+  if (target_fileio_extract_long (&buf, &lnum))
+    {
+      operations->ioerror ();
+      return;
+    }
+  ptrval = (CORE_ADDR) lnum;
+  /* 3. Parameter: buffer length */
+  if (target_fileio_extract_int (&buf, &num))
+    {
+      operations->ioerror ();
+      return;
+    }
+  length = (size_t) num;
+    
+  buffer = (gdb_byte *) xmalloc (length);
+  retlength = operations->read_bytes (ptrval, buffer, length);
+  if (retlength != length)
+    {
+      xfree (buffer);
+      operations->ioerror ();
+      return;
+    }
+
+  target_fio_no_longjmp = 1;
+  switch (fd)
+    {
+      case FIO_FD_CONSOLE_IN:
+	operations->badfd ();
+	xfree (buffer);
+	return;
+      case FIO_FD_CONSOLE_OUT:
+	ui_file_write (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr,
+		       (char *) buffer, length);
+	gdb_flush (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr);
+	ret = length;
+	break;
+      default:
+	ret = write (fd, buffer, length);
+	if (ret < 0 && errno == EACCES)
+	  errno = EBADF; /* Cygwin returns EACCESS when writing to a R/O file.*/
+	break;
+    }
+
+  if (ret < 0)
+    operations->return_errno (-1);
+  else
+    operations->return_success (ret);
+
+  xfree (buffer);
+}
+
+static void
+target_fileio_func_lseek (char *buf, struct file_io_operations *operations)
+{
+  long num;
+  LONGEST lnum;
+  int fd, flag;
+  off_t offset, ret;
+
+  /* 1. Parameter: file descriptor */
+  if (target_fileio_extract_int (&buf, &num))
+    {
+      operations->ioerror ();
+      return;
+    }
+  fd =target_fileio_map_fd ((int) num);
+  if (fd == FIO_FD_INVALID)
+    {
+      operations->badfd ();
+      return;
+    }
+  else if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
+    {
+      operations->reply (-1, FILEIO_ESPIPE);
+      return;
+    }
+
+  /* 2. Parameter: offset */
+  if (target_fileio_extract_long (&buf, &lnum))
+    {
+      operations->ioerror ();
+      return;
+    }
+  offset = (off_t) lnum;
+  /* 3. Parameter: flag */
+  if (target_fileio_extract_int (&buf, &num))
+    {
+      operations->ioerror ();
+      return;
+    }
+  if (target_fileio_seek_flag_to_host (num, &flag))
+    {
+      operations->reply (-1, FILEIO_EINVAL);
+      return;
+    }
+  
+  target_fio_no_longjmp = 1;
+  ret = lseek (fd, offset, flag);
+
+  if (ret == (off_t) -1)
+    operations->return_errno (-1);
+  else
+    operations->return_success (ret);
+}
+
+static void
+target_fileio_func_rename (char *buf, struct file_io_operations *operations)
+{
+  CORE_ADDR old_ptr, new_ptr;
+  int old_len, new_len, retlength;
+  char *oldpath, *newpath;
+  int ret, of, nf;
+  struct stat ost, nst;
+
+  /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */
+  if (target_fileio_extract_ptr_w_len (&buf, &old_ptr, &old_len))
+    {
+      operations->ioerror ();
+      return;
+    }
+  
+  /* 2. Parameter: Ptr to newpath / length incl. trailing zero */
+  if (target_fileio_extract_ptr_w_len (&buf, &new_ptr, &new_len))
+    {
+      operations->ioerror ();
+      return;
+    }
+  
+  /* Request oldpath */
+  oldpath = alloca (old_len);
+  retlength = operations->read_bytes (old_ptr, (gdb_byte *) oldpath, old_len);
+  if (retlength != old_len)
+    {
+      operations->ioerror ();
+      return;
+    }
+  
+  /* Request newpath */
+  newpath = alloca (new_len);
+  retlength = operations->read_bytes (new_ptr, (gdb_byte *) newpath, new_len);
+  if (retlength != new_len)
+    {
+      operations->ioerror ();
+      return;
+    }
+  
+  /* Only operate on regular files and directories */
+  of = stat (oldpath, &ost);
+  nf = stat (newpath, &nst);
+  if ((!of && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode))
+      || (!nf && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode)))
+    {
+      operations->reply (-1, FILEIO_EACCES);
+      return;
+    }
+
+  target_fio_no_longjmp = 1;
+  ret = rename (oldpath, newpath);
+
+  if (ret == -1)
+    {
+      /* Special case: newpath is a non-empty directory.  Some systems
+         return ENOTEMPTY, some return EEXIST.  We coerce that to be
+	 always EEXIST. */
+      if (errno == ENOTEMPTY)
+        errno = EEXIST;
+#ifdef __CYGWIN__
+      /* Workaround some Cygwin problems with correct errnos. */
+      if (errno == EACCES)
+        {
+	  if (!of && !nf && S_ISDIR (nst.st_mode))
+	    {
+	      if (S_ISREG (ost.st_mode))
+		errno = EISDIR;
+	      else
+		{
+		  char oldfullpath[PATH_MAX + 1];
+		  char newfullpath[PATH_MAX + 1];
+		  int len;
+
+		  cygwin_conv_to_full_posix_path (oldpath, oldfullpath);
+		  cygwin_conv_to_full_posix_path (newpath, newfullpath);
+		  len = strlen (oldfullpath);
+		  if (newfullpath[len] == '/'
+		      && !strncmp (oldfullpath, newfullpath, len))
+		    errno = EINVAL;
+		  else
+		    errno = EEXIST;
+		}
+	    }
+	}
+#endif
+
+      operations->return_errno (-1);
+    }
+  else
+    operations->return_success (ret);
+}
+
+static void
+target_fileio_func_unlink (char *buf, struct file_io_operations *operations)
+{
+  CORE_ADDR ptrval;
+  int length, retlength;
+  char *pathname;
+  int ret;
+  struct stat st;
+
+  /* Parameter: Ptr to pathname / length incl. trailing zero */
+  if (target_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
+    {
+      operations->ioerror ();
+      return;
+    }
+  /* Request pathname */
+  pathname = alloca (length);
+  retlength = operations->read_bytes (ptrval, (gdb_byte *) pathname, length);
+  if (retlength != length)
+    {
+      operations->ioerror ();
+      return;
+    }
+
+  /* Only operate on regular files (and directories, which allows to return
+     the correct return code) */
+  if (!stat (pathname, &st) && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
+    {
+      operations->reply (-1, FILEIO_ENODEV);
+      return;
+    }
+
+  target_fio_no_longjmp = 1;
+  ret = unlink (pathname);
+
+  if (ret == -1)
+    operations->return_errno (-1);
+  else
+    operations->return_success (ret);
+}
+
+static void
+target_fileio_func_stat (char *buf, struct file_io_operations *operations)
+{
+  CORE_ADDR statptr, nameptr;
+  int ret, namelength, retlength;
+  char *pathname;
+  LONGEST lnum;
+  struct stat st;
+  struct fio_stat fst;
+
+  /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
+  if (target_fileio_extract_ptr_w_len (&buf, &nameptr, &namelength))
+    {
+      operations->ioerror ();
+      return;
+    }
+
+  /* 2. Parameter: Ptr to struct stat */
+  if (target_fileio_extract_long (&buf, &lnum))
+    {
+      operations->ioerror ();
+      return;
+    }
+  statptr = (CORE_ADDR) lnum;
+  
+  /* Request pathname */
+  pathname = alloca (namelength);
+  retlength = operations->read_bytes (nameptr, (gdb_byte *) pathname, namelength);
+  if (retlength != namelength)
+    {
+      operations->ioerror ();
+      return;
+    }
+
+  target_fio_no_longjmp = 1;
+  ret = stat (pathname, &st);
+
+  if (ret == -1)
+    {
+      operations->return_errno (-1);
+      return;
+    }
+  /* Only operate on regular files and directories */
+  if (!ret && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
+    {
+      operations->reply (-1, FILEIO_EACCES);
+      return;
+    }
+  if (statptr)
+    {
+     target_fileio_to_fio_stat (&st, &fst);
+     target_fileio_to_fio_uint (0, fst.fst_dev);
+      
+      retlength = operations->write_bytes (statptr,
+					   (gdb_byte *) &fst, sizeof fst);
+      if (retlength != sizeof fst)
+	{
+	  operations->return_errno (-1);
+	  return;
+	}
+    }
+  operations->return_success (ret);
+}
+
+static void
+target_fileio_func_fstat (char *buf, struct file_io_operations *operations)
+{
+  CORE_ADDR ptrval;
+  int fd, ret, retlength;
+  long target_fd;
+  LONGEST lnum;
+  struct stat st;
+  struct fio_stat fst;
+  struct timeval tv;
+
+  /* 1. Parameter: file descriptor */
+  if (target_fileio_extract_int (&buf, &target_fd))
+    {
+      operations->ioerror ();
+      return;
+    }
+  fd =target_fileio_map_fd ((int) target_fd);
+  if (fd == FIO_FD_INVALID)
+    {
+      operations->badfd ();
+      return;
+    }
+  /* 2. Parameter: Ptr to struct stat */
+  if (target_fileio_extract_long (&buf, &lnum))
+    {
+      operations->ioerror ();
+      return;
+    }
+  ptrval = (CORE_ADDR) lnum;
+
+  // ARC bug fix 25/11/2008
+  memset(&st,  0, sizeof(st));
+  memset(&fst, 0, sizeof(fst));
+
+  target_fio_no_longjmp = 1;
+  if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
+    {
+     target_fileio_to_fio_uint (1, fst.fst_dev);
+      st.st_mode = S_IFCHR | (fd == FIO_FD_CONSOLE_IN ? S_IRUSR : S_IWUSR);
+      st.st_nlink = 1;
+#ifdef HAVE_GETUID
+      st.st_uid = getuid ();
+#else
+      st.st_uid = 0;
+#endif
+#ifdef HAVE_GETGID
+      st.st_gid = getgid ();
+#else
+      st.st_gid = 0;
+#endif
+      st.st_rdev = 0;
+      st.st_size = 0;
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+      st.st_blksize = 512;
+#endif
+#if HAVE_STRUCT_STAT_ST_BLOCKS
+      st.st_blocks = 0;
+#endif
+
+      /* N.B. st.st_ino is not set! */
+
+      if (!gettimeofday (&tv, NULL))
+	st.st_atime = st.st_mtime = st.st_ctime = tv.tv_sec;
+      else
+        st.st_atime = st.st_mtime = st.st_ctime = (time_t) 0;
+      ret = 0;
+    }
+  else {
+    ret = fstat (fd, &st);
+    target_fileio_to_fio_uint (st.st_dev, fst.fst_dev);  // ARC bug fix 10/11/2008  gdb bug: 9655
+  }
+
+  if (ret == -1)
+    {
+      operations->return_errno (-1);
+      return;
+    }
+  if (ptrval)
+    {
+     target_fileio_to_fio_stat (&st, &fst);
+
+      retlength = operations->write_bytes (ptrval, (gdb_byte *) &fst, sizeof fst);
+      if (retlength != sizeof fst)
+	{
+	  operations->return_errno (-1);
+	  return;
+	}
+    }
+  operations->return_success (ret);
+}
+
+static void
+target_fileio_func_gettimeofday (char *buf, struct file_io_operations *operations)
+{
+  LONGEST lnum;
+  CORE_ADDR ptrval;
+  int ret, retlength;
+  struct timeval tv;
+  struct fio_timeval ftv;
+
+  /* 1. Parameter: struct timeval pointer */
+  if (target_fileio_extract_long (&buf, &lnum))
+    {
+      operations->ioerror ();
+      return;
+    }
+  ptrval = (CORE_ADDR) lnum;
+  /* 2. Parameter: some pointer value... */
+  if (target_fileio_extract_long (&buf, &lnum))
+    {
+      operations->ioerror ();
+      return;
+    }
+  /* ...which has to be NULL */
+  if (lnum)
+    {
+      operations->reply (-1, FILEIO_EINVAL);
+      return;
+    }
+
+  target_fio_no_longjmp = 1;
+  ret = gettimeofday (&tv, NULL);
+
+  if (ret == -1)
+    {
+      operations->return_errno (-1);
+      return;
+    }
+
+  if (ptrval)
+    {
+     target_fileio_to_fio_timeval (&tv, &ftv);
+
+      retlength = operations->write_bytes (ptrval, (gdb_byte *) &ftv, sizeof ftv);
+      if (retlength != sizeof ftv)
+	{
+	  operations->return_errno (-1);
+	  return;
+	}
+    }
+  operations->return_success (ret);
+}
+
+static void
+target_fileio_func_isatty (char *buf, struct file_io_operations *operations)
+{
+  long target_fd;
+  int fd;
+
+  /* Parameter: file descriptor */
+  if (target_fileio_extract_int (&buf, &target_fd))
+    {
+      operations->ioerror ();
+      return;
+    }
+  target_fio_no_longjmp = 1;
+  fd =target_fileio_map_fd ((int) target_fd);
+  operations->return_success (fd == FIO_FD_CONSOLE_IN ||
+  				fd == FIO_FD_CONSOLE_OUT ? 1 : 0);
+}
+
+static void
+target_fileio_func_system (char *buf, struct file_io_operations *operations)
+{
+  CORE_ADDR ptrval;
+  int ret, length, retlength;
+  char *cmdline = NULL;
+
+  /* Parameter: Ptr to commandline / length incl. trailing zero */
+  if (target_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
+    {
+      operations->ioerror ();
+      return;
+    }
+
+  if (length)
+    {
+      /* Request commandline */
+      cmdline = alloca (length);
+      retlength = operations->read_bytes (ptrval, (gdb_byte *) cmdline, length);
+      if (retlength != length)
+	{
+	  operations->ioerror ();
+	  return;
+	}
+    }
+  
+  /* Check if system(3) has been explicitely allowed using the
+     `set remote system-call-allowed 1' command.  If length is 0,
+     indicating a NULL parameter to the system call, return zero to
+     indicate a shell is not available.  Otherwise fail with EPERM.  */
+  if (!target_fio_system_call_allowed)
+    {
+      if (!length)
+	operations->return_success (0);
+      else
+	operations->reply (-1, FILEIO_EPERM);
+      return;
+    }
+
+  target_fio_no_longjmp = 1;
+  ret = system (cmdline);
+
+  if (!length)
+    operations->return_success (ret);
+  else if (ret == -1)
+    operations->return_errno (-1);
+  else
+    operations->return_success (WEXITSTATUS (ret));
+}
+
+static struct {
+  char *name;
+  void (*func)(char *, struct file_io_operations *);
+} target_fio_func_map[] = {
+  { "open",         target_fileio_func_open         },
+  { "close",        target_fileio_func_close        },
+  { "read",         target_fileio_func_read         },
+  { "write",        target_fileio_func_write        },
+  { "lseek",        target_fileio_func_lseek        },
+  { "rename",       target_fileio_func_rename       },
+  { "unlink",       target_fileio_func_unlink       },
+  { "stat",         target_fileio_func_stat         },
+  { "fstat",        target_fileio_func_fstat        },
+  { "gettimeofday", target_fileio_func_gettimeofday },
+  { "isatty",       target_fileio_func_isatty       },
+  { "system",       target_fileio_func_system       },
+  { NULL, NULL }
+};
+
+struct request_args {
+    char                     *buf;
+    struct file_io_operations *operations;
+};
+
+static int
+do_target_fileio_request (struct ui_out *uiout, void *args)
+{
+  struct request_args* request = (struct request_args*) args;
+  char *buf = request->buf;
+  char *c;
+  int idx;
+
+  request->operations->set_ctrl_c_signal_handler();
+
+  c = strchr (++buf, ',');
+  if (c)
+    *c++ = '\0';
+  else
+    c = strchr (buf, '\0');
+  for (idx = 0; target_fio_func_map[idx].name; ++idx)
+    if (!strcmp (target_fio_func_map[idx].name, buf))
+      break;
+  if (!target_fio_func_map[idx].name)	/* ERROR: No such function. */
+    return RETURN_ERROR;
+  target_fio_func_map[idx].func (c, request->operations);
+  return 0;
+}
+
+/* Close any open descriptors, and reinitialize the file mapping.  */
+
+void
+target_fileio_reset (void)
+{
+  int ix;
+
+  for (ix = 0; ix != target_fio_data.fd_map_size; ix++)
+    {
+      int fd = target_fio_data.fd_map[ix];
+
+      if (fd >= 0)
+	close (fd);
+    }
+  if (target_fio_data.fd_map)
+    {
+      free (target_fio_data.fd_map);
+      target_fio_data.fd_map = NULL;
+      target_fio_data.fd_map_size = 0;
+    }
+}
+
+
+void
+target_fileio_request (char *buf, struct file_io_operations *operations)
+{
+  struct request_args args = {buf, operations};
+  int ex;
+
+  target_fio_no_longjmp = 0;
+
+  ex = catch_exceptions (uiout, do_target_fileio_request, (void *)&args,
+			 RETURN_MASK_ALL);
+  switch (ex)
+    {
+      case RETURN_ERROR:
+	operations->reply (-1, FILEIO_ENOSYS);
+        break;
+      case RETURN_QUIT:
+        operations->reply (-1, FILEIO_EINTR);
+	break;
+      default:
+        break;
+    }
+}
+
+static void
+set_system_call_allowed (char *args, int from_tty)
+{
+  if (args)
+    {
+      char *arg_end;
+      int val = strtoul (args, &arg_end, 10);
+      if (*args && *arg_end == '\0')
+        {
+	  target_fio_system_call_allowed = !!val;
+	  return;
+	}
+    }
+  error (_("Illegal argument for \"set remote system-call-allowed\" command"));
+}
+
+static void
+show_system_call_allowed (char *args, int from_tty)
+{
+  if (args)
+    error (_("Garbage after \"show remote system-call-allowed\" command: `%s'"), args);
+  printf_unfiltered ("Calling host system(3) call from target is %sallowed\n",
+		     target_fio_system_call_allowed ? "" : "not ");
+}
+
+void
+initialize_target_fileio (struct cmd_list_element *set_cmdlist,
+                          struct cmd_list_element *show_cmdlist)
+{
+  add_cmd ("system-call-allowed", no_class,
+           set_system_call_allowed,
+           _("Set if the host system(3) call is allowed for the target."),
+           &set_cmdlist);
+  add_cmd ("system-call-allowed", no_class,
+           show_system_call_allowed,
+           _("Show if the host system(3) call is allowed for the target."),
+           &show_cmdlist);
+}
diff --git a/gdb/target-fileio.h b/gdb/target-fileio.h
new file mode 100644
index 0000000..46efd90
--- /dev/null
+++ b/gdb/target-fileio.h
@@ -0,0 +1,53 @@
+/* Target File-I/O communications
+
+   Copyright (C) 2003, 2007, 2008 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+
+#ifndef TARGET_FILEIO_H
+#define TARGET_FILEIO_H
+
+struct cmd_list_element;
+
+struct file_io_operations {
+    int (*read_bytes) (CORE_ADDR memaddr, gdb_byte *myaddr, int len);
+    int (*write_bytes)(CORE_ADDR memaddr, gdb_byte *myaddr, int len);
+    void (*reply)(int retcode, int error);
+    void (*set_ctrl_c_signal_handler)(void);
+};
+
+
+#define ioerror()                 reply(-1,      FILEIO_EIO)
+#define badfd()                   reply(-1,      FILEIO_EBADF)
+#define return_errno(retcode)     reply(retcode, ((retcode) < 0) ? target_fileio_errno_to_target (errno) : 0)
+#define return_success(retcode)   reply(retcode, 0)
+
+
+/* Unified interface to target fileio */
+extern void target_fileio_request (char *buf, struct file_io_operations *operations);
+
+/* Cleanup any target fileio state.  */
+extern void target_fileio_reset (void);
+
+extern void initialize_target_fileio (
+  struct cmd_list_element *set_cmdlist,
+  struct cmd_list_element *show_cmdlist);
+
+
+extern int target_fio_no_longjmp;
+
+#endif
diff --git a/gdb/target.c b/gdb/target.c
index 87ddf24..3887f17 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -39,6 +39,10 @@
 #include "gdbcore.h"
 #include "exceptions.h"
 #include "target-descriptions.h"
+// begin ARC
+#include "observer.h"
+#include "cli/cli-decode.h"
+// end ARC
 
 static void target_info (char *, int);
 
@@ -228,9 +232,28 @@
 
 /* Add a possible target architecture to the list.  */
 
+// begin ARC
+static void
+pre_open_notify (char *name, int from_tty)
+{
+    observer_notify_target_pre_connect(&current_target);
+}
+
+static void
+post_open_notify (char *name, int from_tty)
+{
+    observer_notify_target_post_connect(&current_target);
+}
+// end ARC
+
+
 void
 add_target (struct target_ops *t)
 {
+// begin ARC
+  struct cmd_list_element *cmd;
+// end ARC
+
   /* Provide default values for all "must have" methods.  */
   if (t->to_xfer_partial == NULL)
     t->to_xfer_partial = default_xfer_partial;
@@ -258,7 +281,16 @@
 information on the arguments for a particular protocol, type\n\
 `help target ' followed by the protocol name."),
 		    &targetlist, "target ", 0, &cmdlist);
+
+// begin ARC
+  cmd = 
+// end ARC
   add_cmd (t->to_shortname, no_class, t->to_open, t->to_doc, &targetlist);
+
+// begin ARC
+  (void) add_cmd ("", no_class, pre_open_notify,  "", &cmd->hook_pre);
+  (void) add_cmd ("", no_class, post_open_notify, "", &cmd->hook_post);
+// end ARC
 }
 
 /* Stub functions */
@@ -389,6 +421,7 @@
       INHERIT (to_shortname, t);
       INHERIT (to_longname, t);
       INHERIT (to_doc, t);
+      INHERIT (to_data, t);     // ARC 16/02/2009   gdb bug: 9886
       INHERIT (to_open, t);
       INHERIT (to_close, t);
       INHERIT (to_attach, t);
@@ -645,6 +678,10 @@
 
   if (targetdebug)
     setup_target_debug ();
+
+// begin ARC
+  observer_notify_target_updated(&current_target);
+// end ARC
 }
 
 /* Mark OPS as a running target.  This reverses the effect
@@ -685,7 +722,7 @@
       break;
   if (t == NULL)
     internal_error (__FILE__, __LINE__,
-		    "Attempted to mark unpushed target \"%s\" as running",
+		    "Attempted to mark unpushed target \"%s\" as non-running",   // ARC 17/11/08 correct message   gdb bug: 9887
 		    ops->to_shortname);
 
   ops->to_has_execution = 0;
@@ -1649,6 +1686,9 @@
 target_detach (char *args, int from_tty)
 {
   (current_target.to_detach) (args, from_tty);
+// begin ARC
+  observer_notify_target_post_disconnect(&current_target);
+// end ARC
 }
 
 void
@@ -1760,7 +1800,13 @@
   struct target_ops *t;
 
   t = find_default_run_target ("attach");
+// begin ARC
+  observer_notify_target_pre_connect(t);
+// end ARC
   (t->to_attach) (args, from_tty);
+// begin ARC
+  observer_notify_target_post_connect(t);
+// end ARC
   return;
 }
 
@@ -2060,6 +2106,9 @@
 {
   target_close (&debug_target, quitting);
   fprintf_unfiltered (gdb_stdlog, "target_close (%d)\n", quitting);
+// begin ARC
+  observer_notify_target_post_disconnect(&debug_target);
+// end ARC
 }
 
 void
@@ -2069,6 +2118,9 @@
     targ->to_xclose (targ, quitting);
   else if (targ->to_close != NULL)
     targ->to_close (quitting);
+// begin ARC
+  observer_notify_target_post_disconnect(targ);
+// end ARC
 }
 
 static void
@@ -2092,6 +2144,9 @@
 debug_to_detach (char *args, int from_tty)
 {
   debug_target.to_detach (args, from_tty);
+// begin ARC
+  observer_notify_target_post_disconnect(&debug_target);
+// end ARC
 
   fprintf_unfiltered (gdb_stdlog, "target_detach (%s, %d)\n", args, from_tty);
 }
diff --git a/gdb/testsuite/config/arc-jtag.exp b/gdb/testsuite/config/arc-jtag.exp
deleted file mode 100644
index 1689111..0000000
--- a/gdb/testsuite/config/arc-jtag.exp
+++ /dev/null
@@ -1,112 +0,0 @@
-# Test Framework Driver for GDB using the arcjtag target.
-
-#   Copyright 2005 Free Software Foundation, Inc.
-#
-# 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.  
-
-load_lib gdb.exp
-
-#
-# gdb_target_arcjtag
-# Set gdb to target arcjtag.
-#
-proc gdb_target_arcjtag { } {
-    global gdb_prompt
-    global exit_status
-
-    # our arcjtag target doesn't take any options (yet)
-    #set target_arcjtag_options "[board_info target gdb,target_sim_options]";
-
-    send_gdb "target arcjtag\n"
-
-    gdb_expect 60 {
-        -re "A program is being debugged already.*Kill it.*y or n. $" {
-            send_gdb "y\n"
-	    verbose "\t\tKilling previous program being debugged"
-            exp_continue
-        }
-	-re "Connected to the arcjtag target.*$gdb_prompt $"	{
-	    verbose "Set target to arcjtag"
-	}
-	-re "$gdb_prompt $" {
-	    verbose "Retrying target arcjtag..."
-	    send_gdb "arc-reset-board\n"
-	    send_gdb "target arcjtag\n"
-
-	    gdb_expect 60 {
-		-re "A program is being debugged already.*Kill it.*y or n. $" {
-		    send_gdb "y\n"
-		    verbose "\t\tKilling previous program being debugged"
-		    exp_continue
-		}
-		-re "Connected to the arcjtag target.*$gdb_prompt $"	{
-		    verbose "Set target to arcjtag"
-		}
-		timeout { 
-		    perror "Couldn't set target to arcjtag (timeout)."
-		    return 1
-		}
-	    }
-	}
-	timeout { 
-	    perror "Couldn't set target to arcjtag (timeout)."
-	    return 1
-	}
-    }
-
-    return 0
-}
-
-#
-# gdb_load -- load a file into the debugger.
-#             return a -1 if anything goes wrong.
-#
-proc gdb_load { arg } {
-    global verbose
-    global loadpath
-    global loadfile
-    global GDB
-    global gdb_prompt
-
-    if { $arg != "" } {
-	if [gdb_file_cmd $arg] then { return -1 }
-    }
-    
-    if { [gdb_target_arcjtag] != 0 } {
-	return -1
-    }
-
-    # gotta do something about the timeout....
-    send_gdb "load\n"
-
-    gdb_expect 180 {
-	-re ".*$gdb_prompt $" {
-	    if $verbose>1 then {
-		send_user "Loaded $arg into $GDB\n"
-	    }
-	    return 0
-	}
-	-re "$gdb_prompt $" {
-	    if $verbose>1 then {
-		perror "GDB couldn't load."
-	    }
-	}
-	timeout {
-	    perror "Timed out trying to load $arg."
-	}
-    }
-
-    return 1
-}
diff --git a/gdb/testsuite/config/remote-gdbserver.exp b/gdb/testsuite/config/remote-gdbserver.exp
deleted file mode 100644
index 60d106d..0000000
--- a/gdb/testsuite/config/remote-gdbserver.exp
+++ /dev/null
@@ -1,570 +0,0 @@
-# Test framework for GDB (remote protocol) using a "gdbserver",
-# ie. a debug agent running as a native process on the same or
-# a different host.
-
-# Copyright 2000, 2001, 2003 Free Software Foundation, Inc.
-
-# 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.  
-
-# Please email any bugs, comments, and/or additions to this file to:
-# bug-gdb@prep.ai.mit.edu
-
-# This file was written by Michael Snyder. (msnyder@redhat.com)
-
-#
-# This module to be used for testing gdb with a "gdbserver" 
-# built either from libremote or from gdb/gdbserver.
-#
-
-# Load the basic testing library, and the remote stuff.
-load_lib ../config/monitor.exp
-load_lib telnet.exp
-#
-# To be addressed or set in your baseboard config file:
-#
-#   set_board_info gdb_protocol "remote"
-#	Unles you have a gdbserver that uses a different protocol...
-#
-#   set_board_info use_gdb_stub 1
-#	This tells the rest of the test suite not to do things
-#	like "run" which don't work well on remote targets.
-#
-#   set_board_info gdb,do_reload_on_run 1
-#	Unles you have a gdbserver that can handle multiple sessions.
-#
-#   set_board_info noargs 1
-#	At present there is no provision in the remote protocol
-#	for passing arguments.  This test framework does not
-#	address the issue, so it's best to set this variable
-#	in your baseboard configuration file.  
-#	FIXME: there's no reason why the test harness couldn't
-#	pass commandline args when it spawns gdbserver.
-#
-#   set_board_info gdb,noinferiorio 1
-#	Neither the traditional gdbserver nor the one in libremote
-#	can presently capture stdout and relay it to GDB via the
-#	'O' packet.  This means that tests involving printf will
-#	fail unles you set this varibale in your baseboard
-#	configuration file.
-#   
-#   set_board_info gdb,no_hardware_watchpoints 1
-#	Unles you have a gdbserver that supports hardware watchpoints.
-#	FIXME: gdb should detect if the target doesn't support them,
-#	and fall back to using software watchpoints.
-#
-#   set_board_info gdb_server_prog
-#	This will be the path to the gdbserver program you want to test.
-#	Defaults to "gdbserver".
-#
-#   set_board_info sockethost
-#	The name of the host computer whose socket is being used.
-#	Defaults to "localhost".  Note: old gdbserver requires 
-#	that you define this, but libremote/gdbserver does not.
-#
-#   set_board_info socketport
-#	Port id to use for socket connection.  If not set explicitly,
-#	it will start at "2345" and increment for each use.
-#
-#   set_board_info rsh_prog
-#	The program to use to spawn executables on the remote board.
-#	Default: "rsh"
-#
-#   set_board_info rcp_prog
-#	The program to use to copy test executables to the remote board.
-#	Default: "rcp"
-#
-#   set_board_info nfsdir
-#	If rcp_prog is set to "cp", specify the local directory name that
-#	is NFS mounted by the board.
-
-#
-# gdb_load -- load a file into the debugger.
-#             return a -1 if anything goes wrong.
-#
-
-global server_exec;
-global portnum;
-set portnum "2000";
-
-proc gdb_load { args } {
-    global server_exec;
-    global portnum;
-    global verbose;
-    global gdb_prompt;
-
-    # Port id -- either specified in baseboard file, or managed here.
-    if [target_info exists gdb,socketport] {
-	set portnum [target_info gdb,socketport];
-    } else {
-	# Bump the port number to avoid conflicts with hung ports.
-	incr portnum;
-    }
-
-    # Extract the local and remote host ids from the target board struct.
-
-    if [target_info exists sockethost] {
-	set debughost  [target_info sockethost];
-    } else {
-	set debughost "localhost:";
-    }
-    # Extract the protocol
-    if [target_info exists gdb_protocol] {
-	set protocol [target_info gdb_protocol];
-    } else {
-	set protocol "remote";
-    }
-
-    # Extract the name of the gdbserver, if known (default 'gdbserver').
-    if [target_info exists gdb_server_prog] {
-	set gdbserver [target_info gdb_server_prog];
-    } else {
-	set gdbserver "gdbserver";
-    }
-    # Extract the socket hostname
-    if [target_info exists sockethost] {
-	set sockethost [target_info sockethost];
-    } else {
-	set sockethost ""
-    }
-
-    # Get target name
-    if [target_info exists hostname] {
-	set target_address [target_info hostname];
-    } else {
-	set target_address "localhost"
-    }
-
-    # Get the username on the target
-    if [target_info exists "username"] {
-	set username [target_info username];
-    } else {
-	set username "";
-    }
-
-    # Get download dir
-    if [target_info exists download_dir] {
-	set download_dir [target_info download_dir];
-    } else {
-	set download_dir "/tmp"
-    }
-
-    # Get tests dir
-    if [target_info exists tests_dir] {
-	set tests_dir [target_info tests_dir];
-    } else {
-	set tests_dir $download_dir
-    }
-
-    # Export the host:port pair.
-    set gdbport $debughost$portnum;
-
-    if { $args == "" || $args == "{}" } {
-	if [info exists server_exec] {
-	    set args $server_exec;
-	} else {
-	    send_gdb "info files\n";
-	    gdb_expect 30 {
-		-re "Symbols from \"(\[^\"\]+)\"" {
-		    set args $expect_out(1,string);
-		    exp_continue;
-		}
-		-re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," {
-		    set args $expect_out(1,string);
-		    exp_continue;
-		}
-		-re "$gdb_prompt $" { }
-	    }
-	}
-    }
-
-    # remember new exec file 
-    set server_exec $args;
-
-    # Download the test files into the test_board
-    gdbserver_download $target_address $username $server_exec \
-	$download_dir/a-$portnum.out
-
-    # tell gdb what file we are debugging
-    if [gdb_file_cmd $args] {
-	return -1;
-    }
-
-    if [target_info exists solib_path] {
-	send_gdb "set solib-absolute-prefix [target_info solib_path]\n"
-	gdb_expect 30 {
-	    -re "$gdb_prompt $" {
-		if $verbose>1 then {
-		    send_user "set library path\n"
-		}
-	    }
-	    default { 
-		perror "Couldn't set library path\n"
-		return -1
-	    }
-	}
-    }
-
-    for {set i 1} {$i <= 3} {incr i} {
-	# Fire off the debug agent
-	set server_spawn_id [gdbserver_spawn $target_address $username \
-				 "$gdbserver $target_address:$portnum $tests_dir/a-$portnum.out 2>&1"]
-	
-	if { $server_spawn_id <= 0 } { return -1 }
-
-	# Wait for the server to produce at least one line and an additional
-	# character of output.  This will wait until any TCP socket has been
-	# created, so that GDB can connect.
-	expect {
-	    # expect output from $server_spawn_id
-	    -i $server_spawn_id
-	    -re ".*\n." { }
-	}
-    
-	# We can't just call close, because if gdbserver is local then that means
-	# that it will get a SIGHUP.  Doing it this way could also allow us to
-	# get at the inferior's input or output if necessary, and means that we
-	# don't need to redirect output.
-	expect_background {
-	   -i $server_spawn_id
-	   -re "." { }
-	   eof {
-	       # The spawn ID is already closed now (but not yet waited for).
-	       wait -nowait -i $expect_out(spawn_id)
-	   }
-	}
-	
-	# attach to the "serial port"
-	if {[gdb_target_cmd $protocol $gdbport] == 0 } {
-	    break
-	}
-	verbose -log "Unable to connect to target. Re-trying.."
-    }	
-
-    # do the real load if needed
-    if [target_info exists gdb_server_do_load] {
-        send_gdb "load\n"
-        set timeout 2400
-        verbose "Timeout is now $timeout seconds" 2
-        gdb_expect {
-            -re ".*$gdb_prompt $" {
-                if $verbose>1 then {
-                    send_user "Loaded $arg into $GDB\n"
-                }
-                set timeout 30
-                verbose "Timeout is now $timeout seconds" 2
-                return 1
-            }
-            -re "$gdb_prompt $"     {
-                if $verbose>1 then {
-                    perror "GDB couldn't load."
-                }
-            }
-            timeout {
-                if $verbose>1 then {
-                    perror "Timed out trying to load $arg."
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-
-# Use RSH or telnet depending on the program chosen
-# by the board file. 
-# Return spawn_id
-proc gdbserver_spawn { dest username commandline } {
-    global board_info 
-    if ![target_info exists rsh_prog] {
-        if { [which remsh] != 0 } {
-            set RSH remsh
-        } else {
-            set RSH rsh
-        }
-    } else {
-        set RSH [target_info rsh_prog];
-    }
-
-    if { $RSH == "rsh" } {
-	return [rsh_gdbserver_spawn $dest $username $commandline]
-    } else {
-
-	if { $RSH == "telnet" } {
-	    # Spawn the shell
-	    return [telnet_gdbserver_spawn $dest $username $commandline]
-	    
-	    # expect the shell prompt obtained from 
-	    # the board description.
-	    # Now spawn gdbserver with its parameters
-	    # and dont expect any output from the gdbserver
-	    # other than the shell prompt
-	    # FIXME ?? Where do I close the telnet
-	    # session ( could use gdb_finish for closing the telnet session)
-
-	    
-
-	} else {
-	    verbose "Unknown rsh program "
-	    return -1
-	}
-    }
-}
-
-proc mynewtelnet_open_and_exec {  dest port shell_prompt commandline } {
-    global board_info
-    
-    spawn "telnet-exec.exp" $dest $commandline
-    set board_info($dest,fileid) $spawn_id;
-    return $spawn_id;
-}
-
-
-proc mytelnet_open_and_exec {  dest port shell_prompt commandline } {
-    set tries 0
-    set result -1
-    set need_respawn 1
-    
-    verbose "Starting a telnet connection to $dest:$port $shell_prompt " 2
-    while { $result < 0 && $tries <= 3 } {
-	if { $need_respawn } {
-	    set need_respawn 0
-	    spawn "telnet" $dest $port
-	}
-	expect {
-	    "Trying " {
-		exp_continue
-	    }
-	    -re "$shell_prompt.*$" {
-		verbose "Got prompt $shell_prompt\n"
-		set result 0
-		exp_send $commandline
-	   
-	    }
-	    -re "nt Name:|ogin:" {
-		if [board_info $connhost exists telnet_username] {
-		    exp_send "[board_info $connhost telnet_username]\n"
-		    exp_continue
-		}
-		if [board_info $connhost exists username] {
-		    exp_send "[board_info $connhost username]\n"
-		    exp_continue
-		}
-		perror "telnet: need to login"
-		break
-	    }
-	    "assword:" {
-		if [board_info $connhost exists telnet_password] {
-		    exp_send "[board_info $connhost telnet_password]\n"
-		    exp_continue
-		}
-		if [board_info $connhost exists password] {
-		    exp_send "[board_info $connhost password]\n"
-		    exp_continue
-		}
-		perror "telnet: need a password"
-		break
-	    }
-	    -re "advance.*y/n.*\\?" {
-		exp_send "n\n"
-		exp_continue
-	    }
-	    -re {([Aa]dvanced|[Ss]imple) or ([Ss]imple|[Aa]dvanced)} {
-		exp_send "simple\n"
-		exp_continue
-	    }
-	    "Connected to" {
-		exp_continue
-	    }
-	    "unknown host" {
-		exp_send "\003"
-		perror "telnet: unknown host"
-		break
-	    }
-	    "VxWorks Boot" {
-		exp_send "@\n"
-		sleep 20
-		exp_continue
-	    }
-	    -re "Escape character is.*\\.\[\r\n\]" {
-		    exp_continue
-	    }
-	    "has logged on from" {
-		exp_continue
-	    }
-	    "You have no Kerberos tickets" {
-		warning "telnet: no kerberos Tickets, please kinit"
-		break
-	    }
-	    -re "Connection refused.*$" {
-		catch "exp_send \"\003\"" foo
-		sleep 5
-		warning "telnet: connection refused."
-	    }
-	    -re "Sorry, this system is engaged.*" {
-		exp_send "\003"
-		warning "telnet: already connected."
-	    }
-	    "Connection closed by foreign host.*$" {
-		warning "telnet: connection closed by foreign host."
-		break
-	    }
-	    -re "\[\r\n\]+" {
-		exp_continue
-	    }
-	    timeout {
-		exp_send "\n"
-	    }
-	    eof {
-		warning "telnet: got unexpected EOF from telnet."
-		catch close
-		catch wait
-		set need_respawn 1
-		sleep 5
-	    }
-	}
-	incr tries
-    }
-
-    
-    verbose "spawn id is $spawn_id"
-    set board_info($dest,fileid) $spawn_id;
-    return $spawn_id
-}
-
-# Use telnet to spawn a session 
-proc telnet_gdbserver_spawn { dest username commandline } {
-    global board_info
-    set remote $dest
-    set telnet_prog "telnet"
-    set prompt [target_info shell_prompt]
-    set mport 23 
-    verbose "commandline is $commandline"
-    return [mynewtelnet_open_and_exec $remote $mport $prompt $commandline]
-}
-
-
-#
-# Use $RSH to spawn $commandline on remote machine $dest as user $username.
-# (Note $username on $dest will have to have appropriate .rhost entries.)
-#
-proc rsh_gdbserver_spawn { dest username commandline } {
-    global board_info
-
-    if [target_info exists rsh_prog] {
-	set RSH [target_info rsh_prog];
-    } else {
-        set RSH rsh
-    }
-
-    if [board_info $dest exists hostname] {
-	set remote [board_info $dest hostname];
-    } else {
-	set remote $dest;
-    }
-
-    if { $username == "" } {
-	set rsh_useropts ""
-    } else {
-	set rsh_useropts "-l"
-    }
-
-    verbose "spawn $RSH $rsh_useropts $username $remote $commandline";
-    spawn $RSH $rsh_useropts $username $remote $commandline;
-    set board_info($dest,fileid) $spawn_id;
-
-    set timeout 60
-    expect {
-	# expect output from $spawn_id
-	-i $spawn_id
-	-re "(.*No route to host)|(poll: protocol failure in circuit setup)|(.*Unknown host)|(.*Connection refused)|(Login incorrect)|(Permission denied)" {
-	    verbose -log "$RSH to $remote failed, output \"$expect_out(buffer)\""
-	    return -1
-	}
-	-re ".*\r" { }
-	timeout {
-	    verbose -log "$RSH to $remote timedout (timeout=$timeout)"
-	    return -1
-	}
-	eof {
-	    verbose -log "$RSH to $remote failed"	    
-	    return -1
-	}
-    }
-
-    return $spawn_id;
-}
-
-#
-# Download $srcfile to $destfile on $desthost as user $username using rcp.
-#
-
-proc gdbserver_download {desthost username srcfile destfile} {
-    if [target_info exists rsh_prog] {
-	set RSH [target_info rsh_prog];
-    } else {
-        set RSH rsh
-    }
-
-    if ![target_info exists rcp_prog] {
-        set RCP rcp
-    } else {
-	set RCP [target_info rcp_prog];
-    }
-
-    if [board_info $desthost exists name] {
-	set desthost [board_info $desthost name];
-    }
-
-    if [board_info $desthost exists hostname] {
-	set desthost [board_info $desthost hostname];
-    }
-
-    if { $username == "" } {
-	set rsh_useropts ""
-	set rcp_dest $desthost
-    } else {
-	set rsh_useropts "-l $username"
-	set rcp_dest "$username@$desthost"
-    }
-
-    # Delete the output file
-    # set status [catch "exec $RSH $rsh_useropts $desthost rm -f $destfile |& cat" output] 
-
-    if { $RCP != "cp" } {
-	set status [catch "exec $RCP $srcfile $rcp_dest:$destfile |& cat" output]
-    } else {
-	if [target_info exists nfsdir] {
-	    set nfsdir [target_info nfsdir];
-	    verbose -log "nfsdir is  $nfsdir"
-	    set status [catch "exec cp $srcfile $nfsdir/$destfile |& cat" output]
-	} else {
-	    verbose "\nnfsdir not set\n"
-	    set status 1
-	}
-    }
-    if { $status == 0 } {
-	if [target_info exists nfsdir] {
-	    verbose "Copied $srcfile to $nfsdir/$destfile" 2
-	    return $destfile;
-	} else {
-	    verbose "Copied $srcfile to $desthost:$destfile" 2
-	    return $destfile;
-	}
-    } else {
-	verbose "Download to $desthost failed, $output."
-	return ""
-    }
-}
diff --git a/gdb/testsuite/gdb.arch/arc-step-jtag.exp b/gdb/testsuite/gdb.arch/arc-step-jtag.exp
deleted file mode 100644
index a51f00e..0000000
--- a/gdb/testsuite/gdb.arch/arc-step-jtag.exp
+++ /dev/null
@@ -1,88 +0,0 @@
-if $tracelevel {
-    strace $tracelevel
-}
-
-# Test single-stepping zero-overhead-loops and delay slots
-
-if ![istarget "arc-*-*"] then {
-    verbose "Skipping ARC single-step tests."
-    return
-}
-
-if ![istarget "*elf32*"] then {
-    verbose "Skipping ARC JTAG single-step tests."
-    return
-}
-
-set testfile "arc-step-jtag"
-set srcfile ${testfile}.s
-set binfile ${objdir}/${subdir}/${testfile}
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ""] != "" } {
-    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-
-if { [ gdb_load ${binfile} ] != 0 } {
-    gdb_suppress_entire_file "Load failed, so all tests in this file will automatically fail."
-}
-
-#
-# Run to `main' where we begin our tests.
-#
-
-gdb_test "adv _main" 	".* in _main .*"  "advance to _main"
-
-gdb_test "stepi"     	".* Lmov .*"      "step mov instruction"
-gdb_test "p \$r0"    	".*= 1"           "r0 value after mov instruction"
-
-gdb_test "stepi"     	".* Lmov_s .*"    "step mov_s instruction"
-gdb_test "p \$r0"    	".*= 2"           "r0 value after mov_s instruction"
-
-gdb_test "stepi"     	".* Lb .*"        "step b instruction"
-
-gdb_test "stepi"     	".* Lb_s .*"      "step b_s instruction"
-
-gdb_test "stepi"     	".* Lbdotd_dslot .*"    "step b.d branch"
-gdb_test "stepi"     	".* Lbdotd .*"          "step b.d delay slot"
-gdb_test "p \$r0"    	".*= 5"                 "r0 value after b.d delay slot"
-
-gdb_test "stepi"     	".* Lbl .*"       "step bl instruction"
-
-gdb_test "stepi"     	".* Lj_sdotd_dslot .*"  "step j_s.d \[blink\] branch"
-gdb_test "stepi"     	".* Lj_sdotd .*"        "step j_s.d \[blink\] delay slot"
-gdb_test "p \$r0"    	".*= 6"                 "r0 value after j_s.d \[blink\] delay slot"
-
-gdb_test "stepi"     	".* Lj .*"        "step j instruction"
-
-gdb_test "stepi"     	".*"              "step mov instruction"
-gdb_test "stepi"     	".* ZOLstart .*"  "step lp instruction"
-
-gdb_test "p \$lp_count" ".*= 3"           "lp_count value"
-gdb_test "p \$lp_end - \$lp_start" \
-                        ".* = 8"          "lp_end - lp_start == 8"
-
-gdb_test "p \$r0"       ".* = 6"          "r0 value before loop"
-
-# step thru the loop, checking the value of r0
-
-# first iteration
-gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
-gdb_test "p \$r0"       ".* = 7"          "r0 value after 1 iteration"
-gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
-
-# second iteration
-gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
-gdb_test "p \$r0"       ".* = 8"          "r0 value after 2 iterations"
-gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
-
-# last iteration
-gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
-gdb_test "p \$r0"       ".* = 9"          "r0 value after 3 iterations"
-gdb_test "stepi"        ".* ZOLend .*"    "step out of end of ZOL"
-
-# exit(r0)
-gdb_test "continue"     ".*Program exited.*011.*" \
-                                          "value of r0 on exit"
diff --git a/gdb/testsuite/gdb.arch/arc-step-jtag.s b/gdb/testsuite/gdb.arch/arc-step-jtag.s
deleted file mode 100644
index 7ad8e1f..0000000
--- a/gdb/testsuite/gdb.arch/arc-step-jtag.s
+++ /dev/null
@@ -1,46 +0,0 @@
-_main:
-	.global _main
-main:	
-	.global main
-
-	mov   r0,1		; 32 bit instruction
-Lmov:	
-	mov_s r0,2		; 16 bit instruction
-Lmov_s:	
-	b Lb			; 32 bit, no delay slot
-	mov r0,3
-	nop
-Lb:	
-	b_s Lb_s		; 16 bit, no delay slot
-	mov r0,4
-	nop
-Lb_s:	
-	b.d Lbdotd		; 32 bit, delay slot
-Lbdotd_dslot:
-	mov r0,5
-	nop
-Lbdotd:
-
-	bl Lbl
-Lj_sdotd:
-	j Lj
-Lbl:	
-	j_s.d [blink]		; 16 bit, delay slot
-Lj_sdotd_dslot:
-	mov r0,6
-Lj:	
-	mov lp_count,3		; zero-overhead loop
-	lp ZOLend
-ZOLstart:
-	add r0,r0,1
-ZOLmiddle:
-	nop
-ZOLend:	
-	;; r0 should be 9
-	
-	
-	;; exit(r0)
-	flag 1
-	nop
-	nop
-	nop
diff --git a/gdb/testsuite/gdb.arch/arc-step.exp b/gdb/testsuite/gdb.arch/arc-step.exp
deleted file mode 100644
index e958b5f..0000000
--- a/gdb/testsuite/gdb.arch/arc-step.exp
+++ /dev/null
@@ -1,83 +0,0 @@
-if $tracelevel {
-    strace $tracelevel
-}
-
-# Test single-stepping zero-overhead-loops and delay slots
-
-if ![istarget "arc-*-*"] then {
-    verbose "Skipping ARC single-step tests."
-    return
-}
-
-if ![istarget "*linux*"] then {
-    verbose "Skipping ARC linux single-step tests."
-    return
-}
-
-set testfile "arc-step"
-set srcfile ${testfile}.s
-set binfile ${objdir}/${subdir}/${testfile}
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ""] != "" } {
-    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
-#
-# Run to `main' where we begin our tests.
-#
-
-gdb_test "adv _main" 	".* in _main .*"  "advance to _main"
-
-gdb_test "stepi"     	".* Lmov .*"      "step mov instruction"
-gdb_test "p \$r0"    	".*= 1"           "r0 value after mov instruction"
-
-gdb_test "stepi"     	".* Lmov_s .*"    "step mov_s instruction"
-gdb_test "p \$r0"    	".*= 2"           "r0 value after mov_s instruction"
-
-gdb_test "stepi"     	".* Lb .*"        "step b instruction"
-
-gdb_test "stepi"     	".* Lb_s .*"      "step b_s instruction"
-
-gdb_test "stepi"     	".* Lbdotd .*"    "step b.d instruction"
-gdb_test "p \$r0"    	".*= 5"           "r0 value after b.d instruction"
-
-gdb_test "stepi"     	".* Lbl .*"       "step bl instruction"
-
-gdb_test "stepi"     	".* Lj_sdotd .*"  "step j_s.d \[blink\] instruction"
-gdb_test "p \$r0"    	".*= 6"           "r0 value after j_s.d \[blink\] instruction"
-
-gdb_test "stepi"     	".* Lj .*"        "step j instruction"
-
-gdb_test "stepi"     	".*"              "step mov instruction"
-gdb_test "stepi"     	".* ZOLstart .*"  "step lp instruction"
-
-gdb_test "p \$lp_count" ".*= 3"           "lp_count value"
-gdb_test "p \$lp_end - \$lp_start" \
-                        ".* = 8"          "lp_end - lp_start == 8"
-
-gdb_test "p \$r0"       ".* = 6"          "r0 value before loop"
-
-# step thru the loop, checking the value of r0
-
-# first iteration
-gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
-gdb_test "p \$r0"       ".* = 7"          "r0 value after 1 iteration"
-gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
-
-# second iteration
-gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
-gdb_test "p \$r0"       ".* = 8"          "r0 value after 1 iteration"
-gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
-
-# last iteration
-gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
-gdb_test "p \$r0"       ".* = 9"          "r0 value after 1 iteration"
-gdb_test "stepi"        ".* ZOLend .*"    "step out of end of ZOL"
-
-# exit(r0)
-gdb_test "continue"     ".*Program exited.*011.*" \
-                                          "value of r0 on exit"
diff --git a/gdb/testsuite/gdb.arch/arc-step.s b/gdb/testsuite/gdb.arch/arc-step.s
deleted file mode 100644
index 8dce39a..0000000
--- a/gdb/testsuite/gdb.arch/arc-step.s
+++ /dev/null
@@ -1,43 +0,0 @@
-_main:
-	.global _main
-main:	
-	.global main
-
-	mov   r0,1		; 32 bit instruction
-Lmov:	
-	mov_s r0,2		; 16 bit instruction
-Lmov_s:	
-	b Lb			; 32 bit, no delay slot
-	mov r0,3
-	nop
-Lb:	
-	b_s Lb_s		; 16 bit, no delay slot
-	mov r0,4
-	nop
-Lb_s:	
-	b.d Lbdotd		; 32 bit, delay slot
-	mov r0,5
-	nop
-Lbdotd:
-
-	bl Lbl
-Lj_sdotd:
-	j Lj
-Lbl:	
-	j_s.d [blink]		; 16 bit, delay slot
-	mov r0,6
-Lj:	
-	mov lp_count,3		; zero-overhead loop
-	lp ZOLend
-ZOLstart:
-	add r0,r0,1
-ZOLmiddle:
-	nop
-ZOLend:	
-	;; r0 should be 9
-	
-	
-	;; exit(r0)
-	;; mov r0,0
-	mov r8,1
-	trap_s 0
diff --git a/gdb/testsuite/gdb.asm/arc.inc b/gdb/testsuite/gdb.asm/arc.inc
deleted file mode 100644
index e22c35c..0000000
--- a/gdb/testsuite/gdb.asm/arc.inc
+++ /dev/null
@@ -1,55 +0,0 @@
-
-	comment "subroutine prologue"
-	.macro gdbasm_enter
-	st.a    blink,[sp,-4]
-	st.a	fp, [sp,-4]
-	mov	fp,sp
-	.endm
-
-	comment "subroutine epilogue"
-	.macro gdbasm_leave
-	ld.ab  fp, [sp,4]
-	ld     blink,[sp,0]
-	j.d    [blink]
-	add    sp,sp,4
-	.endm
-
-	.macro gdbasm_call subr
-	bl	\subr
-	.endm
-
-	.macro gdbasm_several_nops
-	nop
-	nop
-	nop
-	nop
-	.endm
-
-	comment "exit (0)"
-	.macro gdbasm_exit0
-	mov_s    r0,0
-	trap_s	 0
-	.endm
-
-	comment "crt0 startup"
-	.macro gdbasm_startup
-	mov    fp, 0
-	.endm
-
-	comment "Declare a data variable"
-	.macro gdbasm_datavar name value
-	.data
-\name:
-	.long	\value
-	.endm
-
-	comment "Declare the start of a subroutine"
-	.macro gdbasm_declare name
-	.type	\name, @function
-\name:
-	.endm
-
-	comment "End a subroutine"
-	.macro gdbasm_end name
-	.size	\name, .-name
-	.endm
diff --git a/gdb/testsuite/gdb.asm/asm-source.exp b/gdb/testsuite/gdb.asm/asm-source.exp
index a94fd98..0f531a9 100644
--- a/gdb/testsuite/gdb.asm/asm-source.exp
+++ b/gdb/testsuite/gdb.asm/asm-source.exp
@@ -48,12 +48,6 @@
     "*arm-*-*" {
         set asm-arch arm
     }
-    "arc-*-*" {
-	set asm-arch arc
-        set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
-	set debug-flags "-gdwarf-2"
-	append link-flags " -marclinux"
-    }
     "xscale-*-*" {
         set asm-arch arm
     }
diff --git a/gdb/testsuite/gdb.base/callfuncs.exp b/gdb/testsuite/gdb.base/callfuncs.exp
index 1a4da6e..de1f647 100644
--- a/gdb/testsuite/gdb.base/callfuncs.exp
+++ b/gdb/testsuite/gdb.base/callfuncs.exp
@@ -266,6 +266,15 @@
 	    }
 	    exp_continue
 	}
+        -re "^COUNT0\[ \t\]+\[^\r\n\]+\[\r\n\]+" {
+            if [istarget "arc*"] {
+                # Filter out COUNT0 which is an instruction counter on the simulator,
+                # giving spurious differences.
+            } else {
+                lappend all_registers_lines $expect_out(0,string)
+            }
+            exp_continue
+        }
 	-re "^\[^ \t\]+\[ \t\]+\[^\r\n\]+\[\r\n\]+" {
 	    lappend all_registers_lines $expect_out(0,string)
 	    exp_continue
diff --git a/gdb/testsuite/gdb.base/float.exp b/gdb/testsuite/gdb.base/float.exp
index ca84466..e0f0d9f 100644
--- a/gdb/testsuite/gdb.base/float.exp
+++ b/gdb/testsuite/gdb.base/float.exp
@@ -97,8 +97,6 @@
     gdb_test "info float" "fr4.*fr4R.*fr31R.*" "info float"
 } elseif [istarget "sparc*-*-*"] then {
     gdb_test "info float" "f0.*f1.*f31.*d0.*d30.*" "info float"
-} elseif [istarget "arc*-*-*"] then {
-    gdb_test "info float" "Software FPU.*"
 } else {
     gdb_test "info float" "No floating.point info available for this processor." "info float (unknown target)"
 }
diff --git a/gdb/testsuite/gdb.base/relocate.exp b/gdb/testsuite/gdb.base/relocate.exp
index 46f7ab6..a7beba9 100644
--- a/gdb/testsuite/gdb.base/relocate.exp
+++ b/gdb/testsuite/gdb.base/relocate.exp
@@ -78,7 +78,7 @@
 
 # Make sure they have different addresses.
 if { "${static_foo_addr}" == "${static_bar_addr}" } {
-  fail "static variables have different addresses"
+  fail "static variables have same address"
 } else {
   pass "static variables have different addresses"
 }
@@ -89,7 +89,7 @@
 
 # Make sure they have different addresses.
 if { "${global_foo_addr}" == "${global_bar_addr}" } {
-  fail "global variables have different addresses"
+  fail "global variables have same address"
 } else {
   pass "global variables have different addresses"
 }
@@ -100,7 +100,7 @@
 
 # Make sure they have different addresses.
 if { "${function_foo_addr}" == "${function_bar_addr}" } {
-  fail "functions have different addresses"
+  fail "functions have same address"
 } else {
   pass "functions have different addresses"
 }
@@ -126,7 +126,7 @@
 
 # Make sure they have different addresses.
 if { "${function_foo_addr}" == "${new_function_foo_addr}" } {
-  fail "function foo has a different address"
+  fail "function foo has the same address"
 } else {
   pass "function foo has a different address"
 }
diff --git a/gdb/testsuite/lib/arc-gdbserver.exp b/gdb/testsuite/lib/arc-gdbserver.exp
deleted file mode 100644
index 6674e92..0000000
--- a/gdb/testsuite/lib/arc-gdbserver.exp
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
-# Foundation, Inc.
-#
-# This file is part of DejaGnu.
-#
-# DejaGnu 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.
-#
-# DejaGnu 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 DejaGnu; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-# gdbserver running cross
-
-#load the config file
-load_generic_config "remote-gdbserver"
-
-
-process_multilib_options ""
-
-# The default compiler for this target.
-set_board_info compiler  "$env(GDBTEST_CC)"
-set_board_info cflags    "$env(GDBTEST_CFLAGS)"
-set_board_info assembler "$env(GDBTEST_AS) $env(GDBTEST_ASFLAGS)"
-set_board_info linker    "$env(GDBTEST_LD)" 
-set_board_info ldflags   "$env(GDBTEST_LDFLAGS)"
-
-# We will be using the standard GDB remote protocol
-set_board_info gdb_protocol "remote"
-
-set_board_info netport "$env(GDBTEST_GDBSERVER_HOST):$env(GDBTEST_GDBSERVER_PORT)"
-
-# Path to the gdbserver executable, if required.
-set_board_info gdb_server_prog $env(GDBTEST_GDBSERVER_PATH)
-#    "../gdbserver/gdbserver"
-
-# Name of the computer whose socket will be used, if required.
-set_board_info sockethost "$env(GDBTEST_GDBSERVER_HOST):"
-
-# Port ID to use for socket connection
-set_board_info gdb,socketport $env(GDBTEST_GDBSERVER_PORT)
-
-# Use techniques appropriate to a stub
-set_board_info use_gdb_stub 1
-
-# This gdbserver can only run a process once per session.
-set_board_info gdb,do_reload_on_run 1
-
-# There's no support for argument-passing (yet).
-set_board_info noargs 1
-
-# Can't do FILE IO in current gdbserver
-set_board_info gdb,nofileio 1
-
-# Can't do input (or output) in the current gdbserver.
-set_board_info gdb,noinferiorio 1
-
-# Can't do hardware watchpoints, in general
-set_board_info gdb,no_hardware_watchpoints 1
-
-# Copy the testcases using cp 
-set_board_info rcp_prog "cp"
-
-
-# Set nfs directory 
-# On my machine this is how it is mounted. - ramana
-# kanika:/home/opt/share on /mnt/nfsmounts type nfs (rw,addr=192.168.100.68)
-set_board_info nfsdir $env(GDBTEST_NFSDIR)
-
-# Set the test directory on the board. Where is this mounted 
-# on the board. 
-set_board_info tests_dir $env(GDBTEST_TESTS_DIR)
-
-# run on target using rsh
-set_board_info rsh_prog "rsh"
-
-# Download directory
-set_board_info download_dir $env(GDBTEST_DOWNLOAD_DIR)
-
-# Hostname 
-set_board_info hostname $env(GDBTEST_GDBSERVER_HOST)
-set_board_info username "root"
-set_board_info sockethost "$env(GDBTEST_GDBSERVER_HOST):"
-
-#Shell prompt
-set_board_info shell_prompt "\[arcLinux\]$"
-
-#set_board_info board,connect "telnet"
-
-# timeout
-#set_board_info gdb,timeout 300
diff --git a/gdb/testsuite/lib/arc-jtag.exp b/gdb/testsuite/lib/arc-jtag.exp
deleted file mode 100644
index c613f30..0000000
--- a/gdb/testsuite/lib/arc-jtag.exp
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# The baseboard file for the arcjtag target
-#
-
-load_generic_config "arc-jtag"
-
-set_board_info compiler  "$env(GDBTEST_CC)"
-set_board_info cflags    "$env(GDBTEST_CFLAGS)"
-set_board_info assembler "$env(GDBTEST_AS) $env(GDBTEST_ASFLAGS)"
-set_board_info linker    "$env(GDBTEST_LD)"
-set_board_info ldflags   "$env(GDBTEST_LDFLAGS)"
-
-#Reload the file before running
-set_board_info gdb,do_reload_on_run 1
-
-#Arguments cannot be passed
-set_board_info noargs               1
-
-#File IO not supported
-set_board_info gdb,nofileio         1
-
-#Inferior is unable to do I/O
-set_board_info gdb,noinferiorio     1
-
-#Signals not supported
-set_board_info gdb,nosignals        1
-
-#Skip the huge.exp test
-set_board_info gdb,skip_huge_test   1
-
-#We use "target arcjtag" to talk to JTAG
-set_board_info gdb_protocol         "arcjtag"
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index cbfa253..edf52e0 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -191,7 +191,21 @@
 proc gdb_run_cmd {args} {
     global gdb_prompt
 
-    if [target_info exists gdb_init_command] {
+
+    send_gdb "target sim\n"
+    gdb_expect 120 {
+        -re "Connected to the simulator.*$gdb_prompt $" {
+	    verbose "Connected to simulator." 2
+        }
+    }
+
+    send_gdb "load\n"
+    gdb_expect 120 {
+        -re ".*$gdb_prompt $" {
+        }
+    }
+
+  if [target_info exists gdb_init_command] {
 	send_gdb "[target_info gdb_init_command]\n";
 	gdb_expect 30 {
 	    -re "$gdb_prompt $" { }
diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp
index 73de76f..6fbaa22 100644
--- a/gdb/testsuite/lib/gdbserver-support.exp
+++ b/gdb/testsuite/lib/gdbserver-support.exp
@@ -250,10 +250,6 @@
 proc gdbserver_spawn { child_args } {
     set target_exec [gdbserver_download]
 
-    if [target_info exists tests_dir] {
-        set tests_dir [target_info tests_dir]
-        set gdbserver_server_exec $tests_dir/$gdbserver_server_exec
-    }
     # Fire off the debug agent.  This flavour of gdbserver takes as
     # arguments the port information, the name of the executable file to
     # be debugged, and any arguments.
diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp
index a67b0cc..99cc80b 100644
--- a/gdb/testsuite/lib/mi-support.exp
+++ b/gdb/testsuite/lib/mi-support.exp
@@ -773,6 +773,19 @@
     }
     global mi_gdb_prompt
 
+    send_gdb "target sim\n"
+    gdb_expect 120 {
+        -re "Connected to the simulator.*$gdb_prompt $" {
+	    verbose "Connected to simulator." 2
+        }
+    }
+
+    send_gdb "load\n"
+    gdb_expect 120 {
+        -re ".*$gdb_prompt $" {
+         }
+    }
+
     if [target_info exists gdb_init_command] {
 	send_gdb "[target_info gdb_init_command]\n";
 	gdb_expect 30 {
diff --git a/gdb/testsuite/lib/telnet-exec.exp b/gdb/testsuite/lib/telnet-exec.exp
deleted file mode 100644
index 8bbaa8d..0000000
--- a/gdb/testsuite/lib/telnet-exec.exp
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/expect -f 
-
-#
-#
-#
-
-
-set host "192.168.100.222"
-set debuggee [lindex $argv 0]
-
-set timeout 360
-set env(TERM) vt100;			# actual value doesn't matter, just has to be set
-
-spawn telnet $host
-sleep 1;				# wait for telnet to happen
-send "PS1=\\# \r"
-expect "\# "
-#expect "\[arcLinux\]\$"
-#send_user "one\n"
-
-
-send "cd /nfs/gdbserver-tests/ \r"
-expect "\# "
-#expect "\[arcLinux\]\$"
-send_user "starting gdbserver...\n"
-send "./gdbserver host:4004 /nfs/gdbserver-tests/ramana-tests/a-4004.out \r"
-
-expect "xxx"
-send "exit"
\ No newline at end of file
diff --git a/gdb/version.in b/gdb/version.in
index 99b56c2..21afad3 100644
--- a/gdb/version.in
+++ b/gdb/version.in
@@ -1 +1 @@
-6.8-arc-20070620
+6.8
diff --git a/include/dis-asm.h b/include/dis-asm.h
index bfe95b1..adcfdf6 100644
--- a/include/dis-asm.h
+++ b/include/dis-asm.h
@@ -210,7 +210,6 @@
 typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *);
 
 extern int print_insn_alpha		(bfd_vma, disassemble_info *);
-extern int print_insn_arc		(bfd_vma, disassemble_info *);
 extern int print_insn_avr		(bfd_vma, disassemble_info *);
 extern int print_insn_bfin		(bfd_vma, disassemble_info *);
 extern int print_insn_big_arm		(bfd_vma, disassemble_info *);
@@ -284,7 +283,7 @@
 extern int print_insn_z8001		(bfd_vma, disassemble_info *);
 extern int print_insn_z8002		(bfd_vma, disassemble_info *);
 
-extern disassembler_ftype arc_get_disassembler (bfd *);
+extern disassembler_ftype arc_get_disassembler (void *);
 extern disassembler_ftype cris_get_disassembler (bfd *);
 
 extern void print_i386_disassembler_options (FILE *);
diff --git a/include/elf/dwarf2.h b/include/elf/dwarf2.h
index 14da6b3..371a038 100644
--- a/include/elf/dwarf2.h
+++ b/include/elf/dwarf2.h
@@ -757,9 +757,7 @@
     /* GNU extensions.  */
     DW_CFA_GNU_window_save = 0x2d,
     DW_CFA_GNU_args_size = 0x2e,
-    DW_CFA_GNU_negative_offset_extended = 0x2f,
-    /* Metaware High C compiler extensions. */
-    DW_CFA_MWARC_info = 0x34
+    DW_CFA_GNU_negative_offset_extended = 0x2f
   };
 
 #define DW_CIE_ID	  0xffffffff
diff --git a/include/gdb/callback.h b/include/gdb/callback.h
index edddc4a..5ae1d00 100644
--- a/include/gdb/callback.h
+++ b/include/gdb/callback.h
@@ -320,14 +320,6 @@
 int cb_is_stdout PARAMS ((host_callback *, int));
 int cb_is_stderr PARAMS ((host_callback *, int));
 
-/* Utility of cb_syscall to fetch a path name.
-   The buffer is malloc'd and the address is stored in BUFP.
-   The result is that of get_string, but prepended with
-   simulator_sysroot if the string starts with '/'.
-   If an error occurs, no buffer is left malloc'd.  */
-#define TADDR unsigned long
-int get_path PARAMS ((host_callback *, CB_SYSCALL *, TADDR, char **));
-
 /* Perform a system call.  */
 CB_RC cb_syscall PARAMS ((host_callback *, CB_SYSCALL *));
 
diff --git a/include/opcode/arc.h b/include/opcode/arc.h
index 184a081..3c3f5eb 100644
--- a/include/opcode/arc.h
+++ b/include/opcode/arc.h
@@ -174,8 +174,8 @@
 
 struct arc_ext_operand_value {
   struct arc_ext_operand_value *next;
-  struct arc_operand_value operand;
-};
+  struct arc_operand_value     operand;
+} *arc_ext_operands;
 
 /* List of extension condition codes, core registers and auxiliary registers.
    Calls to gas/config/tc-arc.c:arc_extoper built up this list.  */
@@ -357,14 +357,24 @@
 		   const struct arc_operand_value **opval, int *invalid);
 };
 
-enum 
+enum
 {
   BR_exec_when_no_jump,
   BR_exec_always,
   BR_exec_when_jump
 };
+enum ARC_Debugger_OperandType
+{
+    ARC_UNDEFINED,
+    ARC_LIMM,
+    ARC_SHIMM,
+    ARC_REGISTER, 
+    ARCOMPACT_REGISTER /* Valid only for the 
+			  registers allowed in
+			  16 bit mode */
+};
 
-enum Flow 
+enum Flow
 {
   noflow,
   direct_jump,
@@ -377,7 +387,7 @@
 enum { no_reg = 99 };
 enum { allOperandsSize = 256 };
 
-struct arcDisState 
+struct arcDisState
 {
   void *_this;
   int instructionLen;
@@ -386,7 +396,7 @@
   const char *(*auxRegName)(void*, int);
   const char *(*condCodeName)(void*, int);
   const char *(*instName)(void*, int, int, int*);
-  
+
   unsigned char* instruction;
   unsigned index;
   const char *comm[6]; /* instr name, cond, NOP, 3 operands */
@@ -462,8 +472,6 @@
 extern const struct arc_operand arc_operands_ac[];
 extern const struct arc_operand *arc_operands;
 extern int arc_operand_count;
-extern /*const*/ struct arc_opcode arc_opcodes[];
-extern const int arc_opcodes_count;
 extern const struct arc_operand_value arc_suffixes_a4[];
 extern const struct arc_operand_value arc_suffixes_ac[];
 extern const struct arc_operand_value *arc_suffixes;
diff --git a/intl/aclocal.m4 b/intl/aclocal.m4
index 5dac235..06d78e3 100644
--- a/intl/aclocal.m4
+++ b/intl/aclocal.m4
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.9.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
 # This file 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.
diff --git a/intl/configure b/intl/configure
index 1a03102..aa20f13 100755
--- a/intl/configure
+++ b/intl/configure
@@ -1,81 +1,35 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59.
+# Generated by GNU Autoconf 2.61.
 #
-# Copyright (C) 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -96,124 +50,466 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
   fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
+  case $as_dir in
 	 /*)
-	   if ("$as_dir/$as_base" -c '
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
+  chmod +x "$as_me.lineno" ||
     { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -222,7 +518,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -231,39 +548,27 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
 
-# CDPATH.
-$as_unset CDPATH
-
+exec 7<&0 </dev/null 6>&1
 
 # Name of the host.
 # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
-exec 6>&1
-
 #
 # Initializations.
 #
 ac_default_prefix=/usr/local
+ac_clean_files=
 ac_config_libobj_dir=.
+LIBOBJS=
 cross_compiling=no
 subdirs=
 MFLAGS=
 MAKEFLAGS=
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
 # Identity of this package.
 PACKAGE_NAME=
 PACKAGE_TARNAME=
@@ -275,42 +580,141 @@
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
-#if HAVE_SYS_TYPES_H
+#ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
-#if HAVE_SYS_STAT_H
+#ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #endif
-#if STDC_HEADERS
+#ifdef STDC_HEADERS
 # include <stdlib.h>
 # include <stddef.h>
 #else
-# if HAVE_STDLIB_H
+# ifdef HAVE_STDLIB_H
 #  include <stdlib.h>
 # endif
 #endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
 #  include <memory.h>
 # endif
 # include <string.h>
 #endif
-#if HAVE_STRINGS_H
+#ifdef HAVE_STRINGS_H
 # include <strings.h>
 #endif
-#if HAVE_INTTYPES_H
+#ifdef HAVE_INTTYPES_H
 # include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
 #endif
-#if HAVE_UNISTD_H
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS SET_MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA MKINSTALLDIRS USE_NLS MSGFMT GMSGFMT XGETTEXT MSGMERGE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT build build_cpu build_vendor build_os host host_cpu host_vendor host_os RANLIB ac_ct_RANLIB CPP EGREP ALLOCA GLIBC21 LIBICONV LTLIBICONV INTLBISON BUILD_INCLUDED_LIBINTL USE_INCLUDED_LIBINTL CATOBJEXT DATADIRNAME INSTOBJEXT GENCAT INTLOBJS INTL_LIBTOOL_SUFFIX_PREFIX INTLLIBS LIBINTL LTLIBINTL POSUB ACLOCAL AUTOCONF AUTOHEADER MAINT LIBINTL_DEP INCINTL LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+SET_MAKE
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+MKINSTALLDIRS
+USE_NLS
+MSGFMT
+GMSGFMT
+XGETTEXT
+MSGMERGE
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+RANLIB
+CPP
+GREP
+EGREP
+ALLOCA
+GLIBC21
+LIBICONV
+LTLIBICONV
+INTLBISON
+BUILD_INCLUDED_LIBINTL
+USE_INCLUDED_LIBINTL
+CATOBJEXT
+DATADIRNAME
+INSTOBJEXT
+GENCAT
+INTLOBJS
+INTL_LIBTOOL_SUFFIX_PREFIX
+INTLLIBS
+LIBINTL
+LTLIBINTL
+POSUB
+ACLOCAL
+AUTOCONF
+AUTOHEADER
+MAINT
+LIBINTL_DEP
+INCINTL
+LIBOBJS
+LTLIBOBJS'
 ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -337,34 +741,48 @@
 # and all the variables that are supposed to be based on exec_prefix
 # by default will actually change.
 # Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
 
 ac_prev=
+ac_dashdash=
 for ac_option
 do
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
+    eval $ac_prev=\$ac_option
     ac_prev=
     continue
   fi
 
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
-  case $ac_option in
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
@@ -386,33 +804,45 @@
   --config-cache | -C)
     cache_file=config.cache ;;
 
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+  -datadir | --datadir | --datadi | --datad)
     ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
     datadir=$ac_optarg ;;
 
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
   -disable-* | --disable-*)
     ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
     ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -439,6 +869,12 @@
   -host=* | --host=* | --hos=* | --ho=*)
     host_alias=$ac_optarg ;;
 
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
@@ -463,13 +899,16 @@
   | --libexe=* | --libex=* | --libe=*)
     libexecdir=$ac_optarg ;;
 
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
   -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
+  | --localstate | --localstat | --localsta | --localst | --locals)
     ac_prev=localstatedir ;;
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
     localstatedir=$ac_optarg ;;
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
@@ -534,6 +973,16 @@
   | --progr-tra=* | --program-tr=* | --program-t=*)
     program_transform_name=$ac_optarg ;;
 
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
@@ -586,24 +1035,20 @@
   -with-* | --with-*)
     ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
 
   -without-* | --without-*)
     ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -634,8 +1079,7 @@
     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
    { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
+    eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
@@ -655,27 +1099,19 @@
    { (exit 1); exit 1; }; }
 fi
 
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
 do
-  eval ac_val=$`echo $ac_var`
+  eval ac_val=\$$ac_var
   case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -702,74 +1138,76 @@
 test "$silent" = yes && exec 6>/dev/null
 
 
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$0" : 'X\(//\)[^/]' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
+  if test ! -r "$srcdir/$ac_unique_file"; then
     srcdir=..
   fi
 else
   ac_srcdir_defaulted=no
 fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
 fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
    { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
 
 #
 # Report the --help message.
@@ -798,9 +1236,6 @@
   -n, --no-create         do not create output files
       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
 
-_ACEOF
-
-  cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
 			  [$ac_default_prefix]
@@ -818,15 +1253,22 @@
   --bindir=DIR           user executables [EPREFIX/bin]
   --sbindir=DIR          system admin executables [EPREFIX/sbin]
   --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
   --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
   --libdir=DIR           object code libraries [EPREFIX/lib]
   --includedir=DIR       C header files [PREFIX/include]
   --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -863,126 +1305,95 @@
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
 _ACEOF
+ac_status=$?
 fi
 
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
+    test -d "$ac_dir" || continue
     ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
   done
 fi
 
-test -n "$ac_init_help" && exit 0
+test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
-  exit 0
+  exit
 fi
-exec 5>config.log
-cat >&5 <<_ACEOF
+cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by $as_me, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
 
 _ACEOF
+exec 5>>config.log
 {
 cat <<_ASUNAME
 ## --------- ##
@@ -1001,7 +1412,7 @@
 /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
 /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
 /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
 /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
 /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
@@ -1015,6 +1426,7 @@
   test -z "$as_dir" && as_dir=.
   echo "PATH: $as_dir"
 done
+IFS=$as_save_IFS
 
 } >&5
 
@@ -1036,7 +1448,6 @@
 ac_configure_args=
 ac_configure_args0=
 ac_configure_args1=
-ac_sep=
 ac_must_keep_next=false
 for ac_pass in 1 2
 do
@@ -1047,7 +1458,7 @@
     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    *\'*)
       ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
@@ -1069,9 +1480,7 @@
 	  -* ) ac_must_keep_next=true ;;
 	esac
       fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
+      ac_configure_args="$ac_configure_args '$ac_arg'"
       ;;
     esac
   done
@@ -1082,8 +1491,8 @@
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
 # would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
   # Save into config.log some information that might help in debugging.
   {
@@ -1096,20 +1505,34 @@
 _ASBOX
     echo
     # The following way of writing the cache mishandles newlines in values,
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
   (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
     *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-}
+    esac |
+    sort
+)
     echo
 
     cat <<\_ASBOX
@@ -1120,22 +1543,28 @@
     echo
     for ac_var in $ac_subst_vars
     do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
       cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
 _ASBOX
       echo
       for ac_var in $ac_subst_files
       do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
@@ -1147,26 +1576,24 @@
 ## ----------- ##
 _ASBOX
       echo
-      sed "/^$/d" confdefs.h | sort
+      cat confdefs.h
       echo
     fi
     test "$ac_signal" != 0 &&
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
-     ' 0
+' 0
 for ac_signal in 1 2 13 15; do
   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
 done
 ac_signal=0
 
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
+rm -f -r conftest* confdefs.h
 
 # Predefined preprocessor variables.
 
@@ -1197,14 +1624,17 @@
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in $CONFIG_SITE; do
+shift
+for ac_site_file
+do
   if test -r "$ac_site_file"; then
     { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
 echo "$as_me: loading site script $ac_site_file" >&6;}
@@ -1220,8 +1650,8 @@
     { echo "$as_me:$LINENO: loading cache $cache_file" >&5
 echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
     esac
   fi
 else
@@ -1233,12 +1663,11 @@
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+for ac_var in $ac_precious_vars; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
       { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
@@ -1263,8 +1692,7 @@
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -1281,6 +1709,22 @@
    { (exit 1); exit 1; }; }
 fi
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -1289,90 +1733,70 @@
 
 
 
+ac_config_headers="$ac_config_headers config.h"
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-          ac_config_headers="$ac_config_headers config.h"
-
-case ../config in
-  [\\/]* | ?:[\\/]* ) ac_macro_dir=../config         ;;
-  *)                      ac_macro_dir=$srcdir/../config ;;
-esac
-if test -d "$ac_macro_dir"; then :
-else
-  { { echo "$as_me:$LINENO: error: cannot find macro directory \`../config'" >&5
-echo "$as_me: error: cannot find macro directory \`../config'" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
 all:
-	@echo 'ac_maketemp="$(MAKE)"'
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
 _ACEOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
 rm -f conftest.make
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   SET_MAKE=
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
 ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install-sh -c"
     break
-  elif test -f $ac_dir/install.sh; then
+  elif test -f "$ac_dir/install.sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install.sh -c"
     break
-  elif test -f $ac_dir/shtool; then
+  elif test -f "$ac_dir/shtool"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/shtool install -c"
     break
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
    { (exit 1); exit 1; }; }
 fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -1387,8 +1811,8 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1410,7 +1834,7 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -1429,21 +1853,22 @@
     ;;
 esac
 done
+IFS=$as_save_IFS
 
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
     INSTALL=$ac_cv_path_install
   else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
+    # removed, or if the value is a relative name.
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -1467,17 +1892,17 @@
 
 
 
-  echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
-    # Check whether --enable-nls or --disable-nls was given.
+  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+    # Check whether --enable-nls was given.
 if test "${enable_nls+set}" = set; then
-  enableval="$enable_nls"
-  USE_NLS=$enableval
+  enableval=$enable_nls; USE_NLS=$enableval
 else
   USE_NLS=yes
-fi;
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
 
 
 
@@ -1514,8 +1939,8 @@
 
 # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_MSGFMT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1545,17 +1970,17 @@
 fi
 MSGFMT="$ac_cv_path_MSGFMT"
 if test "$MSGFMT" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGFMT" >&5
-echo "${ECHO_T}$MSGFMT" >&6
+  { echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
   # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_GMSGFMT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1570,30 +1995,31 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
   test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
   ;;
 esac
 fi
 GMSGFMT=$ac_cv_path_GMSGFMT
-
 if test -n "$GMSGFMT"; then
-  echo "$as_me:$LINENO: result: $GMSGFMT" >&5
-echo "${ECHO_T}$GMSGFMT" >&6
+  { echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
 
+
 # Prepare PATH_SEPARATOR.
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
@@ -1624,8 +2050,8 @@
 
 # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_XGETTEXT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1655,11 +2081,11 @@
 fi
 XGETTEXT="$ac_cv_path_XGETTEXT"
 if test "$XGETTEXT" != ":"; then
-  echo "$as_me:$LINENO: result: $XGETTEXT" >&5
-echo "${ECHO_T}$XGETTEXT" >&6
+  { echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
     rm -f messages.po
@@ -1695,8 +2121,8 @@
 
 # Extract the first word of "msgmerge", so it can be a program name with args.
 set dummy msgmerge; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_MSGMERGE+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1725,11 +2151,11 @@
 fi
 MSGMERGE="$ac_cv_path_MSGMERGE"
 if test "$MSGMERGE" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGMERGE" >&5
-echo "${ECHO_T}$MSGMERGE" >&6
+  { echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
@@ -1739,8 +2165,8 @@
       : ;
     else
       GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
-      echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
-echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6
+      { echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
+echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; }
       GMSGFMT=":"
     fi
   fi
@@ -1750,14 +2176,14 @@
        (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
       : ;
     else
-      echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
-echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
+      { echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6; }
       XGETTEXT=":"
     fi
         rm -f messages.po
   fi
 
-            ac_config_commands="$ac_config_commands default-1"
+  ac_config_commands="$ac_config_commands default-1"
 
 
 ac_ext=c
@@ -1768,8 +2194,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1782,32 +2208,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1820,36 +2248,51 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
   CC="$ac_cv_prog_CC"
 fi
 
 if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1862,74 +2305,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+
   fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1943,7 +2346,7 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -1954,6 +2357,7 @@
   fi
 done
 done
+IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
@@ -1971,22 +2375,23 @@
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+  for ac_prog in cl.exe
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1999,36 +2404,38 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$CC" && break
   done
 fi
 if test -z "$CC"; then
   ac_ct_CC=$CC
-  for ac_prog in cl
+  for ac_prog in cl.exe
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2041,29 +2448,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_CC" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 fi
 
 fi
@@ -2076,21 +2499,35 @@
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
@@ -2115,47 +2552,77 @@
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
 do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
 	;;
     [ab].out )
 	# We found the default executable, but exeext='' is most
 	# certainly right.
 	break;;
     *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
 	break;;
     * )
 	break;;
   esac
 done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
 else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
@@ -2167,19 +2634,21 @@
 fi
 
 ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
 
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
   if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -2198,22 +2667,27 @@
     fi
   fi
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
 rm -f a.out a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
 
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
@@ -2224,9 +2698,8 @@
 for ac_file in conftest.exe conftest conftest.*; do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
 	  break;;
     * ) break;;
   esac
@@ -2240,14 +2713,14 @@
 fi
 
 rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
 if test "${ac_cv_objext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2267,14 +2740,20 @@
 }
 _ACEOF
 rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
@@ -2292,12 +2771,12 @@
 
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2320,50 +2799,49 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2379,38 +2857,118 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -2426,12 +2984,12 @@
     CFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
+  ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2465,12 +3023,17 @@
 /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    function prototypes and stuff, but not '\xHH' hex character constants.
    These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
+   as 'x'.  The following induces an error, until -std is added to get
    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
    array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
+   that's true only with -std.  */
 int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -2485,205 +3048,57 @@
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
+rm -f conftest.$ac_ext
 CC=$ac_save_CC
 
 fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
   *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2691,64 +3106,93 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 # Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
    { (exit 1); exit 1; }; }
 
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
 if test "${ac_cv_build+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
   { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
 echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
    { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
 if test "${ac_cv_host+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+fi
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2761,32 +3205,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2799,39 +3245,52 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
 fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  RANLIB=$ac_ct_RANLIB
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
 else
   RANLIB="$ac_cv_prog_RANLIB"
 fi
 
 
-echo "$as_me:$LINENO: checking for library containing strerror" >&5
-echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for library containing strerror" >&5
+echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; }
 if test "${ac_cv_search_strerror+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_func_search_save_LIBS=$LIBS
-ac_cv_search_strerror=no
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -2839,115 +3298,73 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char strerror ();
 int
 main ()
 {
-strerror ();
+return strerror ();
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_strerror="none required"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_strerror" = no; then
-  for ac_lib in cposix; do
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char strerror ();
-int
-main ()
-{
-strerror ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_strerror="-l$ac_lib"
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_strerror=$ac_res
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-  done
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_strerror+set}" = set; then
+  break
 fi
+done
+if test "${ac_cv_search_strerror+set}" = set; then
+  :
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
-echo "${ECHO_T}$ac_cv_search_strerror" >&6
-if test "$ac_cv_search_strerror" != no; then
-  test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS"
+{ echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+echo "${ECHO_T}$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
 
@@ -2956,8 +3373,8 @@
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -2991,24 +3408,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -3017,9 +3432,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -3029,24 +3445,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -3057,6 +3471,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -3074,8 +3489,8 @@
 else
   ac_cv_prog_CPP=$CPP
 fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
@@ -3098,24 +3513,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -3124,9 +3537,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -3136,24 +3550,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -3164,6 +3576,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -3186,23 +3599,170 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
     fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
 
 
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3226,35 +3786,31 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_stdc=no
+	ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
@@ -3310,6 +3866,7 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ctype.h>
+#include <stdlib.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
@@ -3329,18 +3886,27 @@
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
 	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
+      return 2;
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -3353,12 +3919,14 @@
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
 fi
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -3367,8 +3935,8 @@
 
 fi
 
-echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
 if test "${ac_cv_c_const+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3386,10 +3954,10 @@
 #ifndef __cplusplus
   /* Ultrix mips cc rejects this.  */
   typedef int charset[2];
-  const charset x;
+  const charset cs;
   /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *ccp;
-  char **p;
+  char const *const *pcpcc;
+  char **ppc;
   /* NEC SVR4.0.2 mips cc rejects this.  */
   struct point {int x, y;};
   static struct point const zero = {0,0};
@@ -3398,16 +3966,17 @@
      an arm of an if-expression whose if-part is not a constant
      expression */
   const char *g = "string";
-  ccp = &g + (g ? g-g : 0);
+  pcpcc = &g + (g ? g-g : 0);
   /* HPUX 7.0 cc rejects these. */
-  ++ccp;
-  p = (char**) ccp;
-  ccp = (char const *const *) p;
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
   { /* SCO 3.2v4 cc rejects this.  */
     char *t;
     char const *s = 0 ? (char *) 0 : (char const *) 0;
 
     *t++ = 0;
+    if (s) return 0;
   }
   { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
     int x[] = {25, 17};
@@ -3426,7 +3995,9 @@
   }
   { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
     const int foo = 10;
+    if (!foo) return 0;
   }
+  return !cs[0] && !zero.x;
 #endif
 
   ;
@@ -3434,38 +4005,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_c_const=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_c_const=no
+	ac_cv_c_const=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
-echo "${ECHO_T}$ac_cv_c_const" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
 if test $ac_cv_c_const = no; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -3474,8 +4041,8 @@
 
 fi
 
-echo "$as_me:$LINENO: checking for inline" >&5
-echo $ECHO_N "checking for inline... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
 if test "${ac_cv_c_inline+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3495,39 +4062,37 @@
 
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_c_inline=$ac_kw; break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_inline=$ac_kw
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
 done
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
-echo "${ECHO_T}$ac_cv_c_inline" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6; }
 
 
 case $ac_cv_c_inline in
@@ -3559,9 +4124,9 @@
 		  inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -3575,38 +4140,35 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
@@ -3617,8 +4179,8 @@
 done
 
 
-echo "$as_me:$LINENO: checking for off_t" >&5
-echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_off_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3629,62 +4191,59 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef off_t ac__type_new_;
 int
 main ()
 {
-if ((off_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (off_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_off_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_off_t=no
+	ac_cv_type_off_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
-echo "${ECHO_T}$ac_cv_type_off_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6; }
 if test $ac_cv_type_off_t = yes; then
   :
 else
 
 cat >>confdefs.h <<_ACEOF
-#define off_t long
+#define off_t long int
 _ACEOF
 
 fi
 
-echo "$as_me:$LINENO: checking for size_t" >&5
-echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_size_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3695,64 +4254,61 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef size_t ac__type_new_;
 int
 main ()
 {
-if ((size_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (size_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_size_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_size_t=no
+	ac_cv_type_size_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
-echo "${ECHO_T}$ac_cv_type_size_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6; }
 if test $ac_cv_type_size_t = yes; then
   :
 else
 
 cat >>confdefs.h <<_ACEOF
-#define size_t unsigned
+#define size_t unsigned int
 _ACEOF
 
 fi
 
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
-echo "$as_me:$LINENO: checking for working alloca.h" >&5
-echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; }
 if test "${ac_cv_working_alloca_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3767,44 +4323,42 @@
 main ()
 {
 char *p = (char *) alloca (2 * sizeof (int));
+			  if (p) return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_working_alloca_h=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_working_alloca_h=no
+	ac_cv_working_alloca_h=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
-echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; }
 if test $ac_cv_working_alloca_h = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -3813,8 +4367,8 @@
 
 fi
 
-echo "$as_me:$LINENO: checking for alloca" >&5
-echo $ECHO_N "checking for alloca... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6; }
 if test "${ac_cv_func_alloca_works+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3831,7 +4385,7 @@
 #  include <malloc.h>
 #  define alloca _alloca
 # else
-#  if HAVE_ALLOCA_H
+#  ifdef HAVE_ALLOCA_H
 #   include <alloca.h>
 #  else
 #   ifdef _AIX
@@ -3849,44 +4403,42 @@
 main ()
 {
 char *p = (char *) alloca (1);
+				    if (p) return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_func_alloca_works=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_func_alloca_works=no
+	ac_cv_func_alloca_works=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
-echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; }
 
 if test $ac_cv_func_alloca_works = yes; then
 
@@ -3900,15 +4452,15 @@
 # contain a buggy version.  If you still want to use their alloca,
 # use ar to extract alloca.o from them instead of compiling alloca.c.
 
-ALLOCA=alloca.$ac_objext
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
 
 cat >>confdefs.h <<\_ACEOF
 #define C_ALLOCA 1
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
-echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; }
 if test "${ac_cv_os_cray+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3918,7 +4470,7 @@
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#if defined(CRAY) && ! defined(CRAY2)
+#if defined CRAY && ! defined CRAY2
 webecray
 #else
 wenotbecray
@@ -3934,14 +4486,14 @@
 rm -f conftest*
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
-echo "${ECHO_T}$ac_cv_os_cray" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6; }
 if test $ac_cv_os_cray = yes; then
   for ac_func in _getb67 GETB67 getb67; do
     as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -3967,68 +4519,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -4041,8 +4585,8 @@
   done
 fi
 
-echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
-echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; }
 if test "${ac_cv_c_stack_direction+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4055,6 +4599,7 @@
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+$ac_includes_default
 int
 find_stack_direction ()
 {
@@ -4072,17 +4617,26 @@
 int
 main ()
 {
-  exit (find_stack_direction () < 0);
+  return find_stack_direction () < 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -4095,11 +4649,13 @@
 ( exit $ac_status )
 ac_cv_c_stack_direction=-1
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
+
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
-echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; }
 
 cat >>confdefs.h <<_ACEOF
 #define STACK_DIRECTION $ac_cv_c_stack_direction
@@ -4113,18 +4669,19 @@
 for ac_header in stdlib.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -4135,41 +4692,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -4178,24 +4731,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -4203,9 +4754,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -4229,25 +4781,19 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------------ ##
-## Report this to the AC_PACKAGE_NAME lists.  ##
-## ------------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -4263,9 +4809,9 @@
 for ac_func in getpagesize
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -4291,68 +4837,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -4361,8 +4899,8 @@
 fi
 done
 
-echo "$as_me:$LINENO: checking for working mmap" >&5
-echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6; }
 if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4404,21 +4942,21 @@
 #include <fcntl.h>
 #include <sys/mman.h>
 
-#if !STDC_HEADERS && !HAVE_STDLIB_H
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
 char *malloc ();
 #endif
 
 /* This mess was copied from the GNU getpagesize.h.  */
-#if !HAVE_GETPAGESIZE
+#ifndef HAVE_GETPAGESIZE
 /* Assume that all systems that can run configure have sys/param.h.  */
-# if !HAVE_SYS_PARAM_H
+# ifndef HAVE_SYS_PARAM_H
 #  define HAVE_SYS_PARAM_H 1
 # endif
 
 # ifdef _SC_PAGESIZE
 #  define getpagesize() sysconf(_SC_PAGESIZE)
 # else /* no _SC_PAGESIZE */
-#  if HAVE_SYS_PARAM_H
+#  ifdef HAVE_SYS_PARAM_H
 #   include <sys/param.h>
 #   ifdef EXEC_PAGESIZE
 #    define getpagesize() EXEC_PAGESIZE
@@ -4457,15 +4995,15 @@
   /* First, make a file with some known garbage in it. */
   data = (char *) malloc (pagesize);
   if (!data)
-    exit (1);
+    return 1;
   for (i = 0; i < pagesize; ++i)
     *(data + i) = rand ();
   umask (0);
   fd = creat ("conftest.mmap", 0600);
   if (fd < 0)
-    exit (1);
+    return 1;
   if (write (fd, data, pagesize) != pagesize)
-    exit (1);
+    return 1;
   close (fd);
 
   /* Next, try to mmap the file at a fixed address which already has
@@ -4473,17 +5011,17 @@
      we see the same garbage.  */
   fd = open ("conftest.mmap", O_RDWR);
   if (fd < 0)
-    exit (1);
+    return 1;
   data2 = (char *) malloc (2 * pagesize);
   if (!data2)
-    exit (1);
-  data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1);
+    return 1;
+  data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1);
   if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
 		     MAP_PRIVATE | MAP_FIXED, fd, 0L))
-    exit (1);
+    return 1;
   for (i = 0; i < pagesize; ++i)
     if (*(data + i) != *(data2 + i))
-      exit (1);
+      return 1;
 
   /* Finally, make sure that changes to the mapped area do not
      percolate back to the file as seen by read().  (This is a bug on
@@ -4492,24 +5030,33 @@
     *(data2 + i) = *(data2 + i) + 1;
   data3 = (char *) malloc (pagesize);
   if (!data3)
-    exit (1);
+    return 1;
   if (read (fd, data3, pagesize) != pagesize)
-    exit (1);
+    return 1;
   for (i = 0; i < pagesize; ++i)
     if (*(data + i) != *(data3 + i))
-      exit (1);
+      return 1;
   close (fd);
-  exit (0);
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -4522,11 +5069,13 @@
 ( exit $ac_status )
 ac_cv_func_mmap_fixed_mapped=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
+
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5
-echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6; }
 if test $ac_cv_func_mmap_fixed_mapped = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -4537,8 +5086,8 @@
 rm -f conftest.mmap
 
 
-    echo "$as_me:$LINENO: checking whether we are using the GNU C Library 2.1 or newer" >&5
-echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6; }
 if test "${ac_cv_gnu_library_2_1+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4568,16 +5117,16 @@
 
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_gnu_library_2_1" >&5
-echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_gnu_library_2_1" >&5
+echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6; }
 
     GLIBC21="$ac_cv_gnu_library_2_1"
 
 
 
 
-  echo "$as_me:$LINENO: checking whether integer division by zero raises SIGFPE" >&5
-echo $ECHO_N "checking whether integer division by zero raises SIGFPE... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether integer division by zero raises SIGFPE" >&5
+echo $ECHO_N "checking whether integer division by zero raises SIGFPE... $ECHO_C" >&6; }
 if test "${gt_cv_int_divbyzero_sigfpe+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4638,13 +5187,22 @@
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -4657,12 +5215,14 @@
 ( exit $ac_status )
 gt_cv_int_divbyzero_sigfpe=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
+
+
 fi
-echo "$as_me:$LINENO: result: $gt_cv_int_divbyzero_sigfpe" >&5
-echo "${ECHO_T}$gt_cv_int_divbyzero_sigfpe" >&6
+{ echo "$as_me:$LINENO: result: $gt_cv_int_divbyzero_sigfpe" >&5
+echo "${ECHO_T}$gt_cv_int_divbyzero_sigfpe" >&6; }
   case "$gt_cv_int_divbyzero_sigfpe" in
     *yes) value=1;;
     *) value=0;;
@@ -4674,8 +5234,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking for inttypes.h" >&5
-echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6; }
 if test "${jm_ac_cv_header_inttypes_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4696,38 +5256,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   jm_ac_cv_header_inttypes_h=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-jm_ac_cv_header_inttypes_h=no
+	jm_ac_cv_header_inttypes_h=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $jm_ac_cv_header_inttypes_h" >&5
-echo "${ECHO_T}$jm_ac_cv_header_inttypes_h" >&6
+{ echo "$as_me:$LINENO: result: $jm_ac_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$jm_ac_cv_header_inttypes_h" >&6; }
   if test $jm_ac_cv_header_inttypes_h = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -4737,8 +5293,8 @@
   fi
 
 
-  echo "$as_me:$LINENO: checking for stdint.h" >&5
-echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for stdint.h" >&5
+echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6; }
 if test "${jm_ac_cv_header_stdint_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4759,38 +5315,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   jm_ac_cv_header_stdint_h=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-jm_ac_cv_header_stdint_h=no
+	jm_ac_cv_header_stdint_h=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $jm_ac_cv_header_stdint_h" >&5
-echo "${ECHO_T}$jm_ac_cv_header_stdint_h" >&6
+{ echo "$as_me:$LINENO: result: $jm_ac_cv_header_stdint_h" >&5
+echo "${ECHO_T}$jm_ac_cv_header_stdint_h" >&6; }
   if test $jm_ac_cv_header_stdint_h = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -4800,8 +5352,8 @@
   fi
 
 
-  echo "$as_me:$LINENO: checking for unsigned long long" >&5
-echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for unsigned long long" >&5
+echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6; }
 if test "${ac_cv_type_unsigned_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4822,39 +5374,36 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_type_unsigned_long_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_unsigned_long_long=no
+	ac_cv_type_unsigned_long_long=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
-echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6; }
   if test $ac_cv_type_unsigned_long_long = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -4885,8 +5434,8 @@
   fi
 
 
-  echo "$as_me:$LINENO: checking for inttypes.h" >&5
-echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6; }
 if test "${gt_cv_header_inttypes_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4908,39 +5457,35 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   gt_cv_header_inttypes_h=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-gt_cv_header_inttypes_h=no
+	gt_cv_header_inttypes_h=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 fi
-echo "$as_me:$LINENO: result: $gt_cv_header_inttypes_h" >&5
-echo "${ECHO_T}$gt_cv_header_inttypes_h" >&6
+{ echo "$as_me:$LINENO: result: $gt_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$gt_cv_header_inttypes_h" >&6; }
   if test $gt_cv_header_inttypes_h = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -4952,8 +5497,8 @@
 
 
   if test $gt_cv_header_inttypes_h = yes; then
-    echo "$as_me:$LINENO: checking whether the inttypes.h PRIxNN macros are broken" >&5
-echo $ECHO_N "checking whether the inttypes.h PRIxNN macros are broken... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking whether the inttypes.h PRIxNN macros are broken" >&5
+echo $ECHO_N "checking whether the inttypes.h PRIxNN macros are broken... $ECHO_C" >&6; }
 if test "${gt_cv_inttypes_pri_broken+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4978,39 +5523,35 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   gt_cv_inttypes_pri_broken=no
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-gt_cv_inttypes_pri_broken=yes
+	gt_cv_inttypes_pri_broken=yes
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 fi
-echo "$as_me:$LINENO: result: $gt_cv_inttypes_pri_broken" >&5
-echo "${ECHO_T}$gt_cv_inttypes_pri_broken" >&6
+{ echo "$as_me:$LINENO: result: $gt_cv_inttypes_pri_broken" >&5
+echo "${ECHO_T}$gt_cv_inttypes_pri_broken" >&6; }
   fi
   if test "$gt_cv_inttypes_pri_broken" = yes; then
 
@@ -5037,13 +5578,13 @@
   prefix="$acl_save_prefix"
 
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
+# Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
 else
   with_gnu_ld=no
-fi;
+fi
+
 # Prepare PATH_SEPARATOR.
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
@@ -5060,8 +5601,8 @@
 ac_prog=ld
 if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by GCC" >&5
-echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; }
   case $host in
   *-*-mingw*)
     # gcc leaves a trailing carriage return which upsets mingw
@@ -5090,11 +5631,11 @@
     ;;
   esac
 elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
 else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
 fi
 if test "${acl_cv_path_LD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5123,17 +5664,17 @@
 
 LD="$acl_cv_path_LD"
 if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
 if test "${acl_cv_prog_gnu_ld+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5144,14 +5685,14 @@
   acl_cv_prog_gnu_ld=no
 fi
 fi
-echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6
+{ echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; }
 with_gnu_ld=$acl_cv_prog_gnu_ld
 
 
 
-                                                echo "$as_me:$LINENO: checking for shared library run path origin" >&5
-echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6
+                                                { echo "$as_me:$LINENO: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; }
 if test "${acl_cv_rpath+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5163,8 +5704,8 @@
     acl_cv_rpath=done
 
 fi
-echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
-echo "${ECHO_T}$acl_cv_rpath" >&6
+{ echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$acl_cv_rpath" >&6; }
   wl="$acl_cv_wl"
   libext="$acl_cv_libext"
   shlibext="$acl_cv_shlibext"
@@ -5172,13 +5713,13 @@
   hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
   hardcode_direct="$acl_cv_hardcode_direct"
   hardcode_minus_L="$acl_cv_hardcode_minus_L"
-    # Check whether --enable-rpath or --disable-rpath was given.
+    # Check whether --enable-rpath was given.
 if test "${enable_rpath+set}" = set; then
-  enableval="$enable_rpath"
-  :
+  enableval=$enable_rpath; :
 else
   enable_rpath=yes
-fi;
+fi
+
 
 
 
@@ -5200,10 +5741,9 @@
   prefix="$acl_save_prefix"
 
 
-# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
+# Check whether --with-libiconv-prefix was given.
 if test "${with_libiconv_prefix+set}" = set; then
-  withval="$with_libiconv_prefix"
-
+  withval=$with_libiconv_prefix;
     if test "X$withval" = "Xno"; then
       use_additional=no
     else
@@ -5226,7 +5766,8 @@
       fi
     fi
 
-fi;
+fi
+
       LIBICONV=
   LTLIBICONV=
   INCICONV=
@@ -5579,18 +6120,19 @@
 stdlib.h string.h unistd.h sys/param.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -5601,41 +6143,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -5644,24 +6182,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -5669,9 +6205,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -5695,25 +6232,19 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------------ ##
-## Report this to the AC_PACKAGE_NAME lists.  ##
-## ------------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -5753,9 +6284,9 @@
 __fsetlocking
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -5781,68 +6312,60 @@
 
 #undef $ac_func
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $ac_func ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#if defined __stub_$ac_func || defined __stub___$ac_func
 choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $ac_func;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+	eval "$as_ac_var=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -5882,8 +6405,8 @@
   done
 
 
-  echo "$as_me:$LINENO: checking for iconv" >&5
-echo $ECHO_N "checking for iconv... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6; }
 if test "${am_cv_func_iconv+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5909,34 +6432,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   am_cv_func_iconv=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
     if test "$am_cv_func_iconv" != yes; then
       am_save_LIBS="$LIBS"
@@ -5960,42 +6481,40 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   am_cv_lib_iconv=yes
         am_cv_func_iconv=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
       LIBS="$am_save_LIBS"
     fi
 
 fi
-echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5
-echo "${ECHO_T}$am_cv_func_iconv" >&6
+{ echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6; }
   if test "$am_cv_func_iconv" = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -6004,10 +6523,10 @@
 
   fi
   if test "$am_cv_lib_iconv" = yes; then
-    echo "$as_me:$LINENO: checking how to link with libiconv" >&5
-echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6
-    echo "$as_me:$LINENO: result: $LIBICONV" >&5
-echo "${ECHO_T}$LIBICONV" >&6
+    { echo "$as_me:$LINENO: checking how to link with libiconv" >&5
+echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; }
+    { echo "$as_me:$LINENO: result: $LIBICONV" >&5
+echo "${ECHO_T}$LIBICONV" >&6; }
   else
             CPPFLAGS="$am_save_CPPFLAGS"
     LIBICONV=
@@ -6017,8 +6536,8 @@
 
 
   if test "$am_cv_func_iconv" = yes; then
-    echo "$as_me:$LINENO: checking for iconv declaration" >&5
-echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for iconv declaration" >&5
+echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6; }
     if test "${am_cv_proto_iconv+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6051,43 +6570,39 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   am_cv_proto_iconv_arg1=""
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-am_cv_proto_iconv_arg1="const"
+	am_cv_proto_iconv_arg1="const"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
       am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
 fi
 
     am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
-    echo "$as_me:$LINENO: result: ${ac_t:-
+    { echo "$as_me:$LINENO: result: ${ac_t:-
          }$am_cv_proto_iconv" >&5
 echo "${ECHO_T}${ac_t:-
-         }$am_cv_proto_iconv" >&6
+         }$am_cv_proto_iconv" >&6; }
 
 cat >>confdefs.h <<_ACEOF
 #define ICONV_CONST $am_cv_proto_iconv_arg1
@@ -6096,8 +6611,8 @@
   fi
 
 
-  echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5
-echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6; }
 if test "${am_cv_langinfo_codeset+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6117,40 +6632,37 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   am_cv_langinfo_codeset=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-am_cv_langinfo_codeset=no
+	am_cv_langinfo_codeset=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 
 fi
-echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5
-echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
+{ echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6; }
   if test $am_cv_langinfo_codeset = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -6161,8 +6673,8 @@
 
   if test $ac_cv_header_locale_h = yes; then
 
-  echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5
-echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5
+echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6; }
 if test "${am_cv_val_LC_MESSAGES+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6182,39 +6694,36 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   am_cv_val_LC_MESSAGES=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-am_cv_val_LC_MESSAGES=no
+	am_cv_val_LC_MESSAGES=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5
-echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6
+{ echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5
+echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6; }
   if test $am_cv_val_LC_MESSAGES = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -6229,8 +6738,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_INTLBISON+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6243,33 +6752,35 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_INTLBISON="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 INTLBISON=$ac_cv_prog_INTLBISON
 if test -n "$INTLBISON"; then
-  echo "$as_me:$LINENO: result: $INTLBISON" >&5
-echo "${ECHO_T}$INTLBISON" >&6
+  { echo "$as_me:$LINENO: result: $INTLBISON" >&5
+echo "${ECHO_T}$INTLBISON" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$INTLBISON" && break
 done
 
   if test -z "$INTLBISON"; then
     ac_verc_fail=yes
   else
-        echo "$as_me:$LINENO: checking version of bison" >&5
-echo $ECHO_N "checking version of bison... $ECHO_C" >&6
+        { echo "$as_me:$LINENO: checking version of bison" >&5
+echo $ECHO_N "checking version of bison... $ECHO_C" >&6; }
     ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
     case $ac_prog_version in
       '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -6277,8 +6788,8 @@
          ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
       *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
     esac
-    echo "$as_me:$LINENO: result: $ac_prog_version" >&5
-echo "${ECHO_T}$ac_prog_version" >&6
+    { echo "$as_me:$LINENO: result: $ac_prog_version" >&5
+echo "${ECHO_T}$ac_prog_version" >&6; }
   fi
   if test $ac_verc_fail = yes; then
     INTLBISON=:
@@ -6299,17 +6810,17 @@
 
 
 
-  echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
-    # Check whether --enable-nls or --disable-nls was given.
+  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+    # Check whether --enable-nls was given.
 if test "${enable_nls+set}" = set; then
-  enableval="$enable_nls"
-  USE_NLS=$enableval
+  enableval=$enable_nls; USE_NLS=$enableval
 else
   USE_NLS=yes
-fi;
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
 
 
 
@@ -6324,18 +6835,18 @@
     if test "$USE_NLS" = "yes"; then
     gt_use_preinstalled_gnugettext=no
 
-      echo "$as_me:$LINENO: checking whether included gettext is requested" >&5
-echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6
+      { echo "$as_me:$LINENO: checking whether included gettext is requested" >&5
+echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6; }
 
-# Check whether --with-included-gettext or --without-included-gettext was given.
+# Check whether --with-included-gettext was given.
 if test "${with_included_gettext+set}" = set; then
-  withval="$with_included_gettext"
-  nls_cv_force_use_gnu_gettext=$withval
+  withval=$with_included_gettext; nls_cv_force_use_gnu_gettext=$withval
 else
   nls_cv_force_use_gnu_gettext=no
-fi;
-      echo "$as_me:$LINENO: result: $nls_cv_force_use_gnu_gettext" >&5
-echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
+fi
+
+      { echo "$as_me:$LINENO: result: $nls_cv_force_use_gnu_gettext" >&5
+echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6; }
 
       nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
       if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
@@ -6345,8 +6856,8 @@
 
 
 
-        echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5
-echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6
+        { echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5
+echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6; }
 if test "${gt_cv_func_gnugettext1_libc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6369,39 +6880,36 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   gt_cv_func_gnugettext1_libc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-gt_cv_func_gnugettext1_libc=no
+	gt_cv_func_gnugettext1_libc=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libc" >&5
-echo "${ECHO_T}$gt_cv_func_gnugettext1_libc" >&6
+{ echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libc" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext1_libc" >&6; }
 
         if test "$gt_cv_func_gnugettext1_libc" != "yes"; then
 
@@ -6421,10 +6929,9 @@
   prefix="$acl_save_prefix"
 
 
-# Check whether --with-libintl-prefix or --without-libintl-prefix was given.
+# Check whether --with-libintl-prefix was given.
 if test "${with_libintl_prefix+set}" = set; then
-  withval="$with_libintl_prefix"
-
+  withval=$with_libintl_prefix;
     if test "X$withval" = "Xno"; then
       use_additional=no
     else
@@ -6447,7 +6954,8 @@
       fi
     fi
 
-fi;
+fi
+
       LIBINTL=
   LTLIBINTL=
   INCINTL=
@@ -6783,8 +7291,8 @@
     done
   fi
 
-          echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5
-echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6
+          { echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5
+echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6; }
 if test "${gt_cv_func_gnugettext1_libintl+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6815,35 +7323,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   gt_cv_func_gnugettext1_libintl=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-gt_cv_func_gnugettext1_libintl=no
+	gt_cv_func_gnugettext1_libintl=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
                         if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then
               LIBS="$LIBS $LIBICONV"
@@ -6870,27 +7375,23 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   LIBINTL="$LIBINTL $LIBICONV"
                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
                 gt_cv_func_gnugettext1_libintl=yes
@@ -6899,15 +7400,17 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
             fi
             CPPFLAGS="$gt_save_CPPFLAGS"
             LIBS="$gt_save_LIBS"
 fi
-echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libintl" >&5
-echo "${ECHO_T}$gt_cv_func_gnugettext1_libintl" >&6
+{ echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libintl" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext1_libintl" >&6; }
         fi
 
                                         if test "$gt_cv_func_gnugettext1_libc" = "yes" \
@@ -6953,13 +7456,13 @@
     fi
   fi
 
-  echo "$as_me:$LINENO: checking whether to use NLS" >&5
-echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
+  { echo "$as_me:$LINENO: checking whether to use NLS" >&5
+echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
   if test "$USE_NLS" = "yes"; then
-    echo "$as_me:$LINENO: checking where the gettext function comes from" >&5
-echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking where the gettext function comes from" >&5
+echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6; }
     if test "$gt_use_preinstalled_gnugettext" = "yes"; then
       if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
         gt_source="external libintl"
@@ -6969,18 +7472,18 @@
     else
       gt_source="included intl directory"
     fi
-    echo "$as_me:$LINENO: result: $gt_source" >&5
-echo "${ECHO_T}$gt_source" >&6
+    { echo "$as_me:$LINENO: result: $gt_source" >&5
+echo "${ECHO_T}$gt_source" >&6; }
   fi
 
   if test "$USE_NLS" = "yes"; then
 
     if test "$gt_use_preinstalled_gnugettext" = "yes"; then
       if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
-        echo "$as_me:$LINENO: checking how to link with libintl" >&5
-echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6
-        echo "$as_me:$LINENO: result: $LIBINTL" >&5
-echo "${ECHO_T}$LIBINTL" >&6
+        { echo "$as_me:$LINENO: checking how to link with libintl" >&5
+echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6; }
+        { echo "$as_me:$LINENO: result: $LIBINTL" >&5
+echo "${ECHO_T}$LIBINTL" >&6; }
 
   for element in $INCINTL; do
     haveit=
@@ -7101,8 +7604,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ACLOCAL+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7115,25 +7618,27 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ACLOCAL="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ACLOCAL=$ac_cv_prog_ACLOCAL
 if test -n "$ACLOCAL"; then
-  echo "$as_me:$LINENO: result: $ACLOCAL" >&5
-echo "${ECHO_T}$ACLOCAL" >&6
+  { echo "$as_me:$LINENO: result: $ACLOCAL" >&5
+echo "${ECHO_T}$ACLOCAL" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ACLOCAL" && break
 done
 test -n "$ACLOCAL" || ACLOCAL="$MISSING aclocal"
@@ -7142,8 +7647,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AUTOCONF+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7156,25 +7661,27 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AUTOCONF="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AUTOCONF=$ac_cv_prog_AUTOCONF
 if test -n "$AUTOCONF"; then
-  echo "$as_me:$LINENO: result: $AUTOCONF" >&5
-echo "${ECHO_T}$AUTOCONF" >&6
+  { echo "$as_me:$LINENO: result: $AUTOCONF" >&5
+echo "${ECHO_T}$AUTOCONF" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AUTOCONF" && break
 done
 test -n "$AUTOCONF" || AUTOCONF="$MISSING autoconf"
@@ -7183,8 +7690,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AUTOHEADER+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7197,37 +7704,39 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AUTOHEADER="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AUTOHEADER=$ac_cv_prog_AUTOHEADER
 if test -n "$AUTOHEADER"; then
-  echo "$as_me:$LINENO: result: $AUTOHEADER" >&5
-echo "${ECHO_T}$AUTOHEADER" >&6
+  { echo "$as_me:$LINENO: result: $AUTOHEADER" >&5
+echo "${ECHO_T}$AUTOHEADER" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AUTOHEADER" && break
 done
 test -n "$AUTOHEADER" || AUTOHEADER="$MISSING autoheader"
 
 
-# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+# Check whether --enable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
-  enableval="$enable_maintainer_mode"
-
+  enableval=$enable_maintainer_mode;
 else
   enable_maintainer_mode=no
-fi;
+fi
+
 if test "x$enable_maintainer_mode" = xno; then
   MAINT='#'
 else
@@ -7250,7 +7759,7 @@
     ;;
 esac
 
-                    ac_config_files="$ac_config_files Makefile config.intl"
+ac_config_files="$ac_config_files Makefile config.intl"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -7270,39 +7779,58 @@
 
 # The following way of writing the cache mishandles newlines in values,
 # but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
+# So, we kill variables containing newlines.
 # Ultrix sh set writes to stderr and can't be redirected directly,
 # and sets the high bit in the cache file unless we assign to the vars.
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
   (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       # `set' does not quote correctly, so add quotes (double-quote
       # substitution turns \\\\ into \\, and sed turns \\ into \).
       sed -n \
 	"s/'/'\\\\''/g;
 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
+      ;; #(
     *)
       # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-} |
+    esac |
+    sort
+) |
   sed '
+     /^ac_cv_env_/b end
      t clear
-     : clear
+     :clear
      s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
      t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
     cat confcache >$cache_file
   else
-    echo "not updating unwritable cache $cache_file"
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -7311,32 +7839,18 @@
 # Let make expand exec_prefix.
 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
-
 DEFS=-DHAVE_CONFIG_H
 
 ac_libobjs=
 ac_ltlibobjs=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
 done
 LIBOBJS=$ac_libobjs
 
@@ -7367,73 +7881,26 @@
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -7454,126 +7921,198 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
 do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -7582,7 +8121,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -7591,31 +8151,14 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 exec 6>&1
 
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# Save the log message, to keep $[0] and so on meaningful, and to
 # report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
+# values after options handling.
+ac_log="
 This file was extended by $as_me, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -7623,30 +8166,20 @@
   CONFIG_COMMANDS = $CONFIG_COMMANDS
   $ $0 $@
 
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
 _ACEOF
 
+cat >>$CONFIG_STATUS <<_ACEOF
 # Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
 
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
+_ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
-
 ac_cs_usage="\
 \`$as_me' instantiates files from templates according to the
 current configuration.
@@ -7654,7 +8187,7 @@
 Usage: $0 [OPTIONS] [FILE]...
 
   -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
+  -V, --version    print version number and configuration settings, then exit
   -q, --quiet      do not print progress messages
   -d, --debug      don't remove temporary files
       --recheck    update $as_me by reconfiguring in the same conditions
@@ -7673,19 +8206,21 @@
 $config_commands
 
 Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
 config.status
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 2006 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
 _ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
@@ -7696,39 +8231,24 @@
 do
   case $1 in
   --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
     ac_shift=:
     ;;
-  -*)
+  *)
     ac_option=$1
     ac_optarg=$2
     ac_shift=shift
     ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
   esac
 
   case $ac_option in
   # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
     ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
     $ac_shift
@@ -7738,18 +8258,24 @@
     $ac_shift
     CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
     ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil | --si | --s)
     ac_cs_silent=: ;;
 
   # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
    { (exit 1); exit 1; }; } ;;
 
-  *) ac_config_targets="$ac_config_targets $1" ;;
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
 
   esac
   shift
@@ -7765,17 +8291,28 @@
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
 fi
 
 _ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 #
-# INIT-COMMANDS section.
+# INIT-COMMANDS
 #
-
 # Capture the value of obsolete ALL_LINGUAS because we need it to compute
     # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
     # from automake.
@@ -7786,23 +8323,24 @@
 
 _ACEOF
 
-
-
 cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
 for ac_config_target in $ac_config_targets
 do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "config.intl" ) CONFIG_FILES="$CONFIG_FILES config.intl" ;;
-  "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "config.intl") CONFIG_FILES="$CONFIG_FILES config.intl" ;;
+
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
   esac
 done
 
+
 # If the user did not use the arguments to specify the items to instantiate,
 # then the envvar interface is used.  Set only those that are not.
 # We use the long form for the default assignment because of an extremely
@@ -7814,338 +8352,405 @@
 fi
 
 # Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
+# simply because there is no reason against having it here, and in addition,
 # creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
 $debug ||
 {
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
   trap '{ (exit 1); exit 1; }' 1 2 13 15
 }
-
 # Create a (secure) tmp directory for tmp files.
 
 {
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
   test -n "$tmp" && test -d "$tmp"
 }  ||
 {
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
 } ||
 {
    echo "$me: cannot create a temporary directory in ." >&2
    { (exit 1); exit 1; }
 }
 
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
 #
-# CONFIG_FILES section.
+# Set up the sed scripts for CONFIG_FILES section.
 #
 
 # No need to generate the scripts if there are no CONFIG_FILES.
 # This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@SET_MAKE@,$SET_MAKE,;t t
-s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s,@INSTALL_DATA@,$INSTALL_DATA,;t t
-s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
-s,@USE_NLS@,$USE_NLS,;t t
-s,@MSGFMT@,$MSGFMT,;t t
-s,@GMSGFMT@,$GMSGFMT,;t t
-s,@XGETTEXT@,$XGETTEXT,;t t
-s,@MSGMERGE@,$MSGMERGE,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@CPP@,$CPP,;t t
-s,@EGREP@,$EGREP,;t t
-s,@ALLOCA@,$ALLOCA,;t t
-s,@GLIBC21@,$GLIBC21,;t t
-s,@LIBICONV@,$LIBICONV,;t t
-s,@LTLIBICONV@,$LTLIBICONV,;t t
-s,@INTLBISON@,$INTLBISON,;t t
-s,@BUILD_INCLUDED_LIBINTL@,$BUILD_INCLUDED_LIBINTL,;t t
-s,@USE_INCLUDED_LIBINTL@,$USE_INCLUDED_LIBINTL,;t t
-s,@CATOBJEXT@,$CATOBJEXT,;t t
-s,@DATADIRNAME@,$DATADIRNAME,;t t
-s,@INSTOBJEXT@,$INSTOBJEXT,;t t
-s,@GENCAT@,$GENCAT,;t t
-s,@INTLOBJS@,$INTLOBJS,;t t
-s,@INTL_LIBTOOL_SUFFIX_PREFIX@,$INTL_LIBTOOL_SUFFIX_PREFIX,;t t
-s,@INTLLIBS@,$INTLLIBS,;t t
-s,@LIBINTL@,$LIBINTL,;t t
-s,@LTLIBINTL@,$LTLIBINTL,;t t
-s,@POSUB@,$POSUB,;t t
-s,@ACLOCAL@,$ACLOCAL,;t t
-s,@AUTOCONF@,$AUTOCONF,;t t
-s,@AUTOHEADER@,$AUTOHEADER,;t t
-s,@MAINT@,$MAINT,;t t
-s,@LIBINTL_DEP@,$LIBINTL_DEP,;t t
-s,@INCINTL@,$INCINTL,;t t
-s,@LIBOBJS@,$LIBOBJS,;t t
-s,@LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
+if test -n "$CONFIG_FILES"; then
 
 _ACEOF
 
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+MKINSTALLDIRS!$MKINSTALLDIRS$ac_delim
+USE_NLS!$USE_NLS$ac_delim
+MSGFMT!$MSGFMT$ac_delim
+GMSGFMT!$GMSGFMT$ac_delim
+XGETTEXT!$XGETTEXT$ac_delim
+MSGMERGE!$MSGMERGE$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+RANLIB!$RANLIB$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+ALLOCA!$ALLOCA$ac_delim
+GLIBC21!$GLIBC21$ac_delim
+LIBICONV!$LIBICONV$ac_delim
+LTLIBICONV!$LTLIBICONV$ac_delim
+INTLBISON!$INTLBISON$ac_delim
+BUILD_INCLUDED_LIBINTL!$BUILD_INCLUDED_LIBINTL$ac_delim
+USE_INCLUDED_LIBINTL!$USE_INCLUDED_LIBINTL$ac_delim
+CATOBJEXT!$CATOBJEXT$ac_delim
+DATADIRNAME!$DATADIRNAME$ac_delim
+INSTOBJEXT!$INSTOBJEXT$ac_delim
+GENCAT!$GENCAT$ac_delim
+INTLOBJS!$INTLOBJS$ac_delim
+INTL_LIBTOOL_SUFFIX_PREFIX!$INTL_LIBTOOL_SUFFIX_PREFIX$ac_delim
+INTLLIBS!$INTLLIBS$ac_delim
+LIBINTL!$LIBINTL$ac_delim
+LTLIBINTL!$LTLIBINTL$ac_delim
+POSUB!$POSUB$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAINT!$MAINT$ac_delim
+LIBINTL_DEP!$LIBINTL_DEP$ac_delim
+INCINTL!$INCINTL$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 91; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
 fi # test -n "$CONFIG_FILES"
 
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
   esac
 
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+  ac_dir=`$as_dirname -- "$ac_file" ||
 $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$ac_file" : 'X\(//\)[^/]' \| \
 	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
     as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
     done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-
   ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
 
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
 
   case $INSTALL in
   [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
   esac
-
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
 _ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
 cat >>$CONFIG_STATUS <<_ACEOF
   sed "$ac_vpsub
 $extrasub
@@ -8153,365 +8758,140 @@
 cat >>$CONFIG_STATUS <<\_ACEOF
 :t
 /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-s,@INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
 
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
 
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  rm -f "$tmp/stdin"
   case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
   esac
-
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
 _ACEOF
 
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
 
-# This sed command replaces #undef with comments.  This is necessary, for
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
 
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
 do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
   echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
   rm -f conftest.defines
   mv conftest.tail conftest.defines
 done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
+rm -f conftest.defines conftest.tail
 
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
 cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
   if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
       { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
 echo "$as_me: $ac_file is unchanged" >&6;}
     else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
       rm -f $ac_file
-      mv $tmp/config.h $ac_file
+      mv "$tmp/config.h" $ac_file
     fi
   else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
+    echo "/* $configure_input  */"
+    cat "$ac_result"
   fi
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+  rm -f "$tmp/out12"
+ ;;
 
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
 
 
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    default-1 )
+  case $ac_file$ac_mode in
+    "default-1":C)
     for ac_file in $CONFIG_FILES; do
       # Support "outfile[:infile[:infile...]]"
       case "$ac_file" in
@@ -8612,11 +8992,10 @@
         ;;
       esac
     done ;;
-  esac
-done
-_ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+  esac
+done # for ac_tag
+
 
 { (exit 0); exit 0; }
 _ACEOF
diff --git a/libdecnumber/configure b/libdecnumber/configure
index 19ece0f..83c8e53 100755
--- a/libdecnumber/configure
+++ b/libdecnumber/configure
@@ -1,83 +1,37 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for libdecnumber  .
+# Generated by GNU Autoconf 2.61 for libdecnumber  .
 #
 # Report bugs to <gcc-bugs@gcc.gnu.org>.
 #
-# Copyright (C) 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -98,124 +52,466 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
   fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
+  case $as_dir in
 	 /*)
-	   if ("$as_dir/$as_base" -c '
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
+  chmod +x "$as_me.lineno" ||
     { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -224,7 +520,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -233,39 +550,27 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
 
-# CDPATH.
-$as_unset CDPATH
-
+exec 7<&0 </dev/null 6>&1
 
 # Name of the host.
 # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
-exec 6>&1
-
 #
 # Initializations.
 #
 ac_default_prefix=/usr/local
+ac_clean_files=
 ac_config_libobj_dir=.
+LIBOBJS=
 cross_compiling=no
 subdirs=
 MFLAGS=
 MAKEFLAGS=
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
 # Identity of this package.
 PACKAGE_NAME='libdecnumber'
 PACKAGE_TARNAME='libdecnumber'
@@ -277,42 +582,122 @@
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
-#if HAVE_SYS_TYPES_H
+#ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
-#if HAVE_SYS_STAT_H
+#ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #endif
-#if STDC_HEADERS
+#ifdef STDC_HEADERS
 # include <stdlib.h>
 # include <stddef.h>
 #else
-# if HAVE_STDLIB_H
+# ifdef HAVE_STDLIB_H
 #  include <stdlib.h>
 # endif
 #endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
 #  include <memory.h>
 # endif
 # include <string.h>
 #endif
-#if HAVE_STRINGS_H
+#ifdef HAVE_STRINGS_H
 # include <strings.h>
 #endif
-#if HAVE_INTTYPES_H
+#ifdef HAVE_INTTYPES_H
 # include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
 #endif
-#if HAVE_UNISTD_H
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB ACLOCAL AUTOCONF AUTOHEADER WARN_CFLAGS WARN_PEDANTIC WERROR CPP EGREP MAINT build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os enable_decimal_float ADDITIONAL_OBJS LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+SET_MAKE
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+RANLIB
+ACLOCAL
+AUTOCONF
+AUTOHEADER
+WARN_CFLAGS
+WARN_PEDANTIC
+WERROR
+CPP
+GREP
+EGREP
+MAINT
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+target
+target_cpu
+target_vendor
+target_os
+enable_decimal_float
+ADDITIONAL_OBJS
+LIBOBJS
+LTLIBOBJS'
 ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -339,34 +724,48 @@
 # and all the variables that are supposed to be based on exec_prefix
 # by default will actually change.
 # Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
 
 ac_prev=
+ac_dashdash=
 for ac_option
 do
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
+    eval $ac_prev=\$ac_option
     ac_prev=
     continue
   fi
 
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
-  case $ac_option in
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
@@ -388,33 +787,45 @@
   --config-cache | -C)
     cache_file=config.cache ;;
 
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+  -datadir | --datadir | --datadi | --datad)
     ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
     datadir=$ac_optarg ;;
 
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
   -disable-* | --disable-*)
     ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
     ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -441,6 +852,12 @@
   -host=* | --host=* | --hos=* | --ho=*)
     host_alias=$ac_optarg ;;
 
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
@@ -465,13 +882,16 @@
   | --libexe=* | --libex=* | --libe=*)
     libexecdir=$ac_optarg ;;
 
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
   -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
+  | --localstate | --localstat | --localsta | --localst | --locals)
     ac_prev=localstatedir ;;
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
     localstatedir=$ac_optarg ;;
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
@@ -536,6 +956,16 @@
   | --progr-tra=* | --program-tr=* | --program-t=*)
     program_transform_name=$ac_optarg ;;
 
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
@@ -588,24 +1018,20 @@
   -with-* | --with-*)
     ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
 
   -without-* | --without-*)
     ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -636,8 +1062,7 @@
     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
    { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
+    eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
@@ -657,27 +1082,19 @@
    { (exit 1); exit 1; }; }
 fi
 
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
 do
-  eval ac_val=$`echo $ac_var`
+  eval ac_val=\$$ac_var
   case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -704,74 +1121,76 @@
 test "$silent" = yes && exec 6>/dev/null
 
 
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$0" : 'X\(//\)[^/]' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
+  if test ! -r "$srcdir/$ac_unique_file"; then
     srcdir=..
   fi
 else
   ac_srcdir_defaulted=no
 fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
 fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
    { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
 
 #
 # Report the --help message.
@@ -800,9 +1219,6 @@
   -n, --no-create         do not create output files
       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
 
-_ACEOF
-
-  cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
 			  [$ac_default_prefix]
@@ -820,15 +1236,22 @@
   --bindir=DIR           user executables [EPREFIX/bin]
   --sbindir=DIR          system admin executables [EPREFIX/sbin]
   --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
   --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
   --libdir=DIR           object code libraries [EPREFIX/lib]
   --includedir=DIR       C header files [PREFIX/include]
   --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/libdecnumber]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -861,8 +1284,9 @@
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
 
 Use these variables to override the choices made by `configure' or to help
@@ -870,120 +1294,86 @@
 
 Report bugs to <gcc-bugs@gcc.gnu.org>.
 _ACEOF
+ac_status=$?
 fi
 
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
+    test -d "$ac_dir" || continue
     ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
   done
 fi
 
-test -n "$ac_init_help" && exit 0
+test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
 libdecnumber configure
-generated by GNU Autoconf 2.59
+generated by GNU Autoconf 2.61
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
-  exit 0
+  exit
 fi
-exec 5>config.log
-cat >&5 <<_ACEOF
+cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by libdecnumber $as_me  , which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
 
 _ACEOF
+exec 5>>config.log
 {
 cat <<_ASUNAME
 ## --------- ##
@@ -1002,7 +1392,7 @@
 /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
 /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
 /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
 /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
 /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
@@ -1016,6 +1406,7 @@
   test -z "$as_dir" && as_dir=.
   echo "PATH: $as_dir"
 done
+IFS=$as_save_IFS
 
 } >&5
 
@@ -1037,7 +1428,6 @@
 ac_configure_args=
 ac_configure_args0=
 ac_configure_args1=
-ac_sep=
 ac_must_keep_next=false
 for ac_pass in 1 2
 do
@@ -1048,7 +1438,7 @@
     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    *\'*)
       ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
@@ -1070,9 +1460,7 @@
 	  -* ) ac_must_keep_next=true ;;
 	esac
       fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
+      ac_configure_args="$ac_configure_args '$ac_arg'"
       ;;
     esac
   done
@@ -1083,8 +1471,8 @@
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
 # would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
   # Save into config.log some information that might help in debugging.
   {
@@ -1097,20 +1485,34 @@
 _ASBOX
     echo
     # The following way of writing the cache mishandles newlines in values,
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
   (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
     *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-}
+    esac |
+    sort
+)
     echo
 
     cat <<\_ASBOX
@@ -1121,22 +1523,28 @@
     echo
     for ac_var in $ac_subst_vars
     do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
       cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
 _ASBOX
       echo
       for ac_var in $ac_subst_files
       do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
@@ -1148,26 +1556,24 @@
 ## ----------- ##
 _ASBOX
       echo
-      sed "/^$/d" confdefs.h | sort
+      cat confdefs.h
       echo
     fi
     test "$ac_signal" != 0 &&
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
-     ' 0
+' 0
 for ac_signal in 1 2 13 15; do
   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
 done
 ac_signal=0
 
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
+rm -f -r conftest* confdefs.h
 
 # Predefined preprocessor variables.
 
@@ -1198,14 +1604,17 @@
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in $CONFIG_SITE; do
+shift
+for ac_site_file
+do
   if test -r "$ac_site_file"; then
     { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
 echo "$as_me: loading site script $ac_site_file" >&6;}
@@ -1221,8 +1630,8 @@
     { echo "$as_me:$LINENO: loading cache $cache_file" >&5
 echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
     esac
   fi
 else
@@ -1234,12 +1643,11 @@
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+for ac_var in $ac_precious_vars; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
       { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
@@ -1264,8 +1672,7 @@
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -1282,6 +1689,30 @@
    { (exit 1); exit 1; }; }
 fi
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -1292,68 +1723,34 @@
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-case ../config in
-  [\\/]* | ?:[\\/]* ) ac_macro_dir=../config         ;;
-  *)                      ac_macro_dir=$srcdir/../config ;;
-esac
-if test -d "$ac_macro_dir"; then :
-else
-  { { echo "$as_me:$LINENO: error: cannot find macro directory \`../config'" >&5
-echo "$as_me: error: cannot find macro directory \`../config'" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-
 # Checks for programs.
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
 all:
-	@echo 'ac_maketemp="$(MAKE)"'
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
 _ACEOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
 rm -f conftest.make
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   SET_MAKE=
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
@@ -1365,8 +1762,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1379,32 +1776,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1417,36 +1816,51 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
   CC="$ac_cv_prog_CC"
 fi
 
 if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1459,74 +1873,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+
   fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1540,7 +1914,7 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -1551,6 +1925,7 @@
   fi
 done
 done
+IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
@@ -1568,22 +1943,23 @@
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+  for ac_prog in cl.exe
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1596,36 +1972,38 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$CC" && break
   done
 fi
 if test -z "$CC"; then
   ac_ct_CC=$CC
-  for ac_prog in cl
+  for ac_prog in cl.exe
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1638,29 +2016,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_CC" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 fi
 
 fi
@@ -1673,21 +2067,35 @@
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
@@ -1712,47 +2120,77 @@
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
 do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
 	;;
     [ab].out )
 	# We found the default executable, but exeext='' is most
 	# certainly right.
 	break;;
     *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
 	break;;
     * )
 	break;;
   esac
 done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
 else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
@@ -1764,19 +2202,21 @@
 fi
 
 ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
 
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
   if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -1795,22 +2235,27 @@
     fi
   fi
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
 rm -f a.out a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
 
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
@@ -1821,9 +2266,8 @@
 for ac_file in conftest.exe conftest conftest.*; do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
 	  break;;
     * ) break;;
   esac
@@ -1837,14 +2281,14 @@
 fi
 
 rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
 if test "${ac_cv_objext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1864,14 +2308,20 @@
 }
 _ACEOF
 rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
@@ -1889,12 +2339,12 @@
 
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1917,50 +2367,49 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -1976,38 +2425,118 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -2023,12 +2552,12 @@
     CFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
+  ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2062,12 +2591,17 @@
 /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    function prototypes and stuff, but not '\xHH' hex character constants.
    These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
+   as 'x'.  The following induces an error, until -std is added to get
    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
    array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
+   that's true only with -std.  */
 int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -2082,205 +2616,57 @@
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
+rm -f conftest.$ac_ext
 CC=$ac_save_CC
 
 fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
   *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2290,8 +2676,8 @@
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2304,32 +2690,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2342,27 +2730,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
 fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  RANLIB=$ac_ct_RANLIB
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
 else
   RANLIB="$ac_cv_prog_RANLIB"
 fi
@@ -2373,8 +2775,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ACLOCAL+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2387,25 +2789,27 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ACLOCAL="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ACLOCAL=$ac_cv_prog_ACLOCAL
 if test -n "$ACLOCAL"; then
-  echo "$as_me:$LINENO: result: $ACLOCAL" >&5
-echo "${ECHO_T}$ACLOCAL" >&6
+  { echo "$as_me:$LINENO: result: $ACLOCAL" >&5
+echo "${ECHO_T}$ACLOCAL" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ACLOCAL" && break
 done
 test -n "$ACLOCAL" || ACLOCAL="$MISSING aclocal"
@@ -2414,8 +2818,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AUTOCONF+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2428,25 +2832,27 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AUTOCONF="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AUTOCONF=$ac_cv_prog_AUTOCONF
 if test -n "$AUTOCONF"; then
-  echo "$as_me:$LINENO: result: $AUTOCONF" >&5
-echo "${ECHO_T}$AUTOCONF" >&6
+  { echo "$as_me:$LINENO: result: $AUTOCONF" >&5
+echo "${ECHO_T}$AUTOCONF" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AUTOCONF" && break
 done
 test -n "$AUTOCONF" || AUTOCONF="$MISSING autoconf"
@@ -2455,8 +2861,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AUTOHEADER+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2469,25 +2875,27 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AUTOHEADER="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AUTOHEADER=$ac_cv_prog_AUTOHEADER
 if test -n "$AUTOHEADER"; then
-  echo "$as_me:$LINENO: result: $AUTOHEADER" >&5
-echo "${ECHO_T}$AUTOHEADER" >&6
+  { echo "$as_me:$LINENO: result: $AUTOHEADER" >&5
+echo "${ECHO_T}$AUTOHEADER" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AUTOHEADER" && break
 done
 test -n "$AUTOHEADER" || AUTOHEADER="$MISSING autoheader"
@@ -2504,9 +2912,9 @@
 			  -Wmissing-format-attribute -Wcast-qual; do
   as_acx_Woption=`echo "acx_cv_prog_cc_warning_$option" | $as_tr_sh`
 
-  echo "$as_me:$LINENO: checking whether $CC supports $option" >&5
-echo $ECHO_N "checking whether $CC supports $option... $ECHO_C" >&6
-if eval "test \"\${$as_acx_Woption+set}\" = set"; then
+  { echo "$as_me:$LINENO: checking whether $CC supports $option" >&5
+echo $ECHO_N "checking whether $CC supports $option... $ECHO_C" >&6; }
+if { as_var=$as_acx_Woption; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   CFLAGS="$option"
@@ -2526,39 +2934,36 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_acx_Woption=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_acx_Woption=no"
+	eval "$as_acx_Woption=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_acx_Woption'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_acx_Woption'}'`" >&6
+ac_res=`eval echo '${'$as_acx_Woption'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
   if test `eval echo '${'$as_acx_Woption'}'` = yes; then
   WARN_CFLAGS="$WARN_CFLAGS${WARN_CFLAGS:+ }$option"
 fi
@@ -2568,8 +2973,8 @@
 
 WARN_PEDANTIC=
 if test "$GCC" = yes; then
-  echo "$as_me:$LINENO: checking whether $CC supports -pedantic -Wno-long-long" >&5
-echo $ECHO_N "checking whether $CC supports -pedantic -Wno-long-long... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether $CC supports -pedantic -Wno-long-long" >&5
+echo $ECHO_N "checking whether $CC supports -pedantic -Wno-long-long... $ECHO_C" >&6; }
 if test "${acx_cv_prog_cc_pedantic__Wno_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2591,39 +2996,35 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   acx_cv_prog_cc_pedantic__Wno_long_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-acx_cv_prog_cc_pedantic__Wno_long_long=no
+	acx_cv_prog_cc_pedantic__Wno_long_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 CFLAGS="$save_CFLAGS"
 fi
-echo "$as_me:$LINENO: result: $acx_cv_prog_cc_pedantic__Wno_long_long" >&5
-echo "${ECHO_T}$acx_cv_prog_cc_pedantic__Wno_long_long" >&6
+{ echo "$as_me:$LINENO: result: $acx_cv_prog_cc_pedantic__Wno_long_long" >&5
+echo "${ECHO_T}$acx_cv_prog_cc_pedantic__Wno_long_long" >&6; }
 if test $acx_cv_prog_cc_pedantic__Wno_long_long = yes; then
   WARN_PEDANTIC="$WARN_PEDANTIC${WARN_PEDANTIC:+ }-pedantic -Wno-long-long"
 fi
@@ -2636,13 +3037,13 @@
 # Only enable with --enable-werror-always until existing warnings are
 # corrected.
 WERROR=
-# Check whether --enable-werror-always or --disable-werror-always was given.
+# Check whether --enable-werror-always was given.
 if test "${enable_werror_always+set}" = set; then
-  enableval="$enable_werror_always"
-
+  enableval=$enable_werror_always;
 else
   enable_werror_always=no
-fi;
+fi
+
 if test $enable_werror_always = yes; then
   WERROR="$WERROR${WERROR:+ }-Werror"
 fi
@@ -2656,8 +3057,8 @@
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -2691,24 +3092,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -2717,9 +3116,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2729,24 +3129,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -2757,6 +3155,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -2774,8 +3173,8 @@
 else
   ac_cv_prog_CPP=$CPP
 fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
@@ -2798,24 +3197,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -2824,9 +3221,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2836,24 +3234,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -2864,6 +3260,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -2886,23 +3283,170 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
     fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
 
 
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2926,35 +3470,31 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_stdc=no
+	ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
@@ -3010,6 +3550,7 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ctype.h>
+#include <stdlib.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
@@ -3029,18 +3570,27 @@
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
 	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
+      return 2;
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -3053,12 +3603,14 @@
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
 fi
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -3081,9 +3633,9 @@
 		  inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -3097,38 +3649,35 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
@@ -3146,18 +3695,19 @@
 for ac_header in ctype.h stddef.h string.h stdio.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -3168,41 +3718,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -3211,24 +3757,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -3236,9 +3780,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -3262,25 +3807,24 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
+    ( cat <<\_ASBOX
 ## ----------------------------------- ##
 ## Report this to gcc-bugs@gcc.gnu.org ##
 ## ----------------------------------- ##
 _ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -3305,8 +3849,8 @@
   unset ac_cv_type_int_fast32_t
   unset ac_cv_type_uint64_t
   echo $ECHO_N "looking for a compliant stdint.h in $i, $ECHO_C" >&6
-  echo "$as_me:$LINENO: checking for uintmax_t" >&5
-echo $ECHO_N "checking for uintmax_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for uintmax_t" >&5
+echo $ECHO_N "checking for uintmax_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uintmax_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3319,58 +3863,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uintmax_t ac__type_new_;
 int
 main ()
 {
-if ((uintmax_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uintmax_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uintmax_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uintmax_t=no
+	ac_cv_type_uintmax_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uintmax_t" >&5
-echo "${ECHO_T}$ac_cv_type_uintmax_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uintmax_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintmax_t" >&6; }
 if test $ac_cv_type_uintmax_t = yes; then
   acx_cv_header_stdint=$i
 else
   continue
 fi
 
-  echo "$as_me:$LINENO: checking for uintptr_t" >&5
-echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for uintptr_t" >&5
+echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uintptr_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3383,58 +3924,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uintptr_t ac__type_new_;
 int
 main ()
 {
-if ((uintptr_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uintptr_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uintptr_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uintptr_t=no
+	ac_cv_type_uintptr_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
-echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6; }
 if test $ac_cv_type_uintptr_t = yes; then
   :
 else
   acx_cv_header_stdint_kind="(mostly complete)"
 fi
 
-  echo "$as_me:$LINENO: checking for int_least32_t" >&5
-echo $ECHO_N "checking for int_least32_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for int_least32_t" >&5
+echo $ECHO_N "checking for int_least32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_int_least32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3447,58 +3985,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef int_least32_t ac__type_new_;
 int
 main ()
 {
-if ((int_least32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (int_least32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_int_least32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int_least32_t=no
+	ac_cv_type_int_least32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int_least32_t" >&5
-echo "${ECHO_T}$ac_cv_type_int_least32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int_least32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_least32_t" >&6; }
 if test $ac_cv_type_int_least32_t = yes; then
   :
 else
   acx_cv_header_stdint_kind="(mostly complete)"
 fi
 
-  echo "$as_me:$LINENO: checking for int_fast32_t" >&5
-echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for int_fast32_t" >&5
+echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_int_fast32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3511,58 +4046,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef int_fast32_t ac__type_new_;
 int
 main ()
 {
-if ((int_fast32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (int_fast32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_int_fast32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int_fast32_t=no
+	ac_cv_type_int_fast32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
-echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6; }
 if test $ac_cv_type_int_fast32_t = yes; then
   :
 else
   acx_cv_header_stdint_kind="(mostly complete)"
 fi
 
-  echo "$as_me:$LINENO: checking for uint64_t" >&5
-echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for uint64_t" >&5
+echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uint64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3575,50 +4107,47 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uint64_t ac__type_new_;
 int
 main ()
 {
-if ((uint64_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uint64_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uint64_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint64_t=no
+	ac_cv_type_uint64_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint64_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint64_t" >&6; }
 if test $ac_cv_type_uint64_t = yes; then
   :
 else
@@ -3634,8 +4163,8 @@
     unset ac_cv_type_uint32_t
     unset ac_cv_type_uint64_t
     echo $ECHO_N "looking for an incomplete stdint.h in $i, $ECHO_C" >&6
-    echo "$as_me:$LINENO: checking for uint32_t" >&5
-echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for uint32_t" >&5
+echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uint32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3648,58 +4177,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uint32_t ac__type_new_;
 int
 main ()
 {
-if ((uint32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uint32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uint32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint32_t=no
+	ac_cv_type_uint32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint32_t" >&6; }
 if test $ac_cv_type_uint32_t = yes; then
   acx_cv_header_stdint=$i
 else
   continue
 fi
 
-    echo "$as_me:$LINENO: checking for uint64_t" >&5
-echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for uint64_t" >&5
+echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uint64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3712,53 +4238,50 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uint64_t ac__type_new_;
 int
 main ()
 {
-if ((uint64_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uint64_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uint64_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint64_t=no
+	ac_cv_type_uint64_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint64_t" >&6
 
-    echo "$as_me:$LINENO: checking for uintptr_t" >&5
-echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint64_t" >&6; }
+
+    { echo "$as_me:$LINENO: checking for uintptr_t" >&5
+echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_uintptr_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3771,50 +4294,47 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef uintptr_t ac__type_new_;
 int
 main ()
 {
-if ((uintptr_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uintptr_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_uintptr_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uintptr_t=no
+	ac_cv_type_uintptr_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
-echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6; }
 
     break
   done
@@ -3825,8 +4345,8 @@
     unset ac_cv_type_u_int32_t
     unset ac_cv_type_u_int64_t
     echo $ECHO_N "looking for u_intXX_t types in $i, $ECHO_C" >&6
-    echo "$as_me:$LINENO: checking for u_int32_t" >&5
-echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for u_int32_t" >&5
+echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_u_int32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3839,58 +4359,55 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef u_int32_t ac__type_new_;
 int
 main ()
 {
-if ((u_int32_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (u_int32_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_u_int32_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_u_int32_t=no
+	ac_cv_type_u_int32_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5
-echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; }
 if test $ac_cv_type_u_int32_t = yes; then
   acx_cv_header_stdint=$i
 else
   continue
 fi
 
-    echo "$as_me:$LINENO: checking for u_int64_t" >&5
-echo $ECHO_N "checking for u_int64_t... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for u_int64_t" >&5
+echo $ECHO_N "checking for u_int64_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_u_int64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3903,50 +4420,47 @@
 #include <sys/types.h>
 #include <$i>
 
+typedef u_int64_t ac__type_new_;
 int
 main ()
 {
-if ((u_int64_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (u_int64_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_u_int64_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_u_int64_t=no
+	ac_cv_type_u_int64_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_u_int64_t" >&5
-echo "${ECHO_T}$ac_cv_type_u_int64_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int64_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int64_t" >&6; }
 
     break
   done
@@ -3963,19 +4477,27 @@
 
 # ----------------- Summarize what we found so far
 
-echo "$as_me:$LINENO: checking what to include in gstdint.h" >&5
-echo $ECHO_N "checking what to include in gstdint.h... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking what to include in gstdint.h" >&5
+echo $ECHO_N "checking what to include in gstdint.h... $ECHO_C" >&6; }
 
-case `$as_basename gstdint.h ||
+case `$as_basename -- gstdint.h ||
 $as_expr X/gstdint.h : '.*/\([^/][^/]*\)/*$' \| \
 	 Xgstdint.h : 'X\(//\)$' \| \
-	 Xgstdint.h : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 Xgstdint.h : 'X\(/\)' \| . 2>/dev/null ||
 echo X/gstdint.h |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'` in
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'` in
   stdint.h) { echo "$as_me:$LINENO: WARNING: are you sure you want it there?" >&5
 echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
   inttypes.h) { echo "$as_me:$LINENO: WARNING: are you sure you want it there?" >&5
@@ -3983,15 +4505,15 @@
   *) ;;
 esac
 
-echo "$as_me:$LINENO: result: $acx_cv_header_stdint $acx_cv_header_stdint_kind" >&5
-echo "${ECHO_T}$acx_cv_header_stdint $acx_cv_header_stdint_kind" >&6
+{ echo "$as_me:$LINENO: result: $acx_cv_header_stdint $acx_cv_header_stdint_kind" >&5
+echo "${ECHO_T}$acx_cv_header_stdint $acx_cv_header_stdint_kind" >&6; }
 
 # ----------------- done included file, check C basic types --------
 
 # Lacking an uintptr_t?  Test size of void *
 case "$acx_cv_header_stdint:$ac_cv_type_uintptr_t" in
-  stddef.h:* | *:no) echo "$as_me:$LINENO: checking for void *" >&5
-echo $ECHO_N "checking for void *... $ECHO_C" >&6
+  stddef.h:* | *:no) { echo "$as_me:$LINENO: checking for void *" >&5
+echo $ECHO_N "checking for void *... $ECHO_C" >&6; }
 if test "${ac_cv_type_void_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4002,61 +4524,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef void * ac__type_new_;
 int
 main ()
 {
-if ((void * *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (void *))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_void_p=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_void_p=no
+	ac_cv_type_void_p=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
-echo "${ECHO_T}$ac_cv_type_void_p" >&6
 
-echo "$as_me:$LINENO: checking size of void *" >&5
-echo $ECHO_N "checking size of void *... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
+echo "${ECHO_T}$ac_cv_type_void_p" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of void *" >&5
+echo $ECHO_N "checking size of void *... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_void_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_void_p" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -4066,10 +4584,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -4077,27 +4596,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -4107,10 +4621,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -4118,56 +4633,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -4175,27 +4687,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -4205,10 +4712,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -4216,50 +4724,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -4270,10 +4776,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef void * ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -4281,52 +4788,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_void_p=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+'') if test "$ac_cv_type_void_p" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (void *), 77
+echo "$as_me: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_void_p=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -4334,8 +4834,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (void *)); }
-unsigned long ulongval () { return (long) (sizeof (void *)); }
+   typedef void * ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -4344,35 +4845,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (void *))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (void *))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (void *))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -4383,22 +4893,25 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+if test "$ac_cv_type_void_p" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (void *), 77
+echo "$as_me: error: cannot compute sizeof (void *)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_void_p=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_void_p=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
-echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
+echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_VOID_P $ac_cv_sizeof_void_p
 _ACEOF
@@ -4408,8 +4921,8 @@
 
 # Lacking an uint64_t?  Test size of long
 case "$acx_cv_header_stdint:$ac_cv_type_uint64_t:$ac_cv_type_u_int64_t" in
-  stddef.h:*:* | *:no:no) echo "$as_me:$LINENO: checking for long" >&5
-echo $ECHO_N "checking for long... $ECHO_C" >&6
+  stddef.h:*:* | *:no:no) { echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6; }
 if test "${ac_cv_type_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4420,61 +4933,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long ac__type_new_;
 int
 main ()
 {
-if ((long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long=no
+	ac_cv_type_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
-echo "${ECHO_T}$ac_cv_type_long" >&6
 
-echo "$as_me:$LINENO: checking size of long" >&5
-echo $ECHO_N "checking size of long... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -4484,10 +4993,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -4495,27 +5005,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -4525,10 +5030,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -4536,56 +5042,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -4593,27 +5096,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -4623,10 +5121,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -4634,50 +5133,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -4688,10 +5185,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -4699,52 +5197,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+'') if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -4752,8 +5243,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long)); }
-unsigned long ulongval () { return (long) (sizeof (long)); }
+   typedef long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -4762,35 +5254,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -4801,22 +5302,25 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_LONG $ac_cv_sizeof_long
 _ACEOF
@@ -4826,8 +5330,8 @@
 
 if test $acx_cv_header_stdint = stddef.h; then
   # Lacking a good header?  Test size of everything and deduce all types.
-  echo "$as_me:$LINENO: checking for int" >&5
-echo $ECHO_N "checking for int... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6; }
 if test "${ac_cv_type_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4838,61 +5342,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef int ac__type_new_;
 int
 main ()
 {
-if ((int *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (int))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_int=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int=no
+	ac_cv_type_int=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
-echo "${ECHO_T}$ac_cv_type_int" >&6
 
-echo "$as_me:$LINENO: checking size of int" >&5
-echo $ECHO_N "checking size of int... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_int" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -4902,10 +5402,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -4913,27 +5414,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -4943,10 +5439,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -4954,56 +5451,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -5011,27 +5505,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -5041,10 +5530,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5052,50 +5542,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -5106,10 +5594,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5117,52 +5606,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_int=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+'') if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -5170,8 +5652,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (int)); }
-unsigned long ulongval () { return (long) (sizeof (int)); }
+   typedef int ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -5180,35 +5663,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (int))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -5219,29 +5711,32 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_int=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
-echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_INT $ac_cv_sizeof_int
 _ACEOF
 
 
-  echo "$as_me:$LINENO: checking for short" >&5
-echo $ECHO_N "checking for short... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for short" >&5
+echo $ECHO_N "checking for short... $ECHO_C" >&6; }
 if test "${ac_cv_type_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5252,61 +5747,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef short ac__type_new_;
 int
 main ()
 {
-if ((short *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (short))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_short=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_short=no
+	ac_cv_type_short=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
-echo "${ECHO_T}$ac_cv_type_short" >&6
 
-echo "$as_me:$LINENO: checking size of short" >&5
-echo $ECHO_N "checking size of short... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
+echo "${ECHO_T}$ac_cv_type_short" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of short" >&5
+echo $ECHO_N "checking size of short... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_short" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -5316,10 +5807,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -5327,27 +5819,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -5357,10 +5844,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5368,56 +5856,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -5425,27 +5910,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -5455,10 +5935,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5466,50 +5947,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -5520,10 +5999,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5531,52 +6011,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_short=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+'') if test "$ac_cv_type_short" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (short), 77
+echo "$as_me: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_short=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -5584,8 +6057,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (short)); }
-unsigned long ulongval () { return (long) (sizeof (short)); }
+   typedef short ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -5594,35 +6068,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (short))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (short))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (short))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -5633,29 +6116,32 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+if test "$ac_cv_type_short" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (short), 77
+echo "$as_me: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_short=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_short=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
-echo "${ECHO_T}$ac_cv_sizeof_short" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_short" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_SHORT $ac_cv_sizeof_short
 _ACEOF
 
 
-  echo "$as_me:$LINENO: checking for char" >&5
-echo $ECHO_N "checking for char... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for char" >&5
+echo $ECHO_N "checking for char... $ECHO_C" >&6; }
 if test "${ac_cv_type_char+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5666,61 +6152,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef char ac__type_new_;
 int
 main ()
 {
-if ((char *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (char))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_char=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_char=no
+	ac_cv_type_char=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5
-echo "${ECHO_T}$ac_cv_type_char" >&6
 
-echo "$as_me:$LINENO: checking size of char" >&5
-echo $ECHO_N "checking size of char... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5
+echo "${ECHO_T}$ac_cv_type_char" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of char" >&5
+echo $ECHO_N "checking size of char... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_char+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_char" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -5730,10 +6212,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -5741,27 +6224,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -5771,10 +6249,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5782,56 +6261,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -5839,27 +6315,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -5869,10 +6340,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5880,50 +6352,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -5934,10 +6404,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5945,52 +6416,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_char=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+'') if test "$ac_cv_type_char" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (char), 77
+echo "$as_me: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_char=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -5998,8 +6462,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (char)); }
-unsigned long ulongval () { return (long) (sizeof (char)); }
+   typedef char ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -6008,35 +6473,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (char))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (char))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (char))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -6047,41 +6521,44 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+if test "$ac_cv_type_char" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (char), 77
+echo "$as_me: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_char=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_char=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5
-echo "${ECHO_T}$ac_cv_sizeof_char" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5
+echo "${ECHO_T}$ac_cv_sizeof_char" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_CHAR $ac_cv_sizeof_char
 _ACEOF
 
 
 
-  echo "$as_me:$LINENO: checking for type equivalent to int8_t" >&5
-echo $ECHO_N "checking for type equivalent to int8_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int8_t" >&5
+echo $ECHO_N "checking for type equivalent to int8_t... $ECHO_C" >&6; }
   case "$ac_cv_sizeof_char" in
     1) acx_cv_type_int8_t=char ;;
     *) { { echo "$as_me:$LINENO: error: no 8-bit type" >&5
 echo "$as_me: error: no 8-bit type" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_int8_t" >&5
-echo "${ECHO_T}$acx_cv_type_int8_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_int8_t" >&5
+echo "${ECHO_T}$acx_cv_type_int8_t" >&6; }
 
-  echo "$as_me:$LINENO: checking for type equivalent to int16_t" >&5
-echo $ECHO_N "checking for type equivalent to int16_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int16_t" >&5
+echo $ECHO_N "checking for type equivalent to int16_t... $ECHO_C" >&6; }
   case "$ac_cv_sizeof_int:$ac_cv_sizeof_short" in
     2:*) acx_cv_type_int16_t=int ;;
     *:2) acx_cv_type_int16_t=short ;;
@@ -6089,11 +6566,11 @@
 echo "$as_me: error: no 16-bit type" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_int16_t" >&5
-echo "${ECHO_T}$acx_cv_type_int16_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_int16_t" >&5
+echo "${ECHO_T}$acx_cv_type_int16_t" >&6; }
 
-  echo "$as_me:$LINENO: checking for type equivalent to int32_t" >&5
-echo $ECHO_N "checking for type equivalent to int32_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int32_t" >&5
+echo $ECHO_N "checking for type equivalent to int32_t... $ECHO_C" >&6; }
   case "$ac_cv_sizeof_int:$ac_cv_sizeof_long" in
     4:*) acx_cv_type_int32_t=int ;;
     *:4) acx_cv_type_int32_t=long ;;
@@ -6101,8 +6578,8 @@
 echo "$as_me: error: no 32-bit type" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_int32_t" >&5
-echo "${ECHO_T}$acx_cv_type_int32_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_int32_t" >&5
+echo "${ECHO_T}$acx_cv_type_int32_t" >&6; }
 fi
 
 # These tests are here to make the output prettier
@@ -6111,17 +6588,17 @@
   case "$ac_cv_sizeof_long" in
     8) acx_cv_type_int64_t=long ;;
   esac
-  echo "$as_me:$LINENO: checking for type equivalent to int64_t" >&5
-echo $ECHO_N "checking for type equivalent to int64_t... $ECHO_C" >&6
-  echo "$as_me:$LINENO: result: ${acx_cv_type_int64_t-'using preprocessor symbols'}" >&5
-echo "${ECHO_T}${acx_cv_type_int64_t-'using preprocessor symbols'}" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to int64_t" >&5
+echo $ECHO_N "checking for type equivalent to int64_t... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: ${acx_cv_type_int64_t-'using preprocessor symbols'}" >&5
+echo "${ECHO_T}${acx_cv_type_int64_t-'using preprocessor symbols'}" >&6; }
 fi
 
 # Now we can use the above types
 
 if test "$ac_cv_type_uintptr_t" != yes; then
-  echo "$as_me:$LINENO: checking for type equivalent to intptr_t" >&5
-echo $ECHO_N "checking for type equivalent to intptr_t... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for type equivalent to intptr_t" >&5
+echo $ECHO_N "checking for type equivalent to intptr_t... $ECHO_C" >&6; }
   case $ac_cv_sizeof_void_p in
     2) acx_cv_type_intptr_t=int16_t ;;
     4) acx_cv_type_intptr_t=int32_t ;;
@@ -6130,19 +6607,19 @@
 echo "$as_me: error: no equivalent for intptr_t" >&2;}
    { (exit please report a bug); exit please report a bug; }; }
   esac
-  echo "$as_me:$LINENO: result: $acx_cv_type_intptr_t" >&5
-echo "${ECHO_T}$acx_cv_type_intptr_t" >&6
+  { echo "$as_me:$LINENO: result: $acx_cv_type_intptr_t" >&5
+echo "${ECHO_T}$acx_cv_type_intptr_t" >&6; }
 fi
 
 # ----------------- done all checks, emit header -------------
-          ac_config_commands="$ac_config_commands gstdint.h"
+ac_config_commands="$ac_config_commands gstdint.h"
 
 
 
 
 # Checks for typedefs, structures, and compiler characteristics.
-echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
 if test "${ac_cv_c_const+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6160,10 +6637,10 @@
 #ifndef __cplusplus
   /* Ultrix mips cc rejects this.  */
   typedef int charset[2];
-  const charset x;
+  const charset cs;
   /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *ccp;
-  char **p;
+  char const *const *pcpcc;
+  char **ppc;
   /* NEC SVR4.0.2 mips cc rejects this.  */
   struct point {int x, y;};
   static struct point const zero = {0,0};
@@ -6172,16 +6649,17 @@
      an arm of an if-expression whose if-part is not a constant
      expression */
   const char *g = "string";
-  ccp = &g + (g ? g-g : 0);
+  pcpcc = &g + (g ? g-g : 0);
   /* HPUX 7.0 cc rejects these. */
-  ++ccp;
-  p = (char**) ccp;
-  ccp = (char const *const *) p;
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
   { /* SCO 3.2v4 cc rejects this.  */
     char *t;
     char const *s = 0 ? (char *) 0 : (char const *) 0;
 
     *t++ = 0;
+    if (s) return 0;
   }
   { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
     int x[] = {25, 17};
@@ -6200,7 +6678,9 @@
   }
   { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
     const int foo = 10;
+    if (!foo) return 0;
   }
+  return !cs[0] && !zero.x;
 #endif
 
   ;
@@ -6208,38 +6688,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_c_const=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_c_const=no
+	ac_cv_c_const=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
-echo "${ECHO_T}$ac_cv_c_const" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
 if test $ac_cv_c_const = no; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -6248,8 +6724,8 @@
 
 fi
 
-echo "$as_me:$LINENO: checking for off_t" >&5
-echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_off_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6260,62 +6736,59 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef off_t ac__type_new_;
 int
 main ()
 {
-if ((off_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (off_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_off_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_off_t=no
+	ac_cv_type_off_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
-echo "${ECHO_T}$ac_cv_type_off_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6; }
 if test $ac_cv_type_off_t = yes; then
   :
 else
 
 cat >>confdefs.h <<_ACEOF
-#define off_t long
+#define off_t long int
 _ACEOF
 
 fi
 
-echo "$as_me:$LINENO: checking for int" >&5
-echo $ECHO_N "checking for int... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6; }
 if test "${ac_cv_type_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6326,61 +6799,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef int ac__type_new_;
 int
 main ()
 {
-if ((int *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (int))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_int=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int=no
+	ac_cv_type_int=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
-echo "${ECHO_T}$ac_cv_type_int" >&6
 
-echo "$as_me:$LINENO: checking size of int" >&5
-echo $ECHO_N "checking size of int... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_int" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -6390,10 +6859,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -6401,27 +6871,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6431,10 +6896,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6442,56 +6908,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -6499,27 +6962,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6529,10 +6987,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6540,50 +6999,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -6594,10 +7051,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6605,52 +7063,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_int=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+'') if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -6658,8 +7109,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (int)); }
-unsigned long ulongval () { return (long) (sizeof (int)); }
+   typedef int ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -6668,35 +7120,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (int))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -6707,29 +7168,32 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_int=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
-echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_INT $ac_cv_sizeof_int
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for long" >&5
-echo $ECHO_N "checking for long... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6; }
 if test "${ac_cv_type_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6740,61 +7204,57 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long ac__type_new_;
 int
 main ()
 {
-if ((long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long=no
+	ac_cv_type_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
-echo "${ECHO_T}$ac_cv_type_long" >&6
 
-echo "$as_me:$LINENO: checking size of long" >&5
-echo $ECHO_N "checking size of long... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -6804,10 +7264,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -6815,27 +7276,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6845,10 +7301,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6856,56 +7313,53 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -6913,27 +7367,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6943,10 +7392,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6954,50 +7404,48 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -7008,10 +7456,11 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7019,52 +7468,45 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+'') if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -7072,8 +7514,9 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long)); }
-unsigned long ulongval () { return (long) (sizeof (long)); }
+   typedef long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -7082,35 +7525,44 @@
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -7121,22 +7573,25 @@
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_LONG $ac_cv_sizeof_long
 _ACEOF
@@ -7144,8 +7599,8 @@
 
 
 # Checks for library functions.
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7169,35 +7624,31 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_stdc=no
+	ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
@@ -7253,6 +7704,7 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ctype.h>
+#include <stdlib.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
@@ -7272,18 +7724,27 @@
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
 	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
+      return 2;
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -7296,12 +7757,14 @@
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
 fi
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -7311,13 +7774,13 @@
 fi
 
 
-# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+# Check whether --enable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
-  enableval="$enable_maintainer_mode"
-
+  enableval=$enable_maintainer_mode;
 else
   enable_maintainer_mode=no
-fi;
+fi
+
 
 if test "x$enable_maintainer_mode" = xno; then
   MAINT='#'
@@ -7327,104 +7790,154 @@
 
 
 ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install-sh -c"
     break
-  elif test -f $ac_dir/install.sh; then
+  elif test -f "$ac_dir/install.sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install.sh -c"
     break
-  elif test -f $ac_dir/shtool; then
+  elif test -f "$ac_dir/shtool"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/shtool install -c"
     break
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
    { (exit 1); exit 1; }; }
 fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
 
 # Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
    { (exit 1); exit 1; }; }
 
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
 if test "${ac_cv_build+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
   { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
 echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
    { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
 if test "${ac_cv_host+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+fi
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
-echo "$as_me:$LINENO: checking target system type" >&5
-echo $ECHO_N "checking target system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6; }
 if test "${ac_cv_target+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_target_alias=$target_alias
-test "x$ac_cv_target_alias" = "x" &&
-  ac_cv_target_alias=$ac_cv_host_alias
-ac_cv_target=`$ac_config_sub $ac_cv_target_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+fi
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_target" >&5
-echo "${ECHO_T}$ac_cv_target" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5
+echo "$as_me: error: invalid value of canonical target" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 target=$ac_cv_target
-target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
 
 
 # The aliases save the names the user supplied, while $host etc.
@@ -7436,12 +7949,11 @@
 
 # Default decimal format
 # If you change the defaults here, be sure to change them in the GCC directory also
-echo "$as_me:$LINENO: checking for decimal floating point" >&5
-echo $ECHO_N "checking for decimal floating point... $ECHO_C" >&6
-# Check whether --enable-decimal-float or --disable-decimal-float was given.
+{ echo "$as_me:$LINENO: checking for decimal floating point" >&5
+echo $ECHO_N "checking for decimal floating point... $ECHO_C" >&6; }
+# Check whether --enable-decimal-float was given.
 if test "${enable_decimal_float+set}" = set; then
-  enableval="$enable_decimal_float"
-
+  enableval=$enable_decimal_float;
   case $enable_decimal_float in
     yes | no | bid | dpd) ;;
     *) { { echo "$as_me:$LINENO: error: '$enable_decimal_float' is an invalid value for --enable-decimal-float.
@@ -7462,7 +7974,8 @@
       ;;
   esac
 
-fi;
+fi
+
 
 # x86's use BID format instead of DPD
 # In theory --enable-decimal-float=no should not compile anything
@@ -7485,13 +7998,13 @@
   ADDITIONAL_OBJS=
 fi
 
-echo "$as_me:$LINENO: result: $enable_decimal_float" >&5
-echo "${ECHO_T}$enable_decimal_float" >&6
+{ echo "$as_me:$LINENO: result: $enable_decimal_float" >&5
+echo "${ECHO_T}$enable_decimal_float" >&6; }
 
 
 
-echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
-echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; }
 if test "${ac_cv_c_bigendian+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7508,7 +8021,8 @@
 int
 main ()
 {
-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+#if  ! (defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN \
+	&& BYTE_ORDER && BIG_ENDIAN && LITTLE_ENDIAN)
  bogus endian macros
 #endif
 
@@ -7517,27 +8031,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   # It does; now see whether it defined to BIG_ENDIAN or not.
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -7560,40 +8069,36 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_c_bigendian=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_c_bigendian=no
+	ac_cv_c_bigendian=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-# It does not; compile a test program.
+	# It does not; compile a test program.
 if test "$cross_compiling" = yes; then
   # try to guess the endianness by grepping values into an object file
   ac_cv_c_bigendian=unknown
@@ -7603,11 +8108,11 @@
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
 void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
 void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
 int
 main ()
@@ -7618,27 +8123,22 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
   ac_cv_c_bigendian=yes
 fi
@@ -7654,8 +8154,10 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -7663,27 +8165,41 @@
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+$ac_includes_default
 int
 main ()
 {
+
   /* Are we little or big endian?  From Harbison&Steele.  */
   union
   {
-    long l;
-    char c[sizeof (long)];
+    long int l;
+    char c[sizeof (long int)];
   } u;
   u.l = 1;
-  exit (u.c[sizeof (long) - 1] == 1);
+  return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -7696,13 +8212,16 @@
 ( exit $ac_status )
 ac_cv_c_bigendian=yes
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
+
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
-echo "${ECHO_T}$ac_cv_c_bigendian" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6; }
 case $ac_cv_c_bigendian in
   yes)
 
@@ -7723,9 +8242,9 @@
 
 # Output.
 
-          ac_config_headers="$ac_config_headers config.h:config.in"
+ac_config_headers="$ac_config_headers config.h:config.in"
 
-          ac_config_files="$ac_config_files Makefile"
+ac_config_files="$ac_config_files Makefile"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -7745,39 +8264,58 @@
 
 # The following way of writing the cache mishandles newlines in values,
 # but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
+# So, we kill variables containing newlines.
 # Ultrix sh set writes to stderr and can't be redirected directly,
 # and sets the high bit in the cache file unless we assign to the vars.
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
   (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       # `set' does not quote correctly, so add quotes (double-quote
       # substitution turns \\\\ into \\, and sed turns \\ into \).
       sed -n \
 	"s/'/'\\\\''/g;
 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
+      ;; #(
     *)
       # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-} |
+    esac |
+    sort
+) |
   sed '
+     /^ac_cv_env_/b end
      t clear
-     : clear
+     :clear
      s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
      t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
     cat confcache >$cache_file
   else
-    echo "not updating unwritable cache $cache_file"
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -7786,32 +8324,18 @@
 # Let make expand exec_prefix.
 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
-
 DEFS=-DHAVE_CONFIG_H
 
 ac_libobjs=
 ac_ltlibobjs=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
 done
 LIBOBJS=$ac_libobjs
 
@@ -7842,73 +8366,26 @@
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -7929,126 +8406,198 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
 do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -8057,7 +8606,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -8066,31 +8636,14 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 exec 6>&1
 
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# Save the log message, to keep $[0] and so on meaningful, and to
 # report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
+# values after options handling.
+ac_log="
 This file was extended by libdecnumber $as_me  , which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -8098,30 +8651,20 @@
   CONFIG_COMMANDS = $CONFIG_COMMANDS
   $ $0 $@
 
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
 _ACEOF
 
+cat >>$CONFIG_STATUS <<_ACEOF
 # Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
 
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
+_ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
-
 ac_cs_usage="\
 \`$as_me' instantiates files from templates according to the
 current configuration.
@@ -8129,7 +8672,7 @@
 Usage: $0 [OPTIONS] [FILE]...
 
   -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
+  -V, --version    print version number and configuration settings, then exit
   -q, --quiet      do not print progress messages
   -d, --debug      don't remove temporary files
       --recheck    update $as_me by reconfiguring in the same conditions
@@ -8148,18 +8691,20 @@
 $config_commands
 
 Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
 libdecnumber config.status
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 2006 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
 _ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
@@ -8170,39 +8715,24 @@
 do
   case $1 in
   --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
     ac_shift=:
     ;;
-  -*)
+  *)
     ac_option=$1
     ac_optarg=$2
     ac_shift=shift
     ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
   esac
 
   case $ac_option in
   # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
     ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
     $ac_shift
@@ -8212,18 +8742,24 @@
     $ac_shift
     CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
     ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil | --si | --s)
     ac_cs_silent=: ;;
 
   # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
    { (exit 1); exit 1; }; } ;;
 
-  *) ac_config_targets="$ac_config_targets $1" ;;
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
 
   esac
   shift
@@ -8239,18 +8775,29 @@
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
 fi
 
 _ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 #
-# INIT-COMMANDS section.
+# INIT-COMMANDS
 #
 
-
 GCC="$GCC"
 CC="$CC"
 acx_cv_header_stdint="$acx_cv_header_stdint"
@@ -8271,22 +8818,23 @@
 
 _ACEOF
 
-
-
 cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
 for ac_config_target in $ac_config_targets
 do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "gstdint.h" ) CONFIG_COMMANDS="$CONFIG_COMMANDS gstdint.h" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+  case $ac_config_target in
+    "gstdint.h") CONFIG_COMMANDS="$CONFIG_COMMANDS gstdint.h" ;;
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
   esac
 done
 
+
 # If the user did not use the arguments to specify the items to instantiate,
 # then the envvar interface is used.  Set only those that are not.
 # We use the long form for the default assignment because of an extremely
@@ -8298,315 +8846,382 @@
 fi
 
 # Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
+# simply because there is no reason against having it here, and in addition,
 # creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
 $debug ||
 {
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
   trap '{ (exit 1); exit 1; }' 1 2 13 15
 }
-
 # Create a (secure) tmp directory for tmp files.
 
 {
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
   test -n "$tmp" && test -d "$tmp"
 }  ||
 {
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
 } ||
 {
    echo "$me: cannot create a temporary directory in ." >&2
    { (exit 1); exit 1; }
 }
 
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
 #
-# CONFIG_FILES section.
+# Set up the sed scripts for CONFIG_FILES section.
 #
 
 # No need to generate the scripts if there are no CONFIG_FILES.
 # This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@SET_MAKE@,$SET_MAKE,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@ACLOCAL@,$ACLOCAL,;t t
-s,@AUTOCONF@,$AUTOCONF,;t t
-s,@AUTOHEADER@,$AUTOHEADER,;t t
-s,@WARN_CFLAGS@,$WARN_CFLAGS,;t t
-s,@WARN_PEDANTIC@,$WARN_PEDANTIC,;t t
-s,@WERROR@,$WERROR,;t t
-s,@CPP@,$CPP,;t t
-s,@EGREP@,$EGREP,;t t
-s,@MAINT@,$MAINT,;t t
-s,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;t t
-s,@target@,$target,;t t
-s,@target_cpu@,$target_cpu,;t t
-s,@target_vendor@,$target_vendor,;t t
-s,@target_os@,$target_os,;t t
-s,@enable_decimal_float@,$enable_decimal_float,;t t
-s,@ADDITIONAL_OBJS@,$ADDITIONAL_OBJS,;t t
-s,@LIBOBJS@,$LIBOBJS,;t t
-s,@LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
+if test -n "$CONFIG_FILES"; then
 
 _ACEOF
 
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+RANLIB!$RANLIB$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+WARN_CFLAGS!$WARN_CFLAGS$ac_delim
+WARN_PEDANTIC!$WARN_PEDANTIC$ac_delim
+WERROR!$WERROR$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+MAINT!$MAINT$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+target!$target$ac_delim
+target_cpu!$target_cpu$ac_delim
+target_vendor!$target_vendor$ac_delim
+target_os!$target_os$ac_delim
+enable_decimal_float!$enable_decimal_float$ac_delim
+ADDITIONAL_OBJS!$ADDITIONAL_OBJS$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 72; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
 fi # test -n "$CONFIG_FILES"
 
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
   esac
 
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+  ac_dir=`$as_dirname -- "$ac_file" ||
 $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$ac_file" : 'X\(//\)[^/]' \| \
 	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
     as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
     done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-
   ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
 
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
 
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
 _ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
 cat >>$CONFIG_STATUS <<_ACEOF
   sed "$ac_vpsub
 $extrasub
@@ -8614,368 +9229,139 @@
 cat >>$CONFIG_STATUS <<\_ACEOF
 :t
 /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
 
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
 
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  rm -f "$tmp/stdin"
   case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
   esac
-
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
 _ACEOF
 
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
 
-# This sed command replaces #undef with comments.  This is necessary, for
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
 
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
 do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
   echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
   rm -f conftest.defines
   mv conftest.tail conftest.defines
 done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
+rm -f conftest.defines conftest.tail
 
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
 cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
   if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
       { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
 echo "$as_me: $ac_file is unchanged" >&6;}
     else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
       rm -f $ac_file
-      mv $tmp/config.h $ac_file
+      mv "$tmp/config.h" $ac_file
     fi
   else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
+    echo "/* $configure_input  */"
+    cat "$ac_result"
   fi
-  # Run the commands associated with the file.
-  case $ac_file in
-    config.h ) echo timestamp > stamp-h1 ;;
+  rm -f "$tmp/out12"
+ ;;
+
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
   esac
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
 
 
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    gstdint.h )
+  case $ac_file$ac_mode in
+    "gstdint.h":C)
 if test "$GCC" = yes; then
   echo "/* generated for " `$CC --version | sed 1q` "*/" > tmp-stdint.h
 else
@@ -9303,11 +9689,11 @@
 fi
 
  ;;
-  esac
-done
-_ACEOF
+    "config.h":H) echo timestamp > stamp-h1 ;;
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+  esac
+done # for ac_tag
+
 
 { (exit 0); exit 0; }
 _ACEOF
diff --git a/opcodes/Makefile.am b/opcodes/Makefile.am
index 14ae763..8c80c66 100644
--- a/opcodes/Makefile.am
+++ b/opcodes/Makefile.am
@@ -60,13 +60,15 @@
 CFILES = \
 	alpha-dis.c \
 	alpha-opc.c \
-	arc-ext.c \
+	arcompact-dis.c \
 	arc-asm.c \
 	arc-desc.c \
 	arc-dis.c \
+	arc-dis-cgen.c \
 	arc-ibld.c \
 	arc-opc.c \
 	arc-opinst.c \
+	arc-ext.c \
 	arm-dis.c \
 	avr-dis.c \
 	bfin-dis.c \
@@ -218,13 +220,14 @@
 ALL_MACHINES = \
 	alpha-dis.lo \
 	alpha-opc.lo \
-	arc-ext.lo \
 	arc-asm.lo \
 	arc-desc.lo \
 	arc-dis.lo \
+	arc-dis-cgen.lo \
 	arc-ibld.lo \
-	arc-opc.lo \
 	arc-opinst.lo \
+	arc-opc.lo \
+	arc-ext.lo \
 	arm-dis.lo \
 	avr-dis.lo \
 	bfin-dis.lo \
@@ -499,7 +502,6 @@
 	$(MAKE) run-cgen arch=arc prefix=arc options=opinst \
 		archfile=$(srcdir)/../cpu/arc.cpu \
 		opcfile=$(srcdir)/../cpu/arc.opc extrafiles=opinst
-
 $(srcdir)/ip2k-desc.h $(srcdir)/ip2k-desc.c $(srcdir)/ip2k-opc.h $(srcdir)/ip2k-opc.c $(srcdir)/ip2k-ibld.c $(srcdir)/ip2k-asm.c $(srcdir)/ip2k-dis.c: $(IP2K_DEPS)
 	@true
 stamp-ip2k: $(CGENDEPS) $(CPUDIR)/ip2k.cpu $(CPUDIR)/ip2k.opc
@@ -674,9 +676,6 @@
 alpha-opc.lo: alpha-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/opcode/alpha.h $(BFD_H) $(INCDIR)/ansidecl.h \
   $(INCDIR)/symcat.h opintl.h
-arc-ext.lo: arc-ext.c sysdep.h config.h $(INCDIR)/ansidecl.h \
-  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h arc-ext.h \
-  $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h
 arc-asm.lo: arc-asm.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/symcat.h \
   arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
@@ -689,26 +688,38 @@
   $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h \
   opintl.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/xregex.h $(INCDIR)/xregex2.h
-arc-dis.lo: arc-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
+arcompact-dis.lo: arcompact-dis.c $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \
+  $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/symcat.h $(INCDIR)/opcode/arc.h \
+  $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \
+  $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/arc.h \
+  $(INCDIR)/elf/reloc-macros.h opintl.h arc-dis.h arc-ext.h
+arc-dis.lo: arc-dis.c $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \
+  $(INCDIR)/ansidecl.h $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h \
+  $(INCDIR)/symcat.h $(INCDIR)/opcode/arc.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(INCDIR)/elf/arc.h $(INCDIR)/elf/reloc-macros.h \
+  opintl.h arc-dis.h arc-ext.h
+arc-dis-cgen.lo: arc-dis-cgen.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \
   $(BFD_H) $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \
   arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
   $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h \
   opintl.h
+arc-opco.lo: arc-opc_codito.c sysdep.h config.h $(INCDIR)/ansidecl.h \
+  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/opcode/arc.h \
+  opintl.h
 arc-ibld.lo: arc-ibld.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \
   $(BFD_H) $(INCDIR)/symcat.h arc-desc.h $(INCDIR)/opcode/cgen-bitset.h \
   $(INCDIR)/opcode/cgen.h $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h \
   arc-opc.h opintl.h $(INCDIR)/safe-ctype.h
-arc-opc.lo: arc-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
-  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/symcat.h \
-  arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
-  $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h \
-  $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h
 arc-opinst.lo: arc-opinst.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/symcat.h \
   arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
   $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h
+arc-ext.lo: arc-ext.c sysdep.h config.h $(INCDIR)/ansidecl.h \
+  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h arc-ext.h \
+  $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h
 arm-dis.lo: arm-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \
   $(INCDIR)/opcode/arm.h opintl.h $(INCDIR)/safe-ctype.h \
diff --git a/opcodes/Makefile.in b/opcodes/Makefile.in
index b412e0c..1645320 100644
--- a/opcodes/Makefile.in
+++ b/opcodes/Makefile.in
@@ -289,13 +289,15 @@
 CFILES = \
 	alpha-dis.c \
 	alpha-opc.c \
-	arc-ext.c \
+	arcompact-dis.c \
 	arc-asm.c \
 	arc-desc.c \
 	arc-dis.c \
+	arc-dis-cgen.c \
 	arc-ibld.c \
 	arc-opc.c \
 	arc-opinst.c \
+	arc-ext.c \
 	arm-dis.c \
 	avr-dis.c \
 	bfin-dis.c \
@@ -447,13 +449,14 @@
 ALL_MACHINES = \
 	alpha-dis.lo \
 	alpha-opc.lo \
-	arc-ext.lo \
 	arc-asm.lo \
 	arc-desc.lo \
 	arc-dis.lo \
+	arc-dis-cgen.lo \
 	arc-ibld.lo \
-	arc-opc.lo \
 	arc-opinst.lo \
+	arc-opc.lo \
+	arc-ext.lo \
 	arm-dis.lo \
 	avr-dis.lo \
 	bfin-dis.lo \
@@ -665,15 +668,15 @@
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --cygnus '; \
-	      cd $(srcdir) && $(AUTOMAKE) --cygnus  \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
 		&& exit 0; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --cygnus  Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --cygnus  Makefile
+	  $(AUTOMAKE) --foreign  Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -1052,7 +1055,6 @@
 	$(MAKE) run-cgen arch=arc prefix=arc options=opinst \
 		archfile=$(srcdir)/../cpu/arc.cpu \
 		opcfile=$(srcdir)/../cpu/arc.opc extrafiles=opinst
-
 $(srcdir)/ip2k-desc.h $(srcdir)/ip2k-desc.c $(srcdir)/ip2k-opc.h $(srcdir)/ip2k-opc.c $(srcdir)/ip2k-ibld.c $(srcdir)/ip2k-asm.c $(srcdir)/ip2k-dis.c: $(IP2K_DEPS)
 	@true
 stamp-ip2k: $(CGENDEPS) $(CPUDIR)/ip2k.cpu $(CPUDIR)/ip2k.opc
@@ -1226,9 +1228,6 @@
 alpha-opc.lo: alpha-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/opcode/alpha.h $(BFD_H) $(INCDIR)/ansidecl.h \
   $(INCDIR)/symcat.h opintl.h
-arc-ext.lo: arc-ext.c sysdep.h config.h $(INCDIR)/ansidecl.h \
-  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h arc-ext.h \
-  $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h
 arc-asm.lo: arc-asm.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/symcat.h \
   arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
@@ -1241,26 +1240,38 @@
   $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h \
   opintl.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/xregex.h $(INCDIR)/xregex2.h
-arc-dis.lo: arc-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
+arcompact-dis.lo: arcompact-dis.c $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \
+  $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/symcat.h $(INCDIR)/opcode/arc.h \
+  $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \
+  $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/arc.h \
+  $(INCDIR)/elf/reloc-macros.h opintl.h arc-dis.h arc-ext.h
+arc-dis.lo: arc-dis.c $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \
+  $(INCDIR)/ansidecl.h $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h \
+  $(INCDIR)/symcat.h $(INCDIR)/opcode/arc.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(INCDIR)/elf/arc.h $(INCDIR)/elf/reloc-macros.h \
+  opintl.h arc-dis.h arc-ext.h
+arc-dis-cgen.lo: arc-dis-cgen.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \
   $(BFD_H) $(INCDIR)/symcat.h $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \
   arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
   $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h \
   opintl.h
+arc-opco.lo: arc-opc_codito.c sysdep.h config.h $(INCDIR)/ansidecl.h \
+  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/opcode/arc.h \
+  opintl.h
 arc-ibld.lo: arc-ibld.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \
   $(BFD_H) $(INCDIR)/symcat.h arc-desc.h $(INCDIR)/opcode/cgen-bitset.h \
   $(INCDIR)/opcode/cgen.h $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h \
   arc-opc.h opintl.h $(INCDIR)/safe-ctype.h
-arc-opc.lo: arc-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
-  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/symcat.h \
-  arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
-  $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h \
-  $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h
 arc-opinst.lo: arc-opinst.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/symcat.h \
   arc-desc.h $(INCDIR)/opcode/cgen-bitset.h $(INCDIR)/opcode/cgen.h \
   $(INCDIR)/symcat.h $(INCDIR)/opcode/cgen-bitset.h arc-opc.h
+arc-ext.lo: arc-ext.c sysdep.h config.h $(INCDIR)/ansidecl.h \
+  $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h arc-ext.h \
+  $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h
 arm-dis.lo: arm-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/dis-asm.h $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \
   $(INCDIR)/opcode/arm.h opintl.h $(INCDIR)/safe-ctype.h \
diff --git a/opcodes/arc-dis-cgen.c b/opcodes/arc-dis-cgen.c
new file mode 100644
index 0000000..3efe8b7
--- /dev/null
+++ b/opcodes/arc-dis-cgen.c
@@ -0,0 +1,825 @@
+/* Disassembler interface for targets using CGEN. -*- C -*-
+   CGEN: Cpu tools GENerator
+
+   THIS FILE IS MACHINE GENERATED WITH CGEN.
+   - the resultant file is machine generated, cgen-dis.in isn't
+
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
+   Free Software Foundation, Inc.
+
+   This file is part of the GNU Binutils and GDB, the GNU debugger.
+
+   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.,
+   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+/* ??? Eventually more and more of this stuff can go to cpu-independent files.
+   Keep that in mind.  */
+
+#include "sysdep.h"
+#include <stdio.h>
+#include "ansidecl.h"
+#include "dis-asm.h"
+#include "bfd.h"
+#include "symcat.h"
+#include "libiberty.h"
+#include "arc-desc.h"
+#include "arc-opc.h"
+#include "opintl.h"
+
+/* Prototypes */
+int print_insn_arc (bfd_vma pc, disassemble_info *info);
+
+
+/* Default text to print if an instruction isn't recognized.  */
+#define UNKNOWN_INSN_MSG _("*unknown*")
+
+static void print_normal
+  (CGEN_CPU_DESC, void *, long, unsigned int, bfd_vma, int);
+static void print_address
+  (CGEN_CPU_DESC, void *, bfd_vma, unsigned int, bfd_vma, int) ATTRIBUTE_UNUSED;
+static void print_keyword
+  (CGEN_CPU_DESC, void *, CGEN_KEYWORD *, long, unsigned int) ATTRIBUTE_UNUSED;
+static void print_insn_normal
+  (CGEN_CPU_DESC, void *, const CGEN_INSN *, CGEN_FIELDS *, bfd_vma, int);
+static int print_insn
+  (CGEN_CPU_DESC, bfd_vma,  disassemble_info *, bfd_byte *, unsigned);
+static int default_print_insn
+  (CGEN_CPU_DESC, bfd_vma, disassemble_info *) ATTRIBUTE_UNUSED;
+static int read_insn
+  (CGEN_CPU_DESC, bfd_vma, disassemble_info *, bfd_byte *, int, CGEN_EXTRACT_INFO *,
+   unsigned long *);
+
+/* -- disassembler routines inserted here.  */
+
+/* -- dis.c */
+char limm_str[11] = "0x";
+
+/* Read a long immediate and write it hexadecimally into limm_str.  */
+static void
+read_limm (CGEN_EXTRACT_INFO *ex_info, bfd_vma pc)
+{
+  char buf[2];
+  int i;
+  char *limmp = limm_str + 2;
+  disassemble_info *dis_info = (disassemble_info *) ex_info->dis_info;
+
+  for (i = 0; i < 2; i++, limmp +=4, pc += 2)
+    {
+      int status = (*dis_info->read_memory_func) (pc, (unsigned char*)buf, 2, dis_info);
+
+      if (status != 0)
+        (*dis_info->memory_error_func) (status, pc, dis_info);
+      sprintf (limmp, "%.4x",
+	       (unsigned) bfd_get_bits (buf, 16,
+					dis_info->endian == BFD_ENDIAN_BIG));
+    }
+}
+
+/* Return the actual instruction length, in bits, which depends on the size
+   of the opcode - 2 or 4 bytes - and the absence or presence of a (4 byte)
+   long immediate.
+   Also, if a long immediate is present, put its hexadecimal representation
+   into limm_str.
+   ??? cgen-opc.c:cgen_lookup_insn has a 'sanity' check of the length
+   that will fail if its input length differs from the result of
+   CGEN_EXTRACT_FN.  Need to check when this could trigger.  */
+int
+arc_insn_length (unsigned long insn_value, const CGEN_INSN *insn,
+		 CGEN_EXTRACT_INFO *info, bfd_vma pc)
+{
+  switch (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_LIMM))
+    {
+    case LIMM_NONE:
+      return CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_SHORT_P) ? 16 : 32;
+    case LIMM_H:
+      {
+	/* This is a short insn; extract the actual opcode.  */
+	unsigned high = insn_value >> 16;
+
+        if ((high & 0xe7) != 0xc7)
+	  return 16;
+	read_limm (info, pc+2);
+	return 48;
+      }
+    case LIMM_B:
+      if ((insn_value & 0x07007000) != 0x06007000)
+	return 32;
+      break;
+    case LIMM_BC:
+      if ((insn_value & 0x07007000) == 0x06007000)
+	break;
+      /* Fall through.  */
+    case LIMM_C:
+      if ((insn_value & 0x00000fc0) != 0x00000f80)
+	return 32;
+      break;
+    default:
+      abort ();
+    }
+  read_limm (info, pc+4);
+  return 64;
+}
+
+/* -- */
+
+void arc_cgen_print_operand
+  (CGEN_CPU_DESC, int, PTR, CGEN_FIELDS *, void const *, bfd_vma, int);
+
+/* Main entry point for printing operands.
+   XINFO is a `void *' and not a `disassemble_info *' to not put a requirement
+   of dis-asm.h on cgen.h.
+
+   This function is basically just a big switch statement.  Earlier versions
+   used tables to look up the function to use, but
+   - if the table contains both assembler and disassembler functions then
+     the disassembler contains much of the assembler and vice-versa,
+   - there's a lot of inlining possibilities as things grow,
+   - using a switch statement avoids the function call overhead.
+
+   This function could be moved into `print_insn_normal', but keeping it
+   separate makes clear the interface between `print_insn_normal' and each of
+   the handlers.  */
+
+void
+arc_cgen_print_operand (CGEN_CPU_DESC cd,
+			   int opindex,
+			   void * xinfo,
+			   CGEN_FIELDS *fields,
+			   void const *attrs ATTRIBUTE_UNUSED,
+			   bfd_vma pc,
+			   int length)
+{
+  disassemble_info *info = (disassemble_info *) xinfo;
+
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_F, 0);
+      break;
+    case ARC_OPERAND_F :
+      print_keyword (cd, info, & arc_cgen_opval_h_uflags, fields->f_F, 0);
+      break;
+    case ARC_OPERAND_F0 :
+      print_keyword (cd, info, & arc_cgen_opval_h_nil, fields->f_F, 0);
+      break;
+    case ARC_OPERAND_F1 :
+      print_keyword (cd, info, & arc_cgen_opval_h_auflags, fields->f_F, 0);
+      break;
+    case ARC_OPERAND_F1F :
+      print_keyword (cd, info, & arc_cgen_opval_h_aufflags, fields->f_F, 0);
+      break;
+    case ARC_OPERAND_GP :
+      print_keyword (cd, info, & arc_cgen_opval_h_gp, 0, 0);
+      break;
+    case ARC_OPERAND_LDODI :
+      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_LDODi, 0);
+      break;
+    case ARC_OPERAND_LDRDI :
+      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_LDRDi, 0);
+      break;
+    case ARC_OPERAND_NE :
+      print_keyword (cd, info, & arc_cgen_opval_h_ne, 0, 0);
+      break;
+    case ARC_OPERAND_PCL :
+      print_keyword (cd, info, & arc_cgen_opval_h_pcl, 0, 0);
+      break;
+    case ARC_OPERAND_QCONDB :
+      print_keyword (cd, info, & arc_cgen_opval_h_Qcondb, fields->f_cond_Q, 0);
+      break;
+    case ARC_OPERAND_QCONDI :
+      print_keyword (cd, info, & arc_cgen_opval_h_Qcondi, fields->f_cond_Q, 0);
+      break;
+    case ARC_OPERAND_QCONDJ :
+      print_keyword (cd, info, & arc_cgen_opval_h_Qcondj, fields->f_cond_Q, 0);
+      break;
+    case ARC_OPERAND_R0 :
+      print_keyword (cd, info, & arc_cgen_opval_h_r0, 0, 0);
+      break;
+    case ARC_OPERAND_R31 :
+      print_keyword (cd, info, & arc_cgen_opval_h_r31, 0, 0);
+      break;
+    case ARC_OPERAND_RA :
+      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_A, 0);
+      break;
+    case ARC_OPERAND_RA_0 :
+      print_keyword (cd, info, & arc_cgen_opval_h_nil, fields->f_op_A, 0);
+      break;
+    case ARC_OPERAND_RB :
+      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_B, 0|(1<<CGEN_OPERAND_VIRTUAL));
+      break;
+    case ARC_OPERAND_RB_0 :
+      print_keyword (cd, info, & arc_cgen_opval_h_nil, fields->f_op_B, 0|(1<<CGEN_OPERAND_VIRTUAL));
+      break;
+    case ARC_OPERAND_RC :
+      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_C, 0);
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      print_keyword (cd, info, & arc_cgen_opval_h_ilinkx, fields->f_op_Cj, 0);
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      print_keyword (cd, info, & arc_cgen_opval_h_noilink, fields->f_op_Cj, 0);
+      break;
+    case ARC_OPERAND_R_A :
+      print_keyword (cd, info, & arc_cgen_opval_h_cr16, fields->f_op__a, 0);
+      break;
+    case ARC_OPERAND_R_B :
+      print_keyword (cd, info, & arc_cgen_opval_h_cr16, fields->f_op__b, 0);
+      break;
+    case ARC_OPERAND_R_C :
+      print_keyword (cd, info, & arc_cgen_opval_h_cr16, fields->f_op__c, 0);
+      break;
+    case ARC_OPERAND_RCC :
+      print_keyword (cd, info, & arc_cgen_opval_h_Rcc, fields->f_brcond, 0);
+      break;
+    case ARC_OPERAND_RCCS :
+      print_keyword (cd, info, & arc_cgen_opval_h_RccS, fields->f_brscond, 0);
+      break;
+    case ARC_OPERAND_RH :
+      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_h, 0|(1<<CGEN_OPERAND_VIRTUAL));
+      break;
+    case ARC_OPERAND_SP :
+      print_keyword (cd, info, & arc_cgen_opval_h_sp, 0, 0);
+      break;
+    case ARC_OPERAND_STODI :
+      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_STODi, 0);
+      break;
+    case ARC_OPERAND_U6 :
+      print_normal (cd, info, fields->f_u6, 0, pc, length);
+      break;
+    case ARC_OPERAND_U6X2 :
+      print_normal (cd, info, fields->f_u6x2, 0, pc, length);
+      break;
+    case ARC_OPERAND__AW :
+      print_keyword (cd, info, & arc_cgen_opval_h__aw, 0, 0);
+      break;
+    case ARC_OPERAND__L :
+      print_keyword (cd, info, & arc_cgen_opval_h_insn32, 0, 0);
+      break;
+    case ARC_OPERAND__S :
+      print_keyword (cd, info, & arc_cgen_opval_h_insn16, 0, 0);
+      break;
+    case ARC_OPERAND_CBIT :
+      print_normal (cd, info, 0, 0, pc, length);
+      break;
+    case ARC_OPERAND_DELAY_N :
+      print_keyword (cd, info, & arc_cgen_opval_h_delay, fields->f_delay_N, 0);
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      print_normal (cd, info, fields->f_dummy, 0, pc, length);
+      break;
+    case ARC_OPERAND_I2COND :
+      print_keyword (cd, info, & arc_cgen_opval_h_i2cond, fields->f_cond_i2, 0);
+      break;
+    case ARC_OPERAND_I3COND :
+      print_keyword (cd, info, & arc_cgen_opval_h_i3cond, fields->f_cond_i3, 0);
+      break;
+    case ARC_OPERAND_LABEL10 :
+      print_address (cd, info, fields->f_rel10, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
+      break;
+    case ARC_OPERAND_LABEL13A :
+      print_address (cd, info, fields->f_rel13bl, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
+      break;
+    case ARC_OPERAND_LABEL21 :
+      print_address (cd, info, fields->f_rel21, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_LABEL21A :
+      print_address (cd, info, fields->f_rel21bl, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_LABEL25 :
+      print_address (cd, info, fields->f_rel25, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_LABEL25A :
+      print_address (cd, info, fields->f_rel25bl, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_LABEL7 :
+      print_address (cd, info, fields->f_rel7, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
+      break;
+    case ARC_OPERAND_LABEL8 :
+      print_address (cd, info, fields->f_rel8, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
+      break;
+    case ARC_OPERAND_LABEL9 :
+      print_address (cd, info, fields->f_rel9, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_LBIT :
+      print_normal (cd, info, 0, 0, pc, length);
+      break;
+    case ARC_OPERAND_NBIT :
+      print_normal (cd, info, 0, 0, pc, length);
+      break;
+    case ARC_OPERAND_S12 :
+      print_normal (cd, info, fields->f_s12, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_S12X2 :
+      print_normal (cd, info, fields->f_s12x2, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_S1BIT :
+      print_normal (cd, info, 0, 0, pc, length);
+      break;
+    case ARC_OPERAND_S2BIT :
+      print_normal (cd, info, 0, 0, pc, length);
+      break;
+    case ARC_OPERAND_S9 :
+      print_normal (cd, info, fields->f_s9, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
+      break;
+    case ARC_OPERAND_S9X4 :
+      print_normal (cd, info, fields->f_s9x4, 0, pc, length);
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      print_normal (cd, info, fields->f_s9x4, 0, pc, length);
+      break;
+    case ARC_OPERAND_SC_S9B :
+      print_normal (cd, info, fields->f_s9x1, 0, pc, length);
+      break;
+    case ARC_OPERAND_SC_S9W :
+      print_normal (cd, info, fields->f_s9x2, 0, pc, length);
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      print_normal (cd, info, fields->f_u5x4, 0, pc, length);
+      break;
+    case ARC_OPERAND_SC_U5B :
+      print_normal (cd, info, fields->f_u5, 0, pc, length);
+      break;
+    case ARC_OPERAND_SC_U5W :
+      print_normal (cd, info, fields->f_u5x2, 0, pc, length);
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      print_normal (cd, info, fields->f_trapnum, 0, pc, length);
+      break;
+    case ARC_OPERAND_U3 :
+      print_normal (cd, info, fields->f_u3, 0, pc, length);
+      break;
+    case ARC_OPERAND_U5 :
+      print_normal (cd, info, fields->f_u5, 0, pc, length);
+      break;
+    case ARC_OPERAND_U5X4 :
+      print_normal (cd, info, fields->f_u5x4, 0, pc, length);
+      break;
+    case ARC_OPERAND_U7 :
+      print_normal (cd, info, fields->f_u7, 0, pc, length);
+      break;
+    case ARC_OPERAND_U8 :
+      print_normal (cd, info, fields->f_u8, 0, pc, length);
+      break;
+    case ARC_OPERAND_U8X4 :
+      print_normal (cd, info, fields->f_u8x4, 0, pc, length);
+      break;
+    case ARC_OPERAND_UNCONDB :
+      print_keyword (cd, info, & arc_cgen_opval_h_uncondb, 0, 0);
+      break;
+    case ARC_OPERAND_UNCONDI :
+      print_keyword (cd, info, & arc_cgen_opval_h_uncondi, 0, 0);
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      print_keyword (cd, info, & arc_cgen_opval_h_uncondj, 0, 0);
+      break;
+    case ARC_OPERAND_VBIT :
+      print_normal (cd, info, 0, 0, pc, length);
+      break;
+    case ARC_OPERAND_ZBIT :
+      print_normal (cd, info, 0, 0, pc, length);
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while printing insn.\n"),
+	       opindex);
+    abort ();
+  }
+}
+
+cgen_print_fn * const arc_cgen_print_handlers[] =
+{
+  print_insn_normal,
+};
+
+
+void
+arc_cgen_init_dis (CGEN_CPU_DESC cd)
+{
+  arc_cgen_init_opcode_table (cd);
+  arc_cgen_init_ibld_table (cd);
+  cd->print_handlers = & arc_cgen_print_handlers[0];
+  cd->print_operand = arc_cgen_print_operand;
+}
+
+
+/* Default print handler.  */
+
+static void
+print_normal (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+	      void *dis_info,
+	      long value,
+	      unsigned int attrs,
+	      bfd_vma pc ATTRIBUTE_UNUSED,
+	      int length ATTRIBUTE_UNUSED)
+{
+  disassemble_info *info = (disassemble_info *) dis_info;
+
+#ifdef CGEN_PRINT_NORMAL
+  CGEN_PRINT_NORMAL (cd, info, value, attrs, pc, length);
+#endif
+
+  /* Print the operand as directed by the attributes.  */
+  if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
+    ; /* nothing to do */
+  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SIGNED))
+    (*info->fprintf_func) (info->stream, "%ld", value);
+  else
+    (*info->fprintf_func) (info->stream, "0x%lx", value);
+}
+
+/* Default address handler.  */
+
+static void
+print_address (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+	       void *dis_info,
+	       bfd_vma value,
+	       unsigned int attrs,
+	       bfd_vma pc ATTRIBUTE_UNUSED,
+	       int length ATTRIBUTE_UNUSED)
+{
+  disassemble_info *info = (disassemble_info *) dis_info;
+
+#ifdef CGEN_PRINT_ADDRESS
+  CGEN_PRINT_ADDRESS (cd, info, value, attrs, pc, length);
+#endif
+
+  /* Print the operand as directed by the attributes.  */
+  if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
+    ; /* Nothing to do.  */
+  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_PCREL_ADDR))
+    (*info->print_address_func) (value, info);
+  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_ABS_ADDR))
+    (*info->print_address_func) (value, info);
+  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SIGNED))
+    (*info->fprintf_func) (info->stream, "%ld", (long) value);
+  else
+    (*info->fprintf_func) (info->stream, "0x%lx", (long) value);
+}
+
+/* Keyword print handler.  */
+
+static void
+print_keyword (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+	       void *dis_info,
+	       CGEN_KEYWORD *keyword_table,
+	       long value,
+	       unsigned int attrs ATTRIBUTE_UNUSED)
+{
+  disassemble_info *info = (disassemble_info *) dis_info;
+  const CGEN_KEYWORD_ENTRY *ke;
+
+  ke = cgen_keyword_lookup_value (keyword_table, value);
+  if (ke != NULL)
+    (*info->fprintf_func) (info->stream, "%s", ke->name);
+  else
+    (*info->fprintf_func) (info->stream, "???");
+}
+
+/* Default insn printer.
+
+   DIS_INFO is defined as `void *' so the disassembler needn't know anything
+   about disassemble_info.  */
+
+static void
+print_insn_normal (CGEN_CPU_DESC cd,
+		   void *dis_info,
+		   const CGEN_INSN *insn,
+		   CGEN_FIELDS *fields,
+		   bfd_vma pc,
+		   int length)
+{
+  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
+  disassemble_info *info = (disassemble_info *) dis_info;
+  const CGEN_SYNTAX_CHAR_TYPE *syn;
+
+  CGEN_INIT_PRINT (cd);
+
+  for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
+    {
+      if (CGEN_SYNTAX_MNEMONIC_P (*syn))
+	{
+	  (*info->fprintf_func) (info->stream, "%s", CGEN_INSN_MNEMONIC (insn));
+	  continue;
+	}
+      if (CGEN_SYNTAX_CHAR_P (*syn))
+	{
+	  (*info->fprintf_func) (info->stream, "%c", CGEN_SYNTAX_CHAR (*syn));
+	  continue;
+	}
+
+      /* We have an operand.  */
+      arc_cgen_print_operand (cd, CGEN_SYNTAX_FIELD (*syn), info,
+				 fields, CGEN_INSN_ATTRS (insn), pc, length);
+    }
+}
+
+/* Subroutine of print_insn. Reads an insn into the given buffers and updates
+   the extract info.
+   Returns 0 if all is well, non-zero otherwise.  */
+
+static int
+read_insn (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+	   bfd_vma pc,
+	   disassemble_info *info,
+	   bfd_byte *buf,
+	   int buflen,
+	   CGEN_EXTRACT_INFO *ex_info,
+	   unsigned long *insn_value)
+{
+  int status = (*info->read_memory_func) (pc, buf, buflen, info);
+
+  if (status != 0)
+    {
+      (*info->memory_error_func) (status, pc, info);
+      return -1;
+    }
+
+  ex_info->dis_info = info;
+  ex_info->valid = (1 << buflen) - 1;
+  ex_info->insn_bytes = buf;
+
+  *insn_value = bfd_get_bits (buf, buflen * 8, info->endian == BFD_ENDIAN_BIG);
+  return 0;
+}
+
+/* Utility to print an insn.
+   BUF is the base part of the insn, target byte order, BUFLEN bytes long.
+   The result is the size of the insn in bytes or zero for an unknown insn
+   or -1 if an error occurs fetching data (memory_error_func will have
+   been called).  */
+
+static int
+print_insn (CGEN_CPU_DESC cd,
+	    bfd_vma pc,
+	    disassemble_info *info,
+	    bfd_byte *buf,
+	    unsigned int buflen)
+{
+  CGEN_INSN_INT insn_value;
+  const CGEN_INSN_LIST *insn_list;
+  CGEN_EXTRACT_INFO ex_info;
+  int basesize;
+
+  /* Extract base part of instruction, just in case CGEN_DIS_* uses it. */
+  basesize = cd->base_insn_bitsize < buflen * 8 ?
+                                     cd->base_insn_bitsize : buflen * 8;
+  insn_value = cgen_get_insn_value (cd, buf, basesize);
+
+
+  /* Fill in ex_info fields like read_insn would.  Don't actually call
+     read_insn, since the incoming buffer is already read (and possibly
+     modified a la m32r).  */
+  ex_info.valid = (1 << buflen) - 1;
+  ex_info.dis_info = info;
+  ex_info.insn_bytes = buf;
+
+  /* The instructions are stored in hash lists.
+     Pick the first one and keep trying until we find the right one.  */
+
+  insn_list = CGEN_DIS_LOOKUP_INSN (cd, (char *) buf, insn_value);
+  while (insn_list != NULL)
+    {
+      const CGEN_INSN *insn = insn_list->insn;
+      CGEN_FIELDS fields;
+      int length;
+      unsigned long insn_value_cropped;
+
+#ifdef CGEN_VALIDATE_INSN_SUPPORTED
+      /* Not needed as insn shouldn't be in hash lists if not supported.  */
+      /* Supported by this cpu?  */
+      if (! arc_cgen_insn_supported (cd, insn))
+        {
+          insn_list = CGEN_DIS_NEXT_INSN (insn_list);
+	  continue;
+        }
+#endif
+
+      /* Basic bit mask must be correct.  */
+      /* ??? May wish to allow target to defer this check until the extract
+	 handler.  */
+
+      /* Base size may exceed this instruction's size.  Extract the
+         relevant part from the buffer. */
+      if ((unsigned) (CGEN_INSN_BITSIZE (insn) / 8) < buflen &&
+	  (unsigned) (CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
+	insn_value_cropped = bfd_get_bits (buf, CGEN_INSN_BITSIZE (insn),
+					   info->endian == BFD_ENDIAN_BIG);
+      else
+	insn_value_cropped = insn_value;
+
+      if ((insn_value_cropped & CGEN_INSN_BASE_MASK (insn))
+	  == CGEN_INSN_BASE_VALUE (insn))
+	{
+	  /* Printing is handled in two passes.  The first pass parses the
+	     machine insn and extracts the fields.  The second pass prints
+	     them.  */
+
+	  /* Make sure the entire insn is loaded into insn_value, if it
+	     can fit.  */
+	  if (((unsigned) CGEN_INSN_BITSIZE (insn) > cd->base_insn_bitsize) &&
+	      (unsigned) (CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
+	    {
+	      unsigned long full_insn_value;
+	      int rc = read_insn (cd, pc, info, buf,
+				  CGEN_INSN_BITSIZE (insn) / 8,
+				  & ex_info, & full_insn_value);
+	      if (rc != 0)
+		return rc;
+	      length = CGEN_EXTRACT_FN (cd, insn)
+		(cd, insn, &ex_info, full_insn_value, &fields, pc);
+	    }
+	  else
+	    length = CGEN_EXTRACT_FN (cd, insn)
+	      (cd, insn, &ex_info, insn_value_cropped, &fields, pc);
+
+	  /* Length < 0 -> error.  */
+	  if (length < 0)
+	    return length;
+	  if (length > 0)
+	    {
+	      CGEN_PRINT_FN (cd, insn) (cd, info, insn, &fields, pc, length);
+	      /* Length is in bits, result is in bytes.  */
+	      return length / 8;
+	    }
+	}
+
+      insn_list = CGEN_DIS_NEXT_INSN (insn_list);
+    }
+
+  return 0;
+}
+
+/* Default value for CGEN_PRINT_INSN.
+   The result is the size of the insn in bytes or zero for an unknown insn
+   or -1 if an error occured fetching bytes.  */
+
+#ifndef CGEN_PRINT_INSN
+#define CGEN_PRINT_INSN default_print_insn
+#endif
+
+static int
+default_print_insn (CGEN_CPU_DESC cd, bfd_vma pc, disassemble_info *info)
+{
+  bfd_byte buf[CGEN_MAX_INSN_SIZE];
+  int buflen;
+  int status;
+
+  /* Attempt to read the base part of the insn.  */
+  buflen = cd->base_insn_bitsize / 8;
+  status = (*info->read_memory_func) (pc, buf, buflen, info);
+
+  /* Try again with the minimum part, if min < base.  */
+  if (status != 0 && (cd->min_insn_bitsize < cd->base_insn_bitsize))
+    {
+      buflen = cd->min_insn_bitsize / 8;
+      status = (*info->read_memory_func) (pc, buf, buflen, info);
+    }
+
+  if (status != 0)
+    {
+      (*info->memory_error_func) (status, pc, info);
+      return -1;
+    }
+
+  return print_insn (cd, pc, info, buf, buflen);
+}
+
+/* Main entry point.
+   Print one instruction from PC on INFO->STREAM.
+   Return the size of the instruction (in bytes).  */
+
+typedef struct cpu_desc_list
+{
+  struct cpu_desc_list *next;
+  CGEN_BITSET *isa;
+  int mach;
+  int endian;
+  CGEN_CPU_DESC cd;
+} cpu_desc_list;
+
+int
+print_insn_arc (bfd_vma pc, disassemble_info *info)
+{
+  static cpu_desc_list *cd_list = 0;
+  cpu_desc_list *cl = 0;
+  static CGEN_CPU_DESC cd = 0;
+  static CGEN_BITSET *prev_isa;
+  static int prev_mach;
+  static int prev_endian;
+  int length;
+  CGEN_BITSET *isa;
+  int mach;
+  int endian = (info->endian == BFD_ENDIAN_BIG
+		? CGEN_ENDIAN_BIG
+		: CGEN_ENDIAN_LITTLE);
+  enum bfd_architecture arch;
+
+  /* ??? gdb will set mach but leave the architecture as "unknown" */
+#ifndef CGEN_BFD_ARCH
+#define CGEN_BFD_ARCH bfd_arch_arc
+#endif
+  arch = info->arch;
+  if (arch == bfd_arch_unknown)
+    arch = CGEN_BFD_ARCH;
+
+  /* There's no standard way to compute the machine or isa number
+     so we leave it to the target.  */
+#ifdef CGEN_COMPUTE_MACH
+  mach = CGEN_COMPUTE_MACH (info);
+#else
+  mach = info->mach;
+#endif
+
+#ifdef CGEN_COMPUTE_ISA
+  {
+    static CGEN_BITSET *permanent_isa;
+
+    if (!permanent_isa)
+      permanent_isa = cgen_bitset_create (MAX_ISAS);
+    isa = permanent_isa;
+    cgen_bitset_clear (isa);
+    cgen_bitset_add (isa, CGEN_COMPUTE_ISA (info));
+  }
+#else
+  isa = info->insn_sets;
+#endif
+
+  /* If we've switched cpu's, try to find a handle we've used before */
+  if (cd
+      && (cgen_bitset_compare (isa, prev_isa) != 0
+	  || mach != prev_mach
+	  || endian != prev_endian))
+    {
+      cd = 0;
+      for (cl = cd_list; cl; cl = cl->next)
+	{
+	  if (cgen_bitset_compare (cl->isa, isa) == 0 &&
+	      cl->mach == mach &&
+	      cl->endian == endian)
+	    {
+	      cd = cl->cd;
+ 	      prev_isa = cd->isas;
+	      break;
+	    }
+	}
+    }
+
+  /* If we haven't initialized yet, initialize the opcode table.  */
+  if (! cd)
+    {
+      const bfd_arch_info_type *arch_type = bfd_lookup_arch (arch, mach);
+      const char *mach_name;
+
+      if (!arch_type)
+	abort ();
+      mach_name = arch_type->printable_name;
+
+      prev_isa = cgen_bitset_copy (isa);
+      prev_mach = mach;
+      prev_endian = endian;
+      cd = arc_cgen_cpu_open (CGEN_CPU_OPEN_ISAS, prev_isa,
+				 CGEN_CPU_OPEN_BFDMACH, mach_name,
+				 CGEN_CPU_OPEN_ENDIAN, prev_endian,
+				 CGEN_CPU_OPEN_END);
+      if (!cd)
+	abort ();
+
+      /* Save this away for future reference.  */
+      cl = xmalloc (sizeof (struct cpu_desc_list));
+      cl->cd = cd;
+      cl->isa = prev_isa;
+      cl->mach = mach;
+      cl->endian = endian;
+      cl->next = cd_list;
+      cd_list = cl;
+
+      arc_cgen_init_dis (cd);
+    }
+
+  /* We try to have as much common code as possible.
+     But at this point some targets need to take over.  */
+  /* ??? Some targets may need a hook elsewhere.  Try to avoid this,
+     but if not possible try to move this hook elsewhere rather than
+     have two hooks.  */
+  length = CGEN_PRINT_INSN (cd, pc, info);
+  if (length > 0)
+    return length;
+  if (length < 0)
+    return -1;
+
+  (*info->fprintf_func) (info->stream, UNKNOWN_INSN_MSG);
+  return cd->default_insn_bitsize / 8;
+}
+
diff --git a/opcodes/arc-dis-cgen.h b/opcodes/arc-dis-cgen.h
new file mode 100644
index 0000000..9aa7b44
--- /dev/null
+++ b/opcodes/arc-dis-cgen.h
@@ -0,0 +1,28 @@
+/* Disassembler structures definitions for the ARC.
+   Copyright 1994, 1995, 1997, 1998, 2000, 2001, 2007
+   Free Software Foundation, Inc.
+   Contributed by Doug Evans (dje@cygnus.com).
+
+   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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef ARCDIS_H
+#define ARCDIS_H
+
+int ARCTangent_decodeInstr(bfd_vma address, disassemble_info* info);
+int ARCompact_decodeInstr (bfd_vma address, disassemble_info* info);
+
+#define __TRANSLATION_REQUIRED(state)	((state).acnt != 0)
+
+#endif
diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c
index de6e1d0..b5eb8a5 100644
--- a/opcodes/arc-dis.c
+++ b/opcodes/arc-dis.c
@@ -1,11 +1,7 @@
-/* Disassembler interface for targets using CGEN. -*- C -*-
-   CGEN: Cpu tools GENerator
-
-   THIS FILE IS MACHINE GENERATED WITH CGEN.
-   - the resultant file is machine generated, cgen-dis.in isn't
-
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
+/* Instruction printing code for the ARC.
+   Copyright 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2005, 2007
    Free Software Foundation, Inc.
+   Contributed by Doug Evans (dje@cygnus.com).
 
    This file is part of libopcodes.
 
@@ -20,801 +16,1218 @@
    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.,
-   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-/* ??? Eventually more and more of this stuff can go to cpu-independent files.
-   Keep that in mind.  */
-
-#include "sysdep.h"
-#include <stdio.h>
 #include "ansidecl.h"
-#include "dis-asm.h"
-#include "bfd.h"
-#include "symcat.h"
 #include "libiberty.h"
-#include "arc-desc.h"
-#include "arc-opc.h"
+#include "dis-asm.h"
+#include "opcode/arc.h"
+#include "elf-bfd.h"
+#include "elf/arc.h"
+#include <string.h>
 #include "opintl.h"
 
-/* Default text to print if an instruction isn't recognized.  */
-#define UNKNOWN_INSN_MSG _("*unknown*")
+#include <stdarg.h>
+#include "arc-dis.h"
+#include "arc-ext.h"
 
-static void print_normal
-  (CGEN_CPU_DESC, void *, long, unsigned int, bfd_vma, int);
-static void print_address
-  (CGEN_CPU_DESC, void *, bfd_vma, unsigned int, bfd_vma, int) ATTRIBUTE_UNUSED;
-static void print_keyword
-  (CGEN_CPU_DESC, void *, CGEN_KEYWORD *, long, unsigned int) ATTRIBUTE_UNUSED;
-static void print_insn_normal
-  (CGEN_CPU_DESC, void *, const CGEN_INSN *, CGEN_FIELDS *, bfd_vma, int);
-static int print_insn
-  (CGEN_CPU_DESC, bfd_vma,  disassemble_info *, bfd_byte *, unsigned);
-static int default_print_insn
-  (CGEN_CPU_DESC, bfd_vma, disassemble_info *) ATTRIBUTE_UNUSED;
-static int read_insn
-  (CGEN_CPU_DESC, bfd_vma, disassemble_info *, bfd_byte *, int, CGEN_EXTRACT_INFO *,
-   unsigned long *);
-
-/* -- disassembler routines inserted here.  */
+#ifndef dbg
+#define dbg (0)
+#endif
 
-/* -- dis.c */
-char limm_str[11] = "0x";
+/* Classification of the opcodes for the decoder to print 
+   the instructions.  */
 
-/* Read a long immediate and write it hexadecimally into limm_str.  */
+typedef enum
+{
+  CLASS_A4_ARITH,	     
+  CLASS_A4_OP3_GENERAL,
+  CLASS_A4_FLAG,
+  /* All branches other than JC.  */
+  CLASS_A4_BRANCH,
+  CLASS_A4_JC ,
+  /* All loads other than immediate 
+     indexed loads.  */
+  CLASS_A4_LD0,
+  CLASS_A4_LD1,
+  CLASS_A4_ST,
+  CLASS_A4_SR,
+  /* All single operand instructions.  */
+  CLASS_A4_OP3_SUBOPC3F,
+  CLASS_A4_LR
+} a4_decoding_class;
+
+#define BIT(word,n)	((word) & (1 << n))
+#define BITS(word,s,e)  (((word) << (31 - e)) >> (s + (31 - e)))
+#define OPCODE(word)	(BITS ((word), 27, 31))
+#define FIELDA(word)	(BITS ((word), 21, 26))
+#define FIELDB(word)	(BITS ((word), 15, 20))
+#define FIELDC(word)	(BITS ((word),  9, 14))
+
+/* FIELD D is signed in all of its uses, so we make sure argument is
+   treated as signed for bit shifting purposes:  */
+#define FIELDD(word)	(BITS (((signed int)word), 0, 8))
+
+#define PUT_NEXT_WORD_IN(a)						\
+  do									\
+    {									\
+      if (is_limm == 1 && !NEXT_WORD (1))				\
+        mwerror (state, _("Illegal limm reference in last instruction!\n")); \
+      a = state->words[1];						\
+    }									\
+  while (0)
+
+#define CHECK_FLAG_COND_NULLIFY()				\
+  do								\
+    {								\
+      if (is_shimm == 0)					\
+        {							\
+          flag = BIT (state->words[0], 8);			\
+          state->nullifyMode = BITS (state->words[0], 5, 6);	\
+          cond = BITS (state->words[0], 0, 4);			\
+        }							\
+    }								\
+  while (0)
+
+#define CHECK_COND()				\
+  do						\
+    {						\
+      if (is_shimm == 0)			\
+        cond = BITS (state->words[0], 0, 4);	\
+    }						\
+  while (0)
+
+#define CHECK_FIELD(field)			\
+  do						\
+    {						\
+      if (field == 62)				\
+        {					\
+          is_limm++;				\
+	  field##isReg = 0;			\
+	  PUT_NEXT_WORD_IN (field);		\
+	  limm_value = field;			\
+	}					\
+      else if (field > 60)			\
+        {					\
+	  field##isReg = 0;			\
+	  is_shimm++;				\
+	  flag = (field == 61);			\
+	  field = FIELDD (state->words[0]);	\
+	}					\
+    }						\
+  while (0)
+
+#define CHECK_FIELD_A()				\
+  do						\
+    {						\
+      fieldA = FIELDA (state->words[0]);	\
+      if (fieldA > 60)				\
+        {					\
+	  fieldAisReg = 0;			\
+	  fieldA = 0;				\
+	}					\
+    }						\
+  while (0)
+
+#define CHECK_FIELD_B()				\
+  do						\
+    {						\
+      fieldB = FIELDB (state->words[0]);	\
+      CHECK_FIELD (fieldB);			\
+    }						\
+  while (0)
+
+#define CHECK_FIELD_C()				\
+  do						\
+    {						\
+      fieldC = FIELDC (state->words[0]);	\
+      CHECK_FIELD (fieldC);			\
+    }						\
+  while (0)
+
+#define IS_SMALL(x)                 (((field##x) < 256) && ((field##x) > -257))
+#define IS_REG(x)                    (field##x##isReg)
+#define WRITE_FORMAT_LB_Rx_RB(x)     WRITE_FORMAT (x, "[","]","","")
+#define WRITE_FORMAT_x_COMMA_LB(x)   WRITE_FORMAT (x, "",",[","",",[")
+#define WRITE_FORMAT_COMMA_x_RB(x)   WRITE_FORMAT (x, ",","]",",","]")
+#define WRITE_FORMAT_x_RB(x)         WRITE_FORMAT (x, "","]","","]")
+#define WRITE_FORMAT_COMMA_x(x)      WRITE_FORMAT (x, ",","",",","")
+#define WRITE_FORMAT_x_COMMA(x)      WRITE_FORMAT (x, "",",","",",")
+#define WRITE_FORMAT_x(x)            WRITE_FORMAT (x, "","","","")
+#define WRITE_FORMAT(x,cb1,ca1,cb,ca) strcat (formatString,		\
+				     (IS_REG (x) ? cb1"%r"ca1 :		\
+				      usesAuxReg ? cb"%a"ca :		\
+				      IS_SMALL (x) ? cb"%d"ca : cb"%h"ca))
+#define WRITE_FORMAT_RB()	strcat (formatString, "]")
+#define WRITE_COMMENT(str)	(state->comm[state->commNum++] = (str))
+#define WRITE_NOP_COMMENT()	if (!fieldAisReg && !flag) WRITE_COMMENT ("nop");
+
+#define NEXT_WORD(x)	(offset += 4, state->words[x])
+
+#define add_target(x)	(state->targets[state->tcnt++] = (x))
+
+static char comment_prefix[] = "\t; ";
+
+static const char *
+core_reg_name (struct arcDisState * state, int val)
+{
+  if (state->coreRegName)
+    return (*state->coreRegName)(state->_this, val);
+  return 0;
+}
+
+static const char *
+aux_reg_name (struct arcDisState * state, int val)
+{
+  if (state->auxRegName)
+    return (*state->auxRegName)(state->_this, val);
+  return 0;
+}
+
+static const char *
+cond_code_name (struct arcDisState * state, int val)
+{
+  if (state->condCodeName)
+    return (*state->condCodeName)(state->_this, val);
+  return 0;
+}
+
+static const char *
+instruction_name (struct arcDisState * state,
+		  int    op1,
+		  int    op2,
+		  int *  flags)
+{
+  if (state->instName)
+    return (*state->instName)(state->_this, op1, op2, flags);
+  return 0;
+}
+
 static void
-read_limm (CGEN_EXTRACT_INFO *ex_info, bfd_vma pc)
+mwerror (struct arcDisState * state, const char * msg)
 {
-  unsigned char buf[2];
-  int i;
-  char *limmp = limm_str + 2;
-  disassemble_info *dis_info = (disassemble_info *) ex_info->dis_info;
-
-  for (i = 0; i < 2; i++, limmp +=4, pc += 2)
-    {
-      int status = (*dis_info->read_memory_func) (pc, buf, 2, dis_info);
-
-      if (status != 0)
-        (*dis_info->memory_error_func) (status, pc, dis_info);
-      sprintf (limmp, "%.4x",
-	       (unsigned) bfd_get_bits (buf, 16,
-					dis_info->endian == BFD_ENDIAN_BIG));
-    }
+  if (state->err != 0)
+    (*state->err)(state->_this, (msg));
 }
 
-/* Return the actual instruction length, in bits, which depends on the size
-   of the opcode - 2 or 4 bytes - and the absence or presence of a (4 byte)
-   long immediate.
-   Also, if a long immediate is present, put its hexadecimal representation
-   into limm_str.
-   ??? cgen-opc.c:cgen_lookup_insn has a 'sanity' check of the length
-   that will fail if its input length differs from the result of
-   CGEN_EXTRACT_FN.  Need to check when this could trigger.  */
-int
-arc_insn_length (unsigned long insn_value, const CGEN_INSN *insn,
-		 CGEN_EXTRACT_INFO *info, bfd_vma pc)
+static const char *
+post_address (struct arcDisState * state, int addr)
 {
-  switch (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_LIMM))
+  static char id[3 * ARRAY_SIZE (state->addresses)];
+  int j, i = state->acnt;
+
+  if (i < ((int) ARRAY_SIZE (state->addresses)))
     {
-    case LIMM_NONE:
-      return CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_SHORT_P) ? 16 : 32;
-    case LIMM_H:
+      state->addresses[i] = addr;
+      ++state->acnt;
+      j = i*3;
+      id[j+0] = '@';
+      id[j+1] = '0'+i;
+      id[j+2] = 0;
+
+      return id + j;
+    }
+  return "";
+}
+
+static void
+arc_sprintf (struct arcDisState *state, char *buf, const char *format, ...)
+{
+  char *bp;
+  const char *p;
+  int size, leading_zero, regMap[2];
+  long auxNum;
+  va_list ap;
+
+  va_start (ap, format);
+
+  bp = buf;
+  *bp = 0;
+  p = format;
+  auxNum = -1;
+  regMap[0] = 0;
+  regMap[1] = 0;
+
+  while (1)
+    switch (*p++)
       {
-	/* This is a short insn; extract the actual opcode.  */
-	unsigned high = insn_value >> 16;
-
-        if ((high & 0xe7) != 0xc7)
-	  return 16;
-	read_limm (info, pc+2);
-	return 48;
-      }
-    case LIMM_B:
-      if ((insn_value & 0x07007000) != 0x06007000)
-	return 32;
-      break;
-    case LIMM_BC:
-      if ((insn_value & 0x07007000) == 0x06007000)
+      case 0:
+	goto DOCOMM; /* (return)  */
+      default:
+	*bp++ = p[-1];
 	break;
-      /* Fall through.  */
-    case LIMM_C:
-      if ((insn_value & 0x00000fc0) != 0x00000f80)
-	return 32;
-      break;
-    default:
-      abort ();
-    }
-  read_limm (info, pc+4);
-  return 64;
+      case '%':
+	size = 0;
+	leading_zero = 0;
+      RETRY: ;
+	switch (*p++)
+	  {
+	  case '0':
+	  case '1':
+	  case '2':
+	  case '3':
+	  case '4':
+	  case '5':
+	  case '6':
+	  case '7':
+	  case '8':
+	  case '9':
+	    {
+	      /* size.  */
+	      size = p[-1] - '0';
+	      if (size == 0)
+		leading_zero = 1; /* e.g. %08x  */
+	      while (*p >= '0' && *p <= '9')
+		{
+		  size = size * 10 + *p - '0';
+		  p++;
+		}
+	      goto RETRY;
+	    }
+#define inc_bp() bp = bp + strlen (bp)
+
+	  case 'h':
+	    {
+	      unsigned u = va_arg (ap, int);
+
+	      /* Hex.  We can change the format to 0x%08x in
+		 one place, here, if we wish.
+		 We add underscores for easy reading.  */
+	      if (u > 65536)
+		sprintf (bp, "0x%x_%04x", u >> 16, u & 0xffff);
+	      else
+		sprintf (bp, "0x%x", u);
+	      inc_bp ();
+	    }
+	    break;
+	  case 'X': case 'x':
+	    {
+	      int val = va_arg (ap, int);
+
+	      if (size != 0)
+		if (leading_zero)
+		  sprintf (bp, "%0*x", size, val);
+		else
+		  sprintf (bp, "%*x", size, val);
+	      else
+		sprintf (bp, "%x", val);
+	      inc_bp ();
+	    }
+	    break;
+	  case 'd':
+	    {
+	      int val = va_arg (ap, int);
+
+	      if (size != 0)
+		sprintf (bp, "%*d", size, val);
+	      else
+		sprintf (bp, "%d", val);
+	      inc_bp ();
+	    }
+	    break;
+	  case 'r':
+	    {
+	      /* Register.  */
+	      int val = va_arg (ap, int);
+
+#define REG2NAME(num, name) case num: sprintf (bp, ""name); \
+  regMap[(num < 32) ? 0 : 1] |= 1 << (num - ((num < 32) ? 0 : 32)); break;
+
+	      switch (val)
+		{
+		  REG2NAME (26, "gp");
+		  REG2NAME (27, "fp");
+		  REG2NAME (28, "sp");
+		  REG2NAME (29, "ilink1");
+		  REG2NAME (30, "ilink2");
+		  REG2NAME (31, "blink");
+		  REG2NAME (60, "lp_count");
+		default:
+		  {
+		    const char * ext;
+
+		    ext = core_reg_name (state, val);
+		    if (ext)
+		      sprintf (bp, "%s", ext);
+		    else
+		      sprintf (bp,"r%d",val);
+		  }
+		  break;
+		}
+	      inc_bp ();
+	    } break;
+
+	  case 'a':
+	    {
+	      /* Aux Register.  */
+	      int val = va_arg (ap, int);
+
+#define AUXREG2NAME(num, name) case num: sprintf (bp,name); break;
+
+	      switch (val)
+		{
+		  AUXREG2NAME (0x0, "status");
+		  AUXREG2NAME (0x1, "semaphore");
+		  AUXREG2NAME (0x2, "lp_start");
+		  AUXREG2NAME (0x3, "lp_end");
+		  AUXREG2NAME (0x4, "identity");
+		  AUXREG2NAME (0x5, "debug");
+		default:
+		  {
+		    const char *ext;
+
+		    ext = aux_reg_name (state, val);
+		    if (ext)
+		      sprintf (bp, "%s", ext);
+		    else
+		      arc_sprintf (state, bp, "%h", val);
+		  }
+		  break;
+		}
+	      inc_bp ();
+	    }
+	    break;
+
+	  case 's':
+	    {
+	      sprintf (bp, "%s", va_arg (ap, char *));
+	      inc_bp ();
+	    }
+	    break;
+
+	  default:
+	    fprintf (stderr, "?? format %c\n", p[-1]);
+	    break;
+	  }
+      }
+
+ DOCOMM: *bp = 0;
+  va_end (ap);
 }
 
-/* -- */
-
-void arc_cgen_print_operand
-  (CGEN_CPU_DESC, int, PTR, CGEN_FIELDS *, void const *, bfd_vma, int);
-
-/* Main entry point for printing operands.
-   XINFO is a `void *' and not a `disassemble_info *' to not put a requirement
-   of dis-asm.h on cgen.h.
-
-   This function is basically just a big switch statement.  Earlier versions
-   used tables to look up the function to use, but
-   - if the table contains both assembler and disassembler functions then
-     the disassembler contains much of the assembler and vice-versa,
-   - there's a lot of inlining possibilities as things grow,
-   - using a switch statement avoids the function call overhead.
-
-   This function could be moved into `print_insn_normal', but keeping it
-   separate makes clear the interface between `print_insn_normal' and each of
-   the handlers.  */
-
-void
-arc_cgen_print_operand (CGEN_CPU_DESC cd,
-			   int opindex,
-			   void * xinfo,
-			   CGEN_FIELDS *fields,
-			   void const *attrs ATTRIBUTE_UNUSED,
-			   bfd_vma pc,
-			   int length)
+static void
+write_comments_(struct arcDisState * state,
+		int shimm,
+		int is_limm,
+		long limm_value)
 {
-  disassemble_info *info = (disassemble_info *) xinfo;
-
-  switch (opindex)
+  if (state->commentBuffer != 0)
     {
-    case ARC_OPERAND_EXDI :
-      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_F, 0);
-      break;
-    case ARC_OPERAND_F :
-      print_keyword (cd, info, & arc_cgen_opval_h_uflags, fields->f_F, 0);
-      break;
-    case ARC_OPERAND_F0 :
-      print_keyword (cd, info, & arc_cgen_opval_h_nil, fields->f_F, 0);
-      break;
-    case ARC_OPERAND_F1 :
-      print_keyword (cd, info, & arc_cgen_opval_h_auflags, fields->f_F, 0);
-      break;
-    case ARC_OPERAND_F1F :
-      print_keyword (cd, info, & arc_cgen_opval_h_aufflags, fields->f_F, 0);
-      break;
-    case ARC_OPERAND_GP :
-      print_keyword (cd, info, & arc_cgen_opval_h_gp, 0, 0);
-      break;
-    case ARC_OPERAND_LDODI :
-      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_LDODi, 0);
-      break;
-    case ARC_OPERAND_LDRDI :
-      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_LDRDi, 0);
-      break;
-    case ARC_OPERAND_NE :
-      print_keyword (cd, info, & arc_cgen_opval_h_ne, 0, 0);
-      break;
-    case ARC_OPERAND_PCL :
-      print_keyword (cd, info, & arc_cgen_opval_h_pcl, 0, 0);
-      break;
-    case ARC_OPERAND_QCONDB :
-      print_keyword (cd, info, & arc_cgen_opval_h_Qcondb, fields->f_cond_Q, 0);
-      break;
-    case ARC_OPERAND_QCONDI :
-      print_keyword (cd, info, & arc_cgen_opval_h_Qcondi, fields->f_cond_Q, 0);
-      break;
-    case ARC_OPERAND_QCONDJ :
-      print_keyword (cd, info, & arc_cgen_opval_h_Qcondj, fields->f_cond_Q, 0);
-      break;
-    case ARC_OPERAND_R0 :
-      print_keyword (cd, info, & arc_cgen_opval_h_r0, 0, 0);
-      break;
-    case ARC_OPERAND_R31 :
-      print_keyword (cd, info, & arc_cgen_opval_h_r31, 0, 0);
-      break;
-    case ARC_OPERAND_RA :
-      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_A, 0);
-      break;
-    case ARC_OPERAND_RA_0 :
-      print_keyword (cd, info, & arc_cgen_opval_h_nil, fields->f_op_A, 0);
-      break;
-    case ARC_OPERAND_RB :
-      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_B, 0|(1<<CGEN_OPERAND_VIRTUAL));
-      break;
-    case ARC_OPERAND_RB_0 :
-      print_keyword (cd, info, & arc_cgen_opval_h_nil, fields->f_op_B, 0|(1<<CGEN_OPERAND_VIRTUAL));
-      break;
-    case ARC_OPERAND_RC :
-      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_C, 0);
-      break;
-    case ARC_OPERAND_RC_ILINK :
-      print_keyword (cd, info, & arc_cgen_opval_h_ilinkx, fields->f_op_Cj, 0);
-      break;
-    case ARC_OPERAND_RC_NOILINK :
-      print_keyword (cd, info, & arc_cgen_opval_h_noilink, fields->f_op_Cj, 0);
-      break;
-    case ARC_OPERAND_R_A :
-      print_keyword (cd, info, & arc_cgen_opval_h_cr16, fields->f_op__a, 0);
-      break;
-    case ARC_OPERAND_R_B :
-      print_keyword (cd, info, & arc_cgen_opval_h_cr16, fields->f_op__b, 0);
-      break;
-    case ARC_OPERAND_R_C :
-      print_keyword (cd, info, & arc_cgen_opval_h_cr16, fields->f_op__c, 0);
-      break;
-    case ARC_OPERAND_RCC :
-      print_keyword (cd, info, & arc_cgen_opval_h_Rcc, fields->f_brcond, 0);
-      break;
-    case ARC_OPERAND_RCCS :
-      print_keyword (cd, info, & arc_cgen_opval_h_RccS, fields->f_brscond, 0);
-      break;
-    case ARC_OPERAND_RH :
-      print_keyword (cd, info, & arc_cgen_opval_cr_names, fields->f_op_h, 0|(1<<CGEN_OPERAND_VIRTUAL));
-      break;
-    case ARC_OPERAND_SP :
-      print_keyword (cd, info, & arc_cgen_opval_h_sp, 0, 0);
-      break;
-    case ARC_OPERAND_STODI :
-      print_keyword (cd, info, & arc_cgen_opval_h_Di, fields->f_STODi, 0);
-      break;
-    case ARC_OPERAND_U6 :
-      print_normal (cd, info, fields->f_u6, 0, pc, length);
-      break;
-    case ARC_OPERAND_U6X2 :
-      print_normal (cd, info, fields->f_u6x2, 0, pc, length);
-      break;
-    case ARC_OPERAND__AW :
-      print_keyword (cd, info, & arc_cgen_opval_h__aw, 0, 0);
-      break;
-    case ARC_OPERAND__L :
-      print_keyword (cd, info, & arc_cgen_opval_h_insn32, 0, 0);
-      break;
-    case ARC_OPERAND__S :
-      print_keyword (cd, info, & arc_cgen_opval_h_insn16, 0, 0);
-      break;
-    case ARC_OPERAND_CBIT :
-      print_normal (cd, info, 0, 0, pc, length);
-      break;
-    case ARC_OPERAND_DELAY_N :
-      print_keyword (cd, info, & arc_cgen_opval_h_delay, fields->f_delay_N, 0);
-      break;
-    case ARC_OPERAND_DUMMY_OP :
-      print_normal (cd, info, fields->f_dummy, 0, pc, length);
-      break;
-    case ARC_OPERAND_I2COND :
-      print_keyword (cd, info, & arc_cgen_opval_h_i2cond, fields->f_cond_i2, 0);
-      break;
-    case ARC_OPERAND_I3COND :
-      print_keyword (cd, info, & arc_cgen_opval_h_i3cond, fields->f_cond_i3, 0);
-      break;
-    case ARC_OPERAND_LABEL10 :
-      print_address (cd, info, fields->f_rel10, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
-      break;
-    case ARC_OPERAND_LABEL13A :
-      print_address (cd, info, fields->f_rel13bl, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
-      break;
-    case ARC_OPERAND_LABEL21 :
-      print_address (cd, info, fields->f_rel21, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_LABEL21A :
-      print_address (cd, info, fields->f_rel21bl, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_LABEL25 :
-      print_address (cd, info, fields->f_rel25, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_LABEL25A :
-      print_address (cd, info, fields->f_rel25bl, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_LABEL7 :
-      print_address (cd, info, fields->f_rel7, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
-      break;
-    case ARC_OPERAND_LABEL8 :
-      print_address (cd, info, fields->f_rel8, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);
-      break;
-    case ARC_OPERAND_LABEL9 :
-      print_address (cd, info, fields->f_rel9, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_LBIT :
-      print_normal (cd, info, 0, 0, pc, length);
-      break;
-    case ARC_OPERAND_NBIT :
-      print_normal (cd, info, 0, 0, pc, length);
-      break;
-    case ARC_OPERAND_S12 :
-      print_normal (cd, info, fields->f_s12, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_S12X2 :
-      print_normal (cd, info, fields->f_s12x2, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_S1BIT :
-      print_normal (cd, info, 0, 0, pc, length);
-      break;
-    case ARC_OPERAND_S2BIT :
-      print_normal (cd, info, 0, 0, pc, length);
-      break;
-    case ARC_OPERAND_S9 :
-      print_normal (cd, info, fields->f_s9, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
-      break;
-    case ARC_OPERAND_S9X4 :
-      print_normal (cd, info, fields->f_s9x4, 0, pc, length);
-      break;
-    case ARC_OPERAND_SC_S9_ :
-      print_normal (cd, info, fields->f_s9x4, 0, pc, length);
-      break;
-    case ARC_OPERAND_SC_S9B :
-      print_normal (cd, info, fields->f_s9x1, 0, pc, length);
-      break;
-    case ARC_OPERAND_SC_S9W :
-      print_normal (cd, info, fields->f_s9x2, 0, pc, length);
-      break;
-    case ARC_OPERAND_SC_U5_ :
-      print_normal (cd, info, fields->f_u5x4, 0, pc, length);
-      break;
-    case ARC_OPERAND_SC_U5B :
-      print_normal (cd, info, fields->f_u5, 0, pc, length);
-      break;
-    case ARC_OPERAND_SC_U5W :
-      print_normal (cd, info, fields->f_u5x2, 0, pc, length);
-      break;
-    case ARC_OPERAND_TRAPNUM :
-      print_normal (cd, info, fields->f_trapnum, 0, pc, length);
-      break;
-    case ARC_OPERAND_U3 :
-      print_normal (cd, info, fields->f_u3, 0, pc, length);
-      break;
-    case ARC_OPERAND_U5 :
-      print_normal (cd, info, fields->f_u5, 0, pc, length);
-      break;
-    case ARC_OPERAND_U5X4 :
-      print_normal (cd, info, fields->f_u5x4, 0, pc, length);
-      break;
-    case ARC_OPERAND_U7 :
-      print_normal (cd, info, fields->f_u7, 0, pc, length);
-      break;
-    case ARC_OPERAND_U8 :
-      print_normal (cd, info, fields->f_u8, 0, pc, length);
-      break;
-    case ARC_OPERAND_U8X4 :
-      print_normal (cd, info, fields->f_u8x4, 0, pc, length);
-      break;
-    case ARC_OPERAND_UNCONDB :
-      print_keyword (cd, info, & arc_cgen_opval_h_uncondb, 0, 0);
-      break;
-    case ARC_OPERAND_UNCONDI :
-      print_keyword (cd, info, & arc_cgen_opval_h_uncondi, 0, 0);
-      break;
-    case ARC_OPERAND_UNCONDJ :
-      print_keyword (cd, info, & arc_cgen_opval_h_uncondj, 0, 0);
-      break;
-    case ARC_OPERAND_VBIT :
-      print_normal (cd, info, 0, 0, pc, length);
-      break;
-    case ARC_OPERAND_ZBIT :
-      print_normal (cd, info, 0, 0, pc, length);
-      break;
+      int i;
 
-    default :
-      /* xgettext:c-format */
-      fprintf (stderr, _("Unrecognized field %d while printing insn.\n"),
-	       opindex);
-    abort ();
-  }
+      if (is_limm)
+	{
+	  const char *name = post_address (state, limm_value + shimm);
+
+	  if (*name != 0)
+	    WRITE_COMMENT (name);
+	}
+      for (i = 0; i < state->commNum; i++)
+	{
+	  if (i == 0)
+	    strcpy (state->commentBuffer, comment_prefix);
+	  else
+	    strcat (state->commentBuffer, ", ");
+	  strncat (state->commentBuffer, state->comm[i],
+		   sizeof (state->commentBuffer));
+	}
+    }
 }
 
-cgen_print_fn * const arc_cgen_print_handlers[] = 
+#define write_comments2(x) write_comments_ (state, x, is_limm, limm_value)
+#define write_comments()   write_comments2 (0)
+
+static const char *condName[] =
 {
-  print_insn_normal,
+  /* 0..15.  */
+  ""   , "z"  , "nz" , "p"  , "n"  , "c"  , "nc" , "v"  ,
+  "nv" , "gt" , "ge" , "lt" , "le" , "hi" , "ls" , "pnz"
 };
 
-
-void
-arc_cgen_init_dis (CGEN_CPU_DESC cd)
-{
-  arc_cgen_init_opcode_table (cd);
-  arc_cgen_init_ibld_table (cd);
-  cd->print_handlers = & arc_cgen_print_handlers[0];
-  cd->print_operand = arc_cgen_print_operand;
-}
-
-
-/* Default print handler.  */
-
 static void
-print_normal (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
-	      void *dis_info,
-	      long value,
-	      unsigned int attrs,
-	      bfd_vma pc ATTRIBUTE_UNUSED,
-	      int length ATTRIBUTE_UNUSED)
+write_instr_name_(struct arcDisState * state,
+		  const char * instrName,
+		  int cond,
+		  int condCodeIsPartOfName,
+		  int flag,
+		  int signExtend,
+		  int addrWriteBack,
+		  int directMem)
 {
-  disassemble_info *info = (disassemble_info *) dis_info;
+  strcpy (state->instrBuffer, instrName);
 
-#ifdef CGEN_PRINT_NORMAL
-  CGEN_PRINT_NORMAL (cd, info, value, attrs, pc, length);
-#endif
-
-  /* Print the operand as directed by the attributes.  */
-  if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
-    ; /* nothing to do */
-  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SIGNED))
-    (*info->fprintf_func) (info->stream, "%ld", value);
-  else
-    (*info->fprintf_func) (info->stream, "0x%lx", value);
-}
-
-/* Default address handler.  */
-
-static void
-print_address (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
-	       void *dis_info,
-	       bfd_vma value,
-	       unsigned int attrs,
-	       bfd_vma pc ATTRIBUTE_UNUSED,
-	       int length ATTRIBUTE_UNUSED)
-{
-  disassemble_info *info = (disassemble_info *) dis_info;
-
-#ifdef CGEN_PRINT_ADDRESS
-  CGEN_PRINT_ADDRESS (cd, info, value, attrs, pc, length);
-#endif
-
-  /* Print the operand as directed by the attributes.  */
-  if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
-    ; /* Nothing to do.  */
-  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_PCREL_ADDR))
-    (*info->print_address_func) (value, info);
-  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_ABS_ADDR))
-    (*info->print_address_func) (value, info);
-  else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SIGNED))
-    (*info->fprintf_func) (info->stream, "%ld", (long) value);
-  else
-    (*info->fprintf_func) (info->stream, "0x%lx", (long) value);
-}
-
-/* Keyword print handler.  */
-
-static void
-print_keyword (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
-	       void *dis_info,
-	       CGEN_KEYWORD *keyword_table,
-	       long value,
-	       unsigned int attrs ATTRIBUTE_UNUSED)
-{
-  disassemble_info *info = (disassemble_info *) dis_info;
-  const CGEN_KEYWORD_ENTRY *ke;
-
-  ke = cgen_keyword_lookup_value (keyword_table, value);
-  if (ke != NULL)
-    (*info->fprintf_func) (info->stream, "%s", ke->name);
-  else
-    (*info->fprintf_func) (info->stream, "???");
-}
-
-/* Default insn printer.
-
-   DIS_INFO is defined as `void *' so the disassembler needn't know anything
-   about disassemble_info.  */
-
-static void
-print_insn_normal (CGEN_CPU_DESC cd,
-		   void *dis_info,
-		   const CGEN_INSN *insn,
-		   CGEN_FIELDS *fields,
-		   bfd_vma pc,
-		   int length)
-{
-  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
-  disassemble_info *info = (disassemble_info *) dis_info;
-  const CGEN_SYNTAX_CHAR_TYPE *syn;
-
-  CGEN_INIT_PRINT (cd);
-
-  for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
+  if (cond > 0)
     {
-      if (CGEN_SYNTAX_MNEMONIC_P (*syn))
-	{
-	  (*info->fprintf_func) (info->stream, "%s", CGEN_INSN_MNEMONIC (insn));
-	  continue;
-	}
-      if (CGEN_SYNTAX_CHAR_P (*syn))
-	{
-	  (*info->fprintf_func) (info->stream, "%c", CGEN_SYNTAX_CHAR (*syn));
-	  continue;
-	}
+      const char *cc = 0;
 
-      /* We have an operand.  */
-      arc_cgen_print_operand (cd, CGEN_SYNTAX_FIELD (*syn), info,
-				 fields, CGEN_INSN_ATTRS (insn), pc, length);
-    }
-}
-
-/* Subroutine of print_insn. Reads an insn into the given buffers and updates
-   the extract info.
-   Returns 0 if all is well, non-zero otherwise.  */
+      if (!condCodeIsPartOfName)
+	strcat (state->instrBuffer, ".");
 
-static int
-read_insn (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
-	   bfd_vma pc,
-	   disassemble_info *info,
-	   bfd_byte *buf,
-	   int buflen,
-	   CGEN_EXTRACT_INFO *ex_info,
-	   unsigned long *insn_value)
-{
-  int status = (*info->read_memory_func) (pc, buf, buflen, info);
-
-  if (status != 0)
-    {
-      (*info->memory_error_func) (status, pc, info);
-      return -1;
-    }
-
-  ex_info->dis_info = info;
-  ex_info->valid = (1 << buflen) - 1;
-  ex_info->insn_bytes = buf;
-
-  *insn_value = bfd_get_bits (buf, buflen * 8, info->endian == BFD_ENDIAN_BIG);
-  return 0;
-}
-
-/* Utility to print an insn.
-   BUF is the base part of the insn, target byte order, BUFLEN bytes long.
-   The result is the size of the insn in bytes or zero for an unknown insn
-   or -1 if an error occurs fetching data (memory_error_func will have
-   been called).  */
-
-static int
-print_insn (CGEN_CPU_DESC cd,
-	    bfd_vma pc,
-	    disassemble_info *info,
-	    bfd_byte *buf,
-	    unsigned int buflen)
-{
-  CGEN_INSN_INT insn_value;
-  const CGEN_INSN_LIST *insn_list;
-  CGEN_EXTRACT_INFO ex_info;
-  int basesize;
-
-  /* Extract base part of instruction, just in case CGEN_DIS_* uses it. */
-  basesize = cd->base_insn_bitsize < buflen * 8 ?
-                                     cd->base_insn_bitsize : buflen * 8;
-  insn_value = cgen_get_insn_value (cd, buf, basesize);
-
-
-  /* Fill in ex_info fields like read_insn would.  Don't actually call
-     read_insn, since the incoming buffer is already read (and possibly
-     modified a la m32r).  */
-  ex_info.valid = (1 << buflen) - 1;
-  ex_info.dis_info = info;
-  ex_info.insn_bytes = buf;
-
-  /* The instructions are stored in hash lists.
-     Pick the first one and keep trying until we find the right one.  */
-
-  insn_list = CGEN_DIS_LOOKUP_INSN (cd, (char *) buf, insn_value);
-  while (insn_list != NULL)
-    {
-      const CGEN_INSN *insn = insn_list->insn;
-      CGEN_FIELDS fields;
-      int length;
-      unsigned long insn_value_cropped;
-
-#ifdef CGEN_VALIDATE_INSN_SUPPORTED 
-      /* Not needed as insn shouldn't be in hash lists if not supported.  */
-      /* Supported by this cpu?  */
-      if (! arc_cgen_insn_supported (cd, insn))
-        {
-          insn_list = CGEN_DIS_NEXT_INSN (insn_list);
-	  continue;
-        }
-#endif
-
-      /* Basic bit mask must be correct.  */
-      /* ??? May wish to allow target to defer this check until the extract
-	 handler.  */
-
-      /* Base size may exceed this instruction's size.  Extract the
-         relevant part from the buffer. */
-      if ((unsigned) (CGEN_INSN_BITSIZE (insn) / 8) < buflen &&
-	  (unsigned) (CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
-	insn_value_cropped = bfd_get_bits (buf, CGEN_INSN_BITSIZE (insn), 
-					   info->endian == BFD_ENDIAN_BIG);
+      if (cond < 16)
+	cc = condName[cond];
       else
-	insn_value_cropped = insn_value;
+	cc = cond_code_name (state, cond);
 
-      if ((insn_value_cropped & CGEN_INSN_BASE_MASK (insn))
-	  == CGEN_INSN_BASE_VALUE (insn))
-	{
-	  /* Printing is handled in two passes.  The first pass parses the
-	     machine insn and extracts the fields.  The second pass prints
-	     them.  */
+      if (!cc)
+	cc = "???";
 
-	  /* Make sure the entire insn is loaded into insn_value, if it
-	     can fit.  */
-	  if (((unsigned) CGEN_INSN_BITSIZE (insn) > cd->base_insn_bitsize) &&
-	      (unsigned) (CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
-	    {
-	      unsigned long full_insn_value;
-	      int rc = read_insn (cd, pc, info, buf,
-				  CGEN_INSN_BITSIZE (insn) / 8,
-				  & ex_info, & full_insn_value);
-	      if (rc != 0)
-		return rc;
-	      length = CGEN_EXTRACT_FN (cd, insn)
-		(cd, insn, &ex_info, full_insn_value, &fields, pc);
-	    }
-	  else
-	    length = CGEN_EXTRACT_FN (cd, insn)
-	      (cd, insn, &ex_info, insn_value_cropped, &fields, pc);
-
-	  /* Length < 0 -> error.  */
-	  if (length < 0)
-	    return length;
-	  if (length > 0)
-	    {
-	      CGEN_PRINT_FN (cd, insn) (cd, info, insn, &fields, pc, length);
-	      /* Length is in bits, result is in bytes.  */
-	      return length / 8;
-	    }
-	}
-
-      insn_list = CGEN_DIS_NEXT_INSN (insn_list);
+      strcat (state->instrBuffer, cc);
     }
 
-  return 0;
+  if (flag)
+    strcat (state->instrBuffer, ".f");
+
+  switch (state->nullifyMode)
+    {
+    case BR_exec_always:
+      strcat (state->instrBuffer, ".d");
+      break;
+    case BR_exec_when_jump:
+      strcat (state->instrBuffer, ".jd");
+      break;
+    }
+
+  if (signExtend)
+    strcat (state->instrBuffer, ".x");
+
+  if (addrWriteBack)
+    strcat (state->instrBuffer, ".a");
+
+  if (directMem)
+    strcat (state->instrBuffer, ".di");
 }
 
-/* Default value for CGEN_PRINT_INSN.
-   The result is the size of the insn in bytes or zero for an unknown insn
-   or -1 if an error occured fetching bytes.  */
+#define write_instr_name()						\
+  do									\
+    {									\
+      write_instr_name_(state, instrName,cond, condCodeIsPartOfName,	\
+			flag, signExtend, addrWriteBack, directMem);	\
+      formatString[0] = '\0';						\
+    }									\
+  while (0)
 
-#ifndef CGEN_PRINT_INSN
-#define CGEN_PRINT_INSN default_print_insn
-#endif
+enum
+{
+  op_LD0 = 0, op_LD1 = 1, op_ST  = 2, op_3   = 3,
+  op_BC  = 4, op_BLC = 5, op_LPC = 6, op_JC  = 7,
+  op_ADD = 8, op_ADC = 9, op_SUB = 10, op_SBC = 11,
+  op_AND = 12, op_OR  = 13, op_BIC = 14, op_XOR = 15
+};
+
+extern disassemble_info tm_print_insn_info;
 
 static int
-default_print_insn (CGEN_CPU_DESC cd, bfd_vma pc, disassemble_info *info)
+dsmOneArcInst (bfd_vma addr, struct arcDisState * state)
 {
-  bfd_byte buf[CGEN_MAX_INSN_SIZE];
-  int buflen;
-  int status;
+  int condCodeIsPartOfName = 0;
+  a4_decoding_class decodingClass;
+  const char * instrName;
+  int repeatsOp = 0;
+  int fieldAisReg = 1;
+  int fieldBisReg = 1;
+  int fieldCisReg = 1;
+  int fieldA;
+  int fieldB;
+  int fieldC = 0;
+  int flag = 0;
+  int cond = 0;
+  int is_shimm = 0;
+  int is_limm = 0;
+  long limm_value = 0;
+  int signExtend = 0;
+  int addrWriteBack = 0;
+  int directMem = 0;
+  int is_linked = 0;
+  int offset = 0;
+  int usesAuxReg = 0;
+  int flags;
+  int ignoreFirstOpd;
+  char formatString[60];
 
-  /* Attempt to read the base part of the insn.  */
-  buflen = cd->base_insn_bitsize / 8;
-  status = (*info->read_memory_func) (pc, buf, buflen, info);
+  state->instructionLen = 4;
+  state->nullifyMode = BR_exec_when_no_jump;
+  state->opWidth = 12;
+  state->isBranch = 0;
 
-  /* Try again with the minimum part, if min < base.  */
-  if (status != 0 && (cd->min_insn_bitsize < cd->base_insn_bitsize))
+  state->_mem_load = 0;
+  state->_ea_present = 0;
+  state->_load_len = 0;
+  state->ea_reg1 = no_reg;
+  state->ea_reg2 = no_reg;
+  state->_offset = 0;
+
+  if (! NEXT_WORD (0))
+    return 0;
+
+  state->_opcode = OPCODE (state->words[0]);
+  instrName = 0;
+  decodingClass = CLASS_A4_ARITH; /* default!  */
+  repeatsOp = 0;
+  condCodeIsPartOfName=0;
+  state->commNum = 0;
+  state->tcnt = 0;
+  state->acnt = 0;
+  state->flow = noflow;
+  ignoreFirstOpd = 0;
+
+  if (state->commentBuffer)
+    state->commentBuffer[0] = '\0';
+
+  switch (state->_opcode)
     {
-      buflen = cd->min_insn_bitsize / 8;
-      status = (*info->read_memory_func) (pc, buf, buflen, info);
-    }
-
-  if (status != 0)
-    {
-      (*info->memory_error_func) (status, pc, info);
-      return -1;
-    }
-
-  return print_insn (cd, pc, info, buf, buflen);
-}
-
-/* Main entry point.
-   Print one instruction from PC on INFO->STREAM.
-   Return the size of the instruction (in bytes).  */
-
-typedef struct cpu_desc_list
-{
-  struct cpu_desc_list *next;
-  CGEN_BITSET *isa;
-  int mach;
-  int endian;
-  CGEN_CPU_DESC cd;
-} cpu_desc_list;
-
-int
-print_insn_arc (bfd_vma pc, disassemble_info *info)
-{
-  static cpu_desc_list *cd_list = 0;
-  cpu_desc_list *cl = 0;
-  static CGEN_CPU_DESC cd = 0;
-  static CGEN_BITSET *prev_isa;
-  static int prev_mach;
-  static int prev_endian;
-  int length;
-  CGEN_BITSET *isa;
-  int mach;
-  int endian = (info->endian == BFD_ENDIAN_BIG
-		? CGEN_ENDIAN_BIG
-		: CGEN_ENDIAN_LITTLE);
-  enum bfd_architecture arch;
-
-  /* ??? gdb will set mach but leave the architecture as "unknown" */
-#ifndef CGEN_BFD_ARCH
-#define CGEN_BFD_ARCH bfd_arch_arc
-#endif
-  arch = info->arch;
-  if (arch == bfd_arch_unknown)
-    arch = CGEN_BFD_ARCH;
-   
-  /* There's no standard way to compute the machine or isa number
-     so we leave it to the target.  */
-#ifdef CGEN_COMPUTE_MACH
-  mach = CGEN_COMPUTE_MACH (info);
-#else
-  mach = info->mach;
-#endif
-
-#ifdef CGEN_COMPUTE_ISA
-  {
-    static CGEN_BITSET *permanent_isa;
-
-    if (!permanent_isa)
-      permanent_isa = cgen_bitset_create (MAX_ISAS);
-    isa = permanent_isa;
-    cgen_bitset_clear (isa);
-    cgen_bitset_add (isa, CGEN_COMPUTE_ISA (info));
-  }
-#else
-  isa = info->insn_sets;
-#endif
-
-  /* If we've switched cpu's, try to find a handle we've used before */
-  if (cd
-      && (cgen_bitset_compare (isa, prev_isa) != 0
-	  || mach != prev_mach
-	  || endian != prev_endian))
-    {
-      cd = 0;
-      for (cl = cd_list; cl; cl = cl->next)
+    case op_LD0:
+      switch (BITS (state->words[0],1,2))
 	{
-	  if (cgen_bitset_compare (cl->isa, isa) == 0 &&
-	      cl->mach == mach &&
-	      cl->endian == endian)
+	case 0:
+	  instrName = "ld";
+	  state->_load_len = 4;
+	  break;
+	case 1:
+	  instrName = "ldb";
+	  state->_load_len = 1;
+	  break;
+	case 2:
+	  instrName = "ldw";
+	  state->_load_len = 2;
+	  break;
+	default:
+	  instrName = "??? (0[3])";
+	  state->flow = invalid_instr;
+	  break;
+	}
+      decodingClass = CLASS_A4_LD0;
+      break;
+
+    case op_LD1:
+      if (BIT (state->words[0],13))
+	{
+	  instrName = "lr";
+	  decodingClass = CLASS_A4_LR;
+	}
+      else
+	{
+	  switch (BITS (state->words[0], 10, 11))
 	    {
-	      cd = cl->cd;
- 	      prev_isa = cd->isas;
+	    case 0:
+	      instrName = "ld";
+	      state->_load_len = 4;
+	      break;
+	    case 1:
+	      instrName = "ldb";
+	      state->_load_len = 1;
+	      break;
+	    case 2:
+	      instrName = "ldw";
+	      state->_load_len = 2;
+	      break;
+	    default:
+	      instrName = "??? (1[3])";
+	      state->flow = invalid_instr;
 	      break;
 	    }
+	  decodingClass = CLASS_A4_LD1;
 	}
-    } 
+      break;
 
-  /* If we haven't initialized yet, initialize the opcode table.  */
-  if (! cd)
-    {
-      const bfd_arch_info_type *arch_type = bfd_lookup_arch (arch, mach);
-      const char *mach_name;
+    case op_ST:
+      if (BIT (state->words[0], 25))
+	{
+	  instrName = "sr";
+	  decodingClass = CLASS_A4_SR;
+	}
+      else
+	{
+	  switch (BITS (state->words[0], 22, 23))
+	    {
+	    case 0:
+	      instrName = "st";
+	      break;
+	    case 1:
+	      instrName = "stb";
+	      break;
+	    case 2:
+	      instrName = "stw";
+	      break;
+	    default:
+	      instrName = "??? (2[3])";
+	      state->flow = invalid_instr;
+	      break;
+	    }
+	  decodingClass = CLASS_A4_ST;
+	}
+      break;
 
-      if (!arch_type)
-	abort ();
-      mach_name = arch_type->printable_name;
+    case op_3:
+      decodingClass = CLASS_A4_OP3_GENERAL;  /* default for opcode 3...  */
+      switch (FIELDC (state->words[0]))
+	{
+	case  0:
+	  instrName = "flag";
+	  decodingClass = CLASS_A4_FLAG;
+	  break;
+	case  1:
+	  instrName = "asr";
+	  break;
+	case  2:
+	  instrName = "lsr";
+	  break;
+	case  3:
+	  instrName = "ror";
+	  break;
+	case  4:
+	  instrName = "rrc";
+	  break;
+	case  5:
+	  instrName = "sexb";
+	  break;
+	case  6:
+	  instrName = "sexw";
+	  break;
+	case  7:
+	  instrName = "extb";
+	  break;
+	case  8:
+	  instrName = "extw";
+	  break;
+	case  0x3f:
+	  {
+	    decodingClass = CLASS_A4_OP3_SUBOPC3F;
+	    switch (FIELDD (state->words[0]))
+	      {
+	      case 0:
+		instrName = "brk";
+		break;
+	      case 1:
+		instrName = "sleep";
+		break;
+	      case 2:
+		instrName = "swi";
+		break;
+	      default:
+		instrName = "???";
+		state->flow=invalid_instr;
+		break;
+	      }
+	  }
+	  break;
 
-      prev_isa = cgen_bitset_copy (isa);
-      prev_mach = mach;
-      prev_endian = endian;
-      cd = arc_cgen_cpu_open (CGEN_CPU_OPEN_ISAS, prev_isa,
-				 CGEN_CPU_OPEN_BFDMACH, mach_name,
-				 CGEN_CPU_OPEN_ENDIAN, prev_endian,
-				 CGEN_CPU_OPEN_END);
-      if (!cd)
-	abort ();
+	  /* ARC Extension Library Instructions
+	     NOTE: We assume that extension codes are these instrs.  */
+	default:
+	  instrName = instruction_name (state,
+					state->_opcode,
+					FIELDC (state->words[0]),
+					&flags);
+	  if (!instrName)
+	    {
+	      instrName = "???";
+	      state->flow = invalid_instr;
+	    }
+	  if (flags & IGNORE_FIRST_OPD)
+	    ignoreFirstOpd = 1;
+	  break;
+	}
+      break;
 
-      /* Save this away for future reference.  */
-      cl = xmalloc (sizeof (struct cpu_desc_list));
-      cl->cd = cd;
-      cl->isa = prev_isa;
-      cl->mach = mach;
-      cl->endian = endian;
-      cl->next = cd_list;
-      cd_list = cl;
+    case op_BC:
+      instrName = "b";
+    case op_BLC:
+      if (!instrName)
+	instrName = "bl";
+    case op_LPC:
+      if (!instrName)
+	instrName = "lp";
+    case op_JC:
+      if (!instrName)
+	{
+	  if (BITS (state->words[0],9,9))
+	    {
+	      instrName = "jl";
+	      is_linked = 1;
+	    }
+	  else
+	    {
+	      instrName = "j";
+	      is_linked = 0;
+	    }
+	}
+      condCodeIsPartOfName = 1;
+      decodingClass = ((state->_opcode == op_JC) ? CLASS_A4_JC : CLASS_A4_BRANCH );
+      state->isBranch = 1;
+      break;
 
-      arc_cgen_init_dis (cd);
+    case op_ADD:
+    case op_ADC:
+    case op_AND:
+      repeatsOp = (FIELDC (state->words[0]) == FIELDB (state->words[0]));
+
+      switch (state->_opcode)
+	{
+	case op_ADD:
+	  instrName = (repeatsOp ? "asl" : "add");
+	  break;
+	case op_ADC:
+	  instrName = (repeatsOp ? "rlc" : "adc");
+	  break;
+	case op_AND:
+	  instrName = (repeatsOp ? "mov" : "and");
+	  break;
+	}
+      break;
+
+    case op_SUB: instrName = "sub";
+      break;
+    case op_SBC: instrName = "sbc";
+      break;
+    case op_OR:  instrName = "or";
+      break;
+    case op_BIC: instrName = "bic";
+      break;
+
+    case op_XOR:
+      if (state->words[0] == 0x7fffffff)
+	{
+	  /* NOP encoded as xor -1, -1, -1.   */
+	  instrName = "nop";
+	  decodingClass = CLASS_A4_OP3_SUBOPC3F;
+	}
+      else
+	instrName = "xor";
+      break;
+
+    default:
+      instrName = instruction_name (state,state->_opcode,0,&flags);
+      /* if (instrName) printf("FLAGS=0x%x\n", flags);  */
+      if (!instrName)
+	{
+	  instrName = "???";
+	  state->flow=invalid_instr;
+	}
+      if (flags & IGNORE_FIRST_OPD)
+	ignoreFirstOpd = 1;
+      break;
     }
 
-  /* We try to have as much common code as possible.
-     But at this point some targets need to take over.  */
-  /* ??? Some targets may need a hook elsewhere.  Try to avoid this,
-     but if not possible try to move this hook elsewhere rather than
-     have two hooks.  */
-  length = CGEN_PRINT_INSN (cd, pc, info);
-  if (length > 0)
-    return length;
-  if (length < 0)
-    return -1;
+  fieldAisReg = fieldBisReg = fieldCisReg = 1; /* Assume regs for now.  */
+  flag = cond = is_shimm = is_limm = 0;
+  state->nullifyMode = BR_exec_when_no_jump;	/* 0  */
+  signExtend = addrWriteBack = directMem = 0;
+  usesAuxReg = 0;
 
-  (*info->fprintf_func) (info->stream, UNKNOWN_INSN_MSG);
-  return cd->default_insn_bitsize / 8;
+  switch (decodingClass)
+    {
+    case CLASS_A4_ARITH:
+      CHECK_FIELD_A ();
+      CHECK_FIELD_B ();
+      if (!repeatsOp)
+	CHECK_FIELD_C ();
+      CHECK_FLAG_COND_NULLIFY ();
+
+      write_instr_name ();
+      if (!ignoreFirstOpd)
+	{
+	  WRITE_FORMAT_x (A);
+	  WRITE_FORMAT_COMMA_x (B);
+	  if (!repeatsOp)
+	    WRITE_FORMAT_COMMA_x (C);
+	  WRITE_NOP_COMMENT ();
+	  arc_sprintf (state, state->operandBuffer, formatString,
+		      fieldA, fieldB, fieldC);
+	}
+      else
+	{
+	  WRITE_FORMAT_x (B);
+	  if (!repeatsOp)
+	    WRITE_FORMAT_COMMA_x (C);
+	  arc_sprintf (state, state->operandBuffer, formatString,
+		      fieldB, fieldC);
+	}
+      write_comments ();
+      break;
+
+    case CLASS_A4_OP3_GENERAL:
+      CHECK_FIELD_A ();
+      CHECK_FIELD_B ();
+      CHECK_FLAG_COND_NULLIFY ();
+
+      write_instr_name ();
+      if (!ignoreFirstOpd)
+	{
+	  WRITE_FORMAT_x (A);
+	  WRITE_FORMAT_COMMA_x (B);
+	  WRITE_NOP_COMMENT ();
+	  arc_sprintf (state, state->operandBuffer, formatString,
+		      fieldA, fieldB);
+	}
+      else
+	{
+	  WRITE_FORMAT_x (B);
+	  arc_sprintf (state, state->operandBuffer, formatString, fieldB);
+	}
+      write_comments ();
+      break;
+
+    case CLASS_A4_FLAG:
+      CHECK_FIELD_B ();
+      CHECK_FLAG_COND_NULLIFY ();
+      flag = 0; /* This is the FLAG instruction -- it's redundant.  */
+
+      write_instr_name ();
+      WRITE_FORMAT_x (B);
+      arc_sprintf (state, state->operandBuffer, formatString, fieldB);
+      write_comments ();
+      break;
+
+    case CLASS_A4_BRANCH:
+      fieldA = BITS (state->words[0],7,26) << 2;
+      fieldA = (fieldA << 10) >> 10; /* Make it signed.  */
+      fieldA += addr + 4;
+      CHECK_FLAG_COND_NULLIFY ();
+      flag = 0;
+
+      write_instr_name ();
+      /* This address could be a label we know. Convert it.  */
+      if (state->_opcode != op_LPC /* LP  */)
+	{
+	  add_target (fieldA); /* For debugger.  */
+	  state->flow = state->_opcode == op_BLC /* BL  */
+	    ? direct_call
+	    : direct_jump;
+	  /* indirect calls are achieved by "lr blink,[status];
+	     lr dest<- func addr; j [dest]"  */
+	}
+
+      strcat (formatString, "%s"); /* Address/label name.  */
+      arc_sprintf (state, state->operandBuffer, formatString,
+		  post_address (state, fieldA));
+      write_comments ();
+      break;
+
+    case CLASS_A4_JC:
+      /* For op_JC -- jump to address specified.
+	 Also covers jump and link--bit 9 of the instr. word
+	 selects whether linked, thus "is_linked" is set above.  */
+      fieldA = 0;
+      CHECK_FIELD_B ();
+      CHECK_FLAG_COND_NULLIFY ();
+
+      if (!fieldBisReg)
+	{
+	  fieldAisReg = 0;
+	  fieldA = (fieldB >> 25) & 0x7F; /* Flags.  */
+	  fieldB = (fieldB & 0xFFFFFF) << 2;
+	  state->flow = is_linked ? direct_call : direct_jump;
+	  add_target (fieldB);
+	  /* Screwy JLcc requires .jd mode to execute correctly
+	     but we pretend it is .nd (no delay slot).  */
+	  if (is_linked && state->nullifyMode == BR_exec_when_jump)
+	    state->nullifyMode = BR_exec_when_no_jump;
+	}
+      else
+	{
+	  state->flow = is_linked ? indirect_call : indirect_jump;
+	  /* We should also treat this as indirect call if NOT linked
+	     but the preceding instruction was a "lr blink,[status]"
+	     and we have a delay slot with "add blink,blink,2".
+	     For now we can't detect such.  */
+	  state->register_for_indirect_jump = fieldB;
+	}
+
+      write_instr_name ();
+      strcat (formatString,
+	      IS_REG (B) ? "[%r]" : "%s"); /* Address/label name.  */
+      if (fieldA != 0)
+	{
+	  fieldAisReg = 0;
+	  WRITE_FORMAT_COMMA_x (A);
+	}
+      if (IS_REG (B))
+	arc_sprintf (state, state->operandBuffer, formatString, fieldB, fieldA);
+      else
+	arc_sprintf (state, state->operandBuffer, formatString,
+		    post_address (state, fieldB), fieldA);
+      write_comments ();
+      break;
+
+    case CLASS_A4_LD0:
+      /* LD instruction.
+	 B and C can be regs, or one (both?) can be limm.  */
+      CHECK_FIELD_A ();
+      CHECK_FIELD_B ();
+      CHECK_FIELD_C ();
+      if (dbg)
+	printf ("5:b reg %d %d c reg %d %d  \n",
+		fieldBisReg,fieldB,fieldCisReg,fieldC);
+      state->_offset = 0;
+      state->_ea_present = 1;
+      if (fieldBisReg)
+	state->ea_reg1 = fieldB;
+      else
+	state->_offset += fieldB;
+      if (fieldCisReg)
+	state->ea_reg2 = fieldC;
+      else
+	state->_offset += fieldC;
+      state->_mem_load = 1;
+
+      directMem     = BIT (state->words[0], 5);
+      addrWriteBack = BIT (state->words[0], 3);
+      signExtend    = BIT (state->words[0], 0);
+
+      write_instr_name ();
+      WRITE_FORMAT_x_COMMA_LB(A);
+      if (fieldBisReg || fieldB != 0)
+	WRITE_FORMAT_x_COMMA (B);
+      else
+	fieldB = fieldC;
+
+      WRITE_FORMAT_x_RB (C);
+      arc_sprintf (state, state->operandBuffer, formatString,
+		  fieldA, fieldB, fieldC);
+      write_comments ();
+      break;
+
+    case CLASS_A4_LD1:
+      /* LD instruction.  */
+      CHECK_FIELD_B ();
+      CHECK_FIELD_A ();
+      fieldC = FIELDD (state->words[0]);
+
+      if (dbg)
+	printf ("6:b reg %d %d c 0x%x  \n",
+		fieldBisReg, fieldB, fieldC);
+      state->_ea_present = 1;
+      state->_offset = fieldC;
+      state->_mem_load = 1;
+      if (fieldBisReg)
+	state->ea_reg1 = fieldB;
+      /* Field B is either a shimm (same as fieldC) or limm (different!)
+	 Say ea is not present, so only one of us will do the name lookup.  */
+      else
+	state->_offset += fieldB, state->_ea_present = 0;
+
+      directMem     = BIT (state->words[0],14);
+      addrWriteBack = BIT (state->words[0],12);
+      signExtend    = BIT (state->words[0],9);
+
+      write_instr_name ();
+      WRITE_FORMAT_x_COMMA_LB (A);
+      if (!fieldBisReg)
+	{
+	  fieldB = state->_offset;
+	  WRITE_FORMAT_x_RB (B);
+	}
+      else
+	{
+	  WRITE_FORMAT_x (B);
+	  if (fieldC != 0 && !BIT (state->words[0],13))
+	    {
+	      fieldCisReg = 0;
+	      WRITE_FORMAT_COMMA_x_RB (C);
+	    }
+	  else
+	    WRITE_FORMAT_RB ();
+	}
+      arc_sprintf (state, state->operandBuffer, formatString,
+		  fieldA, fieldB, fieldC);
+      write_comments ();
+      break;
+
+    case CLASS_A4_ST:
+      /* ST instruction.  */
+      CHECK_FIELD_B();
+      CHECK_FIELD_C();
+      fieldA = FIELDD(state->words[0]); /* shimm  */
+
+      /* [B,A offset]  */
+      if (dbg) printf("7:b reg %d %x off %x\n",
+		      fieldBisReg,fieldB,fieldA);
+      state->_ea_present = 1;
+      state->_offset = fieldA;
+      if (fieldBisReg)
+	state->ea_reg1 = fieldB;
+      /* Field B is either a shimm (same as fieldA) or limm (different!)
+	 Say ea is not present, so only one of us will do the name lookup.
+	 (for is_limm we do the name translation here).  */
+      else
+	state->_offset += fieldB, state->_ea_present = 0;
+
+      directMem     = BIT (state->words[0], 26);
+      addrWriteBack = BIT (state->words[0], 24);
+
+      write_instr_name ();
+      WRITE_FORMAT_x_COMMA_LB(C);
+
+      if (!fieldBisReg)
+	{
+	  fieldB = state->_offset;
+	  WRITE_FORMAT_x_RB (B);
+	}
+      else
+	{
+	  WRITE_FORMAT_x (B);
+	  if (fieldBisReg && fieldA != 0)
+	    {
+	      fieldAisReg = 0;
+	      WRITE_FORMAT_COMMA_x_RB(A);
+	    }
+	  else
+	    WRITE_FORMAT_RB();
+	}
+      arc_sprintf (state, state->operandBuffer, formatString,
+		  fieldC, fieldB, fieldA);
+      write_comments2 (fieldA);
+      break;
+
+    case CLASS_A4_SR:
+      /* SR instruction  */
+      CHECK_FIELD_B();
+      CHECK_FIELD_C();
+
+      write_instr_name ();
+      WRITE_FORMAT_x_COMMA_LB(C);
+      /* Try to print B as an aux reg if it is not a core reg.  */
+      usesAuxReg = 1;
+      WRITE_FORMAT_x (B);
+      WRITE_FORMAT_RB ();
+      arc_sprintf (state, state->operandBuffer, formatString, fieldC, fieldB);
+      write_comments ();
+      break;
+
+    case CLASS_A4_OP3_SUBOPC3F:
+      write_instr_name ();
+      state->operandBuffer[0] = '\0';
+      break;
+
+    case CLASS_A4_LR:
+      /* LR instruction */
+      CHECK_FIELD_A ();
+      CHECK_FIELD_B ();
+
+      write_instr_name ();
+      WRITE_FORMAT_x_COMMA_LB (A);
+      /* Try to print B as an aux reg if it is not a core reg. */
+      usesAuxReg = 1;
+      WRITE_FORMAT_x (B);
+      WRITE_FORMAT_RB ();
+      arc_sprintf (state, state->operandBuffer, formatString, fieldA, fieldB);
+      write_comments ();
+      break;
+
+    default:
+      mwerror (state, "Bad decoding class in ARC disassembler");
+      break;
+    }
+
+  state->_cond = cond;
+  return state->instructionLen = offset;
+}
+
+
+/* Returns the name the user specified core extension register.  */
+
+static const char *
+_coreRegName(void * arg ATTRIBUTE_UNUSED, int regval)
+{
+  return arcExtMap_coreRegName (regval);
+}
+
+/* Returns the name the user specified AUX extension register.  */
+
+static const char *
+_auxRegName(void *_this ATTRIBUTE_UNUSED, int regval)
+{
+  return arcExtMap_auxRegName(regval);
+}
+
+/* Returns the name the user specified condition code name.  */
+
+static const char *
+_condCodeName(void *_this ATTRIBUTE_UNUSED, int regval)
+{
+  return arcExtMap_condCodeName(regval);
+}
+
+/* Returns the name the user specified extension instruction.  */
+
+static const char *
+_instName (void *_this ATTRIBUTE_UNUSED, int majop, int minop, int *flags)
+{
+  return arcExtMap_instName(majop, minop, flags);
+}
+
+/* Decode an instruction returning the size of the instruction
+   in bytes or zero if unrecognized.  */
+
+static int
+decodeInstr (bfd_vma            address, /* Address of this instruction.  */
+	     disassemble_info * info)
+{
+  int status;
+  bfd_byte buffer[4];
+  struct arcDisState s;		/* ARC Disassembler state.  */
+  void *stream = info->stream; 	/* Output stream.  */
+  fprintf_ftype func = info->fprintf_func;
+  int bytes;
+
+  memset (&s, 0, sizeof(struct arcDisState));
+
+  /* read first instruction  */
+  status = (*info->read_memory_func) (address, buffer, 4, info);
+  if (status != 0)
+    {
+      (*info->memory_error_func) (status, address, info);
+      return 0;
+    }
+  if (info->endian == BFD_ENDIAN_LITTLE)
+    s.words[0] = bfd_getl32(buffer);
+  else
+    s.words[0] = bfd_getb32(buffer);
+  /* Always read second word in case of limm.  */
+
+  /* We ignore the result since last insn may not have a limm.  */
+  status = (*info->read_memory_func) (address + 4, buffer, 4, info);
+  if (info->endian == BFD_ENDIAN_LITTLE)
+    s.words[1] = bfd_getl32(buffer);
+  else
+    s.words[1] = bfd_getb32(buffer);
+
+  s._this = &s;
+  s.coreRegName = _coreRegName;
+  s.auxRegName = _auxRegName;
+  s.condCodeName = _condCodeName;
+  s.instName = _instName;
+
+  /* Disassemble.  */
+  bytes = dsmOneArcInst (address, (void *)& s);
+
+  /* Display the disassembly instruction.  */
+  (*func) (stream, "%08lx ", s.words[0]);
+  (*func) (stream, "    ");
+  (*func) (stream, "%-10s ", s.instrBuffer);
+
+  if (__TRANSLATION_REQUIRED (s))
+    {
+      bfd_vma addr = s.addresses[s.operandBuffer[1] - '0'];
+
+      (*info->print_address_func) ((bfd_vma) addr, info);
+      (*func) (stream, "\n");
+    }
+  else
+    (*func) (stream, "%s",s.operandBuffer);
+
+  return s.instructionLen;
+}
+
+/* Return the print_insn function to use.
+   Side effect: load (possibly empty) extension section  */
+
+disassembler_ftype
+arc_get_disassembler (void *ptr)
+{
+  if (ptr)
+    build_ARC_extmap (ptr);
+  return decodeInstr;
 }
diff --git a/opcodes/arc-ext.c b/opcodes/arc-ext.c
index d2d838e..2bb1bb1 100644
--- a/opcodes/arc-ext.c
+++ b/opcodes/arc-ext.c
@@ -21,16 +21,269 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+
 #include "bfd.h"
 #include "arc-ext.h"
 #include "elf/arc.h"
-
 #include "libiberty.h"
 #include "sysdep.h"
 
-/* extension structure */
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module provides support for extensions to the ARC processor       */
+/*     architecture.                                                          */
+/*                                                                            */
+/******************************************************************************/
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local constants                              */
+/* -------------------------------------------------------------------------- */
+
+#define FIRST_EXTENSION_CORE_REGISTER   32
+#define LAST_EXTENSION_CORE_REGISTER    59
+#define FIRST_EXTENSION_CONDITION_CODE  0x10
+#define LAST_EXTENSION_CONDITION_CODE   0x1f
+
+#define NUM_EXT_CORE      (LAST_EXTENSION_CORE_REGISTER  - FIRST_EXTENSION_CORE_REGISTER  + 1)
+#define NUM_EXT_COND      (LAST_EXTENSION_CONDITION_CODE - FIRST_EXTENSION_CONDITION_CODE + 1)
+#define INST_HASH_BITS    6
+#define INST_HASH_SIZE    (1 << INST_HASH_BITS)
+#define INST_HASH_MASK    (INST_HASH_SIZE - 1)
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local types                                  */
+/* -------------------------------------------------------------------------- */
+
+/* these types define the information stored in the table */
+
+struct ExtInstruction
+{
+  char                   major;
+  char                   minor;
+  char                   flags;
+  char*                  name;
+  struct ExtInstruction* next;
+};
+
+struct ExtAuxRegister
+{
+  long                   address;
+  char*                  name;
+  struct ExtAuxRegister* next;
+};
+
+struct ExtCoreRegister
+{
+  short             number;
+  enum ExtReadWrite rw;
+  char*             name;
+};
+
+struct arcExtMap
+{
+  struct ExtAuxRegister* auxRegisters;
+  struct ExtInstruction* instructions[INST_HASH_SIZE];
+  struct ExtCoreRegister coreRegisters[NUM_EXT_CORE];
+  char*                  condCodes[NUM_EXT_COND];
+};
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+/* extension table */
 static struct arcExtMap arc_extension_map;
 
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+/* a hash function used to map instructions into the table */
+#define INST_HASH(MAJOR, MINOR)    ((((MAJOR) << 3) ^ (MINOR)) & INST_HASH_MASK)
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
+static void create_map(unsigned char *block, unsigned long length)
+{
+  unsigned char *p = block;
+
+//printf("building ext map...\n");
+
+  while (p && p < (block + length))
+    {
+      /* p[0] == length of record
+	 p[1] == type of record
+	 For instructions:
+	   p[2]  = opcode
+	   p[3]  = minor opcode (if opcode == 3)
+	   p[4]  = flags
+	   p[5]+ = name
+	 For core regs and condition codes:
+	   p[2]  = value
+	   p[3]+ = name
+	 For auxiliary regs:
+	   p[2..5] = value
+	   p[6]+   = name
+	     (value is p[2]<<24|p[3]<<16|p[4]<<8|p[5]) */
+
+      /* the sequence of records is temrinated by an "empty" record */
+      if (p[0] == 0)
+	break;
+
+//    printf("%d byte type %d record\n", p[0], p[1]);
+
+      switch (p[1])
+	{ /* type */
+	case EXT_INSTRUCTION:
+	  {
+	    struct ExtInstruction  *insn = XNEW (struct ExtInstruction);
+	    int                     major = p[2];
+	    int                     minor = p[3];
+	    struct ExtInstruction **bucket =
+                   &arc_extension_map.instructions[INST_HASH (major, minor)];
+
+	    insn->name  = xstrdup ((char *) (p+5));
+	    insn->major = major;
+	    insn->minor = minor;
+	    insn->flags = p[4];
+	    insn->next  = *bucket;
+	    *bucket = insn;
+	    break;
+	  }
+
+	case EXT_CORE_REGISTER:
+	  {
+	    unsigned char number = p[2];
+	    char*         name   = (char *) p+3;
+
+	    arc_extension_map.coreRegisters[number - FIRST_EXTENSION_CORE_REGISTER].number = number;
+	    arc_extension_map.coreRegisters[number - FIRST_EXTENSION_CORE_REGISTER].rw     = REG_READWRITE;
+	    arc_extension_map.coreRegisters[number - FIRST_EXTENSION_CORE_REGISTER].name   = xstrdup (name);
+	    break;
+	  }
+
+	case EXT_LONG_CORE_REGISTER:
+	  {
+	    unsigned char     number = p[2];
+	    char*             name   = (char *) p+7;
+	    enum ExtReadWrite rw     = p[6];
+
+	    arc_extension_map.coreRegisters[number - FIRST_EXTENSION_CORE_REGISTER].number = number;
+	    arc_extension_map.coreRegisters[number - FIRST_EXTENSION_CORE_REGISTER].rw     = rw;
+	    arc_extension_map.coreRegisters[number - FIRST_EXTENSION_CORE_REGISTER].name   = xstrdup (name);
+	  }
+
+	case EXT_COND_CODE:
+	  {
+	    char *cc_name = xstrdup ((char *) (p+3));
+
+	    arc_extension_map.condCodes[p[2] - FIRST_EXTENSION_CONDITION_CODE] = cc_name;
+	    break;
+	  }
+
+	case EXT_AUX_REGISTER:
+	  {
+	    /* trickier -- need to store linked list of these */
+	    struct ExtAuxRegister *newAuxRegister = XNEW (struct ExtAuxRegister);
+	    char *aux_name = xstrdup ((char *) (p+6));
+
+	    newAuxRegister->name           = aux_name;
+	    newAuxRegister->address        = p[2]<<24 | p[3]<<16 | p[4]<<8 | p[5];
+	    newAuxRegister->next           = arc_extension_map.auxRegisters;
+	    arc_extension_map.auxRegisters = newAuxRegister;
+	    break;
+	  }
+
+	default:
+//        printf("type %d extension record skipped\n", p[1]);
+	  break;
+	}
+
+      p += p[0]; /* move on to next record */
+    }
+
+//printf("ext map built\n");
+}
+
+
+/* Free memory that has been allocated for the extensions. */
+static void destroy_map(void)
+{
+  struct ExtAuxRegister *r;
+  unsigned int           i;
+
+  /* free auxiliary registers */
+  r = arc_extension_map.auxRegisters;
+  while (r)
+    {
+      /* N.B. after r has been freed, r->next is invalid! */
+      struct ExtAuxRegister* next = r->next;
+
+      free (r->name);
+      free (r);
+      r = next;
+    }
+
+  /*  free instructions */
+  for (i = 0; i < INST_HASH_SIZE; i++)
+    {
+      struct ExtInstruction *insn = arc_extension_map.instructions[i];
+
+      while (insn)
+        {
+          /* N.B. after insn has been freed, insn->next is invalid! */
+          struct ExtInstruction *next = insn->next;
+
+          free (insn->name);
+          free (insn);
+          insn = next;
+        }
+    }
+
+  /* free core registers */
+  for (i = 0; i < NUM_EXT_CORE; i++)
+    {
+      if (arc_extension_map.coreRegisters[i].name)
+        free (arc_extension_map.coreRegisters[i].name);
+    }
+
+  /* free condition codes */
+  for (i = 0; i < NUM_EXT_COND; i++)
+    {
+      if (arc_extension_map.condCodes[i])
+        free (arc_extension_map.condCodes[i]);
+    }
+
+  memset (&arc_extension_map, 0, sizeof (arc_extension_map));
+}
+
+
+static const char* ExtReadWrite_image(enum ExtReadWrite val)
+{
+    switch (val)
+    {
+        case REG_INVALID  : return "INVALID";
+        case REG_READ     : return "RO";
+        case REG_WRITE    : return "WO";
+        case REG_READWRITE: return "R/W";
+        default           : return "???";
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
 /* Get the name of an extension instruction.  */
 
 const char *
@@ -119,237 +372,126 @@
   while (temp)
     {
       if ((temp->major == opcode) && (temp->minor == minor))
-	{
-	  *flags = temp->flags;
-	  return temp->name;
-	}
+        {
+          *flags = temp->flags;
+          return temp->name;
+        }
       temp = temp->next;
     }
 
   return NULL;
 }
 
+
 /* get the name of an extension core register */
 const char *
-arcExtMap_coreRegName (int value)
+arcExtMap_coreRegName (int regnum)
 {
-  if (value < 32)
-    return 0;
-  return arc_extension_map.coreRegisters[value-32].name;
+  if (regnum < FIRST_EXTENSION_CORE_REGISTER || regnum > LAST_EXTENSION_CONDITION_CODE)
+    return NULL;
+  return arc_extension_map.coreRegisters[regnum - FIRST_EXTENSION_CORE_REGISTER].name;
 }
 
+
+/* get the access mode of an extension core register */
 enum ExtReadWrite
-arcExtMap_coreReadWrite (int value)
+arcExtMap_coreReadWrite (int regnum)
 {
-  if (value < 32)
+  if (regnum < FIRST_EXTENSION_CORE_REGISTER || regnum > LAST_EXTENSION_CONDITION_CODE)
     return REG_INVALID;
-  return arc_extension_map.coreRegisters[value-32].rw;
+  return arc_extension_map.coreRegisters[regnum - FIRST_EXTENSION_CORE_REGISTER].rw;
 }
 
-#if 0
-struct ExtAuxRegister *
-arc_ExtMap_auxRegs ()
-{
-  return arc_extension_map.auxRegisters;
-}
-#endif
 
-/* Get the name of an extension condition code.  */
+/* get the name of an extension condition code */
 const char *
-arcExtMap_condCodeName (int value)
+arcExtMap_condCodeName (int code)
 {
-  if (value < 16)
-    return 0;
-  return arc_extension_map.condCodes[value-16];
+  if (code < FIRST_EXTENSION_CONDITION_CODE || code > LAST_EXTENSION_CONDITION_CODE)
+    return NULL;
+  return arc_extension_map.condCodes[code - FIRST_EXTENSION_CONDITION_CODE];
 }
 
-/* Get the name of an extension aux register.  */
 
+/* Get the name of an extension auxiliary register.  */
 const char *
 arcExtMap_auxRegName (long address)
 {
-  /* Walk the list of aux reg names and find the name.  */
+  /* Walk the list of auxiliary register names and find the name.  */
   struct ExtAuxRegister *r;
 
   for (r = arc_extension_map.auxRegisters; r; r = r->next)
     {
       if (r->address == address)
-	return (const char *)r->name;
+        return (const char *)r->name;
     }
-  return 0;
+  return NULL;
 }
 
-#if 0
-/* Recursively free auxilliary register strcture pointers until
-   the list is empty.  */
-static void
-clean_aux_registers (struct ExtAuxRegister *r)
-{
-  if (r -> next)
-    {
-      clean_aux_registers (r->next);
-      free (r->name);
-      free (r->next);
-      r->next = NULL;
-    }
-  else
-    free (r->name);
-}
-
-/* Free memory that has been allocated for the extensions. */
-
-static void
-cleanup_ext_map (void)
-{
-  struct ExtAuxRegister *r;
-  struct ExtInstruction *insn;
-  int i;
-
-  /* Clean aux reg structure.  */
-  r = arc_extension_map.auxRegisters;
-  if (r)
-    {
-      (clean_aux_registers (r));
-      free (r);
-    }
-
-  /* Clean instructions.  */
-  for (i = INST_HASH_SIZE - 1; i >= 0; i--)
-    {
-      for (insn = arc_extension_map.instructions[i]; insn ; insn = insn->next)
-	{
-	  free (insn->name);
-	  free (insn);
-	}
-    }
-
-  /* Clean core reg struct.  */
-  for (i = 0; i < NUM_EXT_CORE; i++)
-    {
-      if (arc_extension_map.coreRegisters[i].name)
-	free (arc_extension_map.coreRegisters[i].name);
-    }
-
-  for (i = 0; i < NUM_EXT_COND; i++) {
-    if (arc_extension_map.condCodes[i])
-      free (arc_extension_map.condCodes[i]);
-  }
-
-  memset (&arc_extension_map, 0, sizeof (struct arcExtMap));
-}
-#endif
-
-int
-arcExtMap_add (void *base, unsigned long length)
-{
-  unsigned char *block = base;
-  unsigned char *p = block;
-
-  while (p && p < (block + length))
-    {
-      /* p[0] == length of record
-	 p[1] == type of record
-	 For instructions:
-	   p[2]  = opcode
-	   p[3]  = minor opcode (if opcode == 3)
-	   p[4]  = flags
-	   p[5]+ = name
-	 For core regs and condition codes:
-	   p[2]  = value
-	   p[3]+ = name
-	 For aux regs:
-	   p[2..5] = value
-	   p[6]+   = name
-	     (value is p[2]<<24|p[3]<<16|p[4]<<8|p[5]) */
-      if (p[0] == 0)
-	return -1;
-
-      switch (p[1])
-	{ /* type */
-	case EXT_INSTRUCTION:
-	  {
-	    char *insn_name = xstrdup ((char *) (p+5));
-	    struct ExtInstruction *insn = XNEW (struct ExtInstruction);
-	    int major = p[2];
-	    int minor = p[3];
-	    struct ExtInstruction **bucket
-	      = &arc_extension_map.instructions[INST_HASH (major, minor)];
-
-	    insn->name  = insn_name;
-	    insn->major = major;
-	    insn->minor = minor;
-	    insn->flags = p[4];
-	    insn->next  = *bucket;
-	    *bucket = insn;
-	    break;
-	  }
-	case EXT_CORE_REGISTER:
-	  {
-	    unsigned char number = p[2];
-	    char *name = (char *) p+3;
-
-	    arc_extension_map.coreRegisters[number-32].number = number;
-	    arc_extension_map.coreRegisters[number-32].rw = REG_READWRITE;
-	    arc_extension_map.coreRegisters[number-32].name = xstrdup (name);
-	    break;
-	  }
-	case EXT_LONG_CORE_REGISTER:
-	  {
-	    unsigned char number = p[2];
-	    char *name = (char *) p+7;
-	    enum ExtReadWrite rw = p[6];
-
-	    arc_extension_map.coreRegisters[number-32].number = number;
-	    arc_extension_map.coreRegisters[number-32].rw = rw;
-	    arc_extension_map.coreRegisters[number-32].name = xstrdup (name);
-	  }
-	case EXT_COND_CODE:
-	  {
-	    char *cc_name = xstrdup ((char *) (p+3));
-
-	    arc_extension_map.condCodes[p[2]-16] = cc_name;
-	    break;
-	  }
-	case EXT_AUX_REGISTER:
-	  {
-	    /* trickier -- need to store linked list to these */
-	    struct ExtAuxRegister *newAuxRegister
-	      = XNEW (struct ExtAuxRegister);
-	    char *aux_name = xstrdup ((char *) (p+6));
-
-	    newAuxRegister->name = aux_name;
-	    newAuxRegister->address = p[2]<<24 | p[3]<<16 | p[4]<<8  | p[5];
-	    newAuxRegister->next = arc_extension_map.auxRegisters;
-	    arc_extension_map.auxRegisters = newAuxRegister;
-	    break;
-	  }
-	default:
-	  return -1;
-	}
-      p += p[0]; /* move to next record */
-    }
-  return 0;
-}
 
 /* Load extensions described in .arcextmap and .gnu.linkonce.arcextmap.* ELF
    section.  */
 void
 build_ARC_extmap (bfd *text_bfd)
 {
-  char *arcExtMap;
-  bfd_size_type count;
-  asection *p;
+  asection *sect;
 
-  for (p = text_bfd->sections; p != NULL; p = p->next)
-    if (!strncmp (p->name,
-		  ".gnu.linkonce.arcextmap.",
-		  sizeof (".gnu.linkonce.arcextmap.")-1)
-	|| !strcmp (p->name,".arcextmap"))
+  /* the map is built each time gdb loads an executable file - so free any
+   * existing map, as the map defined by the new file may differ from the old
+   */
+  destroy_map();
+
+  for (sect = text_bfd->sections; sect != NULL; sect = sect->next)
+    if (!strncmp (sect->name,
+                  ".gnu.linkonce.arcextmap.",
+          sizeof (".gnu.linkonce.arcextmap.") - 1)
+        || !strcmp (sect->name,".arcextmap"))
       {
-        count = bfd_get_section_size (p);
-        arcExtMap = (char *) xmalloc (count);
-        if (bfd_get_section_contents (text_bfd, p, (PTR) arcExtMap, 0, count))
-	  arcExtMap_add ((PTR) arcExtMap, count);
-        free ((PTR) arcExtMap);
+        bfd_size_type  count  = bfd_get_section_size (sect);
+        unsigned char* buffer = xmalloc (count);
+
+        if (buffer)
+          {
+            if (bfd_get_section_contents (text_bfd, sect, buffer, 0, count))
+              create_map(buffer, count);
+            free (buffer);
+          }
       }
 }
+
+
+void dump_ARC_extmap (void)
+{
+    struct ExtAuxRegister* r;
+    int                    i;
+
+    r = arc_extension_map.auxRegisters;
+
+    while (r)
+    {
+        printf("AUX : %s %ld\n", r->name, r->address);
+        r = r->next;
+    }
+
+    for (i = 0; i < INST_HASH_SIZE; i++)
+    {
+        struct ExtInstruction *insn;
+
+        for (insn = arc_extension_map.instructions[i]; insn != NULL; insn = insn->next)
+            printf("INST: %d %d %x %s\n", insn->major, insn->minor, insn->flags, insn->name);
+    }
+
+    for (i = 0; i < NUM_EXT_CORE; i++)
+    {
+        struct ExtCoreRegister reg = arc_extension_map.coreRegisters[i];
+
+        if (reg.name)
+            printf("CORE: %s %d %s\n", reg.name, reg.number, ExtReadWrite_image(reg.rw));
+    }
+
+    for (i = 0; i < NUM_EXT_COND; i++)
+        if (arc_extension_map.condCodes[i])
+            printf("COND: %s\n", arc_extension_map.condCodes[i]);
+}
+
+/******************************************************************************/
diff --git a/opcodes/arc-ext.h b/opcodes/arc-ext.h
index 1143490..6f202bd 100644
--- a/opcodes/arc-ext.h
+++ b/opcodes/arc-ext.h
@@ -18,84 +18,74 @@
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-#ifndef ARCEXT_H
-#define ARCEXT_H
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines a table of extensions to the ARC processor    */
+/*     architecture.  These extensions are read from the '.arcextmap' or      */
+/*     '.gnu.linkonce.arcextmap.<type>.<N>' sections in the ELF file which is */
+/*     identified by the bfd parameter to the build_ARC_extmap function.      */
+/*                                                                            */
+/*     These extensions may include:                                          */
+/*         core registers                                                     */
+/*         auxiliary registers                                                */
+/*         instructions                                                       */
+/*         condition codes                                                    */
+/*                                                                            */
+/*     Once the table has been constructed, accessor functions may be used to */
+/*     retrieve information from it.                                          */
+/*                                                                            */
+/*     The build_ARC_extmap constructor function build_ARC_extmap may be      */
+/*     called as many times as required; it will re-initialize the table each */
+/*     time.                                                                  */
+/*                                                                            */
+/******************************************************************************/
 
+#ifndef ARC_EXTENSIONS_H
+#define ARC_EXTENSIONS_H
 
-enum { INST_HASH_BITS = 6 };
-enum {NUM_EXT_CORE = 59-32+1};
-enum {NUM_EXT_COND = 0x1f-0x10+1};
-
-enum { INST_HASH_SIZE = 1 << INST_HASH_BITS };
-#define INST_HASH(MAJOR,MINOR) \
-  ((((MAJOR) << 3) ^ (MINOR)) & ((INST_HASH_SIZE) - 1))
-
-enum ExtOperType
-  {
-    EXT_INSTRUCTION,
-    EXT_CORE_REGISTER,
-    EXT_AUX_REGISTER,
-    EXT_COND_CODE,
-    EXT_AC_INSTRUCTION,
-    EXT_LONG_CORE_REGISTER = 0x06
-  };
+#define IGNORE_FIRST_OPD 1
 
 /* Define this if we do not want to encode instructions based on the
    ARCompact Programmer's Reference.  */
 #define UNMANGLED
 
-struct ExtInstruction
+
+/* this defines the kinds of extensions which may be read from the sections in
+ * the executable files
+ */
+enum ExtOperType
 {
-  char major;
-  char minor;
-  char flags;
-  char *name;
-  struct ExtInstruction *next;
+  EXT_INSTRUCTION,
+  EXT_CORE_REGISTER,
+  EXT_AUX_REGISTER,
+  EXT_COND_CODE,
+  EXT_AC_INSTRUCTION,
+  EXT_LONG_CORE_REGISTER = 0x06
 };
 
-struct ExtAuxRegister
-{
-  long address;
-  char *name;
-  struct ExtAuxRegister *next;
-};
 
 enum ExtReadWrite
-  {
-    REG_INVALID,
-    REG_READ,
-    REG_WRITE,
-    REG_READWRITE
-  };
-
-struct ExtCoreRegister
 {
-  short number;
-  enum ExtReadWrite rw;
-  char *name;
+  REG_INVALID,
+  REG_READ,
+  REG_WRITE,
+  REG_READWRITE
 };
 
-struct arcExtMap
-{
-  struct ExtAuxRegister *auxRegisters;
-  struct ExtInstruction *instructions[INST_HASH_SIZE];
-  struct ExtCoreRegister coreRegisters[NUM_EXT_CORE];
-  char *condCodes[NUM_EXT_COND];
-};
 
-extern int arcExtMap_add(void*, unsigned long);
-extern enum ExtReadWrite arcExtMap_coreReadWrite (int);
-extern const char *arcExtMap_coreRegName(int);
-extern const char *arcExtMap_auxRegName(long);
-extern const char *arcExtMap_condCodeName(int);
-extern const char *arcExtMap_instName(int, int, int*);
+/* constructor function */
+extern void build_ARC_extmap (bfd* text_bfd);
 
-/* Ravi:
-   warning: implicit declaration of function `build_ARC_extmap'
-*/
-extern void build_ARC_extmap (bfd *);
+/* accessor functions */
+extern enum ExtReadWrite arcExtMap_coreReadWrite (int  regnum);
+extern const char*       arcExtMap_coreRegName   (int  regnum);
+extern const char*       arcExtMap_auxRegName    (long regnum);
+extern const char*       arcExtMap_condCodeName  (int  code);
+extern const char*       arcExtMap_instName      (int  opcode, int insn, int* flags);
 
+/* dump function (for debugging) */
+extern void dump_ARC_extmap (void);
 
-#define IGNORE_FIRST_OPD 1
-
-#endif /* __arcExtMap_h__ */
+#endif /* ARC_EXTENSIONS_H */
+/******************************************************************************/
diff --git a/opcodes/arc-opc.c b/opcodes/arc-opc.c
index d64ebbe..67304b2 100644
--- a/opcodes/arc-opc.c
+++ b/opcodes/arc-opc.c
@@ -2,23 +2,23 @@
 
 THIS FILE IS MACHINE GENERATED WITH CGEN.
 
-Copyright 1996-2007 Free Software Foundation, Inc.
+Copyright 1996-2005 Free Software Foundation, Inc.
 
 This file is part of the GNU Binutils and/or GDB, the GNU debugger.
 
-   This file is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+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.
 
-   It 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.
+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.,
-   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+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.,
+51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 
 */
 
diff --git a/opcodes/arcompact-dis.c b/opcodes/arcompact-dis.c
index 545eecb..485be8b 100644
--- a/opcodes/arcompact-dis.c
+++ b/opcodes/arcompact-dis.c
@@ -1,5 +1,5 @@
 /* Instruction printing code for the ARC.
-   Copyright (C) 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1994, 1995, 1997, 1998, 2009 Free Software Foundation, Inc.
    Contributed by Doug Evans (dje@cygnus.com).
 
    Sources derived from work done by Sankhya Technologies (www.sankhya.com)
@@ -9,41 +9,45 @@
    Ramana Radhakrishnan(ramana.radhakrishnan@codito.com)
 
 
-   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 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.
+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., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+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 <ansidecl.h>
-#include "dis-asm.h"
-#include "opcode/arc.h"
-#include "elf-bfd.h"
-#include "elf/arc.h"
-#include <string.h>
 
 #include <ctype.h>
 #include <stdarg.h>
-#include "arc-dis.h"
+#include <ansidecl.h>
+#include <string.h>
+
+#include "dis-asm.h"
+#include "opcode/arc.h"
 #include "arc-ext.h"
+#include "arc-dis.h"
+#include "arcompact-dis.h"
+#include "elf-bfd.h"
+#include "elf/arc.h"
+
+
+/* Prototypes */
+static bfd_vma bfd_getm32 (unsigned int data);
+/*static bfd_vma bfd_getm32_ac (unsigned int data); UNUSED*/
 
   /*
+    Ravi:
     warning: implicit declaration of function `printf_unfiltered'
     if dbg is 1 then this definition is required
   */
   void printf_unfiltered (const char *,...);
-static bfd_vma bfd_getm32 (unsigned int);
-static bfd_vma bfd_getm32_ac (unsigned int) ATTRIBUTE_UNUSED;
-struct arcDisState arcAnalyzeInstr (bfd_vma, disassemble_info*);
 
 
 #ifndef dbg
@@ -70,28 +74,28 @@
 
 #define BIT(word,n)       ((word) & (1 << n))
 #define BITS(word,s,e)    (((word) << (31-e)) >> (s+(31-e)))
-#define OPCODE(word)      (BITS ((word), 27, 31))
-#define FIELDA(word)      (BITS ((word), 0, 5))
-#define FIELDb(word)      (BITS ((word), 24, 26))
-#define FIELDB(word)      (BITS ((word), 12, 14))
-#define FIELDC(word)      (BITS ((word), 6, 11))
-#define OPCODE_AC(word)   (BITS ((word), 11, 15))
-#define FIELDA_AC(word)   (BITS ((word), 0, 2))
-#define FIELDB_AC(word)   (BITS ((word), 8, 10))
-#define FIELDC_AC(word)   (BITS ((word), 5, 7))
-#define FIELDU_AC(word)   (BITS ((word), 0, 4))
+#define OPCODE(word)      (BITS((word),27,31))
+#define FIELDA(word)      (BITS((word),0,5))
+#define FIELDb(word)      (BITS((word),24,26))
+#define FIELDB(word)      (BITS((word),12,14))
+#define FIELDC(word)      (BITS((word),6,11))
+#define OPCODE_AC(word)   (BITS((word),11,15))
+#define FIELDA_AC(word)   (BITS((word),0,2))
+#define FIELDB_AC(word)   (BITS((word),8,10))
+#define FIELDC_AC(word)   (BITS((word),5,7))
+#define FIELDU_AC(word)   (BITS((word),0,4))
 
 /*
  * FIELDS_AC is the 11-bit signed immediate value used for
  * GP-relative instructions.
  */
-#define FIELDS_AC(word)   (BITS (((signed int) word), 0, 8))
+#define FIELDS_AC(word)   (BITS(((signed int)word),0,8))
 
 /*
  * FIELDD is signed in all of its uses, so we make sure argument is
  * treated as signed for bit shifting purposes.
  */
-#define FIELDD(word)      (BITS (((signed int) word), 16, 23))
+#define FIELDD(word)      (BITS(((signed int)word),16,23))
 
 /*
  * FIELDD9 is the 9-bit signed immediate value used for
@@ -184,14 +188,6 @@
 	  fieldCisReg = 0; 			\
 	}					\
 	}
-/********** Aurora SIMD ARC 8 - bit constant **********/
-#define FIELD_U8() {                            \
-                                                \
-          fieldC  = BITS(state->words[0],15,16);\
-          fieldC  = fieldC <<6;                 \
-          fieldC |= FIELDC(state->words[0]);    \
-          fieldCisReg = 0;                      \
-        }
 
 #define CHECK_FIELD_B() {			\
 	fieldB = (FIELDB(state->words[0]) << 3);\
@@ -250,9 +246,6 @@
 
 #define IS_SMALL(x) (((field##x) < 256) && ((field##x) > -257))
 #define IS_REG(x)   (field##x##isReg)
-#define IS_SIMD_128_REG(x)  (usesSimdReg##x == 1)
-#define IS_SIMD_16_REG(x)   (usesSimdReg##x == 2)
-#define IS_SIMD_DATA_REG(x) (usesSimdReg##x == 3)
 #define WRITE_FORMAT_LB_Rx_RB(x)     WRITE_FORMAT(x,"[","]","","")
 #define WRITE_FORMAT_x_COMMA_LB(x)   WRITE_FORMAT(x,"",",[","",",[")
 #define WRITE_FORMAT_COMMA_x_RB(x)   WRITE_FORMAT(x,",","]",",","]")
@@ -260,13 +253,10 @@
 #define WRITE_FORMAT_COMMA_x(x)      WRITE_FORMAT(x,",","",",","")
 #define WRITE_FORMAT_x_COMMA(x)      WRITE_FORMAT(x,"",",","",",")
 #define WRITE_FORMAT_x(x)            WRITE_FORMAT(x,"","","","")
-#define WRITE_FORMAT(x,cb1,ca1,cb,ca) strcat(formatString,              \
-                                     (IS_SIMD_128_REG(x) ? cb1"%S"ca1:  \
-                                      IS_SIMD_16_REG(x)  ? cb1"%I"ca1:  \
-                                      IS_SIMD_DATA_REG(x)? cb1"%D"ca1:  \
-                                      IS_REG(x)          ? cb1"%r"ca1:  \
-                                      usesAuxReg         ?  cb"%a"ca :  \
-                                      IS_SMALL(x) ? cb"%d"ca : cb"%h"ca))
+#define WRITE_FORMAT(x,cb1,ca1,cb,ca) strcat(formatString,		\
+				     (IS_REG(x) ? cb1"%r"ca1 :		\
+				      usesAuxReg ? cb"%a"ca :		\
+				      IS_SMALL(x) ? cb"%d"ca : cb"%h"ca))
 
 #define WRITE_FORMAT_LB() strcat(formatString, "[")
 #define WRITE_FORMAT_RB() strcat(formatString, "]")
@@ -280,7 +270,6 @@
 #define add_target(x) 	(state->targets[state->tcnt++] = (x))
 
 static char comment_prefix[] = "\t; ";
-short int enable_simd = 0;
 
 static const char *
 core_reg_name(struct arcDisState *state, int val)
@@ -325,8 +314,8 @@
 post_address(struct arcDisState *state, int addr)
 {
   static char id[3*_NELEM(state->addresses)];
-  unsigned int j, i = state->acnt;
-  if (i < _NELEM(state->addresses)) {
+  int j, i = state->acnt;
+  if ((unsigned)i < _NELEM(state->addresses)) {
     state->addresses[i] = addr;
     ++state->acnt;
     j = i*3;
@@ -456,11 +445,14 @@
 	  {
 	  /* Aux Register. */
 	    int val = va_arg(ap,int);
+// The arc_aux_reg_name fucntion does not appear to exist anywwhere!
+#if 0
 	    char *ret;
 	    ret = arc_aux_reg_name(val);
 	    if(ret)
 	      sprintf(bp,"%s",ret);
 	    else
+#endif
 	      {
 		const char *ext;
 		  ext = aux_reg_name(state, val);
@@ -473,45 +465,18 @@
 	  break;
 	case 's':
 	  {
-	    sprintf(bp,"%s",va_arg(ap,char*));
-	    inc_bp();
+	    sprintf (bp,"%s", va_arg (ap, char *));
+	    inc_bp ();
 	  }
 	  break;
 	case '*':
 	  {
-	    va_arg(ap,char*);
-	    inc_bp();
-	    break;
-	  }
-
-	  /* SIMD operands follow*/
-	case 'S':
-	  {
-	    int val = va_arg (ap,int);
-
-	    sprintf (bp, "vr%d",val);
+	    (void) va_arg (ap, char *);
 	    inc_bp ();
 	    break;
 	  }
-	case 'I':
-	  {
-	    int val = va_arg (ap,int);
-
-	    sprintf (bp, "i%d",val);
-	    inc_bp ();
-	    break;
-	  }
-	case 'D':
-	  {
-	    int val = va_arg (ap,int);
-
-	    sprintf (bp, "dr%d",val);
-	    inc_bp ();
-	    break;
-	  }
-	  /* SIMD operands end */
 	default:
-	  fprintf(stderr,"?? format %c\n",p[-1]);
+	  fprintf (stderr, "?? format %c\n", p[-1]);
 	  break;
 	}
     }
@@ -579,7 +544,8 @@
     }
   if (flag) strcat(state->instrBuffer, ".f");
   if (state->nullifyMode)
-    strcat(state->instrBuffer, ".d");
+    if (strstr(state->instrBuffer, ".d") == NULL)
+       strcat(state->instrBuffer, ".d");
   if (signExtend)    strcat(state->instrBuffer, ".x");
   switch (addrWriteBack)
   {
@@ -591,14 +557,14 @@
 }
 
 #define write_instr_name()	{\
-  write_instr_name_(state, instrName,cond, condCodeIsPartOfName, flag, signExtend, addrWriteBack, directMem); \
+  write_instr_name_(state, instrName, cond, condCodeIsPartOfName, flag, signExtend, addrWriteBack, directMem); \
  formatString[0] = '\0'; \
 }
 
 enum
 {
   op_BC = 0, op_BLC = 1, op_LD  = 2, op_ST = 3, op_MAJOR_4  = 4,
-  op_MAJOR_5 = 5, op_SIMD=6,      op_LD_ADD = 12, op_ADD_SUB_SHIFT  = 13,
+  op_MAJOR_5 = 5, op_LD_ADD = 12, op_ADD_SUB_SHIFT  = 13,
   op_ADD_MOV_CMP = 14, op_S = 15, op_LD_S = 16, op_LDB_S = 17,
   op_LDW_S = 18, op_LDWX_S  = 19, op_ST_S = 20, op_STB_S = 21,
   op_STW_S = 22, op_Su5     = 23, op_SP   = 24, op_GP    = 25, op_Pcl = 26,
@@ -611,6 +577,9 @@
  * bfd_getm32 - To retrieve the upper 16-bits of the ARCtangent-A5
  *              basecase (32-bit) instruction
  */
+
+
+
 static bfd_vma
 bfd_getm32 (data)
      unsigned int data;
@@ -626,6 +595,7 @@
  * bfd_getm32_ac - To retrieve the upper 8-bits of the ARCompact
  *                 16-bit instruction
  */
+/*	UNUSED
 static bfd_vma
 bfd_getm32_ac (data)
      unsigned int data;
@@ -635,7 +605,7 @@
    value = ((data & 0xff) << 8 | (data & 0xff00) >> 8);
    return value;
 }
-
+*/
 /*
  * sign_extend - Sign Extend the value
  *
@@ -675,8 +645,7 @@
   int is_linked=0;
   int offset=0;
   int usesAuxReg = 0;
-  int usesSimdRegA= 0, usesSimdRegB=0, usesSimdRegC=0,simd_scale_u8=-1;
-  int flags = !E_ARC_MACH_A4;
+  int flags;
   char formatString[60];
 
   state->nullifyMode = BR_exec_when_no_jump;
@@ -690,6 +659,8 @@
   state->_offset = 0;
   state->_addrWriteBack = 0;
 
+  state->sourceType = ARC_UNDEFINED;
+
   state->instructionLen = info->bytes_per_line;
 
   /* ARCtangent-A5 basecase instruction and little-endian mode */
@@ -733,7 +704,7 @@
    */
 
   switch (state->_opcode)
-    {
+  {
     case op_BC:
     /* Branch Conditionally */
       instrName = "b";
@@ -813,50 +784,37 @@
       decodingClass = 0;  /* Default for 3 operand instructions */
       subopcode = BITS(state->words[0],16,21);
       switch (subopcode)
-        {
-	case 0: instrName = "add";  break;
-	case 1: instrName = "adc";  break;
-	case 2: instrName = "sub";  break;
-	case 3: instrName = "sbc";  break;
-	case 4: instrName = "and";  break;
-	case 5: instrName = "or";   break;
-	case 6: instrName = "bic";  break;
-	case 7: instrName = "xor";  break;
-	case 8: instrName = "max";  break;
-	case 9: instrName = "min";  break;
-	case 10:
-	  {
-	    if(state->words[0] == 0x264a7000)
-	      {
-		instrName = "nop";
-		decodingClass = 26;
-	      }
-	    else
-	      {
-		instrName = "mov";
-		decodingClass = 12;
-	      }
-	    break;
-	  }
-	case 11: instrName = "tst"; decodingClass = 2; break;
-	case 12: instrName = "cmp"; decodingClass = 2; break;
-	case 13: instrName = "rcmp"; decodingClass = 2; break;
-	case 14: instrName = "rsub"; break;
-	case 15: instrName = "bset"; break;
-	case 16: instrName = "bclr"; break;
-	case 17: instrName = "btst"; decodingClass = 2; break;
-	case 18: instrName = "bxor"; break;
-	case 19: instrName = "bmsk"; break;
-	case 20: instrName = "add1"; break;
-	case 21: instrName = "add2"; break;
-	case 22: instrName = "add3"; break;
-	case 23: instrName = "sub1"; break;
-	case 24: instrName = "sub2"; break;
-	case 25: instrName = "sub3"; break;
-	case 26: instrName = "mpylo"; break;
-	case 27: instrName = "mpyhi"; break;
-	case 28: instrName = "mpyhiu";break;
-	case 29: instrName = "mpylou";break;
+      {
+        case 0: instrName = "add";  break;
+        case 1: instrName = "adc";  break;
+        case 2: instrName = "sub";  break;
+        case 3: instrName = "sbc";  break;
+        case 4: instrName = "and";  break;
+        case 5: instrName = "or";   break;
+        case 6: instrName = "bic";  break;
+        case 7: instrName = "xor";  break;
+      case 8: instrName = "max";  break;
+      case 9: instrName = "min";  break;
+      case 10: instrName = "mov"; decodingClass = 12; break;
+      case 11: instrName = "tst"; decodingClass = 2; break;
+      case 12: instrName = "cmp"; decodingClass = 2; break;
+      case 13: instrName = "rcmp"; decodingClass = 2; break;
+      case 14: instrName = "rsub"; break;
+      case 15: instrName = "bset"; break;
+      case 16: instrName = "bclr"; break;
+      case 17: instrName = "btst"; decodingClass = 2; break;
+      case 18: instrName = "bxor"; break;
+      case 19: instrName = "bmsk"; break;
+      case 20: instrName = "add1"; break;
+      case 21: instrName = "add2"; break;
+      case 22: instrName = "add3"; break;
+      case 23: instrName = "sub1"; break;
+      case 24: instrName = "sub2"; break;
+      case 25: instrName = "sub3"; break;
+      case 26: instrName = "mpylo"; break;
+      case 27: instrName = "mpyhi"; break;
+      case 28: instrName = "mpyhiu";break;
+      case 29: instrName = "mpylou";break;
         case 32:
         case 33:
 	  instrName = "j";
@@ -917,11 +875,6 @@
 		break;
 	      case 4 : instrName = "rtie" ; break;
 	      case 5 : instrName = "brk"; break;
-	      default:
-
-		instrName = "???";
-		state->flow=invalid_instr;
-		break;
 	      }
 	    break;
 	  }
@@ -983,10 +936,6 @@
 
 
 	  case 8: instrName = "normw"; decodingClass = 1; break;
-	  default:
-	    instrName = "???";
-	    state->flow =invalid_instr;
-	    break;
 
 	  }
 	break;
@@ -997,981 +946,6 @@
       }
     break;
 
-
-    /* Aurora SIMD instruction support*/
-  case op_SIMD:
-
-    if (enable_simd)
-      {
-	decodingClass = 42;
-	subopcode     = BITS(state->words[0], 17, 23);
-
-	switch (subopcode)
-	  {
-
-	  case 68:
-	    instrName = "vld32";
-	    decodingClass = 37;
-	    usesSimdRegA=1;
-	    usesSimdRegB=2;
-	    usesSimdRegC=0;
-	    simd_scale_u8 = 2;
-	    break;
-
-	  case 72:
-	    instrName = "vld64";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 3;
-	    break;
-
-	  case 74:
-	    instrName = "vld64w";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 3;
-	    break;
-
-	  case 70:
-	    instrName = "vld32wl";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 2;
-	    break;
-
-	  case 66:
-	    instrName = "vld32wh";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 2;
-	    break;
-
-	  case 76:
-	    instrName = "vld128";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 4;
-	    break;
-
-	  case 78:
-	    {
-	      short  sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vld128r";
-		  decodingClass = 38;
-		  usesSimdRegA  = 1;
-		  usesSimdRegB  = usesSimdRegC = 0;
-		  break;
-		default:
-		  instrName = "SIMD";
-		  state->flow = invalid_instr;
-		}
-	    }
-	    break;
-	  case 71:
-	    instrName = "vst16_0";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 81:
-	    instrName = "vst16_1";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 67:
-	    instrName = "vst16_2";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 75:
-	    instrName = "vst16_3";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 83:
-	    instrName = "vst16_4";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 89:
-	    instrName = "vst16_5";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 91:
-	    instrName = "vst16_6";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 93:
-	    instrName = "vst16_7";
-	    decodingClass = 37;
-	    usesSimdRegA = 1;
-	    usesSimdRegB = 2;
-	    usesSimdRegC = 0;
-	    simd_scale_u8 = 1;
-	    break;
-
-	  case 69:
-	    instrName = "vst32_0";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 2;
-	    break;
-
-	  case 82:
-	    instrName = "vst32_2";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 2;
-	    break;
-
-	  case 86:
-	    instrName = "vst32_4";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 2;
-	    break;
-
-	  case 88:
-	    instrName = "vst32_6";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 2;
-	    break;
-
-	  case 73:
-	    instrName = "vst64";
-	    decodingClass = 37 ;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 3;
-	    break;
-
-	  case 77:
-	    instrName = "vst128";
-	    decodingClass = 37;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = 2;
-	    usesSimdRegC  = 0;
-	    simd_scale_u8 = 4;
-	    break;
-
-	  case 79:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vst128r";
-		  decodingClass = 38;
-		  usesSimdRegA = 1;
-		  usesSimdRegB = usesSimdRegC = 0;
-		  break;
-
-		default:
-		  instrName = "SIMD";
-		  state->flow = invalid_instr;
-		}
-
-	    }
-	    break;
-	  case 80:
-	    instrName = "vmvw";
-	    usesSimdRegA = usesSimdRegB = 1;
-	    usesSimdRegC = 0;
-	    decodingClass = 39;
-	    break;
-
-	  case 84:
-	    instrName = "vmvzw";
-	    decodingClass = 39;
-	    usesSimdRegA = usesSimdRegB = 1;
-	    usesSimdRegC = 0;
-	    break;
-
-	  case 90:
-	    instrName = "vmovw";
-	    decodingClass = 39;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = usesSimdRegC = 0;
-	    break;
-
-	  case 94:
-	    instrName = "vmovzw";
-	    decodingClass = 39;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = usesSimdRegC = 0;
-	    break;
-
-	  case 85:
-	    instrName = "vmvaw";
-	    decodingClass = 39;
-	    usesSimdRegA  = usesSimdRegB = 1;
-	    usesSimdRegC  = 0;
-	    break;
-
-	  case 95:
-	    instrName = "vmovaw";
-	    decodingClass = 39;
-	    usesSimdRegA  = 1;
-	    usesSimdRegB  = usesSimdRegC = 0;
-	    break;
-
-	  case 10:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vaddw"; decodingClass = 42;
-		  usesSimdRegA = usesSimdRegB = usesSimdRegC =1;
-		  break;
-
-		case 1:
-		  instrName = "vaddaw"; decodingClass = 42;
-		  usesSimdRegA = usesSimdRegB = usesSimdRegC =1;
-		  break;
-
-		case 2:
-		  instrName = "vbaddw"; decodingClass = 42;
-		  usesSimdRegA = usesSimdRegB = 1;
-		  usesSimdRegC = 0;
-		  break;
-		}
-	      break;
-	    }
-
-	  case 11:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vsubw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-		case 1:
-		  instrName = "vsubaw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-		case 2:
-		  instrName = "vbsubw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		}
-	    }
-	    break;
-
-	  case 12:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vmulw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-		case 1:
-		  instrName = "vmulaw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-		case 2:
-		  instrName = "vbmulw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-
-		case 3:
-		  instrName = "vbmulaw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		}
-	    }
-	    break;
-
-	  case 13:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vmulfw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-		case 1:
-		  instrName = "vmulfaw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-		case 2:
-		  instrName = "vbmulfw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		}
-	    }
-	    break;
-
-	  case 15:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vsummw";
-		  decodingClass = 42;
-		  usesSimdRegA = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-		case 2:
-		  instrName = "vbrsubw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		}
-	    }
-	    break;
-
-	  case 23:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vmr7w";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-		case 1:
-		  instrName = "vmr7aw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-
-
-		case 2:
-		  switch (BITS(state->words[0], 0, 5))
-		    {
-		    case 0:
-		      instrName = "vaddsuw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 1:
-		      instrName = "vabsw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 2:
-		      instrName = "vsignw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 3:
-		      instrName = "vupbw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 4:
-		      instrName = "vexch1";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 5:
-		      instrName = "vexch2";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 6:
-		      instrName = "vexch4";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 7:
-		      instrName = "vupsbw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 8:
-		      instrName = "vdirun";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = usesSimdRegA = 0;
-		      break;
-
-		    case 9:
-		      instrName = "vdorun";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = usesSimdRegA = 0;
-		      break;
-
-		    case 10:
-		      instrName = "vdiwr";
-		      decodingClass = 40;
-		      usesSimdRegB  = 3;
-		      usesSimdRegA  = usesSimdRegC = 0;
-		      fieldCisReg   = 1;
-		      break;
-
-		    case 11:
-		      instrName = "vdowr";
-		      decodingClass = 40;
-		      usesSimdRegB  = 3;
-		      usesSimdRegA  = usesSimdRegC = 0;
-		      fieldCisReg   = 1;
-		      break;
-
-		    case 12:
-		      instrName = "vdird";
-		      decodingClass = 40;
-		      usesSimdRegB  = 1;
-		      usesSimdRegC  = 3;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 13:
-		      instrName = "vdord";
-		      decodingClass = 40;
-		      usesSimdRegB  = 1;
-		      usesSimdRegC  = 3;
-		      usesSimdRegA  = 0;
-		      break;
-
-		    case 63:
-		      {
-			switch (BITS(state->words[0], 24, 25))
-			  {
-			  case 0:
-			    instrName = "vrec";
-			    decodingClass = 43;
-			    usesSimdRegC  = 0;
-			    usesSimdRegB  = usesSimdRegA = 0;
-			    break;
-
-			  case 1:
-			    instrName = "vrecrun";
-			    decodingClass = 43;
-			    usesSimdRegC  = 0;
-			    usesSimdRegA  = usesSimdRegB = 0;
-			    break;
-
-			  case 2:
-			    instrName = "vrun";
-			    decodingClass = 43;
-			    usesSimdRegC  = 0;
-			    usesSimdRegB  = usesSimdRegA = 0;
-			    break;
-
-			  case 3:
-			    instrName = "vendrec";
-			    decodingClass = 43;
-			    usesSimdRegC  = 0;
-			    usesSimdRegB  = usesSimdRegA = 0;
-			    break;
-			  }
-		      }
-		      break;
-		    }
-		  break;
-
-		case 3:
-		  switch (BITS(state->words[0], 0, 2))
-		    {
-		    case 1:
-		      instrName = "vabsaw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-		    case 3:
-		      instrName = "vupbaw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-		    case 7:
-		      instrName = "vupsbaw";
-		      decodingClass = 40;
-		      usesSimdRegC  = usesSimdRegB = 1;
-		      usesSimdRegA  = 0;
-		      break;
-		    }
-		  break;
-		}
-	    }
-	    break;
-
-	  case 16:
-	    instrName = "vasrw";
-	    decodingClass = 42;
-	    usesSimdRegA  = usesSimdRegB = 1;
-	    usesSimdRegC  = 2;
-	    break;
-
-	  case 48:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vasrwi";
-		  decodingClass = 41;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		case 2:
-		  instrName = "vasrrwi";
-		  decodingClass = 41;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		}
-	    }
-	    break;
-
-	  case 59:
-	    instrName = "vasrsrwi";
-	    decodingClass = 41;
-	    usesSimdRegA  = usesSimdRegB = 1;
-	    usesSimdRegC  = 0;
-	    break;
-
-	  case 18:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vmaxw";
-		  usesSimdRegC = 1;
-		  break;
-		case 1:
-		  instrName = "vmaxaw";
-		  usesSimdRegC = 1;
-		  break;
-		case 2:
-		  instrName = "vbmaxw";
-		  usesSimdRegC = 0;
-		  break;
-		}
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = 1;
-	      break;
-	    }
-
-	  case 19:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vminw";
-		  usesSimdRegC = 1;
-		  break;
-		case 1:
-		  instrName = "vminaw";
-		  usesSimdRegC = 0;
-		  break;
-		case 2:
-		  instrName = "vbminw";
-		  usesSimdRegC = 0;
-		  break;
-		}
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = 1;
-	      break;
-	    }
-
-	  case 14:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vdifw";
-		  break;
-		case 1:
-		  instrName = "vdifaw";
-		  break;
-		case 2:
-		  instrName = "vmrb";
-		  break;
-		}
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	      break;
-	    }
-
-	  case 24:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vand";
-		  decodingClass = 42;
-		  usesSimdRegA = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-		case 1:
-		  instrName = "vandaw";
-		  decodingClass = 42;
-		  usesSimdRegA = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-		}
-	      break;
-	    }
-
-	  case 25:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vor";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-		  break;
-		}
-	      break;
-	    }
-
-	  case 26:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vxor";
-		  break;
-		case 1:
-		  instrName = "vxoraw";
-		  break;
-		}
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	      break;
-	    }
-
-	  case 27:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vbic";
-		  break;
-		case 1:
-		  instrName = "vbicaw";
-		  break;
-		}
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	      break;
-	    }
-
-	  case 4:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vavb";
-		  break;
-		case 2:
-		  instrName = "vavrb";
-		  break;
-		}
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	      break;
-	    }
-
-	  case 28:
-	    instrName = "veqw";
-	    decodingClass = 42;
-	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	    break;
-
-	  case 29:
-	    instrName = "vnew";
-	    decodingClass = 42;
-	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	    break;
-
-	  case 30:
-	    instrName = "vlew";
-	    decodingClass = 42;
-	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	    break;
-
-	  case 31:
-	    instrName = "vltw";
-	    decodingClass = 42;
-	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	    break;
-
-	  case 49:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vasrpwbi";
-		  decodingClass = 41;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		case 2:
-		  instrName = "vasrrpwbi";
-		  decodingClass = 41;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		}
-	      break;
-	    }
-
-	  case 5:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vsr8";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 2;
-		  break;
-
-		case 1:
-		  instrName = "vsr8aw";
-		  decodingClass = 42;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 2;
-		  break;
-		}
-	      break;
-	    }
-
-	  case 37:
-	    {
-	      short sub_subopcode = BITS(state->words[0], 15, 16);
-	      switch (sub_subopcode)
-		{
-		case 0:
-		  instrName = "vsr8i";
-		  decodingClass = 41;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-
-		case 1:
-		  instrName = "vsr8awi";
-		  decodingClass = 41;
-		  usesSimdRegA  = usesSimdRegB = 1;
-		  usesSimdRegC  = 0;
-		  break;
-		}
-	      break;
-	    }
-
-	  case 20:
-	  case 21:
-	  case 22:
-	    {
-	      short subopcode2 = BITS(state->words[0], 15, 18);
-	      switch (subopcode2)
-		{
-		case 0:
-		  instrName = "vmr1w";
-		  break;
-
-		case 2:
-		  instrName = "vmr2w";
-		  break;
-
-		case 4:
-		  instrName = "vmr3w";
-		  break;
-
-		case 6:
-		  instrName = "vmr4w";
-		  break;
-
-		case 8:
-		  instrName = "vmr5w";
-		  break;
-
-		case 10:
-		  instrName = "vmr6w";
-		  break;
-
-		case 1:
-		  instrName = "vmr1aw";
-		  break;
-
-		case 3:
-		  instrName = "vmr2aw";
-		  break;
-
-		case 5:
-		  instrName = "vmr3aw";
-		  break;
-
-		case 7:
-		  instrName = "vmr4aw";
-		  break;
-
-		case 9:
-		  instrName = "vmr5aw";
-		  break;
-
-		case 11:
-		  instrName = "vmr6aw";
-		  break;
-
-		}
-
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	      break;
-	    }
-
-
-	  case 7:
-	  case 6:
-	    {
-	      switch (BITS(state->words[0], 16, 19))
-		{
-		case 15:
-		  instrName = "vh264ft";
-		  break;
-		case 14:
-		  instrName = "vh264f";
-		  break;
-		case 13:
-		  instrName = "vvc1ft";
-		  break;
-		case 12:
-		  instrName = "vvc1f";
-		  break;
-		}
-	      decodingClass = 42;
-	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
-	      break;
-
-	    }
-
-	  case 92:
-	    instrName = "vd6tapf";
-	    decodingClass = 39;
-	    usesSimdRegA  = usesSimdRegB = 1;
-	    usesSimdRegC  = 0;
-	    break;
-
-	  case 55:
-	    instrName = "vinti";
-	    decodingClass = 43;
-	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 0;
-	    break;
-
-	  default:
-	    instrName = "SIMD";
-	    state->flow = invalid_instr;
-	    break;
-	  }
-      }
-    else
-      {
-	instrName = "???_SIMD";
-	state->flow = invalid_instr;
-      }
-	break;
-
-
     case op_LD_ADD:
     /* Load/Add resister-register */
       decodingClass = 15;  /* default for Major opcode 12 ... */
@@ -2039,9 +1013,6 @@
           	     state->isBranch = 1;
 		     state->nullifyMode = BR_exec_always;
 		     break;
-            case 6 : instrName = "sub_s.ne";
-	             decodingClass = 35;
-	             break;
             case 7 :
 	      decodingClass = 26;
               switch(BITS(state->words[0],8,10))
@@ -2049,7 +1020,7 @@
               	case 0 : instrName = "nop_s"; break;
 
 		  /* Unimplemented instruction reserved in ARC700 */
-	        case 1: instrName = "unimp_s";break;
+	        case 1: instrName = "unimp";break;
 
 
 	        case 4: instrName = "jeq_s [blink]";
@@ -2115,7 +1086,7 @@
       }
       break;
 
-       case op_LD_S:
+    case op_LD_S:
     /* ARCompact 16-bit Load with offset, Major Opcode 0x10 */
       instrName = "ld_s";
       decodingClass = 28;
@@ -2274,76 +1245,14 @@
       break;
 
     default:
-      instrName = instruction_name (state, state->_opcode, 0, &flags);
-      if (!instrName)
-	{
-	  instrName = "???";
-	  state->flow=invalid_instr;
-	}
+      instrName = instruction_name(state,state->_opcode,0,&flags);
+      if (!instrName) instrName = "???", state->flow=invalid_instr;
       break;
   }
 
-  /* Maybe we should be checking for extension instructions over here
-   * instead of all over this crazy switch case. */
-  if (state->flow == invalid_instr)
-    {
-      if (!((state->_opcode == op_SIMD) && enable_simd))
-	instrName = instruction_name(state,state->_opcode,
-				     state->words[0],
-				     &flags);
-
-      if (state->instructionLen == 2)
-	{
-	  switch (flags)
-	    {
-	    case AC_SYNTAX_3OP:
-	      decodingClass = 22;
-	      break;
-	    case AC_SYNTAX_2OP:
-	      decodingClass = 14;
-	      break;
-	    case AC_SYNTAX_1OP:
-	      decodingClass = 36;
-	      break;
-	    case AC_SYNTAX_NOP:
-	      decodingClass = 26;
-	      break;
-	    default:
-	      mwerror(state, "Invalid syntax class\n");
-	    }
-	}
-      else
-	{
-/* Must do the above for this one too */
-	  switch (flags)
-	    {
-	    case AC_SYNTAX_3OP:
-	      decodingClass = 0;
-	      break;
-	    case AC_SYNTAX_2OP:
-	      decodingClass = 1;
-	      break;
-	    case AC_SYNTAX_1OP:
-	      decodingClass = 32;
-	      break;
-	    case AC_SYNTAX_NOP:
-	      break;
-	    case AC_SYNTAX_SIMD:
-	      break;
-	    default:
-	      mwerror(state, "Invalid syntax class\n");
-	    }
-	}
-
-      if (!instrName)
-	{
-	  instrName = "???";
-	  state->flow=invalid_instr;
-	}
-    }
-
   fieldAisReg = fieldBisReg = fieldCisReg = 1; /* assume regs for now */
   flag = cond = is_shimm = is_limm = 0;
+  //state->nullifyMode = BR_exec_when_no_jump;	/* 0 */
   signExtend = addrWriteBack = directMem = 0;
   usesAuxReg = 0;
 
@@ -2669,10 +1578,7 @@
       state->_mem_load = 1;
 
       directMem     = BIT(state->words[0],15);
-      /* Check if address writeback is allowed before decoding the
-	 address writeback field of a load instruction.*/
-      if (fieldBisReg && (fieldB != 62))
-        addrWriteBack = BITS(state->words[0],22,23);
+      addrWriteBack = BITS(state->words[0],22,23);
       signExtend    = BIT(state->words[0],16);
 
       write_instr_name();
@@ -2723,10 +1629,7 @@
       else state->_offset += fieldB, state->_ea_present = 0;
 
       directMem     = BIT(state->words[0],11);
-      /* Check if address writeback is allowed before decoding the
-	 address writeback field of a load instruction.*/
-      if (fieldBisReg && (fieldB != 62))
-        addrWriteBack = BITS(state->words[0],9,10);
+      addrWriteBack = BITS(state->words[0],9,10);
       signExtend    = BIT(state->words[0],6);
 
       write_instr_name();
@@ -2753,12 +1656,12 @@
 
     case 7:
       /* ST instruction. */
-      CHECK_FIELD_B ();
-      CHECK_FIELD_C ();
+      CHECK_FIELD_B();
+      CHECK_FIELD_C();
       state->source_operand.registerNum = fieldC;
-      state->sourceType = fieldCisReg ? ARC_REGISTER : ARC_LIMM;
-      fieldA  = FIELDD9 (state->words[0]); /* shimm */
-      fieldAisReg = 0;
+      state->sourceType = fieldCisReg? ARC_REGISTER : ARC_LIMM ;
+      fieldA  = FIELDD9(state->words[0]); /* shimm */
+      fieldAisReg=0;
 
       /* [B,A offset] */
       if (dbg) printf_unfiltered("7:b reg %d %x off %x\n",
@@ -2774,11 +1677,11 @@
       else
 	state->_offset += fieldB, state->_ea_present = 0;
 
-      directMem     = BIT (state->words[0], 5);
-      addrWriteBack = BITS (state->words[0], 3, 4);
+      directMem     = BIT(state->words[0],5);
+      addrWriteBack = BITS(state->words[0],3,4);
       state->_addrWriteBack = addrWriteBack;
-      write_instr_name ();
-      WRITE_FORMAT_x_COMMA_LB (C);
+      write_instr_name();
+      WRITE_FORMAT_x_COMMA_LB(C);
       if (fieldA == 0)
       {
         WRITE_FORMAT_x_RB(B);
@@ -3299,14 +2202,13 @@
 
       FIELD_B_AC();
       fieldC = (BITS(state->words[0],0,6)) << 1;
-      fieldC = sign_extend (fieldC, 8);
-
       fieldC += (addr & ~0x3);
       fieldA = fieldAisReg = fieldCisReg = 0;
 
       write_instr_name();
       /* This address could be a label we know.  Convert it. */
       add_target(fieldC); /* For debugger. */
+      state->flow = direct_jump;
 
       WRITE_FORMAT_x(B);
       WRITE_FORMAT_COMMA_x(A);
@@ -3328,11 +2230,14 @@
 
       /* j_s instruction */
 
-      FIELD_B_AC ();
+      FIELD_B_AC();
+
+      /*printf("OPCODES: j_s.d");*/
       state->register_for_indirect_jump = fieldB;
-      write_instr_name ();
-      strcat (formatString,"[%r]");
-      my_sprintf (state, state->operandBuffer, formatString, fieldB);
+
+      write_instr_name();
+      strcat(formatString,"[%r]");
+      my_sprintf(state, state->operandBuffer, formatString, fieldB);
       break;
 
     case 28:
@@ -3485,6 +2390,8 @@
     if (fieldCisReg)
       state->ea_reg1 = fieldC;
 
+
+
     write_instr_name();
     WRITE_FORMAT_x_COMMA_LB(B);
 
@@ -3495,133 +2402,11 @@
     write_comments();
     break;
 
-  case 35:
-
-    /* sub_s.ne instruction */
-
-    FIELD_B_AC();
-    write_instr_name();
-    strcat(formatString,"%r,%r,%r");
-    my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldB, fieldB);
     break;
-
-  case 36:
-
-    FIELD_B_AC();
-
-    write_instr_name();
-
-    WRITE_FORMAT_x(B);
-    WRITE_NOP_COMMENT();
-    my_sprintf(state, state->operandBuffer, formatString, fieldB);
-
-    break;
-    /*******SIMD instructions decoding follows*************/
-  case 37:
-  case 39:
-  case 41:
-    /*fieldA is vr register
-      fieldB is I register
-      fieldC is a constant
-      %*,[%(,%<]
-      or
-      %*,%(,%<
-      or
-      %*,%(,%u
-    */
-
-    CHECK_FIELD_A();
-
-    CHECK_FIELD_B();
-    if (decodingClass == 41)
-       {
-	 FIELD_C();
-       }
-    else
-      {
-	FIELD_U8();
-
-	if (simd_scale_u8>0)
-	  fieldC = fieldC << simd_scale_u8;
-      }
-
-    fieldCisReg = 0;
-
-    write_instr_name();
-    (decodingClass == 37 ? WRITE_FORMAT_x_COMMA_LB(A) :
-                           WRITE_FORMAT_x_COMMA(A));
-    WRITE_FORMAT_x_COMMA(B);
-    (decodingClass == 37 ?  WRITE_FORMAT_x_RB(C):
-                            WRITE_FORMAT_x(C));
-    WRITE_NOP_COMMENT();
-    my_sprintf(state,state->operandBuffer, formatString, fieldA, fieldB, fieldC);
-
-
-    break;
-  case 38:
-    /* fieldA is a vr register
-       fieldB is a ARC700 basecase register.
-       %*,[%b]
-    */
-    CHECK_FIELD_A();
-    CHECK_FIELD_B();
-
-    write_instr_name();
-    WRITE_FORMAT_x_COMMA_LB(A);
-    WRITE_FORMAT_x_RB(B);
-    WRITE_NOP_COMMENT();
-    my_sprintf(state,state->operandBuffer, formatString, fieldA, fieldB);
-
-    break;
-  case 40:
-    /* fieldB & fieldC are vr registers
-       %(,%)
-       or
-       %B,%C
-       or
-       %(,%C
-    */
-    CHECK_FIELD_B();
-    CHECK_FIELD_C();
-
-    write_instr_name();
-    WRITE_FORMAT_x(B);
-    WRITE_FORMAT_COMMA_x(C);
-    my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
-    break;
-
-  case 42:
-    /* fieldA, fieldB, fieldC are all vr registers
-       %*, %(, %) */
-    CHECK_FIELD_A();
-    CHECK_FIELD_B();
-    FIELD_C();
-
-    write_instr_name();
-    WRITE_FORMAT_x(A);
-    WRITE_FORMAT_COMMA_x(B);
-    WRITE_FORMAT_COMMA_x(C);
-    my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
-    break;
-
-  case 43:
-    /* Only fieldC is a register
-     %C*/
-    CHECK_FIELD_C();
-
-    if (BITS(state->words[0], 17, 23) == 55)
-      fieldCisReg = 0;
-
-    write_instr_name();
-    WRITE_FORMAT_x(C);
-    my_sprintf(state, state->operandBuffer, formatString, fieldC);
-    break;
-
-    /***************SIMD decoding ends*********************/
-  default:
-    mwerror(state, "Bad decoding class in ARC disassembler");
-    break;
-  }
+    default:
+      mwerror(state, "Bad decoding class in ARC disassembler");
+      break;
+    }
 
   state->_cond = cond;
   return state->instructionLen = offset;
@@ -3632,11 +2417,14 @@
  * _coreRegName - Returns the name the user specified core extension
  *                register.
  */
+
+
+
 static const char *
 _coreRegName
 (
- void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
- int v                         /* Register value */
+ ATTRIBUTE_UNUSED void *_this,                /* C++ this pointer */
+ int v                       /* Register value */
  )
 {
   return arcExtMap_coreRegName(v);
@@ -3648,8 +2436,8 @@
  */
 static const char *
 _auxRegName
-( void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
-  int v                         /* Register value */
+( ATTRIBUTE_UNUSED void *_this,                /* C++ this pointer */
+  int v                       /* Register value */
   )
 {
   return arcExtMap_auxRegName(v);
@@ -3663,8 +2451,8 @@
 static const char *
 _condCodeName
 (
- void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
- int v                         /* Register value */
+ ATTRIBUTE_UNUSED void *_this,                /* C++ this pointer */
+ int v                       /* Register value */
  )
 {
   return arcExtMap_condCodeName(v);
@@ -3677,22 +2465,145 @@
 static const char *
 _instName
 (
- void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
- int op1,                      /* major opcode value */
- int op2,                      /* minor opcode value */
- int *flags                    /* instruction flags */
+ ATTRIBUTE_UNUSED void *_this,                /* C++ this pointer */
+ int op1,                    /* major opcode value */
+ int op2,                    /* minor opcode value */
+ int *flags                  /* instruction flags */
  )
 {
   return arcExtMap_instName(op1, op2, flags);
 }
 
-static void
-parse_disassembler_options (char *options)
+
+/*
+ * decodeInstr - Decode an instruction returning the size of the
+ *		instruction in bytes or zero if unrecognized.
+ */
+static int
+decodeInstr
+(
+ bfd_vma address,		/* Address of this instruction */
+ disassemble_info* info
+ )
 {
-  if (!strncasecmp (options, "simd",4))
+  int status;
+  bfd_byte buffer[4];
+  struct arcDisState s;	/* ARC Disassembler state */
+  void *stream = info->stream; /* output stream */
+  fprintf_ftype func = info->fprintf_func;
+  int bytes;
+  int lowbyte, highbyte;
+  char buf[256];
+
+  lowbyte = ((info->endian == BFD_ENDIAN_LITTLE) ? 1 : 0);
+  highbyte = ((info->endian == BFD_ENDIAN_LITTLE) ? 0 : 1);
+
+  memset(&s, 0, sizeof(struct arcDisState));
+
+  /* read first instruction */
+  status = (*info->read_memory_func) (address, buffer, 2, info);
+
+  if (status != 0)
     {
-      enable_simd = 1;
+      (*info->memory_error_func) (status, address, info);
+      return -1;
     }
+
+  if ((buffer[lowbyte] & 0xf8) > 0x38)
+  {
+    info->bytes_per_line = 2;
+    s.words[0] = (buffer[lowbyte] << 8) | buffer[highbyte];
+    status = (*info->read_memory_func) (address + 2, buffer, 4, info);
+    if (info->endian == BFD_ENDIAN_LITTLE)
+      s.words[1] = bfd_getl32(buffer);
+    else
+      s.words[1] = bfd_getb32(buffer);
+  }
+  else
+  {
+    info->bytes_per_line = 4;
+    status = (*info->read_memory_func) (address + 2, &buffer[2], 2, info);
+    if (status != 0)
+    {
+      (*info->memory_error_func) (status, address + 2, info);
+      return -1;
+    }
+    if (info->endian == BFD_ENDIAN_LITTLE)
+      s.words[0] = bfd_getl32(buffer);
+    else
+      s.words[0] = bfd_getb32(buffer);
+
+    /* always read second word in case of limm */
+    /* we ignore the result since last insn may not have a limm */
+    status = (*info->read_memory_func) (address + 4, buffer, 4, info);
+    if (info->endian == BFD_ENDIAN_LITTLE)
+      s.words[1] = bfd_getl32(buffer);
+    else
+      s.words[1] = bfd_getb32(buffer);
+  }
+
+  s._this = &s;
+  s.coreRegName = _coreRegName;
+  s.auxRegName = _auxRegName;
+  s.condCodeName = _condCodeName;
+  s.instName = _instName;
+
+  /* disassemble */
+  bytes = dsmOneArcInst(address, (void *)&s, info);
+
+  /* display the disassembled instruction */
+
+  {
+    char* instr   = s.instrBuffer;
+    char* operand = s.operandBuffer;
+    char* space   = strchr(instr, ' ');
+ 
+    if (s.instructionLen == 2)
+      (*func) (stream, "    %04x ", (unsigned int) s.words[0]);
+    else
+      (*func) (stream, "%08x ", (unsigned int) s.words[0]);
+
+    (*func) (stream, "    ");
+
+    /* if the operand is actually in the instruction buffer */
+    if ((space != NULL) && (operand[0] == '\0'))
+      {
+          *space  = '\0';
+          operand = space + 1;
+      }
+
+    if (__TRANSLATION_REQUIRED(s))
+      {
+        bfd_vma addr;
+        int i = 1;
+
+        (*func) (stream, "%-10s ", instr);
+
+        if (operand[0] != '@')
+        {
+          char *tmpBuffer;
+	  /* Branch instruction with 3 operands, Translation is required
+             only for the third operand. Print the first 2 operands */
+          strcpy(buf, operand);
+	  tmpBuffer = strtok(buf,"@");
+          (*func) (stream, "%s", tmpBuffer);
+	  i = strlen(tmpBuffer) + 1;
+        }
+
+        addr = s.addresses[operand[i] - '0'];
+        (*info->print_address_func) ((bfd_vma) addr, info);
+      }
+    else
+      {
+        if (operand[0] == '\0')
+          (*func) (stream, "%s", instr);
+        else
+          (*func) (stream, "%-10s %s", instr, operand);
+      }
+  }
+
+  return s.instructionLen;
+
 }
 
 /*
@@ -3711,12 +2622,16 @@
   int status;
   bfd_byte buffer[4];
   struct arcDisState s;	/* ARC Disassembler state */
+  /* void *stream = info->stream; - unused and hence commented  output stream */
+  /*  fprintf_ftype func = info->fprintf_func; - unused hence commented out */
+  int bytes;
   int lowbyte, highbyte;
+  /*char buf[256]; - unused hence commented out*/
 
   lowbyte = ((info->endian == BFD_ENDIAN_LITTLE) ? 1 : 0);
   highbyte = ((info->endian == BFD_ENDIAN_LITTLE) ? 0 : 1);
 
-  memset (&s, 0, sizeof (struct arcDisState));
+  memset(&s, 0, sizeof(struct arcDisState));
 
   /* read first instruction */
   status = (*info->read_memory_func) (address, buffer, 2, info);
@@ -3729,38 +2644,38 @@
     }
 
   if ((buffer[lowbyte] & 0xf8) > 0x38)
-    {
-      info->bytes_per_line = 2;
-      s.words[0] = (buffer[lowbyte] << 8) | buffer[highbyte];
-      status = (*info->read_memory_func) (address + 2, buffer, 4, info);
-      if (info->endian == BFD_ENDIAN_LITTLE)
-	s.words[1] = bfd_getl32 (buffer);
-      else
-	s.words[1] = bfd_getb32 (buffer);
-    }
+  {
+    info->bytes_per_line = 2;
+    s.words[0] = (buffer[lowbyte] << 8) | buffer[highbyte];
+    status = (*info->read_memory_func) (address + 2, buffer, 4, info);
+    if (info->endian == BFD_ENDIAN_LITTLE)
+      s.words[1] = bfd_getl32(buffer);
+    else
+      s.words[1] = bfd_getb32(buffer);
+  }
   else
+  {
+    info->bytes_per_line = 4;
+    status = (*info->read_memory_func) (address + 2, &buffer[2], 2, info);
+    if (status != 0)
     {
-      info->bytes_per_line = 4;
-      status = (*info->read_memory_func) (address + 2, &buffer[2], 2, info);
-      if (status != 0)
-	{
-	  (*info->memory_error_func) (status, address + 2, info);
-	  s.instructionLen = -1;
-	  return s;
-	}
-      if (info->endian == BFD_ENDIAN_LITTLE)
-	s.words[0] = bfd_getl32(buffer);
-      else
-	s.words[0] = bfd_getb32(buffer);
-
-      /* Always read second word in case of limm.  */
-      /* We ignore the result since the last insn may not have a limm.  */
-      status = (*info->read_memory_func) (address + 4, buffer, 4, info);
-      if (info->endian == BFD_ENDIAN_LITTLE)
-	s.words[1] = bfd_getl32(buffer);
-      else
-	s.words[1] = bfd_getb32(buffer);
+      (*info->memory_error_func) (status, address + 2, info);
+      s.instructionLen = -1;
+      return s;
     }
+    if (info->endian == BFD_ENDIAN_LITTLE)
+      s.words[0] = bfd_getl32(buffer);
+    else
+      s.words[0] = bfd_getb32(buffer);
+
+    /* always read second word in case of limm */
+    /* we ignore the result since last insn may not have a limm */
+    status = (*info->read_memory_func) (address + 4, buffer, 4, info);
+    if (info->endian == BFD_ENDIAN_LITTLE)
+      s.words[1] = bfd_getl32(buffer);
+    else
+      s.words[1] = bfd_getb32(buffer);
+  }
 
   s._this = &s;
   s.coreRegName = _coreRegName;
@@ -3769,65 +2684,20 @@
   s.instName = _instName;
 
   /* disassemble */
-  dsmOneArcInst (address, (void *)&s, info);
+  bytes = dsmOneArcInst(address, (void *)&s, info);
 
   return s;
 }
 
-/* ARCompact_decodeInstr - Decode an ARCompact instruction returning the
-   size of the instruction in bytes or zero if unrecognized.  */
-int
-ARCompact_decodeInstr (address, info)
-     bfd_vma address; /* Address of this instruction.  */
-     disassemble_info* info;
+
+/* Return the print_insn function to use.  */
+
+/* Side effect:                            */
+/* load (possibly empty) extension section */
+
+disassembler_ftype
+arcompact_get_disassembler (void *ptr)
 {
-  void *stream = info->stream; /* output stream */
-  fprintf_ftype func = info->fprintf_func;
-  char buf[256];
-
-  if (info->disassembler_options)
-    {
-      parse_disassembler_options (info->disassembler_options);
-
-      /* To avoid repeated parsing of these options, we remove them here.  */
-      info->disassembler_options = NULL;
-    }
-
-  s = arcAnalyzeInstr (address, info);
-
-  if (!s.this)
-    return -1;
-
-  /* display the disassembly instruction */
-
-  if (s.instructionLen == 2)
-    (*func) (stream, "        ");
-
-  (*func) (stream, "%08x ", s.words[0]);
-  (*func) (stream, "    ");
-
-  (*func) (stream, "%-10s ", s.instrBuffer);
-
-  if (__TRANSLATION_REQUIRED(s))
-    {
-      bfd_vma addr;
-      char *tmpBuffer;
-      int i = 1;
-      if (s.operandBuffer[0] != '@')
-	{
-	  /* Branch instruction with 3 operands, Translation is required
-	     only for the third operand. Print the first 2 operands */
-	  strcpy (buf, s.operandBuffer);
-	  tmpBuffer = strtok (buf,"@");
-	  (*func) (stream, "%s",tmpBuffer);
-	  i = strlen (tmpBuffer)+1;
-	}
-      addr = s.addresses[s.operandBuffer[i] - '0'];
-      (*info->print_address_func) ((bfd_vma) addr, info);
-      (*func) (stream, "\n");
-    }
-  else
-    (*func) (stream, "%s",s.operandBuffer);
-  return s.instructionLen;
-
+  build_ARC_extmap(ptr);
+  return decodeInstr;
 }
diff --git a/opcodes/arcompact-dis.h b/opcodes/arcompact-dis.h
new file mode 100644
index 0000000..f96cb71
--- /dev/null
+++ b/opcodes/arcompact-dis.h
@@ -0,0 +1,34 @@
+/* Disassembler structures definitions for the ARC.
+   Copyright 2009
+   Free Software Foundation, Inc.
+
+   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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef ARCOMPACT_DIS_H
+#define ARCOMPACT_DIS_H
+
+
+void print_arc_disassembler_options (FILE *stream);
+
+disassembler_ftype arcompact_get_disassembler (void *);
+
+struct arcDisState
+arcAnalyzeInstr(bfd_vma           address,
+                disassemble_info* info);
+
+int ARCompact_decodeInstr (bfd_vma address, disassemble_info* info);
+
+
+#endif /* ARCOMPACT_DIS_H */
diff --git a/opcodes/configure b/opcodes/configure
index 90c95b9..8029156 100755
--- a/opcodes/configure
+++ b/opcodes/configure
@@ -1,81 +1,35 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59.
+# Generated by GNU Autoconf 2.61.
 #
-# Copyright (C) 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -96,124 +50,466 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
   fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
+  case $as_dir in
 	 /*)
-	   if ("$as_dir/$as_base" -c '
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
+  chmod +x "$as_me.lineno" ||
     { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -222,7 +518,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -231,15 +548,6 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 
 
 # Check that we are running under the correct shell.
@@ -390,29 +698,26 @@
 
 
 
+exec 7<&0 </dev/null 6>&1
+
 # Name of the host.
 # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
-exec 6>&1
-
 #
 # Initializations.
 #
 ac_default_prefix=/usr/local
+ac_clean_files=
 ac_config_libobj_dir=.
+LIBOBJS=
 cross_compiling=no
 subdirs=
 MFLAGS=
 MAKEFLAGS=
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
 # Identity of this package.
 PACKAGE_NAME=
 PACKAGE_TARNAME=
@@ -424,42 +729,189 @@
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
-#if HAVE_SYS_TYPES_H
+#ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
-#if HAVE_SYS_STAT_H
+#ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #endif
-#if STDC_HEADERS
+#ifdef STDC_HEADERS
 # include <stdlib.h>
 # include <stddef.h>
 #else
-# if HAVE_STDLIB_H
+# ifdef HAVE_STDLIB_H
 #  include <stdlib.h>
 # endif
 #endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
 #  include <memory.h>
 # endif
 # include <string.h>
 #endif
-#if HAVE_STRINGS_H
+#ifdef HAVE_STRINGS_H
 # include <strings.h>
 #endif
-#if HAVE_INTTYPES_H
+#ifdef HAVE_INTTYPES_H
 # include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
 #endif
-#if HAVE_UNISTD_H
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE AR ac_ct_AR RANLIB ac_ct_RANLIB LIBTOOL SED EGREP FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM LN_S lt_ECHO CPP WARN_CFLAGS NO_WERROR MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT INSTALL_LIBBFD_TRUE INSTALL_LIBBFD_FALSE host_noncanonical target_noncanonical bfdlibdir bfdincludedir USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT MKINSTALLDIRS MSGFMT MSGMERGE CC_FOR_BUILD EXEEXT_FOR_BUILD HDEFINES CGEN_MAINT_TRUE CGEN_MAINT_FALSE cgendir SHARED_LDFLAGS SHARED_LIBADD SHARED_DEPENDENCIES archdefs BFD_MACHINES LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+target
+target_cpu
+target_vendor
+target_os
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+AR
+RANLIB
+LIBTOOL
+SED
+GREP
+EGREP
+FGREP
+LD
+DUMPBIN
+ac_ct_DUMPBIN
+NM
+LN_S
+lt_ECHO
+CPP
+WARN_CFLAGS
+NO_WERROR
+MAINTAINER_MODE_TRUE
+MAINTAINER_MODE_FALSE
+MAINT
+INSTALL_LIBBFD_TRUE
+INSTALL_LIBBFD_FALSE
+host_noncanonical
+target_noncanonical
+bfdlibdir
+bfdincludedir
+USE_NLS
+LIBINTL
+LIBINTL_DEP
+INCINTL
+XGETTEXT
+GMSGFMT
+POSUB
+CATALOGS
+DATADIRNAME
+INSTOBJEXT
+GENCAT
+CATOBJEXT
+MKINSTALLDIRS
+MSGFMT
+MSGMERGE
+CC_FOR_BUILD
+EXEEXT_FOR_BUILD
+HDEFINES
+CGEN_MAINT_TRUE
+CGEN_MAINT_FALSE
+cgendir
+SHARED_LDFLAGS
+SHARED_LIBADD
+SHARED_DEPENDENCIES
+archdefs
+BFD_MACHINES
+LIBOBJS
+LTLIBOBJS'
 ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -486,34 +938,48 @@
 # and all the variables that are supposed to be based on exec_prefix
 # by default will actually change.
 # Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
 
 ac_prev=
+ac_dashdash=
 for ac_option
 do
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
+    eval $ac_prev=\$ac_option
     ac_prev=
     continue
   fi
 
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
-  case $ac_option in
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
@@ -535,33 +1001,45 @@
   --config-cache | -C)
     cache_file=config.cache ;;
 
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+  -datadir | --datadir | --datadi | --datad)
     ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
     datadir=$ac_optarg ;;
 
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
   -disable-* | --disable-*)
     ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
     ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -588,6 +1066,12 @@
   -host=* | --host=* | --hos=* | --ho=*)
     host_alias=$ac_optarg ;;
 
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
@@ -612,13 +1096,16 @@
   | --libexe=* | --libex=* | --libe=*)
     libexecdir=$ac_optarg ;;
 
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
   -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
+  | --localstate | --localstat | --localsta | --localst | --locals)
     ac_prev=localstatedir ;;
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
     localstatedir=$ac_optarg ;;
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
@@ -683,6 +1170,16 @@
   | --progr-tra=* | --program-tr=* | --program-t=*)
     program_transform_name=$ac_optarg ;;
 
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
@@ -735,24 +1232,20 @@
   -with-* | --with-*)
     ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
 
   -without-* | --without-*)
     ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -783,8 +1276,7 @@
     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
    { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
+    eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
@@ -804,27 +1296,19 @@
    { (exit 1); exit 1; }; }
 fi
 
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
 do
-  eval ac_val=$`echo $ac_var`
+  eval ac_val=\$$ac_var
   case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -851,74 +1335,76 @@
 test "$silent" = yes && exec 6>/dev/null
 
 
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$0" : 'X\(//\)[^/]' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
+  if test ! -r "$srcdir/$ac_unique_file"; then
     srcdir=..
   fi
 else
   ac_srcdir_defaulted=no
 fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
 fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
    { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
 
 #
 # Report the --help message.
@@ -947,9 +1433,6 @@
   -n, --no-create         do not create output files
       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
 
-_ACEOF
-
-  cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
 			  [$ac_default_prefix]
@@ -967,15 +1450,22 @@
   --bindir=DIR           user executables [EPREFIX/bin]
   --sbindir=DIR          system admin executables [EPREFIX/sbin]
   --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
   --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
   --libdir=DIR           object code libraries [EPREFIX/lib]
   --includedir=DIR       C header files [PREFIX/include]
   --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -1001,10 +1491,8 @@
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --disable-dependency-tracking  speeds up one-time build
   --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-shared[=PKGS]
-                          build shared libraries [default=no]
-  --enable-static[=PKGS]
-                          build static libraries [default=yes]
+  --enable-shared[=PKGS]  build shared libraries [default=no]
+  --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
@@ -1030,126 +1518,95 @@
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
 _ACEOF
+ac_status=$?
 fi
 
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
+    test -d "$ac_dir" || continue
     ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
   done
 fi
 
-test -n "$ac_init_help" && exit 0
+test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
-  exit 0
+  exit
 fi
-exec 5>config.log
-cat >&5 <<_ACEOF
+cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by $as_me, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
 
 _ACEOF
+exec 5>>config.log
 {
 cat <<_ASUNAME
 ## --------- ##
@@ -1168,7 +1625,7 @@
 /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
 /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
 /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
 /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
 /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
@@ -1182,6 +1639,7 @@
   test -z "$as_dir" && as_dir=.
   echo "PATH: $as_dir"
 done
+IFS=$as_save_IFS
 
 } >&5
 
@@ -1203,7 +1661,6 @@
 ac_configure_args=
 ac_configure_args0=
 ac_configure_args1=
-ac_sep=
 ac_must_keep_next=false
 for ac_pass in 1 2
 do
@@ -1214,7 +1671,7 @@
     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    *\'*)
       ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
@@ -1236,9 +1693,7 @@
 	  -* ) ac_must_keep_next=true ;;
 	esac
       fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
+      ac_configure_args="$ac_configure_args '$ac_arg'"
       ;;
     esac
   done
@@ -1249,8 +1704,8 @@
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
 # would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
   # Save into config.log some information that might help in debugging.
   {
@@ -1263,20 +1718,34 @@
 _ASBOX
     echo
     # The following way of writing the cache mishandles newlines in values,
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
   (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
     *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-}
+    esac |
+    sort
+)
     echo
 
     cat <<\_ASBOX
@@ -1287,22 +1756,28 @@
     echo
     for ac_var in $ac_subst_vars
     do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
       cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
 _ASBOX
       echo
       for ac_var in $ac_subst_files
       do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
@@ -1314,26 +1789,24 @@
 ## ----------- ##
 _ASBOX
       echo
-      sed "/^$/d" confdefs.h | sort
+      cat confdefs.h
       echo
     fi
     test "$ac_signal" != 0 &&
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
-     ' 0
+' 0
 for ac_signal in 1 2 13 15; do
   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
 done
 ac_signal=0
 
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
+rm -f -r conftest* confdefs.h
 
 # Predefined preprocessor variables.
 
@@ -1364,14 +1837,17 @@
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in $CONFIG_SITE; do
+shift
+for ac_site_file
+do
   if test -r "$ac_site_file"; then
     { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
 echo "$as_me: loading site script $ac_site_file" >&6;}
@@ -1387,8 +1863,8 @@
     { echo "$as_me:$LINENO: loading cache $cache_file" >&5
 echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
     esac
   fi
 else
@@ -1400,12 +1876,11 @@
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+for ac_var in $ac_precious_vars; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
       { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
@@ -1430,8 +1905,7 @@
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -1448,6 +1922,22 @@
    { (exit 1); exit 1; }; }
 fi
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -1457,122 +1947,155 @@
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install-sh -c"
     break
-  elif test -f $ac_dir/install.sh; then
+  elif test -f "$ac_dir/install.sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install.sh -c"
     break
-  elif test -f $ac_dir/shtool; then
+  elif test -f "$ac_dir/shtool"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/shtool install -c"
     break
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
    { (exit 1); exit 1; }; }
 fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
 
 # Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
    { (exit 1); exit 1; }; }
 
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
 if test "${ac_cv_build+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
   { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
 echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
    { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
 if test "${ac_cv_host+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+fi
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
-echo "$as_me:$LINENO: checking target system type" >&5
-echo $ECHO_N "checking target system type... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6; }
 if test "${ac_cv_target+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_target_alias=$target_alias
-test "x$ac_cv_target_alias" = "x" &&
-  ac_cv_target_alias=$ac_cv_host_alias
-ac_cv_target=`$ac_config_sub $ac_cv_target_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+fi
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_target" >&5
-echo "${ECHO_T}$ac_cv_target" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5
+echo "$as_me: error: invalid value of canonical target" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
 target=$ac_cv_target
-target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
 
 
 # The aliases save the names the user supplied, while $host etc.
@@ -1589,8 +2112,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1603,32 +2126,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1641,36 +2166,51 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
   CC="$ac_cv_prog_CC"
 fi
 
 if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1683,74 +2223,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+
   fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1764,7 +2264,7 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -1775,6 +2275,7 @@
   fi
 done
 done
+IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
@@ -1792,22 +2293,23 @@
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+  for ac_prog in cl.exe
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1820,36 +2322,38 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$CC" && break
   done
 fi
 if test -z "$CC"; then
   ac_ct_CC=$CC
-  for ac_prog in cl
+  for ac_prog in cl.exe
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1862,29 +2366,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_CC" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 fi
 
 fi
@@ -1897,21 +2417,35 @@
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
@@ -1936,47 +2470,77 @@
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
 do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
 	;;
     [ab].out )
 	# We found the default executable, but exeext='' is most
 	# certainly right.
 	break;;
     *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
 	break;;
     * )
 	break;;
   esac
 done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
 else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
@@ -1988,19 +2552,21 @@
 fi
 
 ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
 
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
   if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -2019,22 +2585,27 @@
     fi
   fi
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
 rm -f a.out a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
 
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
@@ -2045,9 +2616,8 @@
 for ac_file in conftest.exe conftest conftest.*; do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
 	  break;;
     * ) break;;
   esac
@@ -2061,14 +2631,14 @@
 fi
 
 rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
 if test "${ac_cv_objext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2088,14 +2658,20 @@
 }
 _ACEOF
 rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
@@ -2113,12 +2689,12 @@
 
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2141,50 +2717,49 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2200,38 +2775,118 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -2247,12 +2902,12 @@
     CFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
+  ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2286,12 +2941,17 @@
 /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    function prototypes and stuff, but not '\xHH' hex character constants.
    These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
+   as 'x'.  The following induces an error, until -std is added to get
    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
    array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
+   that's true only with -std.  */
 int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -2306,205 +2966,57 @@
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
+rm -f conftest.$ac_ext
 CC=$ac_save_CC
 
 fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
   *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2512,13 +3024,12 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for library containing strerror" >&5
-echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for library containing strerror" >&5
+echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; }
 if test "${ac_cv_search_strerror+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_func_search_save_LIBS=$LIBS
-ac_cv_search_strerror=no
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -2526,115 +3037,73 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char strerror ();
 int
 main ()
 {
-strerror ();
+return strerror ();
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_strerror="none required"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test "$ac_cv_search_strerror" = no; then
-  for ac_lib in cposix; do
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char strerror ();
-int
-main ()
-{
-strerror ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_search_strerror="-l$ac_lib"
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_strerror=$ac_res
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-  done
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_strerror+set}" = set; then
+  break
 fi
+done
+if test "${ac_cv_search_strerror+set}" = set; then
+  :
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
-echo "${ECHO_T}$ac_cv_search_strerror" >&6
-if test "$ac_cv_search_strerror" != no; then
-  test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS"
+{ echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+echo "${ECHO_T}$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
 
@@ -2658,8 +3127,8 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -2681,7 +3150,7 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -2700,21 +3169,22 @@
     ;;
 esac
 done
+IFS=$as_save_IFS
 
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
     INSTALL=$ac_cv_path_install
   else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
+    # removed, or if the value is a relative name.
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -2724,8 +3194,8 @@
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
 # Just in case
 sleep 1
 echo timestamp > conftest.file
@@ -2767,20 +3237,20 @@
 Check your system clock" >&2;}
    { (exit 1); exit 1; }; }
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 test "$program_prefix" != NONE &&
-  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
 test "$program_suffix" != NONE &&
-  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
 # Double any \ or $.  echo might interpret backslashes.
 # By default was `s,x,x', remove it if useless.
 cat <<\_ACEOF >conftest.sed
 s/[\\$]/&&/g;s/;s,x,x,$//
 _ACEOF
 program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm conftest.sed
+rm -f conftest.sed
 
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
@@ -2832,8 +3302,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AWK+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2846,54 +3316,57 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AWK="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AWK=$ac_cv_prog_AWK
 if test -n "$AWK"; then
-  echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AWK" && break
 done
 
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
 all:
-	@echo 'ac_maketemp="$(MAKE)"'
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
 _ACEOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
 rm -f conftest.make
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   SET_MAKE=
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
@@ -2908,7 +3381,7 @@
 
 DEPDIR="${am__leading_dot}deps"
 
-          ac_config_commands="$ac_config_commands depfiles"
+ac_config_commands="$ac_config_commands depfiles"
 
 
 am_make=${MAKE-make}
@@ -2918,8 +3391,8 @@
 .PHONY: am__doit
 END
 # If we don't find an include directive, just comment out the code.
-echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
 am__include="#"
 am__quote=
 _am_result=none
@@ -2946,15 +3419,15 @@
 fi
 
 
-echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
 rm -f confinc confmf
 
-# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+# Check whether --enable-dependency-tracking was given.
 if test "${enable_dependency_tracking+set}" = set; then
-  enableval="$enable_dependency_tracking"
+  enableval=$enable_dependency_tracking;
+fi
 
-fi;
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
@@ -3029,8 +3502,8 @@
   if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3043,32 +3516,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3081,27 +3556,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
 fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  STRIP=$ac_ct_STRIP
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
 else
   STRIP="$ac_cv_prog_STRIP"
 fi
@@ -3122,8 +3611,8 @@
 
 depcc="$CC"   am_compiler_list=
 
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3212,8 +3701,8 @@
 fi
 
 fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
 
 
@@ -3239,8 +3728,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3253,32 +3742,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3291,36 +3782,51 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
   CC="$ac_cv_prog_CC"
 fi
 
 if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3333,74 +3839,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+
   fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3414,7 +3880,7 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -3425,6 +3891,7 @@
   fi
 done
 done
+IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
@@ -3442,22 +3909,23 @@
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+  for ac_prog in cl.exe
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3470,36 +3938,38 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$CC" && break
   done
 fi
 if test -z "$CC"; then
   ac_ct_CC=$CC
-  for ac_prog in cl
+  for ac_prog in cl.exe
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3512,29 +3982,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_CC" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 fi
 
 fi
@@ -3547,27 +4033,41 @@
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3590,50 +4090,49 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3649,38 +4148,118 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -3696,12 +4275,12 @@
     CFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
+  ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -3735,12 +4314,17 @@
 /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    function prototypes and stuff, but not '\xHH' hex character constants.
    These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
+   as 'x'.  The following induces an error, until -std is added to get
    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
    array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
+   that's true only with -std.  */
 int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -3755,205 +4339,57 @@
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
+rm -f conftest.$ac_ext
 CC=$ac_save_CC
 
 fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
   *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3970,8 +4406,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3984,32 +4420,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AR="${ac_tool_prefix}ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AR=$ac_cv_prog_AR
 if test -n "$AR"; then
-  echo "$as_me:$LINENO: result: $AR" >&5
-echo "${ECHO_T}$AR" >&6
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_AR"; then
   ac_ct_AR=$AR
   # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4022,26 +4460,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_AR="ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_AR=$ac_cv_prog_ac_ct_AR
 if test -n "$ac_ct_AR"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
-echo "${ECHO_T}$ac_ct_AR" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  AR=$ac_ct_AR
+  if test "x$ac_ct_AR" = x; then
+    AR=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
 else
   AR="$ac_cv_prog_AR"
 fi
@@ -4049,8 +4502,8 @@
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4063,32 +4516,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4101,36 +4556,49 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
 fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  RANLIB=$ac_ct_RANLIB
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
 else
   RANLIB="$ac_cv_prog_RANLIB"
 fi
 
 
-# Check whether --enable-shared or --disable-shared was given.
+# Check whether --enable-shared was given.
 if test "${enable_shared+set}" = set; then
-  enableval="$enable_shared"
-  p=${PACKAGE-default}
+  enableval=$enable_shared; p=${PACKAGE-default}
     case $enableval in
     yes) enable_shared=yes ;;
     no) enable_shared=no ;;
@@ -4149,7 +4617,8 @@
     esac
 else
   enable_shared=no
-fi;
+fi
+
 
 
 
@@ -4186,10 +4655,9 @@
 
 
 
-# Check whether --enable-static or --disable-static was given.
+# Check whether --enable-static was given.
 if test "${enable_static+set}" = set; then
-  enableval="$enable_static"
-  p=${PACKAGE-default}
+  enableval=$enable_static; p=${PACKAGE-default}
     case $enableval in
     yes) enable_static=yes ;;
     no) enable_static=no ;;
@@ -4208,7 +4676,7 @@
     esac
 else
   enable_static=yes
-fi;
+fi
 
 
 
@@ -4218,13 +4686,14 @@
 
 
 
-# Check whether --with-pic or --without-pic was given.
+
+# Check whether --with-pic was given.
 if test "${with_pic+set}" = set; then
-  withval="$with_pic"
-  pic_mode="$withval"
+  withval=$with_pic; pic_mode="$withval"
 else
   pic_mode=default
-fi;
+fi
+
 
 test -z "$pic_mode" && pic_mode=default
 
@@ -4234,10 +4703,9 @@
 
 
 
-# Check whether --enable-fast-install or --disable-fast-install was given.
+# Check whether --enable-fast-install was given.
 if test "${enable_fast_install+set}" = set; then
-  enableval="$enable_fast_install"
-  p=${PACKAGE-default}
+  enableval=$enable_fast_install; p=${PACKAGE-default}
     case $enableval in
     yes) enable_fast_install=yes ;;
     no) enable_fast_install=no ;;
@@ -4256,7 +4724,7 @@
     esac
 else
   enable_fast_install=yes
-fi;
+fi
 
 
 
@@ -4265,64 +4733,90 @@
 
 
 
-echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
-echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
-if test "${lt_cv_path_SED+set}" = set; then
+
+{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; }
+if test "${ac_cv_path_SED+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  # Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" | sed 99q >conftest.sed
+     $as_unset ac_script || ac_script=
+     # Extract the first word of "sed gsed" to use in msg output
+if test -z "$SED"; then
+set dummy sed gsed; ac_prog_name=$2
+if test "${ac_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_SED_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
+  for ac_prog in sed gsed; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+    # Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
   done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_SED_found && break 3
+  done
+done
+
 done
 IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
+
 
 fi
 
-SED=$lt_cv_path_SED
+SED="$ac_cv_path_SED"
+if test -z "$SED"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+fi
 
-echo "$as_me:$LINENO: result: $SED" >&5
-echo "${ECHO_T}$SED" >&6
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5
+echo "${ECHO_T}$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
 
 test -z "$SED" && SED=sed
 Xsed="$SED -e 1s/^X//"
@@ -4337,34 +4831,249 @@
 
 
 
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
-
-
-echo "$as_me:$LINENO: checking for fgrep" >&5
-echo $ECHO_N "checking for fgrep... $ECHO_C" >&6
-if test "${ac_cv_prog_fgrep+set}" = set; then
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if echo 'ab*c' | (grep -F 'ab*c') >/dev/null 2>&1
-    then ac_cv_prog_fgrep='grep -F'
-    else ac_cv_prog_fgrep='fgrep'
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
     fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_fgrep" >&5
-echo "${ECHO_T}$ac_cv_prog_fgrep" >&6
- FGREP=$ac_cv_prog_fgrep
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     # Extract the first word of "fgrep" to use in msg output
+if test -z "$FGREP"; then
+set dummy fgrep; ac_prog_name=$2
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_FGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in fgrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+    # Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_FGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+FGREP="$ac_cv_path_FGREP"
+if test -z "$FGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
 
 
 test -z "$GREP" && GREP=grep
@@ -4387,18 +5096,18 @@
 
 
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
+# Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
 else
   with_gnu_ld=no
-fi;
+fi
+
 ac_prog=ld
 if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
-echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
   case $host in
   *-*-mingw*)
     # gcc leaves a trailing carriage return which upsets mingw
@@ -4427,11 +5136,11 @@
     ;;
   esac
 elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
 else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
 fi
 if test "${lt_cv_path_LD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4464,17 +5173,17 @@
 
 LD="$lt_cv_path_LD"
 if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
 if test "${lt_cv_prog_gnu_ld+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4488,8 +5197,8 @@
   ;;
 esac
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
 with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
@@ -4501,8 +5210,8 @@
 
 
 
-echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
-echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
+echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6; }
 if test "${lt_cv_path_NM+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4550,8 +5259,8 @@
   : ${lt_cv_path_NM=no}
 fi
 fi
-echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
-echo "${ECHO_T}$lt_cv_path_NM" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6; }
 if test "$lt_cv_path_NM" != "no"; then
   NM="$lt_cv_path_NM"
 else
@@ -4561,8 +5270,8 @@
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_DUMPBIN+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4575,25 +5284,27 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 DUMPBIN=$ac_cv_prog_DUMPBIN
 if test -n "$DUMPBIN"; then
-  echo "$as_me:$LINENO: result: $DUMPBIN" >&5
-echo "${ECHO_T}$DUMPBIN" >&6
+  { echo "$as_me:$LINENO: result: $DUMPBIN" >&5
+echo "${ECHO_T}$DUMPBIN" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$DUMPBIN" && break
   done
 fi
@@ -4603,8 +5314,8 @@
 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4617,30 +5328,45 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
 if test -n "$ac_ct_DUMPBIN"; then
-  echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
-echo "${ECHO_T}$ac_ct_DUMPBIN" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
+echo "${ECHO_T}$ac_ct_DUMPBIN" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_DUMPBIN" && break
 done
-test -n "$ac_ct_DUMPBIN" || ac_ct_DUMPBIN=":"
 
-  DUMPBIN=$ac_ct_DUMPBIN
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
 fi
 
 
@@ -4655,43 +5381,43 @@
 
 
 
-echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
-echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
+echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6; }
 if test "${lt_cv_nm_interface+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:4665: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:5391: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4668: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:5394: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4671: output\"" >&5)
+  (eval echo "\"\$as_me:5397: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
   fi
   rm -f conftest*
 fi
-echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
-echo "${ECHO_T}$lt_cv_nm_interface" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
+echo "${ECHO_T}$lt_cv_nm_interface" >&6; }
 
-echo "$as_me:$LINENO: checking whether ln -s works" >&5
-echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; }
 LN_S=$as_ln_s
 if test "$LN_S" = "ln -s"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
-  echo "$as_me:$LINENO: result: no, using $LN_S" >&5
-echo "${ECHO_T}no, using $LN_S" >&6
+  { echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6; }
 fi
 
 # find the maximum length of command line arguments
-echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
-echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; }
 if test "${lt_cv_sys_max_cmd_len+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4810,11 +5536,11 @@
 fi
 
 if test -n $lt_cv_sys_max_cmd_len ; then
-  echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
-echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+  { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; }
 else
-  echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
+  { echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6; }
 fi
 max_cmd_len=$lt_cv_sys_max_cmd_len
 
@@ -4828,26 +5554,26 @@
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
-echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
+echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6; }
 # Try some XSI features
 xsi_shell=no
 ( _lt_dummy="a/b/c"
   test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
       = c,a/b,, ) >/dev/null 2>&1 \
   && xsi_shell=yes
-echo "$as_me:$LINENO: result: $xsi_shell" >&5
-echo "${ECHO_T}$xsi_shell" >&6
+{ echo "$as_me:$LINENO: result: $xsi_shell" >&5
+echo "${ECHO_T}$xsi_shell" >&6; }
 
 
-echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
-echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
+echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6; }
 lt_shell_append=no
 ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
     >/dev/null 2>&1 \
   && lt_shell_append=yes
-echo "$as_me:$LINENO: result: $lt_shell_append" >&5
-echo "${ECHO_T}$lt_shell_append" >&6
+{ echo "$as_me:$LINENO: result: $lt_shell_append" >&5
+echo "${ECHO_T}$lt_shell_append" >&6; }
 
 
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
@@ -4881,15 +5607,15 @@
 
 
 
-echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
-echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; }
 if test "${lt_cv_ld_reload_flag+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   lt_cv_ld_reload_flag='-r'
 fi
-echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
-echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; }
 reload_flag=$lt_cv_ld_reload_flag
 case $reload_flag in
 "" | " "*) ;;
@@ -4915,8 +5641,8 @@
 
 
 
-echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
-echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
+echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; }
 if test "${lt_cv_deplibs_check_method+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4935,7 +5661,7 @@
 # whether `pass_all' will *always* work, you probably want this one.
 
 case $host_os in
-aix4* | aix5*)
+aix[4-9]*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -5105,8 +5831,8 @@
 esac
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
-echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; }
 file_magic_cmd=$lt_cv_file_magic_cmd
 deplibs_check_method=$lt_cv_deplibs_check_method
 test -z "$deplibs_check_method" && deplibs_check_method=unknown
@@ -5125,8 +5851,8 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5139,32 +5865,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AR="${ac_tool_prefix}ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AR=$ac_cv_prog_AR
 if test -n "$AR"; then
-  echo "$as_me:$LINENO: result: $AR" >&5
-echo "${ECHO_T}$AR" >&6
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_AR"; then
   ac_ct_AR=$AR
   # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5177,27 +5905,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_AR="ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
 fi
 fi
 ac_ct_AR=$ac_cv_prog_ac_ct_AR
 if test -n "$ac_ct_AR"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
-echo "${ECHO_T}$ac_ct_AR" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  AR=$ac_ct_AR
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
 else
   AR="$ac_cv_prog_AR"
 fi
@@ -5218,8 +5960,8 @@
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5232,32 +5974,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5270,27 +6014,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
 fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  STRIP=$ac_ct_STRIP
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
 else
   STRIP="$ac_cv_prog_STRIP"
 fi
@@ -5305,8 +6063,8 @@
 if test -n "$ac_tool_prefix"; then
   # 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 "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5319,32 +6077,34 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5357,27 +6117,41 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
 fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  RANLIB=$ac_ct_RANLIB
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
 else
   RANLIB="$ac_cv_prog_RANLIB"
 fi
@@ -5450,8 +6224,8 @@
 
 
 # Check for command to grab the raw symbol name followed by C symbol from nm.
-echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
-echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; }
 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5669,11 +6443,11 @@
   lt_cv_sys_global_symbol_to_cdecl=
 fi
 if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  echo "$as_me:$LINENO: result: failed" >&5
-echo "${ECHO_T}failed" >&6
+  { echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6; }
 else
-  echo "$as_me:$LINENO: result: ok" >&5
-echo "${ECHO_T}ok" >&6
+  { echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6; }
 fi
 
 
@@ -5692,11 +6466,11 @@
 
 
 
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+# Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then
-  enableval="$enable_libtool_lock"
+  enableval=$enable_libtool_lock;
+fi
 
-fi;
 test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
@@ -5723,7 +6497,7 @@
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 5726 "configure"' > conftest.$ac_ext
+  echo '#line 6500 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -5815,8 +6589,8 @@
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
   SAVE_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -belf"
-  echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; }
 if test "${lt_cv_cc_needs_belf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5842,35 +6616,32 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   lt_cv_cc_needs_belf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-lt_cv_cc_needs_belf=no
+	lt_cv_cc_needs_belf=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
      ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -5879,8 +6650,8 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; }
   if test x"$lt_cv_cc_needs_belf" != x"yes"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
     CFLAGS="$SAVE_CFLAGS"
@@ -5914,8 +6685,8 @@
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -5949,24 +6720,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -5975,9 +6744,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -5987,24 +6757,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -6015,6 +6783,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -6032,8 +6801,8 @@
 else
   ac_cv_prog_CPP=$CPP
 fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
@@ -6056,24 +6825,22 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -6082,9 +6849,10 @@
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -6094,24 +6862,22 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -6122,6 +6888,7 @@
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -6144,8 +6911,8 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6169,35 +6936,31 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_stdc=no
+	ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
@@ -6253,6 +7016,7 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ctype.h>
+#include <stdlib.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
@@ -6272,18 +7036,27 @@
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
 	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
+      return 2;
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -6296,12 +7069,14 @@
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
 fi
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -6324,9 +7099,9 @@
 		  inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -6340,38 +7115,35 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
@@ -6386,9 +7158,9 @@
 for ac_header in dlfcn.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -6402,38 +7174,35 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
@@ -6494,8 +7263,8 @@
    setopt NO_GLOB_SUBST
 fi
 
-echo "$as_me:$LINENO: checking for objdir" >&5
-echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6; }
 if test "${lt_cv_objdir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6509,8 +7278,8 @@
 fi
 rmdir .libs 2>/dev/null
 fi
-echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
-echo "${ECHO_T}$lt_cv_objdir" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6; }
 objdir=$lt_cv_objdir
 
 
@@ -6602,8 +7371,8 @@
 case $deplibs_check_method in
 file_magic*)
   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; }
 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6655,11 +7424,11 @@
 
 MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
 if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
@@ -6668,8 +7437,8 @@
 
 if test -z "$lt_cv_path_MAGIC_CMD"; then
   if test -n "$ac_tool_prefix"; then
-    echo "$as_me:$LINENO: checking for file" >&5
-echo $ECHO_N "checking for file... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6; }
 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6721,11 +7490,11 @@
 
 MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
 if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
@@ -6805,8 +7574,8 @@
 if test "$GCC" = yes; then
   lt_prog_compiler_no_builtin_flag=' -fno-builtin'
 
-  echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -6823,11 +7592,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:6826: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:7595: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:6830: \$? = $ac_status" >&5
+   echo "$as_me:7599: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -6840,8 +7609,8 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
@@ -6860,8 +7629,8 @@
 lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
 
   if test "$GCC" = yes; then
     lt_prog_compiler_wl='-Wl,'
@@ -7115,8 +7884,8 @@
     lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
     ;;
 esac
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6; }
 
 
 
@@ -7127,8 +7896,8 @@
 # Check to make sure the PIC flag actually works.
 #
 if test -n "$lt_prog_compiler_pic"; then
-  echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; }
 if test "${lt_prog_compiler_pic_works+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7145,11 +7914,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7148: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:7917: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:7152: \$? = $ac_status" >&5
+   echo "$as_me:7921: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -7162,8 +7931,8 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; }
 
 if test x"$lt_prog_compiler_pic_works" = xyes; then
     case $lt_prog_compiler_pic in
@@ -7186,8 +7955,8 @@
 # Check to make sure the static flag actually works.
 #
 wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
 if test "${lt_prog_compiler_static_works+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7214,8 +7983,8 @@
    LDFLAGS="$save_LDFLAGS"
 
 fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; }
 
 if test x"$lt_prog_compiler_static_works" = xyes; then
     :
@@ -7229,8 +7998,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
 if test "${lt_cv_prog_compiler_c_o+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7250,11 +8019,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7253: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8022: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:7257: \$? = $ac_status" >&5
+   echo "$as_me:8026: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -7276,16 +8045,16 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
 
 
 
-  echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
 if test "${lt_cv_prog_compiler_c_o+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -7305,11 +8074,11 @@
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7308: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8077: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:7312: \$? = $ac_status" >&5
+   echo "$as_me:8081: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -7331,8 +8100,8 @@
    $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
@@ -7340,16 +8109,16 @@
 hard_links="nottested"
 if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
   # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
   hard_links=yes
   $RM conftest*
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   touch conftest.a
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
   if test "$hard_links" = no; then
     { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
@@ -7364,8 +8133,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
 
   runpath_var=
   allow_undefined_flag=
@@ -7453,7 +8222,7 @@
 
     # See if GNU ld supports shared libraries.
     case $host_os in
-    aix3* | aix4* | aix5*)
+    aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
       if test "$host_cpu" != ia64; then
 	ld_shlibs=no
@@ -7687,7 +8456,7 @@
       fi
       ;;
 
-    aix4* | aix5*)
+    aix[4-9]*)
       if test "$host_cpu" = ia64; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
@@ -7707,7 +8476,7 @@
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
 	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	  for ld_flag in $LDFLAGS; do
 	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
 	    aix_use_runtimelinking=yes
@@ -7800,27 +8569,23 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
 
 lt_aix_libpath_sed='
     /Import File Strings/,/^$/ {
@@ -7838,8 +8603,10 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
@@ -7869,27 +8636,23 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
 
 lt_aix_libpath_sed='
     /Import File Strings/,/^$/ {
@@ -7907,8 +8670,10 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
@@ -8163,35 +8928,33 @@
 int foo(void) {}
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
 
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
         LDFLAGS="$save_LDFLAGS"
       else
@@ -8444,8 +9207,8 @@
     fi
   fi
 
-echo "$as_me:$LINENO: result: $ld_shlibs" >&5
-echo "${ECHO_T}$ld_shlibs" >&6
+{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6; }
 test "$ld_shlibs" = no && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
@@ -8481,8 +9244,8 @@
       # Test whether the compiler implicitly links with -lc since on some
       # systems, -lgcc has to come before -lc. If gcc already passes -lc
       # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
       $RM conftest*
       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
@@ -8519,8 +9282,8 @@
         cat conftest.err 1>&5
       fi
       $RM conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
-echo "${ECHO_T}$archive_cmds_need_lc" >&6
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6; }
       ;;
     esac
   fi
@@ -8683,8 +9446,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
 withGCC=$GCC
 if test "$withGCC" = yes; then
   case $host_os in
@@ -8767,7 +9530,7 @@
   soname_spec='${libname}${release}${shared_ext}$major'
   ;;
 
-aix4* | aix5*)
+aix[4-9]*)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -9116,27 +9879,23 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir"; then
   shlibpath_overrides_runpath=yes
 fi
@@ -9145,8 +9904,10 @@
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
   LDFLAGS=$save_LDFLAGS
   libdir=$save_libdir
@@ -9359,8 +10120,8 @@
   dynamic_linker=no
   ;;
 esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
 test "$dynamic_linker" = no && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
@@ -9454,8 +10215,8 @@
 
 
 
-  echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
@@ -9479,8 +10240,8 @@
   # directories.
   hardcode_action=unsupported
 fi
-echo "$as_me:$LINENO: result: $hardcode_action" >&5
-echo "${ECHO_T}$hardcode_action" >&6
+{ echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6; }
 
 if test "$hardcode_action" = relink ||
    test "$inherit_rpath" = yes; then
@@ -9524,8 +10285,8 @@
 
   darwin*)
   # if libdl is installed we need to link against it
-    echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dl_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9538,56 +10299,53 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 int
 main ()
 {
-dlopen ();
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dl_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dl_dlopen=no
+	ac_cv_lib_dl_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
 if test $ac_cv_lib_dl_dlopen = yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
 else
@@ -9601,8 +10359,8 @@
     ;;
 
   *)
-    echo "$as_me:$LINENO: checking for shl_load" >&5
-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; }
 if test "${ac_cv_func_shl_load+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9629,73 +10387,64 @@
 
 #undef shl_load
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char shl_load ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_shl_load) || defined (__stub___shl_load)
+#if defined __stub_shl_load || defined __stub___shl_load
 choke me
-#else
-char (*f) () = shl_load;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != shl_load;
+return shl_load ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_func_shl_load=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_func_shl_load=no
+	ac_cv_func_shl_load=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
-echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6; }
 if test $ac_cv_func_shl_load = yes; then
   lt_cv_dlopen="shl_load"
 else
-  echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dld_shl_load+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9708,61 +10457,58 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char shl_load ();
 int
 main ()
 {
-shl_load ();
+return shl_load ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dld_shl_load=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dld_shl_load=no
+	ac_cv_lib_dld_shl_load=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; }
 if test $ac_cv_lib_dld_shl_load = yes; then
   lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
 else
-  echo "$as_me:$LINENO: checking for dlopen" >&5
-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
 if test "${ac_cv_func_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9789,73 +10535,64 @@
 
 #undef dlopen
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_dlopen) || defined (__stub___dlopen)
+#if defined __stub_dlopen || defined __stub___dlopen
 choke me
-#else
-char (*f) () = dlopen;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != dlopen;
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_func_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_func_dlopen=no
+	ac_cv_func_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
-echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6; }
 if test $ac_cv_func_dlopen = yes; then
   lt_cv_dlopen="dlopen"
 else
-  echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dl_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9868,61 +10605,58 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 int
 main ()
 {
-dlopen ();
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dl_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dl_dlopen=no
+	ac_cv_lib_dl_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
 if test $ac_cv_lib_dl_dlopen = yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
 else
-  echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; }
 if test "${ac_cv_lib_svld_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -9935,61 +10669,58 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dlopen ();
 int
 main ()
 {
-dlopen ();
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_svld_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_svld_dlopen=no
+	ac_cv_lib_svld_dlopen=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; }
 if test $ac_cv_lib_svld_dlopen = yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
 else
-  echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; }
 if test "${ac_cv_lib_dld_dld_link+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10002,56 +10733,53 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char dld_link ();
 int
 main ()
 {
-dld_link ();
+return dld_link ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
   ac_cv_lib_dld_dld_link=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dld_dld_link=no
+	ac_cv_lib_dld_dld_link=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; }
 if test $ac_cv_lib_dld_dld_link = yes; then
   lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
 fi
@@ -10091,8 +10819,8 @@
     save_LIBS="$LIBS"
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
-    echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+    { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; }
 if test "${lt_cv_dlopen_self+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10102,7 +10830,7 @@
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10105 "configure"
+#line 10833 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10186,13 +10914,13 @@
 
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6; }
 
     if test "x$lt_cv_dlopen_self" = xyes; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+      { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; }
 if test "${lt_cv_dlopen_self_static+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10202,7 +10930,7 @@
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10205 "configure"
+#line 10933 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10286,8 +11014,8 @@
 
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; }
     fi
 
     CPPFLAGS="$save_CPPFLAGS"
@@ -10325,13 +11053,13 @@
 
 striplib=
 old_striplib=
-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; }
 if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
   test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
   test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
@@ -10339,16 +11067,16 @@
     if test -n "$STRIP" ; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
-      echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+      { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
     else
-      echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+      { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
     fi
     ;;
   *)
-    echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
     ;;
   esac
 fi
@@ -10365,13 +11093,13 @@
 
 
   # Report which library types will actually be built
-  echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-  echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
+  { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6; }
 
-  echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
   test "$can_build_shared" = "no" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
@@ -10385,21 +11113,21 @@
     fi
     ;;
 
-  aix4* | aix5*)
+  aix[4-9]*)
     if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
       test "$enable_shared" = yes && enable_static=no
     fi
     ;;
   esac
-  echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
+  { echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6; }
 
-  echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; }
   # Make sure either enable_shared or enable_static is yes.
   test "$enable_shared" = yes || enable_static=yes
-  echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
+  { echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6; }
 
 
 
@@ -10425,7 +11153,7 @@
 
 
 
-                  ac_config_commands="$ac_config_commands libtool"
+        ac_config_commands="$ac_config_commands libtool"
 
 
 
@@ -10434,10 +11162,9 @@
 
 
 
-# Check whether --enable-targets or --disable-targets was given.
+# Check whether --enable-targets was given.
 if test "${enable_targets+set}" = set; then
-  enableval="$enable_targets"
-  case "${enableval}" in
+  enableval=$enable_targets; case "${enableval}" in
   yes | "") { { echo "$as_me:$LINENO: error: enable-targets option must specify target names or 'all'" >&5
 echo "$as_me: error: enable-targets option must specify target names or 'all'" >&2;}
    { (exit 1); exit 1; }; }
@@ -10445,31 +11172,32 @@
   no)       enable_targets= ;;
   *)        enable_targets=$enableval ;;
 esac
-fi; # Check whether --enable-commonbfdlib or --disable-commonbfdlib was given.
+fi
+# Check whether --enable-commonbfdlib was given.
 if test "${enable_commonbfdlib+set}" = set; then
-  enableval="$enable_commonbfdlib"
-  case "${enableval}" in
+  enableval=$enable_commonbfdlib; case "${enableval}" in
   yes) commonbfdlib=true ;;
   no)  commonbfdlib=false ;;
   *)   { { echo "$as_me:$LINENO: error: bad value ${enableval} for opcodes commonbfdlib option" >&5
 echo "$as_me: error: bad value ${enableval} for opcodes commonbfdlib option" >&2;}
    { (exit 1); exit 1; }; } ;;
 esac
-fi;
+fi
+
 
 GCC_WARN_CFLAGS="-W -Wall -Wstrict-prototypes -Wmissing-prototypes"
 
-# Check whether --enable-werror or --disable-werror was given.
+# Check whether --enable-werror was given.
 if test "${enable_werror+set}" = set; then
-  enableval="$enable_werror"
-  case "${enableval}" in
+  enableval=$enable_werror; case "${enableval}" in
      yes | y) ERROR_ON_WARNING="yes" ;;
      no | n)  ERROR_ON_WARNING="no" ;;
      *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-werror" >&5
 echo "$as_me: error: bad value ${enableval} for --enable-werror" >&2;}
    { (exit 1); exit 1; }; } ;;
    esac
-fi;
+fi
+
 
 # Enable -Wno-format by default when using gcc on mingw
 case "${host}" in
@@ -10496,10 +11224,9 @@
   WARN_CFLAGS="${GCC_WARN_CFLAGS}"
 fi
 
-# Check whether --enable-build-warnings or --disable-build-warnings was given.
+# Check whether --enable-build-warnings was given.
 if test "${enable_build_warnings+set}" = set; then
-  enableval="$enable_build_warnings"
-  case "${enableval}" in
+  enableval=$enable_build_warnings; case "${enableval}" in
   yes)	WARN_CFLAGS="${GCC_WARN_CFLAGS}";;
   no)	if test "${GCC}" = yes ; then
 	  WARN_CFLAGS="-w"
@@ -10510,7 +11237,8 @@
         WARN_CFLAGS="${t} ${GCC_WARN_CFLAGS}";;
   *)    WARN_CFLAGS=`echo "${enableval}" | sed -e "s/,/ /g"`;;
 esac
-fi;
+fi
+
 
 if test x"$silent" != x"yes" && test x"$WARN_CFLAGS" != x""; then
   echo "Setting warning flags = $WARN_CFLAGS" 6>&1
@@ -10520,7 +11248,7 @@
 
 
 
-          ac_config_headers="$ac_config_headers config.h:config.in"
+ac_config_headers="$ac_config_headers config.h:config.in"
 
 
 if test -z "$target" ; then
@@ -10529,17 +11257,17 @@
    { (exit 1); exit 1; }; }
 fi
 
-echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
-echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
-    # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; }
+    # Check whether --enable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
-  enableval="$enable_maintainer_mode"
-  USE_MAINTAINER_MODE=$enableval
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
 else
   USE_MAINTAINER_MODE=no
-fi;
-  echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
-echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; }
 
 
 if test $USE_MAINTAINER_MODE = yes; then
@@ -10568,21 +11296,21 @@
   *) target_noncanonical=${target_alias} ;;
 esac
 
-echo "$as_me:$LINENO: checking whether to install libbfd" >&5
-echo $ECHO_N "checking whether to install libbfd... $ECHO_C" >&6
-  # Check whether --enable-install-libbfd or --disable-install-libbfd was given.
+{ echo "$as_me:$LINENO: checking whether to install libbfd" >&5
+echo $ECHO_N "checking whether to install libbfd... $ECHO_C" >&6; }
+  # Check whether --enable-install-libbfd was given.
 if test "${enable_install_libbfd+set}" = set; then
-  enableval="$enable_install_libbfd"
-  install_libbfd_p=$enableval
+  enableval=$enable_install_libbfd; install_libbfd_p=$enableval
 else
   if test "${host}" = "${target}" || test "$enable_shared" = "yes"; then
         install_libbfd_p=yes
       else
         install_libbfd_p=no
       fi
-fi;
-  echo "$as_me:$LINENO: result: $install_libbfd_p" >&5
-echo "${ECHO_T}$install_libbfd_p" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $install_libbfd_p" >&5
+echo "${ECHO_T}$install_libbfd_p" >&6; }
 
 
 if test $install_libbfd_p = yes; then
@@ -10627,22 +11355,22 @@
 if test -f  ../intl/config.intl; then
   .  ../intl/config.intl
 fi
-echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
 if test x"$USE_NLS" != xyes; then
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 else
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
 cat >>confdefs.h <<\_ACEOF
 #define ENABLE_NLS 1
 _ACEOF
 
 
-  echo "$as_me:$LINENO: checking for catalogs to be installed" >&5
-echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for catalogs to be installed" >&5
+echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6; }
   # Look for .po and .gmo files in the source directory.
   CATALOGS=
   XLINGUAS=
@@ -10673,8 +11401,8 @@
     fi
   done
   LINGUAS="$XLINGUAS"
-  echo "$as_me:$LINENO: result: $LINGUAS" >&5
-echo "${ECHO_T}$LINGUAS" >&6
+  { echo "$as_me:$LINENO: result: $LINGUAS" >&5
+echo "${ECHO_T}$LINGUAS" >&6; }
 
 
     DATADIRNAME=share
@@ -10700,17 +11428,17 @@
 
 
 
-  echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
-    # Check whether --enable-nls or --disable-nls was given.
+  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+    # Check whether --enable-nls was given.
 if test "${enable_nls+set}" = set; then
-  enableval="$enable_nls"
-  USE_NLS=$enableval
+  enableval=$enable_nls; USE_NLS=$enableval
 else
   USE_NLS=yes
-fi;
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
 
 
 
@@ -10747,8 +11475,8 @@
 
 # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_MSGFMT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10778,17 +11506,17 @@
 fi
 MSGFMT="$ac_cv_path_MSGFMT"
 if test "$MSGFMT" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGFMT" >&5
-echo "${ECHO_T}$MSGFMT" >&6
+  { echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
   # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_GMSGFMT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10803,30 +11531,31 @@
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
   test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
   ;;
 esac
 fi
 GMSGFMT=$ac_cv_path_GMSGFMT
-
 if test -n "$GMSGFMT"; then
-  echo "$as_me:$LINENO: result: $GMSGFMT" >&5
-echo "${ECHO_T}$GMSGFMT" >&6
+  { echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
 
+
 # Prepare PATH_SEPARATOR.
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
@@ -10857,8 +11586,8 @@
 
 # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_XGETTEXT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10888,11 +11617,11 @@
 fi
 XGETTEXT="$ac_cv_path_XGETTEXT"
 if test "$XGETTEXT" != ":"; then
-  echo "$as_me:$LINENO: result: $XGETTEXT" >&5
-echo "${ECHO_T}$XGETTEXT" >&6
+  { echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
     rm -f messages.po
@@ -10928,8 +11657,8 @@
 
 # Extract the first word of "msgmerge", so it can be a program name with args.
 set dummy msgmerge; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_MSGMERGE+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -10958,11 +11687,11 @@
 fi
 MSGMERGE="$ac_cv_path_MSGMERGE"
 if test "$MSGMERGE" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGMERGE" >&5
-echo "${ECHO_T}$MSGMERGE" >&6
+  { echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
@@ -10972,8 +11701,8 @@
       : ;
     else
       GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
-      echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
-echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6
+      { echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
+echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; }
       GMSGFMT=":"
     fi
   fi
@@ -10983,14 +11712,14 @@
        (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
       : ;
     else
-      echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
-echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
+      { echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6; }
       XGETTEXT=":"
     fi
         rm -f messages.po
   fi
 
-            ac_config_commands="$ac_config_commands default-1"
+  ac_config_commands="$ac_config_commands default-1"
 
 
 
@@ -11009,8 +11738,8 @@
 if test "x$cross_compiling" = "xno"; then
   EXEEXT_FOR_BUILD='$(EXEEXT)'
 else
-  echo "$as_me:$LINENO: checking for build system executable suffix" >&5
-echo $ECHO_N "checking for build system executable suffix... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for build system executable suffix" >&5
+echo $ECHO_N "checking for build system executable suffix... $ECHO_C" >&6; }
 if test "${bfd_cv_build_exeext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -11027,8 +11756,8 @@
      rm -f conftest*
      test x"${bfd_cv_build_exeext}" = x && bfd_cv_build_exeext=no
 fi
-echo "$as_me:$LINENO: result: $bfd_cv_build_exeext" >&5
-echo "${ECHO_T}$bfd_cv_build_exeext" >&6
+{ echo "$as_me:$LINENO: result: $bfd_cv_build_exeext" >&5
+echo "${ECHO_T}$bfd_cv_build_exeext" >&6; }
   EXEEXT_FOR_BUILD=""
   test x"${bfd_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${bfd_cv_build_exeext}
 fi
@@ -11048,8 +11777,8 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11071,7 +11800,7 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -11090,21 +11819,22 @@
     ;;
 esac
 done
+IFS=$as_save_IFS
 
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
     INSTALL=$ac_cv_path_install
   else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
+    # removed, or if the value is a relative name.
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -11122,18 +11852,19 @@
 for ac_header in string.h strings.h stdlib.h limits.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -11144,41 +11875,37 @@
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -11187,24 +11914,22 @@
 /* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -11212,9 +11937,10 @@
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
@@ -11238,25 +11964,19 @@
 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
     { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------------ ##
-## Report this to the AC_PACKAGE_NAME lists.  ##
-## ------------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
 fi
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
@@ -11269,8 +11989,8 @@
 done
 
 
-echo "$as_me:$LINENO: checking whether basename is declared" >&5
-echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether basename is declared" >&5
+echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_basename+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -11285,7 +12005,7 @@
 main ()
 {
 #ifndef basename
-  char *p = (char *) basename;
+  (void) basename;
 #endif
 
   ;
@@ -11293,38 +12013,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_basename=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_basename=no
+	ac_cv_have_decl_basename=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_basename" >&5
-echo "${ECHO_T}$ac_cv_have_decl_basename" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_basename" >&5
+echo "${ECHO_T}$ac_cv_have_decl_basename" >&6; }
 if test $ac_cv_have_decl_basename = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -11339,8 +12055,8 @@
 
 
 fi
-echo "$as_me:$LINENO: checking whether stpcpy is declared" >&5
-echo $ECHO_N "checking whether stpcpy is declared... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether stpcpy is declared" >&5
+echo $ECHO_N "checking whether stpcpy is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_stpcpy+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -11355,7 +12071,7 @@
 main ()
 {
 #ifndef stpcpy
-  char *p = (char *) stpcpy;
+  (void) stpcpy;
 #endif
 
   ;
@@ -11363,38 +12079,34 @@
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_have_decl_stpcpy=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_stpcpy=no
+	ac_cv_have_decl_stpcpy=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_stpcpy" >&5
-echo "${ECHO_T}$ac_cv_have_decl_stpcpy" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_stpcpy" >&5
+echo "${ECHO_T}$ac_cv_have_decl_stpcpy" >&6; }
 if test $ac_cv_have_decl_stpcpy = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -11415,10 +12127,9 @@
 cgen_maint=no
 cgendir='$(srcdir)/../cgen'
 
-# Check whether --enable-cgen-maint or --disable-cgen-maint was given.
+# Check whether --enable-cgen-maint was given.
 if test "${enable_cgen_maint+set}" = set; then
-  enableval="$enable_cgen_maint"
-  case "${enableval}" in
+  enableval=$enable_cgen_maint; case "${enableval}" in
   yes)	cgen_maint=yes ;;
   no)	cgen_maint=no ;;
   *)
@@ -11429,7 +12140,8 @@
 	cgendir=${cgen_maint}/lib/cgen
 	;;
 esac
-fi;
+fi
+
 
 if test x${cgen_maint} = xyes; then
   CGEN_MAINT_TRUE=
@@ -11519,7 +12231,8 @@
 	archdefs="$archdefs -DARCH_$ad"
 	case "$arch" in
 	bfd_alpha_arch)		ta="$ta alpha-dis.lo alpha-opc.lo" ;;
-	bfd_arc_arch)		ta="$ta arc-asm.lo arc-desc.lo arc-dis.lo arc-ibld.lo arc-opc.lo arc-opinst.lo arc-ext.lo" using_cgen=yes ;;
+	#bfd_arc_arch)		ta="$ta arc-dis.lo arc-opc.lo arc-ext.lo" ;;
+	bfd_arc_arch)		ta="$ta arc-asm.lo arcompact-dis.lo arc-ext.lo arc-desc.lo arc-dis.lo arc-dis-cgen.lo arc-ibld.lo arc-opc.lo arc-opinst.lo" using_cgen=yes ;;
 	bfd_arm_arch)		ta="$ta arm-dis.lo" ;;
 	bfd_avr_arch)		ta="$ta avr-dis.lo" ;;
 	bfd_bfin_arch)		ta="$ta bfin-dis.lo" ;;
@@ -11643,7 +12356,7 @@
 
 
 
-                    ac_config_files="$ac_config_files Makefile po/Makefile.in:po/Make-in"
+ac_config_files="$ac_config_files Makefile po/Makefile.in:po/Make-in"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -11663,39 +12376,58 @@
 
 # The following way of writing the cache mishandles newlines in values,
 # but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
+# So, we kill variables containing newlines.
 # Ultrix sh set writes to stderr and can't be redirected directly,
 # and sets the high bit in the cache file unless we assign to the vars.
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
   (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       # `set' does not quote correctly, so add quotes (double-quote
       # substitution turns \\\\ into \\, and sed turns \\ into \).
       sed -n \
 	"s/'/'\\\\''/g;
 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
+      ;; #(
     *)
       # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-} |
+    esac |
+    sort
+) |
   sed '
+     /^ac_cv_env_/b end
      t clear
-     : clear
+     :clear
      s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
      t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
     cat confcache >$cache_file
   else
-    echo "not updating unwritable cache $cache_file"
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -11704,32 +12436,18 @@
 # Let make expand exec_prefix.
 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
-
 DEFS=-DHAVE_CONFIG_H
 
 ac_libobjs=
 ac_ltlibobjs=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
 done
 LIBOBJS=$ac_libobjs
 
@@ -11795,73 +12513,26 @@
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
+  setopt NO_GLOB_SUBST
 else
-  as_unset=false
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
 fi
 
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
 
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
+# PATH needs CR
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
 as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -11882,126 +12553,198 @@
   rm -f conf$$.sh
 fi
 
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
 done
+IFS=$as_save_IFS
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
 do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -12010,7 +12753,28 @@
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -12019,31 +12783,14 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 exec 6>&1
 
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# Save the log message, to keep $[0] and so on meaningful, and to
 # report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
+# values after options handling.
+ac_log="
 This file was extended by $as_me, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -12051,30 +12798,20 @@
   CONFIG_COMMANDS = $CONFIG_COMMANDS
   $ $0 $@
 
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
 _ACEOF
 
+cat >>$CONFIG_STATUS <<_ACEOF
 # Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
 
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
+_ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
-
 ac_cs_usage="\
 \`$as_me' instantiates files from templates according to the
 current configuration.
@@ -12082,7 +12819,7 @@
 Usage: $0 [OPTIONS] [FILE]...
 
   -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
+  -V, --version    print version number and configuration settings, then exit
   -q, --quiet      do not print progress messages
   -d, --debug      don't remove temporary files
       --recheck    update $as_me by reconfiguring in the same conditions
@@ -12101,19 +12838,21 @@
 $config_commands
 
 Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
 config.status
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 2006 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
 _ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
@@ -12124,39 +12863,24 @@
 do
   case $1 in
   --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
     ac_shift=:
     ;;
-  -*)
+  *)
     ac_option=$1
     ac_optarg=$2
     ac_shift=shift
     ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
   esac
 
   case $ac_option in
   # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
     ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
     $ac_shift
@@ -12166,18 +12890,24 @@
     $ac_shift
     CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
     ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil | --si | --s)
     ac_cs_silent=: ;;
 
   # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
    { (exit 1); exit 1; }; } ;;
 
-  *) ac_config_targets="$ac_config_targets $1" ;;
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
 
   esac
   shift
@@ -12193,17 +12923,28 @@
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
 fi
 
 _ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
 
+_ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 #
-# INIT-COMMANDS section.
+# INIT-COMMANDS
 #
-
 AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
 
 
@@ -12456,25 +13197,26 @@
 
 _ACEOF
 
-
-
 cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
 for ac_config_target in $ac_config_targets
 do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in:po/Make-in" ;;
-  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-  "libtool" ) CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-  "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in:po/Make-in" ;;
+
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
   esac
 done
 
+
 # If the user did not use the arguments to specify the items to instantiate,
 # then the envvar interface is used.  Set only those that are not.
 # We use the long form for the default assignment because of an extremely
@@ -12486,389 +13228,494 @@
 fi
 
 # Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
+# simply because there is no reason against having it here, and in addition,
 # creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
 $debug ||
 {
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
   trap '{ (exit 1); exit 1; }' 1 2 13 15
 }
-
 # Create a (secure) tmp directory for tmp files.
 
 {
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
   test -n "$tmp" && test -d "$tmp"
 }  ||
 {
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
 } ||
 {
    echo "$me: cannot create a temporary directory in ." >&2
    { (exit 1); exit 1; }
 }
 
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
 #
-# CONFIG_FILES section.
+# Set up the sed scripts for CONFIG_FILES section.
 #
 
 # No need to generate the scripts if there are no CONFIG_FILES.
 # This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;t t
-s,@target@,$target,;t t
-s,@target_cpu@,$target_cpu,;t t
-s,@target_vendor@,$target_vendor,;t t
-s,@target_os@,$target_os,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s,@INSTALL_DATA@,$INSTALL_DATA,;t t
-s,@CYGPATH_W@,$CYGPATH_W,;t t
-s,@PACKAGE@,$PACKAGE,;t t
-s,@VERSION@,$VERSION,;t t
-s,@ACLOCAL@,$ACLOCAL,;t t
-s,@AUTOCONF@,$AUTOCONF,;t t
-s,@AUTOMAKE@,$AUTOMAKE,;t t
-s,@AUTOHEADER@,$AUTOHEADER,;t t
-s,@MAKEINFO@,$MAKEINFO,;t t
-s,@install_sh@,$install_sh,;t t
-s,@STRIP@,$STRIP,;t t
-s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
-s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
-s,@mkdir_p@,$mkdir_p,;t t
-s,@AWK@,$AWK,;t t
-s,@SET_MAKE@,$SET_MAKE,;t t
-s,@am__leading_dot@,$am__leading_dot,;t t
-s,@AMTAR@,$AMTAR,;t t
-s,@am__tar@,$am__tar,;t t
-s,@am__untar@,$am__untar,;t t
-s,@DEPDIR@,$DEPDIR,;t t
-s,@am__include@,$am__include,;t t
-s,@am__quote@,$am__quote,;t t
-s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
-s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
-s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
-s,@CCDEPMODE@,$CCDEPMODE,;t t
-s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
-s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
-s,@AR@,$AR,;t t
-s,@ac_ct_AR@,$ac_ct_AR,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@LIBTOOL@,$LIBTOOL,;t t
-s,@SED@,$SED,;t t
-s,@EGREP@,$EGREP,;t t
-s,@FGREP@,$FGREP,;t t
-s,@GREP@,$GREP,;t t
-s,@LD@,$LD,;t t
-s,@DUMPBIN@,$DUMPBIN,;t t
-s,@ac_ct_DUMPBIN@,$ac_ct_DUMPBIN,;t t
-s,@NM@,$NM,;t t
-s,@LN_S@,$LN_S,;t t
-s,@lt_ECHO@,$lt_ECHO,;t t
-s,@CPP@,$CPP,;t t
-s,@WARN_CFLAGS@,$WARN_CFLAGS,;t t
-s,@NO_WERROR@,$NO_WERROR,;t t
-s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
-s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
-s,@MAINT@,$MAINT,;t t
-s,@INSTALL_LIBBFD_TRUE@,$INSTALL_LIBBFD_TRUE,;t t
-s,@INSTALL_LIBBFD_FALSE@,$INSTALL_LIBBFD_FALSE,;t t
-s,@host_noncanonical@,$host_noncanonical,;t t
-s,@target_noncanonical@,$target_noncanonical,;t t
-s,@bfdlibdir@,$bfdlibdir,;t t
-s,@bfdincludedir@,$bfdincludedir,;t t
-s,@USE_NLS@,$USE_NLS,;t t
-s,@LIBINTL@,$LIBINTL,;t t
-s,@LIBINTL_DEP@,$LIBINTL_DEP,;t t
-s,@INCINTL@,$INCINTL,;t t
-s,@XGETTEXT@,$XGETTEXT,;t t
-s,@GMSGFMT@,$GMSGFMT,;t t
-s,@POSUB@,$POSUB,;t t
-s,@CATALOGS@,$CATALOGS,;t t
-s,@DATADIRNAME@,$DATADIRNAME,;t t
-s,@INSTOBJEXT@,$INSTOBJEXT,;t t
-s,@GENCAT@,$GENCAT,;t t
-s,@CATOBJEXT@,$CATOBJEXT,;t t
-s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
-s,@MSGFMT@,$MSGFMT,;t t
-s,@MSGMERGE@,$MSGMERGE,;t t
-s,@CC_FOR_BUILD@,$CC_FOR_BUILD,;t t
-s,@EXEEXT_FOR_BUILD@,$EXEEXT_FOR_BUILD,;t t
-s,@HDEFINES@,$HDEFINES,;t t
-s,@CGEN_MAINT_TRUE@,$CGEN_MAINT_TRUE,;t t
-s,@CGEN_MAINT_FALSE@,$CGEN_MAINT_FALSE,;t t
-s,@cgendir@,$cgendir,;t t
-s,@SHARED_LDFLAGS@,$SHARED_LDFLAGS,;t t
-s,@SHARED_LIBADD@,$SHARED_LIBADD,;t t
-s,@SHARED_DEPENDENCIES@,$SHARED_DEPENDENCIES,;t t
-s,@archdefs@,$archdefs,;t t
-s,@BFD_MACHINES@,$BFD_MACHINES,;t t
-s,@LIBOBJS@,$LIBOBJS,;t t
-s,@LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
+if test -n "$CONFIG_FILES"; then
 
 _ACEOF
 
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+target!$target$ac_delim
+target_cpu!$target_cpu$ac_delim
+target_vendor!$target_vendor$ac_delim
+target_os!$target_os$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+AR!$AR$ac_delim
+RANLIB!$RANLIB$ac_delim
+LIBTOOL!$LIBTOOL$ac_delim
+SED!$SED$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+FGREP!$FGREP$ac_delim
+LD!$LD$ac_delim
+DUMPBIN!$DUMPBIN$ac_delim
+ac_ct_DUMPBIN!$ac_ct_DUMPBIN$ac_delim
+NM!$NM$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+LN_S!$LN_S$ac_delim
+lt_ECHO!$lt_ECHO$ac_delim
+CPP!$CPP$ac_delim
+WARN_CFLAGS!$WARN_CFLAGS$ac_delim
+NO_WERROR!$NO_WERROR$ac_delim
+MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim
+MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim
+MAINT!$MAINT$ac_delim
+INSTALL_LIBBFD_TRUE!$INSTALL_LIBBFD_TRUE$ac_delim
+INSTALL_LIBBFD_FALSE!$INSTALL_LIBBFD_FALSE$ac_delim
+host_noncanonical!$host_noncanonical$ac_delim
+target_noncanonical!$target_noncanonical$ac_delim
+bfdlibdir!$bfdlibdir$ac_delim
+bfdincludedir!$bfdincludedir$ac_delim
+USE_NLS!$USE_NLS$ac_delim
+LIBINTL!$LIBINTL$ac_delim
+LIBINTL_DEP!$LIBINTL_DEP$ac_delim
+INCINTL!$INCINTL$ac_delim
+XGETTEXT!$XGETTEXT$ac_delim
+GMSGFMT!$GMSGFMT$ac_delim
+POSUB!$POSUB$ac_delim
+CATALOGS!$CATALOGS$ac_delim
+DATADIRNAME!$DATADIRNAME$ac_delim
+INSTOBJEXT!$INSTOBJEXT$ac_delim
+GENCAT!$GENCAT$ac_delim
+CATOBJEXT!$CATOBJEXT$ac_delim
+MKINSTALLDIRS!$MKINSTALLDIRS$ac_delim
+MSGFMT!$MSGFMT$ac_delim
+MSGMERGE!$MSGMERGE$ac_delim
+CC_FOR_BUILD!$CC_FOR_BUILD$ac_delim
+EXEEXT_FOR_BUILD!$EXEEXT_FOR_BUILD$ac_delim
+HDEFINES!$HDEFINES$ac_delim
+CGEN_MAINT_TRUE!$CGEN_MAINT_TRUE$ac_delim
+CGEN_MAINT_FALSE!$CGEN_MAINT_FALSE$ac_delim
+cgendir!$cgendir$ac_delim
+SHARED_LDFLAGS!$SHARED_LDFLAGS$ac_delim
+SHARED_LIBADD!$SHARED_LIBADD$ac_delim
+SHARED_DEPENDENCIES!$SHARED_DEPENDENCIES$ac_delim
+archdefs!$archdefs$ac_delim
+BFD_MACHINES!$BFD_MACHINES$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 42; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
 fi # test -n "$CONFIG_FILES"
 
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
   esac
 
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+  ac_dir=`$as_dirname -- "$ac_file" ||
 $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$ac_file" : 'X\(//\)[^/]' \| \
 	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
     as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
     done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-
   ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
 
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
 
   case $INSTALL in
   [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
   esac
-
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
 _ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
 cat >>$CONFIG_STATUS <<_ACEOF
   sed "$ac_vpsub
 $extrasub
@@ -12876,248 +13723,130 @@
 cat >>$CONFIG_STATUS <<\_ACEOF
 :t
 /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-s,@INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out
 
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
 
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  rm -f "$tmp/stdin"
   case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
   esac
-
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
 _ACEOF
 
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
 
-# This sed command replaces #undef with comments.  This is necessary, for
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
 
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
 do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
   echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
   rm -f conftest.defines
   mv conftest.tail conftest.defines
 done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
+rm -f conftest.defines conftest.tail
 
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
 cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
   if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
       { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
 echo "$as_me: $ac_file is unchanged" >&6;}
     else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
       rm -f $ac_file
-      mv $tmp/config.h $ac_file
+      mv "$tmp/config.h" $ac_file
     fi
   else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
+    echo "/* $configure_input  */"
+    cat "$ac_result"
   fi
+  rm -f "$tmp/out12"
 # Compute $ac_file's index in $config_headers.
 _am_stamp_count=1
 for _am_header in $config_headers :; do
@@ -13128,135 +13857,39 @@
       _am_stamp_count=`expr $_am_stamp_count + 1` ;;
   esac
 done
-echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+echo "timestamp for $ac_file" >`$as_dirname -- $ac_file ||
 $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X$ac_file : 'X\(//\)[^/]' \| \
 	 X$ac_file : 'X\(//\)$' \| \
-	 X$ac_file : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X$ac_file : 'X\(/\)' \| . 2>/dev/null ||
 echo X$ac_file |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`/stamp-h$_am_stamp_count
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
 
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
 
 
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
   # Strip MF so we end up with the name of the file.
   mf=`echo "$mf" | sed -e 's/:.*$//'`
   # Check whether this is an Automake generated Makefile or not.
@@ -13266,18 +13899,29 @@
   # each Makefile.in and add a new line on top of each file to say so.
   # So let's grep whole file.
   if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
-    dirpart=`(dirname "$mf") 2>/dev/null ||
+    dirpart=`$as_dirname -- "$mf" ||
 $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$mf" : 'X\(//\)[^/]' \| \
 	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   else
     continue
   fi
@@ -13299,49 +13943,76 @@
        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
     # Make sure the directory exists.
     test -f "$dirpart/$file" && continue
-    fdir=`(dirname "$file") 2>/dev/null ||
+    fdir=`$as_dirname -- "$file" ||
 $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$file" : 'X\(//\)[^/]' \| \
 	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    { if $as_mkdir_p; then
-    mkdir -p $dirpart/$fdir
-  else
-    as_dir=$dirpart/$fdir
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
     as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
     done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-
     # echo "creating $dirpart/$file"
     echo '# dummy' > "$dirpart/$file"
   done
 done
  ;;
-    libtool )
+    "libtool":C)
 
     # See if we are running on zsh, and set the options which allow our
     # commands through without removal of \ escapes.
@@ -13890,7 +14561,7 @@
   chmod +x "$ofile"
 
  ;;
-    default-1 )
+    "default-1":C)
     for ac_file in $CONFIG_FILES; do
       # Support "outfile[:infile[:infile...]]"
       case "$ac_file" in
@@ -13991,11 +14662,10 @@
         ;;
       esac
     done ;;
-  esac
-done
-_ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+  esac
+done # for ac_tag
+
 
 { (exit 0); exit 0; }
 _ACEOF
diff --git a/opcodes/configure.in b/opcodes/configure.in
index 4c86d79..cfaa30c 100644
--- a/opcodes/configure.in
+++ b/opcodes/configure.in
@@ -173,7 +173,8 @@
 	archdefs="$archdefs -DARCH_$ad"
 	case "$arch" in
 	bfd_alpha_arch)		ta="$ta alpha-dis.lo alpha-opc.lo" ;;
-	bfd_arc_arch)		ta="$ta arc-asm.lo arc-desc.lo arc-dis.lo arc-ibld.lo arc-opc.lo arc-opinst.lo arc-ext.lo" using_cgen=yes ;;
+	#bfd_arc_arch)		ta="$ta arc-dis.lo arc-opc.lo arc-ext.lo" ;;
+	bfd_arc_arch)		ta="$ta arc-asm.lo arcompact-dis.lo arc-ext.lo arc-desc.lo arc-dis.lo arc-dis-cgen.lo arc-ibld.lo arc-opc.lo arc-opinst.lo" using_cgen=yes ;;
 	bfd_arm_arch)		ta="$ta arm-dis.lo" ;;
 	bfd_avr_arch)		ta="$ta avr-dis.lo" ;;
 	bfd_bfin_arch)		ta="$ta bfin-dis.lo" ;;
diff --git a/opcodes/po/POTFILES.in b/opcodes/po/POTFILES.in
index 250ad36..42f345820 100644
--- a/opcodes/po/POTFILES.in
+++ b/opcodes/po/POTFILES.in
@@ -1,8 +1,16 @@
 alpha-dis.c
 alpha-opc.c
+arc-asm.c
+arc-desc.c
+arc-desc.h
 arc-dis.c
+arc-dis-cgen.c
 arc-ext.c
+arc-ibld.c
+arcompact-dis.c
 arc-opc.c
+arc-opc.h
+arc-opinst.c
 arm-dis.c
 avr-dis.c
 bfin-dis.c
diff --git a/opcodes/po/opcodes.pot b/opcodes/po/opcodes.pot
index 090a97c..7ea612d 100644
--- a/opcodes/po/opcodes.pot
+++ b/opcodes/po/opcodes.pot
@@ -7,8 +7,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-07-05 09:17+0100\n"
+"Report-Msgid-Bugs-To: bug-binutils@gnu.org\n"
+"POT-Creation-Date: 2009-03-20 08:50+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,90 +24,162 @@
 msgid "jump hint unaligned"
 msgstr ""
 
+#. -- assembler routines inserted here.
+#. -- asm.c
+#: arc-asm.c:54 frv-asm.c:972 iq2000-asm.c:56 m32c-asm.c:141 m32c-asm.c:237
+#: m32c-asm.c:279 m32c-asm.c:338 m32c-asm.c:360 m32r-asm.c:53 mep-asm.c:232
+#: mep-asm.c:250 mep-asm.c:265 mep-asm.c:280 mep-asm.c:292 openrisc-asm.c:54
+msgid "missing `)'"
+msgstr ""
+
+#: arc-asm.c:500 fr30-asm.c:310 frv-asm.c:1263 ip2k-asm.c:511 iq2000-asm.c:459
+#: m32c-asm.c:1589 m32r-asm.c:328 mep-asm.c:1001 mt-asm.c:595
+#: openrisc-asm.c:241 xc16x-asm.c:376 xstormy16-asm.c:276
+#, c-format
+msgid "Unrecognized field %d while parsing.\n"
+msgstr ""
+
+#: arc-asm.c:551 fr30-asm.c:361 frv-asm.c:1314 ip2k-asm.c:562 iq2000-asm.c:510
+#: m32c-asm.c:1640 m32r-asm.c:379 mep-asm.c:1052 mt-asm.c:646
+#: openrisc-asm.c:292 xc16x-asm.c:427 xstormy16-asm.c:327
+msgid "missing mnemonic in syntax string"
+msgstr ""
+
+#. We couldn't parse it.
+#: arc-asm.c:686 arc-asm.c:690 arc-asm.c:777 arc-asm.c:878 fr30-asm.c:496
+#: fr30-asm.c:500 fr30-asm.c:587 fr30-asm.c:688 frv-asm.c:1449 frv-asm.c:1453
+#: frv-asm.c:1540 frv-asm.c:1641 ip2k-asm.c:697 ip2k-asm.c:701 ip2k-asm.c:788
+#: ip2k-asm.c:889 iq2000-asm.c:645 iq2000-asm.c:649 iq2000-asm.c:736
+#: iq2000-asm.c:837 m32c-asm.c:1775 m32c-asm.c:1779 m32c-asm.c:1866
+#: m32c-asm.c:1967 m32r-asm.c:514 m32r-asm.c:518 m32r-asm.c:605 m32r-asm.c:706
+#: mep-asm.c:1187 mep-asm.c:1191 mep-asm.c:1278 mep-asm.c:1379 mt-asm.c:781
+#: mt-asm.c:785 mt-asm.c:872 mt-asm.c:973 openrisc-asm.c:427
+#: openrisc-asm.c:431 openrisc-asm.c:518 openrisc-asm.c:619 xc16x-asm.c:562
+#: xc16x-asm.c:566 xc16x-asm.c:653 xc16x-asm.c:754 xstormy16-asm.c:462
+#: xstormy16-asm.c:466 xstormy16-asm.c:553 xstormy16-asm.c:654
+msgid "unrecognized instruction"
+msgstr ""
+
+#: arc-asm.c:733 fr30-asm.c:543 frv-asm.c:1496 ip2k-asm.c:744 iq2000-asm.c:692
+#: m32c-asm.c:1822 m32r-asm.c:561 mep-asm.c:1234 mt-asm.c:828
+#: openrisc-asm.c:474 xc16x-asm.c:609 xstormy16-asm.c:509
+#, c-format
+msgid "syntax error (expected char `%c', found `%c')"
+msgstr ""
+
+#: arc-asm.c:743 fr30-asm.c:553 frv-asm.c:1506 ip2k-asm.c:754 iq2000-asm.c:702
+#: m32c-asm.c:1832 m32r-asm.c:571 mep-asm.c:1244 mt-asm.c:838
+#: openrisc-asm.c:484 xc16x-asm.c:619 xstormy16-asm.c:519
+#, c-format
+msgid "syntax error (expected char `%c', found end of instruction)"
+msgstr ""
+
+#: arc-asm.c:771 fr30-asm.c:581 frv-asm.c:1534 ip2k-asm.c:782 iq2000-asm.c:730
+#: m32c-asm.c:1860 m32r-asm.c:599 mep-asm.c:1272 mt-asm.c:866
+#: openrisc-asm.c:512 xc16x-asm.c:647 xstormy16-asm.c:547
+msgid "junk at end of line"
+msgstr ""
+
+#: arc-asm.c:877 fr30-asm.c:687 frv-asm.c:1640 ip2k-asm.c:888 iq2000-asm.c:836
+#: m32c-asm.c:1966 m32r-asm.c:705 mep-asm.c:1378 mt-asm.c:972
+#: openrisc-asm.c:618 xc16x-asm.c:753 xstormy16-asm.c:653
+msgid "unrecognized form of instruction"
+msgstr ""
+
+#: arc-asm.c:889 fr30-asm.c:699 frv-asm.c:1652 ip2k-asm.c:900 iq2000-asm.c:848
+#: m32c-asm.c:1978 m32r-asm.c:717 mep-asm.c:1390 mt-asm.c:984
+#: openrisc-asm.c:630 xc16x-asm.c:765 xstormy16-asm.c:665
+#, c-format
+msgid "bad instruction `%.50s...'"
+msgstr ""
+
+#: arc-asm.c:892 fr30-asm.c:702 frv-asm.c:1655 ip2k-asm.c:903 iq2000-asm.c:851
+#: m32c-asm.c:1981 m32r-asm.c:720 mep-asm.c:1393 mt-asm.c:987
+#: openrisc-asm.c:633 xc16x-asm.c:768 xstormy16-asm.c:668
+#, c-format
+msgid "bad instruction `%.50s'"
+msgstr ""
+
 #: arc-dis.c:77
 msgid "Illegal limm reference in last instruction!\n"
 msgstr ""
 
-#: arc-opc.c:386
-msgid "unable to fit different valued constants into instruction"
+#. Default text to print if an instruction isn't recognized.
+#: arc-dis-cgen.c:45 fr30-dis.c:41 frv-dis.c:41 ip2k-dis.c:41 iq2000-dis.c:41
+#: m32c-dis.c:41 m32r-dis.c:41 mep-dis.c:41 mmix-dis.c:278 mt-dis.c:41
+#: openrisc-dis.c:41 xc16x-dis.c:41 xstormy16-dis.c:41
+msgid "*unknown*"
 msgstr ""
 
-#: arc-opc.c:395
-msgid "auxiliary register not allowed here"
-msgstr ""
-
-#: arc-opc.c:401 arc-opc.c:418
-msgid "attempt to set readonly register"
-msgstr ""
-
-#: arc-opc.c:406 arc-opc.c:423
-msgid "attempt to read writeonly register"
-msgstr ""
-
-#: arc-opc.c:428
+#: arc-dis-cgen.c:395 fr30-dis.c:299 frv-dis.c:396 ip2k-dis.c:288
+#: iq2000-dis.c:189 m32c-dis.c:891 m32r-dis.c:256 mep-dis.c:776 mt-dis.c:290
+#: openrisc-dis.c:135 xc16x-dis.c:375 xstormy16-dis.c:168
 #, c-format
-msgid "invalid register number `%d'"
+msgid "Unrecognized field %d while printing insn.\n"
 msgstr ""
 
-#: arc-opc.c:594 arc-opc.c:645 arc-opc.c:673
-msgid "too many long constants"
+#: arc-ibld.c:163 fr30-ibld.c:163 frv-ibld.c:163 ip2k-ibld.c:163
+#: iq2000-ibld.c:163 m32c-ibld.c:163 m32r-ibld.c:163 mep-ibld.c:163
+#: mt-ibld.c:163 openrisc-ibld.c:163 xc16x-ibld.c:163 xstormy16-ibld.c:163
+#, c-format
+msgid "operand out of range (%ld not between %ld and %lu)"
 msgstr ""
 
-#: arc-opc.c:668
-msgid "to many shimms in load"
+#: arc-ibld.c:184 fr30-ibld.c:184 frv-ibld.c:184 ip2k-ibld.c:184
+#: iq2000-ibld.c:184 m32c-ibld.c:184 m32r-ibld.c:184 mep-ibld.c:184
+#: mt-ibld.c:184 openrisc-ibld.c:184 xc16x-ibld.c:184 xstormy16-ibld.c:184
+#, c-format
+msgid "operand out of range (0x%lx not between 0 and 0x%lx)"
 msgstr ""
 
-#. Do we have a limm already?
-#: arc-opc.c:781
-msgid "impossible store"
+#: arc-ibld.c:200 cgen-asm.c:336 fr30-ibld.c:200 frv-ibld.c:200
+#: ip2k-ibld.c:200 iq2000-ibld.c:200 m32c-ibld.c:200 m32r-ibld.c:200
+#: mep-ibld.c:200 mt-ibld.c:200 openrisc-ibld.c:200 xc16x-ibld.c:200
+#: xstormy16-ibld.c:200
+#, c-format
+msgid "operand out of range (%ld not between %ld and %ld)"
 msgstr ""
 
-#: arc-opc.c:814
-msgid "st operand error"
+#: arc-ibld.c:954 fr30-ibld.c:726 frv-ibld.c:852 ip2k-ibld.c:603
+#: iq2000-ibld.c:709 m32c-ibld.c:1727 m32r-ibld.c:661 mep-ibld.c:1024
+#: mt-ibld.c:745 openrisc-ibld.c:629 xc16x-ibld.c:748 xstormy16-ibld.c:674
+#, c-format
+msgid "Unrecognized field %d while building insn.\n"
 msgstr ""
 
-#: arc-opc.c:818 arc-opc.c:860
-msgid "address writeback not allowed"
+#: arc-ibld.c:1355 fr30-ibld.c:931 frv-ibld.c:1169 ip2k-ibld.c:678
+#: iq2000-ibld.c:884 m32c-ibld.c:2888 m32r-ibld.c:798 mep-ibld.c:1444
+#: mt-ibld.c:965 openrisc-ibld.c:729 xc16x-ibld.c:968 xstormy16-ibld.c:820
+#, c-format
+msgid "Unrecognized field %d while decoding insn.\n"
 msgstr ""
 
-#: arc-opc.c:822
-msgid "store value must be zero"
+#: arc-ibld.c:1618 fr30-ibld.c:1077 frv-ibld.c:1447 ip2k-ibld.c:752
+#: iq2000-ibld.c:1015 m32c-ibld.c:3505 m32r-ibld.c:911 mep-ibld.c:1737
+#: mt-ibld.c:1165 openrisc-ibld.c:806 xc16x-ibld.c:1189 xstormy16-ibld.c:930
+#, c-format
+msgid "Unrecognized field %d while getting int operand.\n"
 msgstr ""
 
-#: arc-opc.c:847
-msgid "invalid load/shimm insn"
+#: arc-ibld.c:1863 fr30-ibld.c:1205 frv-ibld.c:1707 ip2k-ibld.c:808
+#: iq2000-ibld.c:1128 m32c-ibld.c:4104 m32r-ibld.c:1006 mep-ibld.c:2012
+#: mt-ibld.c:1347 openrisc-ibld.c:865 xc16x-ibld.c:1392 xstormy16-ibld.c:1022
+#, c-format
+msgid "Unrecognized field %d while getting vma operand.\n"
 msgstr ""
 
-#: arc-opc.c:856
-msgid "ld operand error"
+#: arc-ibld.c:2096 fr30-ibld.c:1336 frv-ibld.c:1974 ip2k-ibld.c:867
+#: iq2000-ibld.c:1248 m32c-ibld.c:4691 m32r-ibld.c:1107 mep-ibld.c:2271
+#: mt-ibld.c:1536 openrisc-ibld.c:931 xc16x-ibld.c:1596 xstormy16-ibld.c:1121
+#, c-format
+msgid "Unrecognized field %d while setting int operand.\n"
 msgstr ""
 
-#: arc-opc.c:943
-msgid "jump flags, but no .f seen"
-msgstr ""
-
-#: arc-opc.c:946
-msgid "jump flags, but no limm addr"
-msgstr ""
-
-#: arc-opc.c:949
-msgid "flag bits of jump address limm lost"
-msgstr ""
-
-#: arc-opc.c:952
-msgid "attempt to set HR bits"
-msgstr ""
-
-#: arc-opc.c:955
-msgid "bad jump flags value"
-msgstr ""
-
-#: arc-opc.c:988
-msgid "branch address not on 4 byte boundary"
-msgstr ""
-
-#: arc-opc.c:1024
-msgid "must specify .jd or no nullify suffix"
+#: arc-ibld.c:2319 fr30-ibld.c:1457 frv-ibld.c:2231 ip2k-ibld.c:916
+#: iq2000-ibld.c:1358 m32c-ibld.c:5268 m32r-ibld.c:1198 mep-ibld.c:2520
+#: mt-ibld.c:1715 openrisc-ibld.c:987 xc16x-ibld.c:1790 xstormy16-ibld.c:1210
+#, c-format
+msgid "Unrecognized field %d while setting vma operand.\n"
 msgstr ""
 
 #: arm-dis.c:1808
@@ -126,7 +198,7 @@
 msgid "Unrecognised disassembler option: %s\n"
 msgstr ""
 
-#: arm-dis.c:4226
+#: arm-dis.c:4227
 #, c-format
 msgid ""
 "\n"
@@ -149,13 +221,6 @@
 msgid "unknown constraint `%c'"
 msgstr ""
 
-#: cgen-asm.c:336 fr30-ibld.c:200 frv-ibld.c:200 ip2k-ibld.c:200
-#: iq2000-ibld.c:200 m32c-ibld.c:200 m32r-ibld.c:200 mep-ibld.c:200
-#: mt-ibld.c:200 openrisc-ibld.c:200 xc16x-ibld.c:200 xstormy16-ibld.c:200
-#, c-format
-msgid "operand out of range (%ld not between %ld and %ld)"
-msgstr ""
-
 #: cgen-asm.c:358
 #, c-format
 msgid "operand out of range (%lu not between %lu and %lu)"
@@ -193,144 +258,6 @@
 msgid "Register list is not valid"
 msgstr ""
 
-#: fr30-asm.c:310 frv-asm.c:1263 ip2k-asm.c:511 iq2000-asm.c:459
-#: m32c-asm.c:1589 m32r-asm.c:328 mep-asm.c:1001 mt-asm.c:595
-#: openrisc-asm.c:241 xc16x-asm.c:375 xstormy16-asm.c:276
-#, c-format
-msgid "Unrecognized field %d while parsing.\n"
-msgstr ""
-
-#: fr30-asm.c:361 frv-asm.c:1314 ip2k-asm.c:562 iq2000-asm.c:510
-#: m32c-asm.c:1640 m32r-asm.c:379 mep-asm.c:1052 mt-asm.c:646
-#: openrisc-asm.c:292 xc16x-asm.c:426 xstormy16-asm.c:327
-msgid "missing mnemonic in syntax string"
-msgstr ""
-
-#. We couldn't parse it.
-#: fr30-asm.c:496 fr30-asm.c:500 fr30-asm.c:587 fr30-asm.c:688 frv-asm.c:1449
-#: frv-asm.c:1453 frv-asm.c:1540 frv-asm.c:1641 ip2k-asm.c:697 ip2k-asm.c:701
-#: ip2k-asm.c:788 ip2k-asm.c:889 iq2000-asm.c:645 iq2000-asm.c:649
-#: iq2000-asm.c:736 iq2000-asm.c:837 m32c-asm.c:1775 m32c-asm.c:1779
-#: m32c-asm.c:1866 m32c-asm.c:1967 m32r-asm.c:514 m32r-asm.c:518
-#: m32r-asm.c:605 m32r-asm.c:706 mep-asm.c:1187 mep-asm.c:1191 mep-asm.c:1278
-#: mep-asm.c:1379 mt-asm.c:781 mt-asm.c:785 mt-asm.c:872 mt-asm.c:973
-#: openrisc-asm.c:427 openrisc-asm.c:431 openrisc-asm.c:518 openrisc-asm.c:619
-#: xc16x-asm.c:561 xc16x-asm.c:565 xc16x-asm.c:652 xc16x-asm.c:753
-#: xstormy16-asm.c:462 xstormy16-asm.c:466 xstormy16-asm.c:553
-#: xstormy16-asm.c:654
-msgid "unrecognized instruction"
-msgstr ""
-
-#: fr30-asm.c:543 frv-asm.c:1496 ip2k-asm.c:744 iq2000-asm.c:692
-#: m32c-asm.c:1822 m32r-asm.c:561 mep-asm.c:1234 mt-asm.c:828
-#: openrisc-asm.c:474 xc16x-asm.c:608 xstormy16-asm.c:509
-#, c-format
-msgid "syntax error (expected char `%c', found `%c')"
-msgstr ""
-
-#: fr30-asm.c:553 frv-asm.c:1506 ip2k-asm.c:754 iq2000-asm.c:702
-#: m32c-asm.c:1832 m32r-asm.c:571 mep-asm.c:1244 mt-asm.c:838
-#: openrisc-asm.c:484 xc16x-asm.c:618 xstormy16-asm.c:519
-#, c-format
-msgid "syntax error (expected char `%c', found end of instruction)"
-msgstr ""
-
-#: fr30-asm.c:581 frv-asm.c:1534 ip2k-asm.c:782 iq2000-asm.c:730
-#: m32c-asm.c:1860 m32r-asm.c:599 mep-asm.c:1272 mt-asm.c:866
-#: openrisc-asm.c:512 xc16x-asm.c:646 xstormy16-asm.c:547
-msgid "junk at end of line"
-msgstr ""
-
-#: fr30-asm.c:687 frv-asm.c:1640 ip2k-asm.c:888 iq2000-asm.c:836
-#: m32c-asm.c:1966 m32r-asm.c:705 mep-asm.c:1378 mt-asm.c:972
-#: openrisc-asm.c:618 xc16x-asm.c:752 xstormy16-asm.c:653
-msgid "unrecognized form of instruction"
-msgstr ""
-
-#: fr30-asm.c:699 frv-asm.c:1652 ip2k-asm.c:900 iq2000-asm.c:848
-#: m32c-asm.c:1978 m32r-asm.c:717 mep-asm.c:1390 mt-asm.c:984
-#: openrisc-asm.c:630 xc16x-asm.c:764 xstormy16-asm.c:665
-#, c-format
-msgid "bad instruction `%.50s...'"
-msgstr ""
-
-#: fr30-asm.c:702 frv-asm.c:1655 ip2k-asm.c:903 iq2000-asm.c:851
-#: m32c-asm.c:1981 m32r-asm.c:720 mep-asm.c:1393 mt-asm.c:987
-#: openrisc-asm.c:633 xc16x-asm.c:767 xstormy16-asm.c:668
-#, c-format
-msgid "bad instruction `%.50s'"
-msgstr ""
-
-#. Default text to print if an instruction isn't recognized.
-#: fr30-dis.c:41 frv-dis.c:41 ip2k-dis.c:41 iq2000-dis.c:41 m32c-dis.c:41
-#: m32r-dis.c:41 mep-dis.c:41 mmix-dis.c:278 mt-dis.c:41 openrisc-dis.c:41
-#: xc16x-dis.c:41 xstormy16-dis.c:41
-msgid "*unknown*"
-msgstr ""
-
-#: fr30-dis.c:299 frv-dis.c:396 ip2k-dis.c:288 iq2000-dis.c:189 m32c-dis.c:891
-#: m32r-dis.c:256 mep-dis.c:776 mt-dis.c:290 openrisc-dis.c:135
-#: xc16x-dis.c:375 xstormy16-dis.c:168
-#, c-format
-msgid "Unrecognized field %d while printing insn.\n"
-msgstr ""
-
-#: fr30-ibld.c:163 frv-ibld.c:163 ip2k-ibld.c:163 iq2000-ibld.c:163
-#: m32c-ibld.c:163 m32r-ibld.c:163 mep-ibld.c:163 mt-ibld.c:163
-#: openrisc-ibld.c:163 xc16x-ibld.c:163 xstormy16-ibld.c:163
-#, c-format
-msgid "operand out of range (%ld not between %ld and %lu)"
-msgstr ""
-
-#: fr30-ibld.c:184 frv-ibld.c:184 ip2k-ibld.c:184 iq2000-ibld.c:184
-#: m32c-ibld.c:184 m32r-ibld.c:184 mep-ibld.c:184 mt-ibld.c:184
-#: openrisc-ibld.c:184 xc16x-ibld.c:184 xstormy16-ibld.c:184
-#, c-format
-msgid "operand out of range (0x%lx not between 0 and 0x%lx)"
-msgstr ""
-
-#: fr30-ibld.c:726 frv-ibld.c:852 ip2k-ibld.c:603 iq2000-ibld.c:709
-#: m32c-ibld.c:1727 m32r-ibld.c:661 mep-ibld.c:1024 mt-ibld.c:745
-#: openrisc-ibld.c:629 xc16x-ibld.c:748 xstormy16-ibld.c:674
-#, c-format
-msgid "Unrecognized field %d while building insn.\n"
-msgstr ""
-
-#: fr30-ibld.c:931 frv-ibld.c:1169 ip2k-ibld.c:678 iq2000-ibld.c:884
-#: m32c-ibld.c:2888 m32r-ibld.c:798 mep-ibld.c:1444 mt-ibld.c:965
-#: openrisc-ibld.c:729 xc16x-ibld.c:968 xstormy16-ibld.c:820
-#, c-format
-msgid "Unrecognized field %d while decoding insn.\n"
-msgstr ""
-
-#: fr30-ibld.c:1077 frv-ibld.c:1447 ip2k-ibld.c:752 iq2000-ibld.c:1015
-#: m32c-ibld.c:3505 m32r-ibld.c:911 mep-ibld.c:1737 mt-ibld.c:1165
-#: openrisc-ibld.c:806 xc16x-ibld.c:1189 xstormy16-ibld.c:930
-#, c-format
-msgid "Unrecognized field %d while getting int operand.\n"
-msgstr ""
-
-#: fr30-ibld.c:1205 frv-ibld.c:1707 ip2k-ibld.c:808 iq2000-ibld.c:1128
-#: m32c-ibld.c:4104 m32r-ibld.c:1006 mep-ibld.c:2012 mt-ibld.c:1347
-#: openrisc-ibld.c:865 xc16x-ibld.c:1392 xstormy16-ibld.c:1022
-#, c-format
-msgid "Unrecognized field %d while getting vma operand.\n"
-msgstr ""
-
-#: fr30-ibld.c:1336 frv-ibld.c:1974 ip2k-ibld.c:867 iq2000-ibld.c:1248
-#: m32c-ibld.c:4691 m32r-ibld.c:1107 mep-ibld.c:2271 mt-ibld.c:1536
-#: openrisc-ibld.c:931 xc16x-ibld.c:1596 xstormy16-ibld.c:1121
-#, c-format
-msgid "Unrecognized field %d while setting int operand.\n"
-msgstr ""
-
-#: fr30-ibld.c:1457 frv-ibld.c:2231 ip2k-ibld.c:916 iq2000-ibld.c:1358
-#: m32c-ibld.c:5268 m32r-ibld.c:1198 mep-ibld.c:2520 mt-ibld.c:1715
-#: openrisc-ibld.c:987 xc16x-ibld.c:1790 xstormy16-ibld.c:1210
-#, c-format
-msgid "Unrecognized field %d while setting vma operand.\n"
-msgstr ""
-
 #: frv-asm.c:608
 msgid "missing `]'"
 msgstr ""
@@ -347,14 +274,6 @@
 msgid "register number must be even"
 msgstr ""
 
-#. -- assembler routines inserted here.
-#. -- asm.c
-#: frv-asm.c:972 iq2000-asm.c:56 m32c-asm.c:141 m32c-asm.c:237 m32c-asm.c:279
-#: m32c-asm.c:338 m32c-asm.c:360 m32r-asm.c:53 mep-asm.c:232 mep-asm.c:250
-#: mep-asm.c:265 mep-asm.c:280 mep-asm.c:292 openrisc-asm.c:54
-msgid "missing `)'"
-msgstr ""
-
 #: h8300-dis.c:327
 #, c-format
 msgid "Hmmmm 0x%x"
@@ -376,11 +295,11 @@
 msgid "%02x\t\t*unknown*"
 msgstr ""
 
-#: i386-dis.c:3196
+#: i386-dis.c:4906
 msgid "<internal disassembler error>"
 msgstr ""
 
-#: i386-dis.c:3423
+#: i386-dis.c:5134
 #, c-format
 msgid ""
 "\n"
@@ -389,79 +308,120 @@
 "with the -M switch (multiple options should be separated by commas):\n"
 msgstr ""
 
-#: i386-dis.c:3427
+#: i386-dis.c:5138
 #, c-format
 msgid "  x86-64      Disassemble in 64bit mode\n"
 msgstr ""
 
-#: i386-dis.c:3428
+#: i386-dis.c:5139
 #, c-format
 msgid "  i386        Disassemble in 32bit mode\n"
 msgstr ""
 
-#: i386-dis.c:3429
+#: i386-dis.c:5140
 #, c-format
 msgid "  i8086       Disassemble in 16bit mode\n"
 msgstr ""
 
-#: i386-dis.c:3430
+#: i386-dis.c:5141
 #, c-format
 msgid "  att         Display instruction in AT&T syntax\n"
 msgstr ""
 
-#: i386-dis.c:3431
+#: i386-dis.c:5142
 #, c-format
 msgid "  intel       Display instruction in Intel syntax\n"
 msgstr ""
 
-#: i386-dis.c:3432
+#: i386-dis.c:5143
+#, c-format
+msgid ""
+"  att-mnemonic\n"
+"              Display instruction in AT&T mnemonic\n"
+msgstr ""
+
+#: i386-dis.c:5145
+#, c-format
+msgid ""
+"  intel-mnemonic\n"
+"              Display instruction in Intel mnemonic\n"
+msgstr ""
+
+#: i386-dis.c:5147
 #, c-format
 msgid "  addr64      Assume 64bit address size\n"
 msgstr ""
 
-#: i386-dis.c:3433
+#: i386-dis.c:5148
 #, c-format
 msgid "  addr32      Assume 32bit address size\n"
 msgstr ""
 
-#: i386-dis.c:3434
+#: i386-dis.c:5149
 #, c-format
 msgid "  addr16      Assume 16bit address size\n"
 msgstr ""
 
-#: i386-dis.c:3435
+#: i386-dis.c:5150
 #, c-format
 msgid "  data32      Assume 32bit data size\n"
 msgstr ""
 
-#: i386-dis.c:3436
+#: i386-dis.c:5151
 #, c-format
 msgid "  data16      Assume 16bit data size\n"
 msgstr ""
 
-#: i386-dis.c:3437
+#: i386-dis.c:5152
 #, c-format
 msgid "  suffix      Always display instruction suffix in AT&T syntax\n"
 msgstr ""
 
-#: i386-gen.c:42 ia64-gen.c:307
+#: i386-gen.c:372 ia64-gen.c:307
 #, c-format
 msgid "%s: Error: "
 msgstr ""
 
-#: i386-gen.c:109
-msgid "can't find i386-opc.tbl for reading\n"
+#: i386-gen.c:471
+#, c-format
+msgid "%s: %d: Unknown bitfield: %s\n"
 msgstr ""
 
-#: i386-gen.c:260
-msgid "can't find i386-reg.tbl for reading\n"
+#: i386-gen.c:635
+#, c-format
+msgid "can't find i386-opc.tbl for reading, errno = %s\n"
 msgstr ""
 
-#: i386-gen.c:386 ia64-gen.c:2841
+#: i386-gen.c:812
+#, c-format
+msgid "can't find i386-reg.tbl for reading, errno = %s\n"
+msgstr ""
+
+#: i386-gen.c:904
+#, c-format
+msgid "can't create i386-init.h, errno = %s\n"
+msgstr ""
+
+#: i386-gen.c:993 ia64-gen.c:2848
 #, c-format
 msgid "unable to change directory to \"%s\", errno = %s\n"
 msgstr ""
 
+#: i386-gen.c:1000
+#, c-format
+msgid "%d unused bits in i386_cpu_flags.\n"
+msgstr ""
+
+#: i386-gen.c:1007
+#, c-format
+msgid "%d unused bits in i386_operand_type.\n"
+msgstr ""
+
+#: i386-gen.c:1021
+#, c-format
+msgid "can't create i386-tbl.h, errno = %s\n"
+msgstr ""
+
 #: ia64-gen.c:320
 #, c-format
 msgid "%s: Warning: "
@@ -498,62 +458,67 @@
 msgid "overwriting note %d with note %d (IC:%s)\n"
 msgstr ""
 
-#: ia64-gen.c:1455
+#: ia64-gen.c:1457
 #, c-format
 msgid "don't know how to specify %% dependency %s\n"
 msgstr ""
 
-#: ia64-gen.c:1477
+#: ia64-gen.c:1479
 #, c-format
 msgid "Don't know how to specify # dependency %s\n"
 msgstr ""
 
-#: ia64-gen.c:1516
+#: ia64-gen.c:1518
 #, c-format
 msgid "IC:%s [%s] has no terminals or sub-classes\n"
 msgstr ""
 
-#: ia64-gen.c:1519
+#: ia64-gen.c:1521
 #, c-format
 msgid "IC:%s has no terminals or sub-classes\n"
 msgstr ""
 
-#: ia64-gen.c:1528
+#: ia64-gen.c:1530
 #, c-format
 msgid "no insns mapped directly to terminal IC %s [%s]"
 msgstr ""
 
-#: ia64-gen.c:1531
+#: ia64-gen.c:1533
 #, c-format
 msgid "no insns mapped directly to terminal IC %s\n"
 msgstr ""
 
-#: ia64-gen.c:1542
+#: ia64-gen.c:1544
 #, c-format
 msgid "class %s is defined but not used\n"
 msgstr ""
 
-#: ia64-gen.c:1553
+#: ia64-gen.c:1557
 #, c-format
-msgid "Warning: rsrc %s (%s) has no chks%s\n"
+msgid "Warning: rsrc %s (%s) has no chks\n"
 msgstr ""
 
-#: ia64-gen.c:1557
+#: ia64-gen.c:1560
+#, c-format
+msgid "Warning: rsrc %s (%s) has no chks or regs\n"
+msgstr ""
+
+#: ia64-gen.c:1564
 #, c-format
 msgid "rsrc %s (%s) has no regs\n"
 msgstr ""
 
-#: ia64-gen.c:2469
+#: ia64-gen.c:2476
 #, c-format
 msgid "IC note %d in opcode %s (IC:%s) conflicts with resource %s note %d\n"
 msgstr ""
 
-#: ia64-gen.c:2497
+#: ia64-gen.c:2504
 #, c-format
 msgid "IC note %d for opcode %s (IC:%s) conflicts with resource %s note %d\n"
 msgstr ""
 
-#: ia64-gen.c:2511
+#: ia64-gen.c:2518
 #, c-format
 msgid "opcode %s has no class (ops %d %d %d)\n"
 msgstr ""
@@ -734,26 +699,26 @@
 msgid "invalid %function() here"
 msgstr ""
 
-#: mips-dis.c:745
+#: mips-dis.c:781
 msgid "# internal error, incomplete extension sequence (+)"
 msgstr ""
 
-#: mips-dis.c:852
+#: mips-dis.c:888
 #, c-format
 msgid "# internal error, undefined extension sequence (+%c)"
 msgstr ""
 
-#: mips-dis.c:1211
+#: mips-dis.c:1247
 #, c-format
-msgid "# internal error, undefined modifier(%c)"
+msgid "# internal error, undefined modifier (%c)"
 msgstr ""
 
-#: mips-dis.c:1818
+#: mips-dis.c:1854
 #, c-format
 msgid "# internal disassembler error, unrecognised modifier (%c)"
 msgstr ""
 
-#: mips-dis.c:2049
+#: mips-dis.c:2085
 #, c-format
 msgid ""
 "\n"
@@ -761,7 +726,7 @@
 "with the -M switch (multiple options should be separated by commas):\n"
 msgstr ""
 
-#: mips-dis.c:2053
+#: mips-dis.c:2089
 #, c-format
 msgid ""
 "\n"
@@ -769,7 +734,7 @@
 "                           Default: based on binary being disassembled.\n"
 msgstr ""
 
-#: mips-dis.c:2057
+#: mips-dis.c:2093
 #, c-format
 msgid ""
 "\n"
@@ -777,7 +742,7 @@
 "                           Default: numeric.\n"
 msgstr ""
 
-#: mips-dis.c:2061
+#: mips-dis.c:2097
 #, c-format
 msgid ""
 "\n"
@@ -786,7 +751,7 @@
 "                           Default: based on binary being disassembled.\n"
 msgstr ""
 
-#: mips-dis.c:2066
+#: mips-dis.c:2102
 #, c-format
 msgid ""
 "\n"
@@ -795,7 +760,7 @@
 "                           Default: based on binary being disassembled.\n"
 msgstr ""
 
-#: mips-dis.c:2071
+#: mips-dis.c:2107
 #, c-format
 msgid ""
 "\n"
@@ -803,7 +768,7 @@
 "                           specified ABI.\n"
 msgstr ""
 
-#: mips-dis.c:2075
+#: mips-dis.c:2111
 #, c-format
 msgid ""
 "\n"
@@ -811,7 +776,7 @@
 "                           specified architecture.\n"
 msgstr ""
 
-#: mips-dis.c:2079
+#: mips-dis.c:2115
 #, c-format
 msgid ""
 "\n"
@@ -819,12 +784,12 @@
 "   "
 msgstr ""
 
-#: mips-dis.c:2084 mips-dis.c:2092 mips-dis.c:2094
+#: mips-dis.c:2120 mips-dis.c:2128 mips-dis.c:2130
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: mips-dis.c:2086
+#: mips-dis.c:2122
 #, c-format
 msgid ""
 "\n"
@@ -860,8 +825,7 @@
 msgstr ""
 
 #: mt-asm.c:157
-#, c-format
-msgid "%operator operand is not a symbol"
+msgid "The percent-operator's operand is not a symbol"
 msgstr ""
 
 #: mt-asm.c:395
@@ -878,39 +842,39 @@
 msgid "$<undefined>"
 msgstr ""
 
-#: ppc-opc.c:782 ppc-opc.c:810
+#: ppc-opc.c:801 ppc-opc.c:829
 msgid "invalid conditional option"
 msgstr ""
 
-#: ppc-opc.c:812
+#: ppc-opc.c:831
 msgid "attempt to set y bit when using + or - modifier"
 msgstr ""
 
-#: ppc-opc.c:844
+#: ppc-opc.c:863
 msgid "invalid mask field"
 msgstr ""
 
-#: ppc-opc.c:870
+#: ppc-opc.c:889
 msgid "ignoring invalid mfcr mask"
 msgstr ""
 
-#: ppc-opc.c:920 ppc-opc.c:955
+#: ppc-opc.c:939 ppc-opc.c:974
 msgid "illegal bitmask"
 msgstr ""
 
-#: ppc-opc.c:1075
+#: ppc-opc.c:1094
 msgid "index register in load range"
 msgstr ""
 
-#: ppc-opc.c:1091
+#: ppc-opc.c:1110
 msgid "source and target register operands must be different"
 msgstr ""
 
-#: ppc-opc.c:1106
+#: ppc-opc.c:1125
 msgid "invalid register operand when updating"
 msgstr ""
 
-#: ppc-opc.c:1188
+#: ppc-opc.c:1207
 msgid "invalid sprg number"
 msgstr ""
 
@@ -997,27 +961,27 @@
 msgid "immediate value must be even"
 msgstr ""
 
-#: xc16x-asm.c:65
+#: xc16x-asm.c:66
 msgid "Missing '#' prefix"
 msgstr ""
 
-#: xc16x-asm.c:81
+#: xc16x-asm.c:82
 msgid "Missing '.' prefix"
 msgstr ""
 
-#: xc16x-asm.c:97
+#: xc16x-asm.c:98
 msgid "Missing 'pof:' prefix"
 msgstr ""
 
-#: xc16x-asm.c:113
+#: xc16x-asm.c:114
 msgid "Missing 'pag:' prefix"
 msgstr ""
 
-#: xc16x-asm.c:129
+#: xc16x-asm.c:130
 msgid "Missing 'sof:' prefix"
 msgstr ""
 
-#: xc16x-asm.c:145
+#: xc16x-asm.c:146
 msgid "Missing 'seg:' prefix"
 msgstr ""
 
diff --git a/sim/arc/ChangeLog b/sim/arc/ChangeLog
index a740378..f34493b 100644
--- a/sim/arc/ChangeLog
+++ b/sim/arc/ChangeLog
@@ -1,3 +1,10 @@
+2009-03-20  J"orn Rennecke  <joern.rennecke@arc.com>
+
+	* sim-if.c: Fixed some of the formatting issues.
+	(stack_setup): Always push environment.
+	(sim_create_inferior): Clear envp if PUSH_ENVIRONMENT_ONTO_STACK
+	is not set.
+
 2008-11-18  J"orn Rennecke  <joern.rennecke@arc.com>
 
 	* sem5.c, sem6.c, sem7.c: Regenerate.
diff --git a/sim/arc/Makefile.in b/sim/arc/Makefile.in
index cb32de2..532d57b 100644
--- a/sim/arc/Makefile.in
+++ b/sim/arc/Makefile.in
@@ -21,7 +21,7 @@
 
 ## COMMON_PRE_CONFIG_FRAG
 
-ARC5_OBJS = arc5.o cpu5.o decode5.o sem5.o model5.o mloop5.o
+ARC5_OBJS = arc5.o cpu5.o decode5.o sem5.o model5.o mloop5.o arc-sim-registers.o
 ARC6_OBJS = arc6.o cpu6.o decode6.o sem6.o model6.o mloop6.o
 ARC7_OBJS = arc7.o cpu7.o decode7.o sem7.o model7.o mloop7.o
 TRAPS_OBJ = @traps_obj@
@@ -75,10 +75,12 @@
 
 ARC5_INCLUDE_DEPS = \
 	$(CGEN_MAIN_CPU_DEPS) \
-	cpu5.h decode5.h eng5.h
+	cpu5.h decode5.h eng5.h arc-sim-registers.h
 
 arc5.o: arc5.c $(ARC5_INCLUDE_DEPS)
 
+arc-sim-registers.o: arc-sim-registers.c arc-sim-registers.h arc-sim.h
+
 # FIXME: Use of `mono' is wip.
 mloop5.c eng5.h: stamp-5mloop
 stamp-5mloop: $(srcdir)/../common/genmloop.sh mloop5.in Makefile
diff --git a/sim/arc/arc-sim-registers.c b/sim/arc/arc-sim-registers.c
new file mode 100644
index 0000000..516deb0
--- /dev/null
+++ b/sim/arc/arc-sim-registers.c
@@ -0,0 +1,149 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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.
+*/
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module implements an interface which the simulator can use to map */
+/*     register numbers as known to gdb to hardware register numbers.         */
+/*                                                                            */
+/******************************************************************************/
+
+#include "arc-sim-registers.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+/* GDB register numbers */
+
+/* N.B. these numbers seem very strange!
+ *
+ *      If the gdb numbers for the core registers are 0 (R0) .. 63 (PCL), and
+ *      the numbers for the aux registers follow on from that range, then surely
+ *      we should have PC_REGNUM = 70 and STATUS32_REGNUM = 71?
+ *
+ *      And where does 2111 for the last auxiliary register come from???!!!
+ *
+ *      In the code below, PC is correctly recognized as AUX_FIRST_REGNUM + 6
+ *      (i.e. 70), and STATUS32 will be handled by the AUX_FIRST_REGNUM ..
+ *      AUX_LAST_REGNUM range - so why are there special cases to map R61
+ *      (reserved) and R63 (PCL) onto STATUS32 and PC, respectively?
+ *
+ *      It might be the case that PCL is being treated the same as PC (although
+ *      the ARC documentation says that for the ARCcompact "the PCL register
+ *      returns the current instruction address, whereas the PC register returns
+ *      the next instruction in sequence") - but then why does the calling code
+ *      not just use the *_h_pcl_get / *_h_pcl_set functions?
+ *
+ *      In any case, PCL is read-only, so mapping it onto the PC would allow
+ *      the debugger user to change the value of PCL, which is surely not what
+ *      is wanted!
+ */
+#define STATUS32_REGNUM         61
+#define PC_REGNUM               63    /* should this be PCL_REGNUM? */
+#define AUX_FIRST_REGNUM        64
+#define AUX_LAST_REGNUM       2111
+
+
+static ARC_RegisterMappingFunction       map     = 0;
+static ARC_AuxRegisterConversionFunction convert = 0;
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
+void arc_hw_register_mapping(int                gdb_regno,
+                             int*               hw_regno,
+                             ARC_RegisterClass* reg_class)
+{
+    /* do we have a mapping? */
+    if (map != 0)
+        (*map)(gdb_regno, hw_regno, reg_class);
+    else
+    {
+        /* OK, do it ourselves ... */
+
+        *hw_regno  = -1;
+        *reg_class = ARC_UNKNOWN_REGISTER;
+
+        if (gdb_regno < 61)
+        {
+            *hw_regno  = gdb_regno;
+            *reg_class = ARC_CORE_REGISTER;
+        }
+        else if (gdb_regno == AUX_FIRST_REGNUM + 6)
+        {
+            *reg_class = ARC_PROGRAM_COUNTER;
+        }
+        else if (AUX_FIRST_REGNUM <= gdb_regno && gdb_regno <= AUX_LAST_REGNUM)
+        {
+            /* N.B. this assumes that the aux registers are contiguous in the
+             *      auxiliary register space, i.e. that there are no gaps, but
+             *      that is not the case!
+             */
+            *hw_regno  = gdb_regno - AUX_FIRST_REGNUM;
+            *reg_class = ARC_AUX_REGISTER;
+        }
+        else /* see comment above */
+        {
+            switch (gdb_regno)
+            {
+                case PC_REGNUM:
+                    *reg_class = ARC_PROGRAM_COUNTER;
+                    break;
+                case STATUS32_REGNUM:
+                    *hw_regno  = 0xA;
+                    *reg_class = ARC_AUX_REGISTER;
+                    break;
+                default :
+                    break;
+            }
+        }
+    }
+}
+
+
+void arc_aux_register_conversion(int gdb_regno, void *buffer)
+{
+    if (convert != 0)
+        convert(gdb_regno, buffer);
+}
+
+
+/* this function allows the debugger to provide a mapping */
+void arc_set_register_mapping(ARC_RegisterMappingFunction function)
+{
+    map = function;
+}
+
+
+void arc_set_aux_register_conversion(ARC_AuxRegisterConversionFunction function)
+{
+    convert = function;
+}
+
+/******************************************************************************/
diff --git a/sim/arc/arc-sim-registers.h b/sim/arc/arc-sim-registers.h
new file mode 100644
index 0000000..3b10f2c
--- /dev/null
+++ b/sim/arc/arc-sim-registers.h
@@ -0,0 +1,63 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Contributed by ARC International (www.arc.com)
+
+   Authors:
+      Richard Stuckey <richard.stuckey@arc.com>
+
+   This file is part of GDB.
+
+   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.
+*/
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This header file defines an interface which the simulator can use to   */
+/*     map register numbers as known to gdb to hardware register numbers.     */
+/*                                                                            */
+/******************************************************************************/
+
+#ifndef ARC_SIM_REGISTERS_H
+#define ARC_SIM_REGISTERS_H
+
+
+typedef enum
+{
+    ARC_UNKNOWN_REGISTER,
+    ARC_CORE_REGISTER,
+    ARC_AUX_REGISTER,
+    ARC_PROGRAM_COUNTER
+} ARC_RegisterClass;
+
+
+typedef void (*ARC_RegisterMappingFunction)(int gdb_regno, int *hw_regno, ARC_RegisterClass *regclass);
+
+typedef void (*ARC_AuxRegisterConversionFunction)(int gdb_regno, void *buffer);
+
+
+void arc_hw_register_mapping(int                gdb_regno,
+                             int               *hw_regno,
+                             ARC_RegisterClass *reg_class);
+
+void arc_aux_register_conversion(int gdb_regno, void *buffer);
+
+void arc_set_register_mapping(ARC_RegisterMappingFunction function);
+
+void arc_set_aux_register_conversion(ARC_AuxRegisterConversionFunction function);
+
+
+#endif /* ARC_SIM_REGISTERS_H */
+/******************************************************************************/
diff --git a/sim/arc/arc-sim.h b/sim/arc/arc-sim.h
index 0eb9bf7..ffb2364 100644
--- a/sim/arc/arc-sim.h
+++ b/sim/arc/arc-sim.h
@@ -21,11 +21,6 @@
 #ifndef ARC_SIM_H
 #define ARC_SIM_H
 
-/* GDB register numbers.  */
-#define STATUS32_REGNUM	61
-#define PC_REGNUM	63
-#define AUX0_REGNUM 64
-#define AUXLAST_REGNUM 2111
 
 extern int arc_decode_gdb_ctrl_regnum (int);
 
diff --git a/sim/arc/arc5.c b/sim/arc/arc5.c
index 8283ea5..7e7910e 100644
--- a/sim/arc/arc5.c
+++ b/sim/arc/arc5.c
@@ -1,5 +1,6 @@
 /* arc simulator support code
-   Copyright (C) 1996, 1997, 1998, 2003, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 2003, 2007, 2008, 2009
+   Free Software Foundation, Inc.
 
    This file is part of GDB, the GNU debugger.
 
@@ -24,58 +25,139 @@
 #include "cgen-mem.h"
 #include "cgen-ops.h"
 
-/* The contents of BUF are in target byte order.  */
+#include "arc-sim-registers.h"
 
-int
-a5f_fetch_register (SIM_CPU *current_cpu, int rn, unsigned char *buf,
-			int len)
-{
-  if (rn < 61)
-    SETTWI (buf, a5f_h_cr_get (current_cpu, rn));
-  else if (rn >= AUX0_REGNUM && rn <= AUXLAST_REGNUM)
-    SETTWI (buf, a5f_h_auxr_get (current_cpu, rn - AUX0_REGNUM));
-  else
-    switch (rn)
-      {
-      case PC_REGNUM :
-	SETTWI (buf, a5f_h_pc_get (current_cpu));
-	break;
-      case STATUS32_REGNUM :
-	SETTWI (buf, a5f_h_auxr_get (current_cpu, 10));
-	break;
-      default :
-	return 0;
-      }
 
-  return -1; /*FIXME*/
-}
+#define STATUS_REGNUM         0
+#define IDENTITY_REGNUM       4
+#define BYTES_IN_REGISTER     4
+
+
+/* N.B. the a5f_h_auxr_get/set functions use the GET_H_AUXR/SET_H_AUXR macros:
+        these have a special case for register number 0 (STATUS) which result in
+        an 'invalid insn' internal error being raised (see CR 95530). 
+  
+        Those macros are no doubt intended to be used in the execution of the
+        object code running on the simulator (where access to the obsolete
+        STATUS register, instead of the newer STATUS32 register, would indeed be
+        an error), but they are also being used by this code that the debugger
+        uses to interact with the simulator (via the sim_fetch_register /
+        sim_store_register functions).
+  
+        So we wish to avoid calling a5f_h_auxr_get/set for the STATUS register.
+        Fortunately, the register is read-only so we can simply ignore a write;
+        for a read, we must "short-circuit" the access by going straight to the
+        default case of the GET_H_AUXR macro (which is "CPU (h_auxr[index])").  */
+
 
 /* The contents of BUF are in target byte order.  */
 
 int
-a5f_store_register (SIM_CPU *current_cpu, int rn, unsigned char *buf,
-			int len)
+a5f_fetch_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
 {
-  if (rn < 61)
-    a5f_h_cr_set (current_cpu, rn, GETTWI (buf));
-  else if (rn >= AUX0_REGNUM && rn <= AUXLAST_REGNUM)
-    a5f_h_auxr_set (current_cpu, rn - AUX0_REGNUM, GETTWI (buf));
-  else
-    switch (rn)
-      {
-      case PC_REGNUM :
-	a5f_h_pc_set (current_cpu, GETTWI (buf));
-	break;
-      case STATUS32_REGNUM :
-	a5f_h_auxr_set (current_cpu, 10, GETTWI (buf));
-	break;
-      default :
-	return 0;
-      }
+  int               hw_regnum;
+  ARC_RegisterClass reg_class;
+  SI                contents;
 
-  return -1; /*FIXME*/
+// printf("*** a5f_fetch_register %d\n", rn);
+
+  arc_hw_register_mapping(rn, &hw_regnum, &reg_class);
+
+  switch (reg_class)
+    {
+    case ARC_UNKNOWN_REGISTER:
+      return 0;
+
+    case ARC_CORE_REGISTER:
+      /* R61 and R62 are reserved - so just return 0.  */
+      if (hw_regnum == 61 || hw_regnum == 62)
+          return 0;
+
+      /* N.B. the simulator does not model PCL (R63) if the instruction does
+	 not refer to it. - so get the current
+              instruction address from PC and compute PCL from it.  */
+      contents = (hw_regnum == 63) ? a5f_h_pc_get (current_cpu) & -4
+                                   : a5f_h_cr_get (current_cpu, hw_regnum);
+      break;
+
+    case ARC_AUX_REGISTER:
+      if (hw_regnum == IDENTITY_REGNUM)
+      {
+        /* Construct a value from the target CPU architecture.  */
+        switch (CPU_MACH(current_cpu)->num)
+          {
+          case MACH_A5    : contents = 0x10;  break;
+          case MACH_ARC600: contents = 0x20;  break;
+          case MACH_ARC700: contents = 0x30;  break;
+          default         : contents = 0x00;  break;
+          }
+      }
+      else
+        /* If it is the STATUS register, make the access directly.  */
+        contents = (hw_regnum == STATUS_REGNUM) ? CPU (h_auxr[STATUS_REGNUM])
+                                                : a5f_h_auxr_get (current_cpu, hw_regnum);
+      break;
+
+    case ARC_PROGRAM_COUNTER:
+      contents = a5f_h_pc_get (current_cpu);
+      break;
+    }
+
+  SETTWI (buf, contents);
+  return BYTES_IN_REGISTER;
 }
 
+
+/* The contents of BUF are in target byte order.  */
+
+int
+a5f_store_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
+{
+  int               hw_regnum;
+  ARC_RegisterClass reg_class;
+
+// printf("*** a5f_store_register %d\n", rn);
+
+  arc_hw_register_mapping(rn, &hw_regnum, &reg_class);
+
+  switch (reg_class)
+    {
+    case ARC_UNKNOWN_REGISTER:
+      break;
+
+    case ARC_CORE_REGISTER:
+      /* R61 and R62 are reserved, and R63 is PCL which is read-only - so just
+         do nothing for them. */
+      if (hw_regnum < 61)
+      {
+          a5f_h_cr_set (current_cpu, hw_regnum, GETTWI (buf));
+          return BYTES_IN_REGISTER;
+      }
+      break;
+
+    case ARC_AUX_REGISTER:
+      /* The STATUS aux reg is read/only, so ignore the write attempt.  */
+      if (hw_regnum != STATUS_REGNUM)
+      {
+          /* Do any required conversion on the given value before writing it to
+             the register (this ensures that bits in reserved fields have the
+             on-write values required by the architecture.  */
+          arc_aux_register_conversion(rn, buf);
+
+          a5f_h_auxr_set (current_cpu, hw_regnum, GETTWI (buf));
+          return BYTES_IN_REGISTER;
+      }
+      break;
+
+    case ARC_PROGRAM_COUNTER:
+      a5f_h_pc_set (current_cpu, GETTWI (buf));
+      return BYTES_IN_REGISTER;
+    }
+
+  return 0;
+}
+
+
 /* Initialize cycle counting for an insn.
    FIRST_P is non-zero if this is the first insn in a set of parallel
    insns.  */
diff --git a/sim/arc/sim-if.c b/sim/arc/sim-if.c
index be4d99e..4c5433d 100644
--- a/sim/arc/sim-if.c
+++ b/sim/arc/sim-if.c
@@ -1,6 +1,6 @@
 /* Main simulator entry points specific to the ARC.
-   Copyright (C) 1996, 1997, 1998, 1999, 2003, 2004, 2005, 2006, 2007, 2008
-   Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2003, 2004, 2005, 2006, 2007, 2008,
+   2009 Free Software Foundation, Inc.
 
    This file is part of GDB, the GNU debugger.
 
@@ -18,10 +18,144 @@
    with this program; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-#include "sim-main.h"
-#include "sim-options.h"
-#include "libiberty.h"
-#include "bfd.h"
+
+/******************************************************************************/
+/*                                                                            */
+/* Outline:                                                                   */
+/*     This module provides operations to:                                    */
+/*                                                                            */
+/*        1) create an "instance" of the ARC simulator                        */
+/*        2) destroy an "instance" of the ARC simulator                       */
+/*        3) create an "inferior" to run on the simulator                     */
+/*        4) execute a simulator-related command                              */
+/*                                                                            */
+/*     N.B. there can be only one simulator instance at a time because of the */
+/*          use of the current_state global variable.                         */
+/*                                                                            */
+/*     This module is also responsible for setting up the "command line"      */
+/*     arguments and environment (name/value pairs) to be passed to the       */
+/*     program that is to be debugged. This data is passed on the stack above */
+/*     the top of stack as it is known to the program.                        */
+/*                                                                            */
+/*     E.g. if we are passing 4 arguments to main, we must place the data on  */
+/*          the stack as:                                                     */
+/*                                                                            */
+/*             .                                                              */
+/*             .                                                              */
+/*          stack[top + A3] <== <arg_3>                                       */
+/*             .                                                              */
+/*             .                                                              */
+/*          stack[top + A2] <== <arg_2>                                       */
+/*             .                                                              */
+/*             .                                                              */
+/*          stack[top + A1] <== <arg_1>                                       */
+/*             .                                                              */
+/*             .                                                              */
+/*          stack[top + A0] <== <arg_0>                                       */
+/*          stack[top + 28] <== 0x0           # ? NULL terminator             */
+/*          stack[top + 24] <== 0x0           # envp NULL terminator          */
+/*          stack[top + 20] <== 0x0           # argv NULL terminator          */
+/*          stack[top + 16] <== TOP + A3      # argv[3]                       */
+/*          stack[top + 12] <== TOP + A2      # argv[2]                       */
+/*          stack[top +  8] <== TOP + A1      # argv[1]                       */
+/*          stack[top +  4] <== TOP + A0      # argv[0]                       */
+/*          stack[top     ] <== 0x4           # argc                          */
+/*                                                                            */
+/*     where TOP = &stack[top]                                                */
+/*       and A0 .. A3 are the offsets of the stored arguments from the stack  */
+/*       top.                                                                 */
+/*                                                                            */
+/*                                                                            */
+/* Notes:                                                                     */
+/*     The interface to this module is somewhat muddled: both sim_open and    */
+/*     sim_create_inferior have a BFD parameter which denotes the executable  */
+/*     file which is to be run; but for sim_open this parameter may be NULL.  */
+/*                                                                            */
+/*     Also, both sim_open and sim_create_inferior have an argv parameter,    */
+/*     but for sim_open *some* of the strings in this array parameter may be  */
+/*     command-line arguments to be passed to the program to be executed,     */
+/*     whilst the others are arguments for the simulator itself; but for      */
+/*     sim_create_inferior, *all* of the strings (if any) in this parameter   */
+/*     are such command-line arguments.                                       */
+/*                                                                            */
+/*     Finally, sim_create_inferior has an envp parameter which holds a set   */
+/*     of name/value pairs to be passed as the environment of the executed    */
+/*     program, whereas sim_open does not; but this is not (currently) done.  */
+/*                                                                            */
+/*                                                                            */
+/*     This complexity arises from the variety of ways in which a simulator   */
+/*     instance may be created and used:                                      */
+/*                                                                            */
+/*       a) the instance may be created by gdb before the executable file is  */
+/*          known; e.g. the user may issue the commands                       */
+/*                                                                            */
+/*              set endian big | little                                       */           
+/*              target sim                                                    */
+/*              file <executable>                                             */
+/*              load                                                          */
+/*              run                                                           */
+/*                                                                            */
+/*          and in this case the BFD parameter to sim_open is NULL, and its   */
+/*          argv parameter does not hold the executable's arguments;          */
+/*                                                                            */
+/*       b) the instance may be created by gdb after the executable file is   */
+/*          known; e.g. the user may issue the commands                       */
+/*                                                                            */
+/*              file <executable>                                             */
+/*              target sim                                                    */
+/*              load                                                          */
+/*              run                                                           */
+/*                                                                            */
+/*          and in this case the BFD parameter to sim_open is non-NULL, and   */
+/*          its argv parameter does not hold the executable's arguments;      */
+/*                                                                            */
+/*       c) the instance may be created by a standalone executable; e.g.      */
+/*          known; e.g. the user may issue the command                        */
+/*                                                                            */
+/*              run <executable> [ <arg1> .. <argN> ]                         */
+/*                                                                            */
+/*          and in this case the BFD parameter to sim_open is non-NULL, and   */
+/*          its argv parameter does hold the executable's arguments.          */
+/*                                                                            */
+/*     Note that in each case, the argv parameter to sim_create_inferior      */
+/*     holds the command-line arguments for the executable (so, there is      */
+/*     apparently no need for them to be passed in the sim_open argv also!).  */
+/*                                                                            */
+/*     The arguments to the executed program may also be specified in several */
+/*     ways; e.g by use of the gdb 'set args' command, or as arguments to the */
+/*     gdb 'run' command; or, in the case of a standalone executable, on the  */
+/*     command line.                                                          */
+/*                                                                            */
+/*     Note that the executable program can be run (by gdb) repeatedly with   */
+/*     different argument lists, i.e. there may be multiple calls of          */
+/*     sim_create_inferior after a call of sim_open; and each of these lists  */
+/*     may require a different amount of memory to hold them on the stack.    */
+/*                                                                            */
+/*                                                                            */
+/*     It is necessary to define a memory region with a particular start      */
+/*     address and size in the simulator memory (all accesses outside this    */
+/*     address range by the executed program are erroneous, thus allowing     */
+/*     invalid accesses to be detected); this region must include the program */
+/*     text, (un)initialized data, heap and stack.  This must also include    */
+/*     the argument/environment data which is passed above the top of the     */
+/*     stack.                                                                 */
+/*                                                                            */
+/*     If the executable file is known (i.e. we have a non-NULL BFD),         */
+/*     the bounds of the memory region required for the program may be        */
+/*     extracted from the section header information in the file; if the      */
+/*     arguments/environment are known, the space required to hold them on    */
+/*     the stack may be computed. This allows the total space to be computed, */
+/*     and so a memory region holding it may be defined.                      */
+/*                                                                            */
+/*     However, if a subsequent execution of the program should require a     */
+/*     greater total space (because its arguments have changed) it is then    */
+/*     necessary to define an additional memory region to provide the extra   */
+/*     space; it is not possible to redefine the existing region, or a new    */
+/*     region of the new size (as memory regions may not overlap).            */
+/*                                                                            */
+/******************************************************************************/
+
+/* system header files */
 
 #ifdef HAVE_STRING_H
 #include <string.h>
@@ -34,13 +168,53 @@
 #include <stdlib.h>
 #endif
 
-static void free_state (SIM_DESC);
-static void print_arc_misc_cpu (SIM_CPU *cpu, int verbose);
+/* simulator / binutils header files */
 
-/* Records simulator descriptor so utilities like arc_dump_regs can be
-   called from gdb.  */
+#include "sim-main.h"
+#include "sim-options.h"
+#include "libiberty.h"
+#include "bfd.h"
+
+
+/* -------------------------------------------------------------------------- */
+/*                         conditional compilation flags                      */
+/* -------------------------------------------------------------------------- */
+
+//#define LOGGING
+//#define PUSH_ENVIRONMENT_ONTO_STACK
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible data                      */
+/* -------------------------------------------------------------------------- */
+
+/* Records simulator descriptor so utilities like arc_dump_regs can be called
+   from gdb.  */
 SIM_DESC current_state;
-
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local data                                   */
+/* -------------------------------------------------------------------------- */
+
+#define DEFAULT_ENVIRONMENT_SPACE     2048
+
+#define TARGET_POINTER_SIZE    4
+#define TARGET_INT_SIZE        4
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local macros                                 */
+/* -------------------------------------------------------------------------- */
+
+#define IS_LITTLE_ENDIAN(abfd)   (abfd) ? bfd_little_endian (abfd) \
+                                        : (CURRENT_TARGET_BYTE_ORDER == LITTLE_ENDIAN)
+
+
+/* -------------------------------------------------------------------------- */
+/*                               local functions                              */
+/* -------------------------------------------------------------------------- */
+
 /* Cover function of sim_state_free to free the cpu buffers as well.  */
 
 static void
@@ -52,158 +226,334 @@
   sim_state_free (sd);
 }
 
-/* Find out heap and stack end boundaries, and return required memory
-   size; if this cannot be calcualted, return DEFAULT_MEMSIZE.
-   If INIT_P is nonzero, initialize memory above the stack with argv and envp.
-   If this initialization fails, return 0.  */
-static int
-init_stack (struct bfd *abfd, char **argv,
-	    SIM_DESC sd, int default_memsize, int init_p)
-{
-  USI stack_start = 0, stack_top = 0, heap_start = 0, heap_end = 0;
-  USI prog_end = 0;
-  char *null_env = NULL;
-  char **envp = &null_env;
-  int argc;
-  char **cpp, **rpp, *str;
-  size_t len;
-  int cp, wpp;
-  int n_ptr = 0, cnt;
-  /* All CPUs have the same memory map, apparently.  */
-  SIM_CPU *cpu = STATE_CPU (sd, 0);
-  bfd_byte buf[4];
 
+/* PROFILE_CPU_CALLBACK */
+
+static void
+print_arc_misc_cpu (SIM_CPU *cpu, int verbose)
+{
+  if (CPU_PROFILE_FLAGS (cpu) [PROFILE_INSN_IDX])
+    {
+      SIM_DESC sd = CPU_STATE (cpu);
+      char     buf[20];
+
+      sim_io_printf (sd, "Miscellaneous Statistics\n\n");
+      sim_io_printf (sd, "  %-*s %s\n\n",
+		     PROFILE_LABEL_WIDTH, "Fill nops:",
+		     sim_add_commas (buf, sizeof (buf),
+				     CPU_ARC_MISC_PROFILE (cpu)->fillnop_count));
+    }
+}
+
+
+#ifdef LOGGING
+static void
+dump (SIM_DESC sd, char** argv, char** envp)
+{
+  char **cpp, **rpp;
+  char* tag;
+  int   cnt;
+
+  for (cpp = argv, tag = "argv", cnt = 2; cnt--; cpp = envp, tag = "env")
+    {
+      if (cpp)
+        {
+           int i = 0;
+
+           for (rpp = cpp; *rpp; rpp++, i++)
+               sim_io_eprintf(sd, "%s[%d] = %s\n", tag, i, *rpp);
+        }
+    }
+}
+#endif
+
+/* Setup copy arguments / environment to the stack area of SD according
+   to argv and envp.  Either or both of argv and envp may be NULL.
+   Return 0 on failure, nonzero on success.  */
+
+static int
+setup_stack (SIM_DESC sd, int little_endian_p, char** argv, char** envp)
+{
+  SIM_CPU* cpu = STATE_CPU (sd, 0);
+  int      wpp = sd->memory.stack_top + TARGET_INT_SIZE;
+  int      cp  = sd->memory.argument_data_start;
+  int      count;
+  char**   cpp;
+
+#ifdef LOGGING
+  sim_io_eprintf(sd, "setup stack (%c/E) %d args\n",
+                     (little_endian_p) ? 'L' : 'B',
+                     sd->memory.num_arguments);
+  dump(sd, argv, envp);
+#endif
+
+  if (sd->memory.stack_top <= sd->memory.stack_start)
+    {
+      host_callback *callback = STATE_CALLBACK (sd);
+
+      (*callback->printf_filtered) (callback, "stack overflow\n");
+      return 0;
+    }
+
+  /* Can't use sim_core_write_unaligned_4 without everything
+     initialized when tracing, and then these writes would get into
+     the trace.  */
+#define write_dword(addr, data)                                              \
+ do                                                                          \
+   {                                                                         \
+     bfd_byte buf[4];                                                        \
+     USI data_ = data;                                                       \
+     USI addr_ = addr;                                                       \
+     if (little_endian_p)                                                    \
+       bfd_putl32 (data_, buf);                                              \
+     else                                                                    \
+       bfd_putb32 (data_, buf);                                              \
+     if (sim_core_write_buffer (sd, cpu, 0, buf, addr_, 4) != 4)             \
+        {                                                                    \
+          sim_io_eprintf(sd, "failed to write word to address 0x%x\n", addr);\
+          return 0;                                                          \
+        }                                                                    \
+   }                                                                         \
+ while (0)
+
+
+ /* Push the arguments and environment onto the stack.  */
+
+  write_dword (sd->memory.stack_top, sd->memory.num_arguments);
+  for (cpp = argv, count = 2; count--; cpp = envp)
+    {
+      if (cpp)
+        {
+          char*  argument;
+          char** rpp;
+
+          for (rpp = cpp; (argument = *cpp); cpp++)
+            {
+              size_t len = strlen(argument) + 1;
+
+#ifdef LOGGING
+              sim_io_eprintf(sd, "pushing argument '%s' onto program stack at address 0x%x\n", argument, cp);
+#endif
+
+              if (sim_core_write_buffer (sd, cpu, 0, argument, cp, len) != len)
+                {
+                  sim_io_eprintf(sd, "could not push argument '%s' onto program stack at address 0x%x\n", argument, cp);
+                  return 0;
+                }
+              write_dword (wpp, cp);
+              cp += len;
+              wpp += TARGET_POINTER_SIZE;
+            }
+        }
+
+      write_dword (wpp, 0);         // NULL array terminator
+      wpp += TARGET_POINTER_SIZE;
+
+    }
+  write_dword (wpp, 0); /* uClibc aux_dat NULL terminator.  */
+
+  /* success */
+  return 1;
+}
+
+
+/* Find out heap and stack end boundaries, and calculate required memory size;
+   if this cannot be done, use the default memory size.
+   ABFD, ARGV and/or ENVP may be NULL.
+   If this calculation fails, return 0.  */
+
+static int
+determine_memory_requirements (SIM_DESC sd, struct bfd *abfd, char **argv,
+			       char **envp, struct sim_memory* memory)
+{
+  USI    stack_start           = 0, stack_top = 0, heap_start = 0, heap_end = 0;
+  USI    program_end           = 0;
+  USI    memory_size;
+  USI    data_start;
+  int    argc                  = 0;
+  size_t total_argument_length = 0;
+  int    num_pointers          = 0;
+
+  /* N.B. the *_end variables actually denote the next byte after the end of
+   the sections to which they refer; however, they are used consistently
+   in this way, so that is not a problem!  */
+
+  /* If we have an executable file to look at.  */
   if (abfd)
     {
-      asection *s;
+      asection* section;
 
-      for (s = abfd->sections; s; s = s->next)
-	if (strcmp (bfd_get_section_name (abfd, s), ".stack") == 0)
-	  {
-	    stack_start = bfd_get_section_vma (abfd, s);
-	    stack_top = stack_start + bfd_section_size (abfd, s);
-	    stack_top &= -4; /* 4 == target pointer size */
-	    default_memsize = stack_top;
-	  }
-	else if (strcmp (bfd_get_section_name (abfd, s), ".heap") == 0)
-	  {
-	    heap_start = bfd_get_section_vma (abfd, s);
-	    heap_end = heap_start + bfd_section_size (abfd, s);
-	  }
-	else
-	  {
-	    USI s_end
-	      = bfd_get_section_vma (abfd, s) + bfd_section_size (abfd, s);
+      /* Look at each section in the file.  */
+      for (section = abfd->sections; section; section = section->next)
+        {
+          if (strcmp (bfd_get_section_name (abfd, section), ".stack") == 0)
+            {
+              stack_start = bfd_get_section_vma (abfd, section);
+              stack_top   = stack_start + bfd_section_size (abfd, section);
+              stack_top  &= -TARGET_POINTER_SIZE;
 
-	    if (prog_end < s_end)
-	      prog_end = s_end;
-	  }
-      if (heap_end == 0)
+              /* N.B. this assumes that the target memory region to be
+		 created has the range 0 .. stack_top - 1, i.e. that there
+		 is nothing in the program that has to be loaded at
+		 addresses above the stack top.  */
+              memory_size = stack_top;
+            }
+          else if (strcmp (bfd_get_section_name (abfd, section), ".heap") == 0)
+            {
+              heap_start = bfd_get_section_vma (abfd, section);
+              heap_end   = heap_start + bfd_section_size (abfd, section);
+            }
+          else if (bfd_get_section_flags(abfd, section) & SEC_LOAD)
+            {
+              USI section_end = bfd_get_section_vma (abfd, section) +
+                                bfd_section_size    (abfd, section);
+
+              /* Keep track of the end address of whatever else is to be
+		 loaded.  */
+              if (program_end < section_end)
+                program_end = section_end;
+            }
+        }
+
+       /* If we know the start of the stack, check for an overlap.  */ 
+      if (stack_start > 0 && program_end > stack_start)
 	{
-	  if (prog_end > stack_start)
-	    return 0;
-	  heap_start = prog_end;
-	  heap_end = stack_start;
-	}
-      if (!argv)
-	n_ptr == 1;
-      else
-	{
-	  for (cpp = envp, len = 0, cnt = 2; cnt--; cpp = argv)
-	    {
-	      argc = 0;
-	      for (rpp = cpp; *rpp; rpp++)
-		argc++, len += strlen (*rpp) + 1;
-	      n_ptr += argc + 1;
-	    }
-	}
-      n_ptr ++; //* For uclibc aux_dat */
-      if (!stack_top)
-	stack_top = (default_memsize + 3) & -4; /* 4 == target pointer size */
-      wpp = stack_top + 4;
-      cp = wpp + n_ptr * 4;
-      default_memsize = cp + len;
-      /* Round up to multiple of 32.  strlen expects memory to come in chunks
-	 that are at least cache-line (32 bytes) sized.  */
-      default_memsize += 31;
-      default_memsize &= -32;
-    }
-  if (abfd && init_p)
-    {
-      int little_endian_p = bfd_little_endian (abfd);
-
-      if (stack_top <= stack_start)
-	{
-	  host_callback *callback = STATE_CALLBACK (sd);
-
-	  (*callback->printf_filtered) (callback, "stack overflow\n");
+	  sim_io_eprintf(sd,
+			 "program data overlaps program stack at 0x%x (0x%x)\n",
+			 stack_start, program_end);
 	  return 0;
 	}
 
-      /* Can't use sim_core_write_unaligned_4 without everything
-         initialized when tracing, and then these writes would get into
-         the trace.  */
-#define write_dword(addr, data)						\
- do									\
-   {									\
-     USI data_ = data;							\
-     USI addr_ = addr;							\
-     if (little_endian_p)						\
-       bfd_putl32 (data_, buf); 					\
-     else								\
-       bfd_putb32 (data_, buf); 					\
-     if (sim_core_write_buffer (sd, cpu, 0, buf, addr_, 4) != 4)	\
-        return 0;							\
-   }									\
- while (0)
-
-      write_dword (stack_top, argc);
-      for (cpp = argv, cnt = 2; cnt--; cpp = envp)
-	{
-	  for (rpp = cpp; str = *cpp++;)
-	    {
-	      len = strlen (str) + 1;
-	      if (sim_core_write_buffer (sd, cpu, 0, str, cp, len) != len)
-		return 0;
-	      write_dword (wpp, cp);
-	      cp += len;
-	      wpp += 4;
-	    }
-	  write_dword (wpp, 0);
-	  wpp += 4;
-	}
-      write_dword (wpp, 0);
-      sd->heap_start = heap_start;
-      sd->heap_end = heap_end;
-      sd->stack_top = stack_top;
+       /* No heap section found?  */
+      if (heap_end == 0)
+        {
+          /* Assume the heap lies between the program data and the stack.  */
+          heap_start = program_end;
+          heap_end   = stack_start;
+        }
     }
-  return default_memsize;
+
+
+  /* If we have arguments or environment variables to pass to the program.  */
+
+  if (argv)
+    {
+      char **rpp;
+
+      for (rpp = argv; *rpp; rpp++, num_pointers++)
+         total_argument_length += strlen (*rpp) + 1; 
+
+       argc = num_pointers;
+    }
+  num_pointers++; /* For NULL terminator.  */
+
+  if (envp)
+    {
+      char** rpp;
+
+      for (rpp = envp; *rpp; rpp++, num_pointers++)
+         total_argument_length += strlen (*rpp) + 1;   
+    }
+  num_pointers++;   /* For NULL terminator.  */
+
+  num_pointers++;   /* For uclibc aux_dat.  */
+
+  /* If we could not get the stack bounds from the executable file (and hence
+     do not know the memory size), use the default memory size and take the
+     top of the stack as being at the end of that memory range (aligned to
+     the size of a target pointer).  */
+  if (!stack_top)
+    stack_top = (USI) ((ARC_DEFAULT_MEM_SIZE + 3) & -TARGET_POINTER_SIZE);
+
+  data_start = (USI) (stack_top                          +
+                      TARGET_INT_SIZE                    +  /* For argc.  */
+                      num_pointers * TARGET_POINTER_SIZE);
+
+  /* We need enough memory to hold the program stack, plus the data to be passed
+     above the top of the stack.  */
+  memory_size = (USI) (data_start + total_argument_length);
+
+#ifdef PUSH_ENVIRONMENT_ONTO_STACK
+  if (!envp)
+     memory_size += DEFAULT_ENVIRONMENT_SPACE;
+#endif
+
+  /* Round up to multiple of 32: strlen expects memory to come in chunks
+     that are at least cache-line (32 bytes) sized.
+     FIXME: is that true?  */
+  memory_size += 31;
+  memory_size &= -32;
+
+  memory->heap_start          = heap_start;
+  memory->heap_end            = heap_end;
+  memory->stack_top           = stack_top;
+  memory->stack_start         = stack_start;
+  memory->total_size          = memory_size;
+  memory->argument_data_start = data_start;
+  memory->num_arguments       = (USI) argc;
+
+#ifdef LOGGING
+  sim_io_eprintf(sd, "heap  start   : 0x%x\n", heap_start);
+  sim_io_eprintf(sd, "heap  end     : 0x%x\n", heap_end);
+  sim_io_eprintf(sd, "stack start   : 0x%x\n", stack_start);
+  sim_io_eprintf(sd, "stack top     : 0x%x\n", stack_top);
+  sim_io_eprintf(sd, "memory size   : 0x%x\n", memory_size);
+  sim_io_eprintf(sd, "arg data start: 0x%x\n", data_start);
+  sim_io_eprintf(sd, "%d args\n", argc);
+#endif
+
+  /* Success.  */
+  return 1;
 }
 
+
+static void
+define_memory_region (SIM_DESC sd, USI start, USI size)
+{ 
+  /* Allocate core managed memory if none specified by user.  */
+  if (!sd->memory_regions_defined_by_user)
+    {
+#ifdef LOGGING
+      sim_io_printf   (sd, "memory region 0x%x,0x%x\n", start, size);
+#endif
+      sim_do_commandf (sd, "memory region 0x%x,0x%x",   start, size);
+    }
+}
+
+
+/* -------------------------------------------------------------------------- */
+/*                               externally visible functions                 */
+/* -------------------------------------------------------------------------- */
+
 /* Create an instance of the simulator.  */
 
 SIM_DESC
-sim_open (kind, callback, abfd, argv)
-     SIM_OPEN_KIND kind;
-     host_callback *callback;
-     struct bfd *abfd;
-     char **argv;
+sim_open (SIM_OPEN_KIND  kind,
+          host_callback *callback,
+          struct bfd    *abfd,      /* May be NULL.  */
+          char         **argv)
 {
   SIM_DESC sd = sim_state_alloc (kind, callback);
-  char c;
-  int i;
-  int default_memsize;
-  char ** prog_argv;
+  int      little_endian_p;
+  char**   prog_argv;
+  char     c;
 
-  /* The cpu data is kept in a separately allocated chunk of memory.  */
+  SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
+
+#ifdef LOGGING
+  sim_io_eprintf (sd, "sim_open: %p\n", abfd);
+  dump(sd, argv, NULL);
+#endif
+
+  /* The cpu data is kept in a separately-allocated chunk of memory.  */
   if (sim_cpu_alloc_all (sd, 1, cgen_cpu_max_extra_bytes ()) != SIM_RC_OK)
     {
       free_state (sd);
       return 0;
     }
 
-#if 0 /* FIXME: pc is in mach-specific struct */
-  /* FIXME: watchpoints code shouldn't need this */
+#if 0 /* FIXME: pc is in mach-specific struct.  */
+  /* FIXME: watchpoints code shouldn't need this.  */
   {
     SIM_CPU *current_cpu = STATE_CPU (sd, 0);
     STATE_WATCHPOINTS (sd)->pc = &(PC);
@@ -217,7 +567,7 @@
       return 0;
     }
 
-#ifdef HAVE_DV_SOCKSER /* FIXME: was done differently before */
+#ifdef HAVE_DV_SOCKSER /* FIXME: was done differently before.  */
   if (dv_sockser_install (sd) != SIM_RC_OK)
     {
       free_state (sd);
@@ -225,7 +575,7 @@
     }
 #endif
 
-#if 0 /* FIXME: 'twould be nice if we could do this */
+#if 0 /* FIXME: 'twould be nice if we could do this.  */
   /* These options override any module options.
      Obviously ambiguity should be avoided, however the caller may wish to
      augment the meaning of an option.  */
@@ -242,6 +592,11 @@
       return 0;
     }
 
+#ifdef LOGGING
+  /* sim_parse_args may set up STATE_PROG_ARGV(sd), in the case that kind == SIM_OPEN_STANDALONE.  */
+  dump(sd, STATE_PROG_ARGV (sd), NULL);
+#endif
+
   /* Check for/establish the reference program image, and set arch info.  */
   if (sim_analyze_program (sd,
 			   (STATE_PROG_ARGV (sd) != NULL
@@ -254,18 +609,17 @@
     }
 
   prog_argv = STATE_PROG_ARGV (sd);
+
+  /* If we have not been given an executable file.  */
   if (!abfd)
     {
-      char *name;
-
-      /* FIXME: If the test below fails, we will use ARC_DEFAULT_MEMSIZE.
-	 We should have some way to remember this, so that we can
-	 emit an error in sim_create_inferior if the required memory
-	 size is larger.  */
+      /* If the test below fails, we will use ARC_DEFAULT_MEM_SIZE. */
       if (prog_argv != NULL && *prog_argv != NULL)
 	{
-	  name = *prog_argv;
+	  char* name = *prog_argv;
+
 	  abfd = bfd_openr (name, 0);
+
 	  if (abfd == NULL || !bfd_check_format (abfd, bfd_object))
 	    {
 	      free_state (sd);
@@ -274,21 +628,47 @@
 	}
     }
 
-  default_memsize
-    = init_stack (abfd, prog_argv, sd, ARC_DEFAULT_MEM_SIZE, 0);
-  /* Allocate core managed memory if none specified by user.
-     Use address 4 here in case the user wanted address 0 unmapped.  */
-  if (sim_core_read_buffer (sd, NULL, read_map, &c, 4, 1) == 0)
-    sim_do_commandf (sd, "memory region 0,0x%x", default_memsize);
-
-  if (!init_stack (abfd, prog_argv, sd, default_memsize, 1)
-      /* Establish any remaining configuration options.  */
-      || sim_config (sd) != SIM_RC_OK)
+  /* Establish any remaining configuration options.  */
+  if (sim_config (sd) != SIM_RC_OK)
     {
       free_state (sd);
       return 0;
     }
 
+  little_endian_p = IS_LITTLE_ENDIAN(abfd);
+
+  /* Check whether core managed memory has been specified by user.
+     Use address 4 here in case the user wanted address 0 unmapped.
+     N.B. this is really not a very good check - we want to know whether the
+     user has explicitly specified the target's memory regions, so that we
+     don't define a region ourself (which might overlap), and we try to
+     find that out by seeing if we can read the memory at address 0x4 !!!!  */
+  sd->memory_regions_defined_by_user = 
+    sim_core_read_buffer (sd, NULL, read_map, &c, 4, 1) != 0;
+
+  /* Calculate the memory size required without actually initializing the stack.  */
+  if (!determine_memory_requirements(sd, abfd, prog_argv, NULL, &sd->memory))
+    {
+      free_state (sd);
+      return 0;
+    }
+
+  define_memory_region (sd, 0, sd->memory.total_size);
+
+  /* If the simulator is being used stand-alone, we know that the program 
+     arguments we have been given here are not going to change later on (when
+     sim_create_inferior is called) - so we can go ahead and set up the stack
+     with those arguments right now.  */
+  if (STATE_OPEN_KIND (sd) == SIM_OPEN_STANDALONE)
+    {
+      /* Now that we do know the memory size, initialize the stack.  */
+      if (!setup_stack (sd, little_endian_p, prog_argv, NULL))
+        {
+          free_state (sd);
+          return 0;
+        }
+    }
+
   if (sim_post_argv_init (sd) != SIM_RC_OK)
     {
       free_state (sd);
@@ -297,16 +677,18 @@
 
   /* Open a copy of the cpu descriptor table.  */
   {
-    CGEN_CPU_DESC cd
-      = arc_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd)->printable_name,
-			     (abfd && bfd_little_endian (abfd)
-			      ? CGEN_ENDIAN_LITTLE: CGEN_ENDIAN_BIG));
+    CGEN_CPU_DESC cd = arc_cgen_cpu_open_1
+                          (STATE_ARCHITECTURE (sd)->printable_name,
+			   (little_endian_p ? CGEN_ENDIAN_LITTLE : CGEN_ENDIAN_BIG));
+    int i;
+
     for (i = 0; i < MAX_NR_PROCESSORS; ++i)
       {
 	SIM_CPU *cpu = STATE_CPU (sd, i);
 	CPU_CPU_DESC (cpu) = cd;
 	CPU_DISASSEMBLER (cpu) = sim_cgen_disassemble_insn;
       }
+
     arc_cgen_init_dis (cd);
   }
 
@@ -314,63 +696,130 @@
      Must be done after arc_cgen_cpu_open.  */
   cgen_init (sd);
 
-  for (c = 0; c < MAX_NR_PROCESSORS; ++c)
+  for (c = 0; c < MAX_NR_PROCESSORS; c++)
     {
       /* Only needed for profiling, but the structure member is small.  */
       memset (CPU_ARC_MISC_PROFILE (STATE_CPU (sd, i)), 0,
 	      sizeof (* CPU_ARC_MISC_PROFILE (STATE_CPU (sd, i))));
-      /* Hook in callback for reporting these stats */
-      PROFILE_INFO_CPU_CALLBACK (CPU_PROFILE_DATA (STATE_CPU (sd, i)))
-	= print_arc_misc_cpu;
+
+      /* Hook in callback for reporting these stats.  */
+      PROFILE_INFO_CPU_CALLBACK (CPU_PROFILE_DATA (STATE_CPU (sd, i))) =
+         print_arc_misc_cpu;
     }
 
-  /* Store in a global so things like sparc32_dump_regs can be invoked
+  /* Store in a global so things like arc32_dump_regs can be invoked
      from the gdb command line.  */
   current_state = sd;
 
   return sd;
 }
 
+
 void
-sim_close (sd, quitting)
-     SIM_DESC sd;
-     int quitting;
+sim_close (SIM_DESC sd, int quitting)
 {
   arc_cgen_cpu_close (CPU_CPU_DESC (STATE_CPU (sd, 0)));
   sim_module_uninstall (sd);
 }
-
+
+
 SIM_RC
-sim_create_inferior (sd, abfd, argv, envp)
-     SIM_DESC sd;
-     struct bfd *abfd;
-     char **argv;
-     char **envp;
+sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **envp)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
   SIM_ADDR addr;
 
+#ifndef PUSH_ENVIRONMENT_ONTO_STACK
+  envp = NULL;
+#endif
+#ifdef LOGGING
+  sim_io_eprintf (sd, "sim_create_inferior: %p\n", abfd);
+  dump (sd, argv, envp);
+#endif
+
   if (abfd != NULL)
-    addr = bfd_get_start_address (abfd);
+    {
+      int little_endian_p = bfd_little_endian (abfd);
+
+      if (little_endian_p)
+        {
+          if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN)
+            {
+              sim_io_eprintf (sd, "Target is big-endian but executable file %s is little-endian.\n",
+			      bfd_get_filename (abfd));
+              return SIM_RC_FAIL;
+            }
+        }
+      else
+        {
+          if (CURRENT_TARGET_BYTE_ORDER == LITTLE_ENDIAN)
+            {
+              sim_io_eprintf (sd, "Target is little-endian but executable file %s is big-endian.\n",
+			      bfd_get_filename(abfd));
+              return SIM_RC_FAIL;
+            }
+        }
+
+      addr = bfd_get_start_address (abfd);
+    }
   else
     addr = 0;
+
   sim_pc_set (current_cpu, addr);
-  /* Initialize stack pointer.  */
-  if (!sd->stack_top
-      && !init_stack (abfd, argv, sd, 1, 1))
-    return 0;
-  current_cpu->endbrk = sd->heap_start;
 
-  a5f_h_cr_set (current_cpu, 28, (sd)->stack_top);
-  /* Set r0/r1 to argc / argv */
-  a5f_h_cr_set (current_cpu, 0, GETMEMSI (current_cpu, 0, sd->stack_top));
-  a5f_h_cr_set (current_cpu, 1, sd->stack_top+4);
+  /* If the simulator is being used stand-alone, we have already set up the
+     stack (when sim_open was called); but if the simulator is being used by
+     gdb we must set up the stack each time that sim_create_inferior is
+     called, in case the program arguments have changed since last time.  */
+  if (STATE_OPEN_KIND(sd) == SIM_OPEN_DEBUG)
+    {
+      struct sim_memory memory;
 
-#ifdef ARC_LINUX
-  m32rbf_h_cr_set (current_cpu,
-                    arc_decode_gdb_ctrl_regnum(SPI_REGNUM), 0x1f00000);
-  m32rbf_h_cr_set (current_cpu,
-                    arc_decode_gdb_ctrl_regnum(SPU_REGNUM), 0x1f00000);
+      if (determine_memory_requirements (sd, abfd, argv, envp, &memory))
+        {
+          USI current_size = sd->memory.total_size;
+
+          if (memory.total_size > current_size)
+            {
+#ifdef LOGGING
+              sim_io_eprintf (sd, "program requires memory size 0x%x bytes"
+                                  " but simulator currently has memory size 0x%x bytes\n",
+                                   memory.total_size, current_size);
+#endif
+
+              /* Define another memory region to provide the extra memory
+		 required.  */
+              define_memory_region (sd, current_size,
+				    memory.total_size - current_size);
+
+              /* Update all the memory details.  */
+              sd->memory = memory;
+            }
+          else
+            {
+              /* Update all the memory details *except* the current size.  */
+              sd->memory = memory;
+              sd->memory.total_size = current_size;
+            }
+
+	  if (!setup_stack (sd, IS_LITTLE_ENDIAN (abfd), argv, envp))
+	    return SIM_RC_FAIL;
+	}
+      else
+	return SIM_RC_FAIL;
+    }
+
+  current_cpu->endbrk = sd->memory.heap_start;
+
+  /* Set r28 (SP) to the stack top, and set r0/r1 to argc/argv. */
+  a5f_h_cr_set (current_cpu, 0,  sd->memory.num_arguments);
+  a5f_h_cr_set (current_cpu, 1,  sd->memory.stack_top + 4);
+  a5f_h_cr_set (current_cpu, 28, sd->memory.stack_top);
+
+#ifdef LOGGING
+  sim_io_eprintf (sd, "R0 = 0x%08X\n", sd->memory.num_arguments);
+  sim_io_eprintf (sd, "R1 = 0x%08X\n", sd->memory.stack_top + 4);
+  sim_io_eprintf (sd, "SP = 0x%08X\n", sd->memory.stack_top);
 #endif
 
 #if 0
@@ -381,39 +830,10 @@
   return SIM_RC_OK;
 }
 
-/* PROFILE_CPU_CALLBACK */
-
-static void
-print_arc_misc_cpu (SIM_CPU *cpu, int verbose)
-{
-  SIM_DESC sd = CPU_STATE (cpu);
-  char buf[20];
-
-  if (CPU_PROFILE_FLAGS (cpu) [PROFILE_INSN_IDX])
-    {
-      sim_io_printf (sd, "Miscellaneous Statistics\n\n");
-      sim_io_printf (sd, "  %-*s %s\n\n",
-		     PROFILE_LABEL_WIDTH, "Fill nops:",
-		     sim_add_commas (buf, sizeof (buf),
-				     CPU_ARC_MISC_PROFILE (cpu)->fillnop_count));
-      if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_m32rx)
-	sim_io_printf (sd, "  %-*s %s\n\n",
-		       PROFILE_LABEL_WIDTH, "Parallel insns:",
-		       sim_add_commas (buf, sizeof (buf),
-				       CPU_ARC_MISC_PROFILE (cpu)->parallel_count));
-      if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_m32r2)
-	sim_io_printf (sd, "  %-*s %s\n\n",
-		       PROFILE_LABEL_WIDTH, "Parallel insns:",
-		       sim_add_commas (buf, sizeof (buf),
-				       CPU_ARC_MISC_PROFILE (cpu)->parallel_count));
-    }
-}
 
 void
-sim_do_command (sd, cmd)
-     SIM_DESC sd;
-     char *cmd;
-{ 
+sim_do_command (SIM_DESC sd, char* cmd)
+{
   char **argv;
 
   if (cmd == NULL)
@@ -421,6 +841,8 @@
 
   argv = buildargv (cmd);
 
+  /* Is the command 'info reg[ister] <name>' ?  */
+
   if (argv[0] != NULL
       && strcasecmp (argv[0], "info") == 0
       && argv[1] != NULL
@@ -428,24 +850,13 @@
     {
       SI val;
 
-      /* We only support printing bbpsw,bbpc here as there is no equivalent
-	 functionality in gdb.  */
       if (argv[2] == NULL)
-	sim_io_eprintf (sd, "Missing register in `%s'\n", cmd);
+        sim_io_eprintf (sd, "Missing register in `%s'\n", cmd);
       else if (argv[3] != NULL)
-	sim_io_eprintf (sd, "Too many arguments in `%s'\n", cmd);
-#if 0
-      else if (strcasecmp (argv[2], "bbpsw") == 0)
-	{
-	  val = m32rbf_h_cr_get (STATE_CPU (sd, 0), H_CR_BBPSW);
-	  sim_io_printf (sd, "bbpsw 0x%x %d\n", val, val);
-	}
-      else if (strcasecmp (argv[2], "bbpc") == 0)
-	{
-	  val = m32rbf_h_cr_get (STATE_CPU (sd, 0), H_CR_BBPC);
-	  sim_io_printf (sd, "bbpc 0x%x %d\n", val, val);
-	}
-#endif
+        sim_io_eprintf (sd, "Too many arguments in `%s'\n", cmd);
+
+      /* Should we recognize some/all of the ARC register names here?  */
+
       else
 	sim_io_eprintf (sd, "Printing of register `%s' not supported with `sim info'\n",
 			argv[2]);
@@ -458,3 +869,5 @@
 
   freeargv (argv);
 }
+
+/******************************************************************************/
diff --git a/sim/arc/sim-main.h b/sim/arc/sim-main.h
index 05c7ab3..ef4fd45 100644
--- a/sim/arc/sim-main.h
+++ b/sim/arc/sim-main.h
@@ -1,5 +1,6 @@
 /* Main header for the arc.
-   Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.  */
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
+   Free Software Foundation, Inc.  */
 
 #ifndef SIM_MAIN_H
 #define SIM_MAIN_H
@@ -72,14 +73,25 @@
 
 /* The sim_state struct.  */
 
+
+struct sim_memory {
+  USI heap_start;
+  USI heap_end;
+  USI stack_start;
+  USI stack_top;
+  USI total_size;
+  USI argument_data_start;
+  USI num_arguments;
+};
+
 struct sim_state {
   sim_cpu *cpu;
 #define STATE_CPU(sd, n) (/*&*/ (sd)->cpu)
 
   CGEN_STATE cgen_state;
-  unsigned int heap_start;
-  unsigned int heap_end;
-  unsigned int stack_top;
+
+  struct sim_memory memory;
+  int memory_regions_defined_by_user;
 
   sim_state_base base;
 };
diff --git a/sim/arc/syscall.h b/sim/arc/syscall.h
new file mode 100755
index 0000000..3f4252a
--- /dev/null
+++ b/sim/arc/syscall.h
@@ -0,0 +1,281 @@
+/*
+ * This file contains the system call numbers.
+ */
+
+#define __NR_exit		  1
+#define __NR_fork		  2
+#define __NR_read		  3
+#define __NR_write		  4
+#define __NR_open		  5
+#define __NR_close		  6
+#define __NR_waitpid		  7
+#define __NR_creat		  8
+#define __NR_link		  9
+#define __NR_unlink		 10
+#define __NR_execve		 11
+#define __NR_chdir		 12
+#define __NR_time		 13
+#define __NR_mknod		 14
+#define __NR_chmod		 15
+#define __NR_lchown		 16
+#define __NR_break		 17
+#define __NR_oldstat		 18
+#define __NR_lseek		 19
+#define __NR_getpid		 20
+#define __NR_mount		 21
+#define __NR_umount		 22
+#define __NR_setuid		 23
+#define __NR_getuid		 24
+#define __NR_stime		 25
+#define __NR_ptrace		 26
+#define __NR_alarm		 27
+#define __NR_oldfstat		 28
+#define __NR_pause		 29
+#define __NR_utime		 30
+#define __NR_stty		 31
+#define __NR_gtty		 32
+#define __NR_access		 33
+#define __NR_nice		 34
+#define __NR_ftime		 35
+#define __NR_sync		 36
+#define __NR_kill		 37
+#define __NR_rename		 38
+#define __NR_mkdir		 39
+#define __NR_rmdir		 40
+#define __NR_dup		 41
+#define __NR_pipe		 42
+#define __NR_times		 43
+#define __NR_prof		 44
+#define __NR_brk		 45
+#define __NR_setgid		 46
+#define __NR_getgid		 47
+#define __NR_signal		 48
+#define __NR_geteuid		 49
+#define __NR_getegid		 50
+#define __NR_acct		 51
+#define __NR_umount2		 52
+#define __NR_lock		 53
+#define __NR_ioctl		 54
+#define __NR_fcntl		 55
+#define __NR_mpx		 56
+#define __NR_setpgid		 57
+#define __NR_ulimit		 58
+#define __NR_oldolduname	 59
+#define __NR_umask		 60
+#define __NR_chroot		 61
+#define __NR_ustat		 62
+#define __NR_dup2		 63
+#define __NR_getppid		 64
+#define __NR_getpgrp		 65
+#define __NR_setsid		 66
+#define __NR_sigaction		 67
+#define __NR_sgetmask		 68
+#define __NR_ssetmask		 69
+#define __NR_setreuid		 70
+#define __NR_setregid		 71
+#define __NR_sigsuspend		 72
+#define __NR_sigpending		 73
+#define __NR_sethostname	 74
+#define __NR_setrlimit		 75
+#define __NR_getrlimit		 76
+#define __NR_getrusage		 77
+#define __NR_gettimeofday	 78
+#define __NR_settimeofday	 79
+#define __NR_getgroups		 80
+#define __NR_setgroups		 81
+#define __NR_select		 82
+#define __NR_symlink		 83
+#define __NR_oldlstat		 84
+#define __NR_readlink		 85
+#define __NR_uselib		 86
+#define __NR_swapon		 87
+#define __NR_reboot		 88
+#define __NR_readdir		 89
+#define __NR_mmap		 90
+#define __NR_munmap		 91
+#define __NR_truncate		 92
+#define __NR_ftruncate		 93
+#define __NR_fchmod		 94
+#define __NR_fchown		 95
+#define __NR_getpriority	 96
+#define __NR_setpriority	 97
+#define __NR_profil		 98
+#define __NR_statfs		 99
+#define __NR_fstatfs		100
+#define __NR_ioperm		101
+#define __NR_socketcall		102
+#define __NR_syslog		103
+#define __NR_setitimer		104
+#define __NR_getitimer		105
+#define __NR_stat		106
+#define __NR_lstat		107
+#define __NR_fstat		108
+#define __NR_olduname		109
+#define __NR_iopl		110
+#define __NR_vhangup		111
+#define __NR_idle		112
+#define __NR_vm86old		113
+#define __NR_wait4		114
+#define __NR_swapoff		115
+#define __NR_sysinfo		116
+#define __NR_ipc		117
+#define __NR_fsync		118
+#define __NR_sigreturn		119
+#define __NR_clone		120
+#define __NR_setdomainname	121
+#define __NR_uname		122
+#define __NR_modify_ldt		123
+#define __NR_adjtimex		124
+#define __NR_mprotect		125
+#define __NR_sigprocmask	126
+#define __NR_create_module	127
+#define __NR_init_module	128
+#define __NR_delete_module	129
+#define __NR_get_kernel_syms	130
+#define __NR_quotactl		131
+#define __NR_getpgid		132
+#define __NR_fchdir		133
+#define __NR_bdflush		134
+#define __NR_sysfs		135
+#define __NR_personality	136
+#define __NR_afs_syscall	137 /* Syscall for Andrew File System */
+#define __NR_setfsuid		138
+#define __NR_setfsgid		139
+#define __NR__llseek		140
+#define __NR_getdents		141
+#define __NR__newselect		142
+#define __NR_flock		143
+#define __NR_msync		144
+#define __NR_readv		145
+#define __NR_writev		146
+#define __NR_getsid		147
+#define __NR_fdatasync		148
+#define __NR__sysctl		149
+#define __NR_mlock		150
+#define __NR_munlock		151
+#define __NR_mlockall		152
+#define __NR_munlockall		153
+#define __NR_sched_setparam		154
+#define __NR_sched_getparam		155
+#define __NR_sched_setscheduler		156
+#define __NR_sched_getscheduler		157
+#define __NR_sched_yield		158
+#define __NR_sched_get_priority_max	159
+#define __NR_sched_get_priority_min	160
+#define __NR_sched_rr_get_interval	161
+#define __NR_nanosleep		162
+#define __NR_mremap		163
+#define __NR_setresuid		164
+#define __NR_getresuid		165
+#define __NR_vm86		166
+#define __NR_query_module	167
+#define __NR_poll		168
+#define __NR_nfsservctl		169
+#define __NR_setresgid		170
+#define __NR_getresgid		171
+#define __NR_prctl              172
+#define __NR_rt_sigreturn	173
+#define __NR_rt_sigaction	174
+#define __NR_rt_sigprocmask	175
+#define __NR_rt_sigpending	176
+#define __NR_rt_sigtimedwait	177
+#define __NR_rt_sigqueueinfo	178
+#define __NR_rt_sigsuspend	179
+#define __NR_pread		180
+#define __NR_pwrite		181
+#define __NR_chown		182
+#define __NR_getcwd		183
+#define __NR_capget		184
+#define __NR_capset		185
+#define __NR_sigaltstack	186
+#define __NR_sendfile		187
+#define __NR_getpmsg		188	/* some people actually want streams */
+#define __NR_putpmsg		189	/* some people actually want streams */
+#define __NR_vfork		190
+
+#define __NR_pread64		180
+#define __NR_pwrite64		181
+
+#define __NR_ugetrlimit		191	/* SuS compliant getrlimit */
+#define __NR_mmap2		192
+#define __NR_truncate64		193
+#define __NR_ftruncate64	194
+#define __NR_stat64		195
+#define __NR_lstat64		196
+#define __NR_fstat64		197
+#define __NR_lchown32		198
+#define __NR_getuid32		199
+#define __NR_getgid32		200
+#define __NR_geteuid32		201
+#define __NR_getegid32		202
+#define __NR_setreuid32		203
+#define __NR_setregid32		204
+#define __NR_getgroups32	205
+#define __NR_setgroups32	206
+#define __NR_fchown32		207
+#define __NR_setresuid32	208
+#define __NR_getresuid32	209
+#define __NR_setresgid32	210
+#define __NR_getresgid32	211
+#define __NR_chown32		212
+#define __NR_setuid32		213
+#define __NR_setgid32		214
+#define __NR_setfsuid32		215
+#define __NR_setfsgid32		216
+#define __NR_pivot_root		217
+#define __NR_mincore		218
+#define __NR_madvise		219
+#define __NR_madvise1		219	/* delete when C lib stub is removed */
+#define __NR_getdents64		220
+#define __NR_fcntl64		221
+/* 223 is unused */
+#define __NR_gettid		224
+#define __NR_readahead		225
+#define __NR_setxattr		226
+#define __NR_lsetxattr		227
+#define __NR_fsetxattr		228
+#define __NR_getxattr		229
+#define __NR_lgetxattr		230
+#define __NR_fgetxattr		231
+#define __NR_listxattr		232
+#define __NR_llistxattr		233
+#define __NR_flistxattr		234
+#define __NR_removexattr	235
+#define __NR_lremovexattr	236
+#define __NR_fremovexattr	237
+#define __NR_tkill		238
+#define __NR_sendfile64		239
+#define __NR_futex		240
+#define __NR_sched_setaffinity	241
+#define __NR_sched_getaffinity	242
+#define __NR_set_thread_area	243
+#define __NR_get_thread_area	244
+#define __NR_io_setup		245
+#define __NR_io_destroy		246
+#define __NR_io_getevents	247
+#define __NR_io_submit		248
+#define __NR_io_cancel		249
+#define __NR_fadvise64		250
+
+#define __NR_exit_group		252
+#define __NR_lookup_dcookie	253
+#define __NR_epoll_create	254
+#define __NR_epoll_ctl		255
+#define __NR_epoll_wait		256
+#define __NR_remap_file_pages	257
+#define __NR_set_tid_address	258
+#define __NR_timer_create	259
+#define __NR_timer_settime	(__NR_timer_create+1)
+#define __NR_timer_gettime	(__NR_timer_create+2)
+#define __NR_timer_getoverrun	(__NR_timer_create+3)
+#define __NR_timer_delete	(__NR_timer_create+4)
+#define __NR_clock_settime	(__NR_timer_create+5)
+#define __NR_clock_gettime	(__NR_timer_create+6)
+#define __NR_clock_getres	(__NR_timer_create+7)
+#define __NR_clock_nanosleep	(__NR_timer_create+8)
+#define __NR_statfs64		268
+#define __NR_fstatfs64		269
+#define __NR_tgkill		270
+#define __NR_utimes		271
+#define __NR_fadvise64_64	272
+#define __NR_vserver		273
diff --git a/sim/arc/tconfig.in b/sim/arc/tconfig.in
index ded104a..7f10f57 100644
--- a/sim/arc/tconfig.in
+++ b/sim/arc/tconfig.in
@@ -44,4 +44,6 @@
    one of -scache/-pbb.  */
 #define WITH_SCACHE_PBB 1
 
+#define SIM_HAVE_BIENDIAN 1
+
 #endif /* ARC_TCONFIG_H */
diff --git a/sim/arc/traps-linux.c b/sim/arc/traps-linux.c
new file mode 100755
index 0000000..4feb2c0
--- /dev/null
+++ b/sim/arc/traps-linux.c
@@ -0,0 +1 @@
+#include "traps.c"
\ No newline at end of file
diff --git a/sim/arc/traps.c b/sim/arc/traps.c
index 6702523..e583a06 100644
--- a/sim/arc/traps.c
+++ b/sim/arc/traps.c
@@ -248,7 +248,7 @@
 
       if (s->arg1 == 0)
 	s->result = current_cpu->endbrk;
-      else if (s->arg1 <= sd->heap_end)
+      else if (s->arg1 <= sd->memory.heap_end)
 	current_cpu->endbrk = s->arg1;
       else
 	{
diff --git a/sim/common/ChangeLog.ARC b/sim/common/ChangeLog.ARC
index 2b73a9f..5bf878d 100644
--- a/sim/common/ChangeLog.ARC
+++ b/sim/common/ChangeLog.ARC
@@ -1,3 +1,17 @@
+2007-11-13  Irfan Rafiq     <irfan.rafiq@arc.com>
+
+	* Ingegrating CGEN simulator with gdb.
+		- model5.c, model6.c, model7.c : Synchronizing model strings like A7 with GDB internal DS.
+
+2007-11-05  Irfan Rafiq     <irfan.rafiq@arc.com>
+	* Ingegrating CGEN simulator with gdb.
+		- tconfig.in		       : defined SIM_HAVE_BIENDIAN 1
+
+2007-10-26  Irfan Rafiq     <irfan.rafiq@arc.com>
+	* Ingegrating CGEN simulator with gdb.
+		- sim-if.c		       : Fix of crash
+		- sim-main.c		       : For arc-opc-cgen.h
+	
 2007-09-17  J"orn Rennecke  <joern.rennecke@arc.com>
 
 	* gentvals.sh: Allow target-specific definitions to override
@@ -8,8 +22,7 @@
 
 2007-08-22  J"orn Rennecke  <joern.rennecke@arc.com>
 
-	* cgen-trace.c (sim_cgen_disassemble_insn):
-	Check for CGEN_INSN_DISASM_BITSIZE.
+	* (cgen-trace.c): Check for CGEN_INSN_DISASM_BITSIZE.
 
 2007-08-21  J"orn Rennecke  <joern.rennecke@arc.com>
 
diff --git a/sim/common/callback.c b/sim/common/callback.c
index c0a4407..673e6e1 100644
--- a/sim/common/callback.c
+++ b/sim/common/callback.c
@@ -361,13 +361,16 @@
   return result;
 }
 
+/* Descriptors 0 / 1 / 2 might have been subject to freopen, as in
+   27_io/objects/char/12048-[1-4].cc , and thus correspond to a different
+   host file descriptor.  */
 static int 
 os_read_stdin (p, buf, len)
      host_callback *p;
      char *buf;
      int len;
 {
-  return wrap (p, read (0, buf, len));
+  os_read (p, 0, buf, len);
 }
 
 static int 
@@ -433,10 +436,10 @@
       result = wrap (p, write (real_fd, buf, len));
       break;
     case 1:
-      result = p->write_stdout (p, buf, len);
+      result = fwrite (buf, 1, len, stdout);
       break;
     case 2:
-      result = p->write_stderr (p, buf, len);
+      result = fwrite (buf, 1, len, stderr);
       break;
     }
   return result;
@@ -448,7 +451,7 @@
      const char *buf;
      int len;
 {
-  return fwrite (buf, 1, len, stdout);
+  os_write (p, 1, buf, len);
 }
 
 static void
@@ -464,7 +467,7 @@
      const char *buf;
      int len;
 {
-  return fwrite (buf, 1, len, stderr);
+  os_write (p, 2, buf, len);
 }
 
 static void
@@ -1136,21 +1139,3 @@
   p->evprintf_filtered (p, fmt, ap);
   va_end (ap);
 }
-
-int
-cb_is_stdin (host_callback *cb, int fd)
-{
-  return fdbad (cb, fd) ? 0 : fdmap (cb, fd) == 0;
-}
-
-int
-cb_is_stdout (host_callback *cb, int fd)
-{
-  return fdbad (cb, fd) ? 0 : fdmap (cb, fd) == 1;
-}
-
-int
-cb_is_stderr (host_callback *cb, int fd)
-{
-  return fdbad (cb, fd) ? 0 : fdmap (cb, fd) == 2;
-}
diff --git a/sim/common/gennltvals.sh b/sim/common/gennltvals.sh
index ec4d49a..afb733d 100644
--- a/sim/common/gennltvals.sh
+++ b/sim/common/gennltvals.sh
@@ -20,7 +20,7 @@
 	"signal.h sys/signal.h" 'SIG[A-Z0-9]*' "${cpp}"
 
 $shell ${srccom}/gentvals.sh "arc" open ${srcroot}/newlib/libc/include \
-	"../sys/arc/sys/fcntl.h" 'O_[A-Z0-9]*' "${cpp}"
+        "../sys/arc/sys/fcntl.h" 'O_[A-Z0-9]*' "${cpp}"
 
 $shell ${srccom}/gentvals.sh "" open ${srcroot}/newlib/libc/include \
 	"fcntl.h sys/fcntl.h" 'O_[A-Z0-9]*' "${cpp}"
@@ -34,7 +34,7 @@
 
 dir=libgloss/arc target=arc
 $shell ${srccom}/gentvals.sh $target sys ${srcroot}/$dir \
-	"syscall.h" 'SYS_[_A-Za-z0-9]*' "${cpp}"
+        "syscall.h" 'SYS_[_A-Za-z0-9]*' "${cpp}"
 
 dir=newlib/libc/sys/d10v/sys target=d10v
 $shell ${srccom}/gentvals.sh $target sys ${srcroot}/$dir \
diff --git a/sim/common/syscall.c b/sim/common/syscall.c
index b0b98b5..e2a1e01 100644
--- a/sim/common/syscall.c
+++ b/sim/common/syscall.c
@@ -291,7 +291,11 @@
 
 	while (count > 0)
 	  {
-	    if (cb_is_stdin (cb, fd))
+	    /* ??? Actually making target descriptors 0 / 1 / 2 map directly
+	       to stdin / stdout / stderr gets the semantics of freopen
+	       wrong.  When using default callbacks, this is re-mapped
+	       in callback.c */
+	    if (fd == 0)
 	      result = (int) (*cb->read_stdin) (cb, buf,
 						(count < FILE_XFR_SIZE
 						 ? count : FILE_XFR_SIZE));
@@ -344,12 +348,20 @@
 		errcode = EINVAL;
 		goto FinishSyscall;
 	      }
-	    if (cb_is_stdout(cb, fd))
+        /* Don't treat descriptors 0 / 1 / 2 specially, as their
+	   meaning might have been changed by freopen, as in
+           27_io/objects/char/12048-[1-4].cc .  */
+
+	    /* ??? Actually making target descriptors 0 / 1 / 2 map directly
+	       to stdin / stdout / stderr gets the semantics of freopen
+	       wrong.  When using default callbacks, this is re-mapped
+	       in callback.c */
+	    if (fd == 1)
 	      {
 		result = (int) (*cb->write_stdout) (cb, buf, bytes_read);
 		(*cb->flush_stdout) (cb);
 	      }
-	    else if (cb_is_stderr(cb, fd))
+	    else if (fd == 2)
 	      {
 		result = (int) (*cb->write_stderr) (cb, buf, bytes_read);
 		(*cb->flush_stderr) (cb);
