Delete IRIX support
This does most of the mechanical removal. IOW, the easy part. This doesn't touch procfs.c as that'd be a harder excision, potentially affecting Solaris. mips-tdep.c is left alone. E.g., I didn't delete the GDB_OSABI_IRIX enum value, nor references to it in mips-tdep.c. Some comments mentioning IRIX ABIs may still be relevant and I wouldn't know what to do with them. in That can always be done on a separate pass, preferably by someone who can test on MIPS. I didn't remove a reference to IRIX in testsuite/lib/future.exp, as I believe that code is imported from DejaGNU. Built and tested on x86_64 Fedora 20, with --enable-targets=all. Tested that building for --target=mips-sgi-irix6 on x86_64 Fedora 20 fails with: checking for default auto-load directory... $debugdir:$datadir/auto-load checking for default auto-load safe-path... $debugdir:$datadir/auto-load *** Configuration mips-sgi-irix6 is obsolete. *** Support has been REMOVED. make[1]: *** [configure-gdb] Error 1 make[1]: Leaving directory `/home/pedro/gdb/mygit/build-irix' make: *** [all] Error 2 gdb/ 2014-10-10 Pedro Alves <palves@redhat.com> * Makefile.in (ALL_TARGET_OBS): Remove mips-irix-tdep.o and solib-irix.o. (ALLDEPFILES): Remove mips-irix-tdep.c and solib-irix.c. (HFILES_NO_SRCDIR): Remove solib-irix.h. * NEWS: Mention that support for mips-sgi-irix5* mips-sgi-irix6* and been removed. * config/mips/irix5.mh, config/mips/irix6.mh: Delete files. * configure.ac: Remove references to IRIX. * configure.host: Add *-*-irix* to the obsolete hosts section. Remove all other references to irix. * irix5-nat.c, mips-irix-tdep.c, solib-irix.c, solib-irix.h: Delete files. gdb/testsuite/ 2014-10-10 Pedro Alves <palves@redhat.com> * gdb.base/bigcore.exp: Remove references to IRIX. * gdb.base/funcargs.exp: Likewise. * gdb.base/interrupt.exp: Likewise. * gdb.base/mips_pro.exp: Likewise. * gdb.base/nodebug.exp: Likewise. * gdb.base/setvar.exp: Likewise. * lib/gdb.exp (gdb_compile_shlib): Remove mips-sgi-irix* case.
This commit is contained in:
parent
cc3afae25a
commit
3831839c08
@ -1,3 +1,17 @@
|
|||||||
|
2014-10-10 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* Makefile.in (ALL_TARGET_OBS): Remove mips-irix-tdep.o and solib-irix.o.
|
||||||
|
(ALLDEPFILES): Remove mips-irix-tdep.c and solib-irix.c.
|
||||||
|
(HFILES_NO_SRCDIR): Remove solib-irix.h.
|
||||||
|
* NEWS: Mention that support for mips-sgi-irix5* mips-sgi-irix6*
|
||||||
|
and been removed.
|
||||||
|
* config/mips/irix5.mh, config/mips/irix6.mh: Delete files.
|
||||||
|
* configure.ac: Remove references to IRIX.
|
||||||
|
* configure.host: Add *-*-irix* to the obsolete hosts section.
|
||||||
|
Remove all other references to irix.
|
||||||
|
* irix5-nat.c, mips-irix-tdep.c, solib-irix.c, solib-irix.h:
|
||||||
|
Delete files.
|
||||||
|
|
||||||
2014-10-10 Ajit Agarwal <ajitkum@xilinx.com>
|
2014-10-10 Ajit Agarwal <ajitkum@xilinx.com>
|
||||||
|
|
||||||
* microblaze-tdep.c (microblaze_gdbarch_init): If the description
|
* microblaze-tdep.c (microblaze_gdbarch_init): If the description
|
||||||
|
@ -644,7 +644,7 @@ ALL_TARGET_OBS = \
|
|||||||
m88k-tdep.o \
|
m88k-tdep.o \
|
||||||
mep-tdep.o \
|
mep-tdep.o \
|
||||||
microblaze-tdep.o microblaze-linux-tdep.o \
|
microblaze-tdep.o microblaze-linux-tdep.o \
|
||||||
mips-irix-tdep.o mips-linux-tdep.o \
|
mips-linux-tdep.o \
|
||||||
mipsnbsd-tdep.o mips-tdep.o \
|
mipsnbsd-tdep.o mips-tdep.o \
|
||||||
mn10300-linux-tdep.o mn10300-tdep.o \
|
mn10300-linux-tdep.o mn10300-tdep.o \
|
||||||
moxie-tdep.o \
|
moxie-tdep.o \
|
||||||
@ -673,7 +673,7 @@ ALL_TARGET_OBS = \
|
|||||||
bsd-uthread.o \
|
bsd-uthread.o \
|
||||||
nbsd-tdep.o obsd-tdep.o \
|
nbsd-tdep.o obsd-tdep.o \
|
||||||
sol2-tdep.o \
|
sol2-tdep.o \
|
||||||
solib-frv.o solib-irix.o solib-svr4.o \
|
solib-frv.o solib-svr4.o \
|
||||||
solib-som.o solib-pa64.o solib-darwin.o solib-dsbt.o \
|
solib-som.o solib-pa64.o solib-darwin.o solib-dsbt.o \
|
||||||
dbug-rom.o dink32-rom.o ppcbug-rom.o m32r-rom.o dsrec.o monitor.o \
|
dbug-rom.o dink32-rom.o ppcbug-rom.o m32r-rom.o dsrec.o monitor.o \
|
||||||
remote-m32r-sdi.o remote-mips.o \
|
remote-m32r-sdi.o remote-mips.o \
|
||||||
@ -903,7 +903,7 @@ interps.h auxv.h gdbcmd.h tramp-frame.h mipsnbsd-tdep.h \
|
|||||||
amd64-linux-tdep.h linespec.h i387-tdep.h mn10300-tdep.h \
|
amd64-linux-tdep.h linespec.h i387-tdep.h mn10300-tdep.h \
|
||||||
sparc64-tdep.h monitor.h ppcobsd-tdep.h srec.h solib-pa64.h \
|
sparc64-tdep.h monitor.h ppcobsd-tdep.h srec.h solib-pa64.h \
|
||||||
coff-pe-read.h parser-defs.h gdb_ptrace.h mips-linux-tdep.h \
|
coff-pe-read.h parser-defs.h gdb_ptrace.h mips-linux-tdep.h \
|
||||||
m68k-tdep.h spu-tdep.h jv-lang.h environ.h solib-irix.h amd64-tdep.h \
|
m68k-tdep.h spu-tdep.h jv-lang.h environ.h amd64-tdep.h \
|
||||||
doublest.h regset.h hppa-tdep.h ppc-linux-tdep.h ppc64-tdep.h \
|
doublest.h regset.h hppa-tdep.h ppc-linux-tdep.h ppc64-tdep.h \
|
||||||
rs6000-tdep.h rs6000-aix-tdep.h \
|
rs6000-tdep.h rs6000-aix-tdep.h \
|
||||||
common/gdb_locale.h arch-utils.h trad-frame.h gnu-nat.h \
|
common/gdb_locale.h arch-utils.h trad-frame.h gnu-nat.h \
|
||||||
@ -1661,7 +1661,6 @@ ALLDEPFILES = \
|
|||||||
microblaze-tdep.c microblaze-linux-tdep.c \
|
microblaze-tdep.c microblaze-linux-tdep.c \
|
||||||
mingw-hdep.c \
|
mingw-hdep.c \
|
||||||
mips-linux-nat.c mips-linux-tdep.c \
|
mips-linux-nat.c mips-linux-tdep.c \
|
||||||
mips-irix-tdep.c \
|
|
||||||
mips-tdep.c \
|
mips-tdep.c \
|
||||||
mipsnbsd-nat.c mipsnbsd-tdep.c \
|
mipsnbsd-nat.c mipsnbsd-tdep.c \
|
||||||
mips64obsd-nat.c mips64obsd-tdep.c \
|
mips64obsd-nat.c mips64obsd-tdep.c \
|
||||||
@ -1689,7 +1688,7 @@ ALLDEPFILES = \
|
|||||||
ser-go32.c ser-pipe.c ser-tcp.c ser-mingw.c \
|
ser-go32.c ser-pipe.c ser-tcp.c ser-mingw.c \
|
||||||
sh-tdep.c sh64-tdep.c shnbsd-tdep.c shnbsd-nat.c \
|
sh-tdep.c sh64-tdep.c shnbsd-tdep.c shnbsd-nat.c \
|
||||||
sol2-tdep.c \
|
sol2-tdep.c \
|
||||||
solib-irix.c solib-svr4.c \
|
solib-svr4.c \
|
||||||
sparc-linux-nat.c sparc-linux-tdep.c \
|
sparc-linux-nat.c sparc-linux-tdep.c \
|
||||||
sparc-sol2-nat.c sparc-sol2-tdep.c sparc64-sol2-tdep.c \
|
sparc-sol2-nat.c sparc-sol2-tdep.c sparc64-sol2-tdep.c \
|
||||||
sparc-nat.c sparc-tdep.c sparc64-linux-nat.c sparc64-linux-tdep.c \
|
sparc-nat.c sparc-tdep.c sparc64-linux-nat.c sparc64-linux-tdep.c \
|
||||||
|
7
gdb/NEWS
7
gdb/NEWS
@ -45,6 +45,13 @@ queue-signal signal-name-or-number
|
|||||||
** The -list-thread-groups command outputs an exit-code field for
|
** The -list-thread-groups command outputs an exit-code field for
|
||||||
inferiors that have exited.
|
inferiors that have exited.
|
||||||
|
|
||||||
|
* Removed targets
|
||||||
|
|
||||||
|
Support for these obsolete configurations has been removed.
|
||||||
|
|
||||||
|
mips-sgi-irix5*
|
||||||
|
mips-sgi-irix6*
|
||||||
|
|
||||||
*** Changes in GDB 7.8
|
*** Changes in GDB 7.8
|
||||||
|
|
||||||
* New command line options
|
* New command line options
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
# Host: SGI Iris running irix 5.x
|
|
||||||
NATDEPFILES= fork-child.o irix5-nat.o procfs.o \
|
|
||||||
proc-api.o proc-events.o proc-flags.o proc-why.o
|
|
||||||
HAVE_NATIVE_GCORE_HOST = 1
|
|
@ -1,4 +0,0 @@
|
|||||||
# Host: SGI Iris running irix 6.x
|
|
||||||
NATDEPFILES= fork-child.o irix5-nat.o procfs.o \
|
|
||||||
proc-api.o proc-events.o proc-flags.o proc-why.o
|
|
||||||
HAVE_NATIVE_GCORE_HOST = 1
|
|
13
gdb/configure
vendored
13
gdb/configure
vendored
@ -8716,15 +8716,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|||||||
$as_echo "${PYTHON_CFLAGS}" >&6; }
|
$as_echo "${PYTHON_CFLAGS}" >&6; }
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# On IRIX, type siginfo is not defined. Instead, sys/siginfo.h provides:
|
|
||||||
# #if _SGIAPI
|
|
||||||
# #define siginfo __siginfo
|
|
||||||
# #endif
|
|
||||||
# The problem is that including Python causes some XOPEN macros to be
|
|
||||||
# unilaterally defined, and that in turn causes _SGIAPI to evaluate
|
|
||||||
# to false. So, we work around this issue by defining siginfo ourself
|
|
||||||
# though the command-line.
|
|
||||||
#
|
|
||||||
# On x64 Windows, Python's include headers, and pyconfig.h in
|
# On x64 Windows, Python's include headers, and pyconfig.h in
|
||||||
# particular, rely on MS_WIN64 macro to detect that it's a 64bit
|
# particular, rely on MS_WIN64 macro to detect that it's a 64bit
|
||||||
# version of Windows. Unfortunately, MS_WIN64 is only defined if
|
# version of Windows. Unfortunately, MS_WIN64 is only defined if
|
||||||
@ -8734,10 +8725,6 @@ $as_echo "${PYTHON_CFLAGS}" >&6; }
|
|||||||
# solved as of 2012-10-02 (http://bugs.python.org/issue4709).
|
# solved as of 2012-10-02 (http://bugs.python.org/issue4709).
|
||||||
|
|
||||||
case "$gdb_host" in
|
case "$gdb_host" in
|
||||||
irix*) if test "${GCC}" = yes; then
|
|
||||||
CPPFLAGS="$CPPFLAGS -Dsiginfo=__siginfo"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
mingw64)
|
mingw64)
|
||||||
if test "${GCC}" = yes; then
|
if test "${GCC}" = yes; then
|
||||||
CPPFLAGS="$CPPFLAGS -DMS_WIN64"
|
CPPFLAGS="$CPPFLAGS -DMS_WIN64"
|
||||||
|
@ -999,15 +999,6 @@ if test "${have_libpython}" != no; then
|
|||||||
AC_MSG_RESULT(${PYTHON_CFLAGS})
|
AC_MSG_RESULT(${PYTHON_CFLAGS})
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# On IRIX, type siginfo is not defined. Instead, sys/siginfo.h provides:
|
|
||||||
# #if _SGIAPI
|
|
||||||
# #define siginfo __siginfo
|
|
||||||
# #endif
|
|
||||||
# The problem is that including Python causes some XOPEN macros to be
|
|
||||||
# unilaterally defined, and that in turn causes _SGIAPI to evaluate
|
|
||||||
# to false. So, we work around this issue by defining siginfo ourself
|
|
||||||
# though the command-line.
|
|
||||||
#
|
|
||||||
# On x64 Windows, Python's include headers, and pyconfig.h in
|
# On x64 Windows, Python's include headers, and pyconfig.h in
|
||||||
# particular, rely on MS_WIN64 macro to detect that it's a 64bit
|
# particular, rely on MS_WIN64 macro to detect that it's a 64bit
|
||||||
# version of Windows. Unfortunately, MS_WIN64 is only defined if
|
# version of Windows. Unfortunately, MS_WIN64 is only defined if
|
||||||
@ -1017,10 +1008,6 @@ if test "${have_libpython}" != no; then
|
|||||||
# solved as of 2012-10-02 (http://bugs.python.org/issue4709).
|
# solved as of 2012-10-02 (http://bugs.python.org/issue4709).
|
||||||
|
|
||||||
case "$gdb_host" in
|
case "$gdb_host" in
|
||||||
irix*) if test "${GCC}" = yes; then
|
|
||||||
CPPFLAGS="$CPPFLAGS -Dsiginfo=__siginfo"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
mingw64)
|
mingw64)
|
||||||
if test "${GCC}" = yes; then
|
if test "${GCC}" = yes; then
|
||||||
CPPFLAGS="$CPPFLAGS -DMS_WIN64"
|
CPPFLAGS="$CPPFLAGS -DMS_WIN64"
|
||||||
|
@ -19,6 +19,7 @@ case $host in
|
|||||||
sparc-*-netbsdelf* | \
|
sparc-*-netbsdelf* | \
|
||||||
vax-*-netbsdelf*)
|
vax-*-netbsdelf*)
|
||||||
;;
|
;;
|
||||||
|
*-*-irix* | \
|
||||||
alpha*-*-osf1* | \
|
alpha*-*-osf1* | \
|
||||||
alpha*-*-osf2* | \
|
alpha*-*-osf2* | \
|
||||||
arm*-*-netbsd* | \
|
arm*-*-netbsd* | \
|
||||||
@ -126,8 +127,6 @@ m68*-*-openbsd*) gdb_host=obsd ;;
|
|||||||
|
|
||||||
m88*-*-openbsd*) gdb_host=obsd ;;
|
m88*-*-openbsd*) gdb_host=obsd ;;
|
||||||
|
|
||||||
mips-sgi-irix5*) gdb_host=irix5 ;;
|
|
||||||
mips-sgi-irix6*) gdb_host=irix6 ;;
|
|
||||||
mips*-*-linux*) gdb_host=linux ;;
|
mips*-*-linux*) gdb_host=linux ;;
|
||||||
mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
|
mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
|
||||||
gdb_host=nbsd ;;
|
gdb_host=nbsd ;;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
# in Makefile.in!
|
# in Makefile.in!
|
||||||
|
|
||||||
case $targ in
|
case $targ in
|
||||||
|
*-*-irix* | \
|
||||||
d10v-*-* | \
|
d10v-*-* | \
|
||||||
hppa*-*-hiux* | \
|
hppa*-*-hiux* | \
|
||||||
i[34567]86-ncr-* | \
|
i[34567]86-ncr-* | \
|
||||||
@ -350,14 +351,6 @@ microblaze*-*-*)
|
|||||||
gdb_sim=../sim/microblaze/libsim.a
|
gdb_sim=../sim/microblaze/libsim.a
|
||||||
;;
|
;;
|
||||||
|
|
||||||
mips*-sgi-irix5*)
|
|
||||||
# Target: MIPS SGI running Irix 5
|
|
||||||
gdb_target_obs="mips-tdep.o mips-irix-tdep.o solib-irix.o"
|
|
||||||
;;
|
|
||||||
mips*-sgi-irix6*)
|
|
||||||
# Target: MIPS SGI running Irix 6.x
|
|
||||||
gdb_target_obs="mips-tdep.o mips-irix-tdep.o solib-irix.o"
|
|
||||||
;;
|
|
||||||
mips*-*-linux*)
|
mips*-*-linux*)
|
||||||
# Target: Linux/MIPS
|
# Target: Linux/MIPS
|
||||||
gdb_target_obs="mips-tdep.o mips-linux-tdep.o glibc-tdep.o \
|
gdb_target_obs="mips-tdep.o mips-linux-tdep.o glibc-tdep.o \
|
||||||
|
272
gdb/irix5-nat.c
272
gdb/irix5-nat.c
@ -1,272 +0,0 @@
|
|||||||
/* Native support for the SGI Iris running IRIX version 5, for GDB.
|
|
||||||
|
|
||||||
Copyright (C) 1988-2014 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
|
|
||||||
and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
|
|
||||||
Implemented for Irix 4.x by Garrett A. Wollman.
|
|
||||||
Modified for Irix 5.x by Ian Lance Taylor.
|
|
||||||
|
|
||||||
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 "inferior.h"
|
|
||||||
#include "gdbcore.h"
|
|
||||||
#include "target.h"
|
|
||||||
#include "regcache.h"
|
|
||||||
#include "procfs.h"
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/procfs.h>
|
|
||||||
#include <setjmp.h> /* For JB_XXX. */
|
|
||||||
|
|
||||||
/* Prototypes for supply_gregset etc. */
|
|
||||||
#include "gregset.h"
|
|
||||||
#include "mips-tdep.h"
|
|
||||||
|
|
||||||
static void fetch_core_registers (struct regcache *, char *,
|
|
||||||
unsigned int, int, CORE_ADDR);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See the comment in m68k-tdep.c regarding the utility of these functions.
|
|
||||||
*
|
|
||||||
* These definitions are from the MIPS SVR4 ABI, so they may work for
|
|
||||||
* any MIPS SVR4 target.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
|
|
||||||
{
|
|
||||||
int regi;
|
|
||||||
const greg_t *regp = &(*gregsetp)[0];
|
|
||||||
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
|
||||||
int gregoff = sizeof (greg_t) - mips_isa_regsize (gdbarch);
|
|
||||||
static char zerobuf[32] = {0};
|
|
||||||
|
|
||||||
for (regi = 0; regi <= CTX_RA; regi++)
|
|
||||||
regcache_raw_supply (regcache, regi,
|
|
||||||
(const char *) (regp + regi) + gregoff);
|
|
||||||
|
|
||||||
regcache_raw_supply (regcache, mips_regnum (gdbarch)->pc,
|
|
||||||
(const char *) (regp + CTX_EPC) + gregoff);
|
|
||||||
regcache_raw_supply (regcache, mips_regnum (gdbarch)->hi,
|
|
||||||
(const char *) (regp + CTX_MDHI) + gregoff);
|
|
||||||
regcache_raw_supply (regcache, mips_regnum (gdbarch)->lo,
|
|
||||||
(const char *) (regp + CTX_MDLO) + gregoff);
|
|
||||||
regcache_raw_supply (regcache, mips_regnum (gdbarch)->cause,
|
|
||||||
(const char *) (regp + CTX_CAUSE) + gregoff);
|
|
||||||
|
|
||||||
/* Fill inaccessible registers with zero. */
|
|
||||||
regcache_raw_supply (regcache, mips_regnum (gdbarch)->badvaddr, zerobuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
|
|
||||||
{
|
|
||||||
int regi, size;
|
|
||||||
greg_t *regp = &(*gregsetp)[0];
|
|
||||||
gdb_byte buf[MAX_REGISTER_SIZE];
|
|
||||||
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
|
||||||
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
|
||||||
|
|
||||||
/* Under Irix6, if GDB is built with N32 ABI and is debugging an O32
|
|
||||||
executable, we have to sign extend the registers to 64 bits before
|
|
||||||
filling in the gregset structure. */
|
|
||||||
|
|
||||||
for (regi = 0; regi <= CTX_RA; regi++)
|
|
||||||
if ((regno == -1) || (regno == regi))
|
|
||||||
{
|
|
||||||
size = register_size (gdbarch, regi);
|
|
||||||
regcache_raw_collect (regcache, regi, buf);
|
|
||||||
*(regp + regi) = extract_signed_integer (buf, size, byte_order);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((regno == -1) || (regno == mips_regnum (gdbarch)->pc))
|
|
||||||
{
|
|
||||||
regi = mips_regnum (gdbarch)->pc;
|
|
||||||
size = register_size (gdbarch, regi);
|
|
||||||
regcache_raw_collect (regcache, regi, buf);
|
|
||||||
*(regp + CTX_EPC) = extract_signed_integer (buf, size, byte_order);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((regno == -1) || (regno == mips_regnum (gdbarch)->cause))
|
|
||||||
{
|
|
||||||
regi = mips_regnum (gdbarch)->cause;
|
|
||||||
size = register_size (gdbarch, regi);
|
|
||||||
regcache_raw_collect (regcache, regi, buf);
|
|
||||||
*(regp + CTX_CAUSE) = extract_signed_integer (buf, size, byte_order);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((regno == -1) || (regno == mips_regnum (gdbarch)->hi))
|
|
||||||
{
|
|
||||||
regi = mips_regnum (gdbarch)->hi;
|
|
||||||
size = register_size (gdbarch, regi);
|
|
||||||
regcache_raw_collect (regcache, regi, buf);
|
|
||||||
*(regp + CTX_MDHI) = extract_signed_integer (buf, size, byte_order);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((regno == -1) || (regno == mips_regnum (gdbarch)->lo))
|
|
||||||
{
|
|
||||||
regi = mips_regnum (gdbarch)->lo;
|
|
||||||
size = register_size (gdbarch, regi);
|
|
||||||
regcache_raw_collect (regcache, regi, buf);
|
|
||||||
*(regp + CTX_MDLO) = extract_signed_integer (buf, size, byte_order);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now we do the same thing for floating-point registers.
|
|
||||||
* We don't bother to condition on gdbarch_fp0_regnum since any
|
|
||||||
* reasonable MIPS configuration has an R3010 in it.
|
|
||||||
*
|
|
||||||
* Again, see the comments in m68k-tdep.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
|
|
||||||
{
|
|
||||||
int regi;
|
|
||||||
static char zerobuf[32] = {0};
|
|
||||||
char fsrbuf[8];
|
|
||||||
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
|
||||||
|
|
||||||
/* FIXME, this is wrong for the N32 ABI which has 64 bit FP regs. */
|
|
||||||
|
|
||||||
for (regi = 0; regi < 32; regi++)
|
|
||||||
regcache_raw_supply (regcache, gdbarch_fp0_regnum (gdbarch) + regi,
|
|
||||||
(const char *) &fpregsetp->__fp_r.__fp_regs[regi]);
|
|
||||||
|
|
||||||
/* We can't supply the FSR register directly to the regcache,
|
|
||||||
because there is a size issue: On one hand, fpregsetp->fp_csr
|
|
||||||
is 32bits long, while the regcache expects a 64bits long value.
|
|
||||||
So we use a buffer of the correct size and copy into it the register
|
|
||||||
value at the proper location. */
|
|
||||||
memset (fsrbuf, 0, 4);
|
|
||||||
memcpy (fsrbuf + 4, &fpregsetp->__fp_csr, 4);
|
|
||||||
|
|
||||||
regcache_raw_supply (regcache,
|
|
||||||
mips_regnum (gdbarch)->fp_control_status, fsrbuf);
|
|
||||||
|
|
||||||
/* FIXME: how can we supply FCRIR? SGI doesn't tell us. */
|
|
||||||
regcache_raw_supply (regcache,
|
|
||||||
mips_regnum (gdbarch)->fp_implementation_revision,
|
|
||||||
zerobuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
fill_fpregset (const struct regcache *regcache,
|
|
||||||
fpregset_t *fpregsetp, int regno)
|
|
||||||
{
|
|
||||||
int regi;
|
|
||||||
char *from, *to;
|
|
||||||
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
|
||||||
|
|
||||||
/* FIXME, this is wrong for the N32 ABI which has 64 bit FP regs. */
|
|
||||||
|
|
||||||
for (regi = gdbarch_fp0_regnum (gdbarch);
|
|
||||||
regi < gdbarch_fp0_regnum (gdbarch) + 32; regi++)
|
|
||||||
{
|
|
||||||
if ((regno == -1) || (regno == regi))
|
|
||||||
{
|
|
||||||
const int fp0_regnum = gdbarch_fp0_regnum (gdbarch);
|
|
||||||
|
|
||||||
to = (char *) &(fpregsetp->__fp_r.__fp_regs[regi - fp0_regnum]);
|
|
||||||
regcache_raw_collect (regcache, regi, to);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (regno == -1
|
|
||||||
|| regno == mips_regnum (gdbarch)->fp_control_status)
|
|
||||||
{
|
|
||||||
char fsrbuf[8];
|
|
||||||
|
|
||||||
/* We can't fill the FSR register directly from the regcache,
|
|
||||||
because there is a size issue: On one hand, fpregsetp->fp_csr
|
|
||||||
is 32bits long, while the regcache expects a 64bits long buffer.
|
|
||||||
So we use a buffer of the correct size and copy the register
|
|
||||||
value from that buffer. */
|
|
||||||
regcache_raw_collect (regcache,
|
|
||||||
mips_regnum (gdbarch)->fp_control_status, fsrbuf);
|
|
||||||
|
|
||||||
memcpy (&fpregsetp->__fp_csr, fsrbuf + 4, 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Provide registers to GDB from a core file.
|
|
||||||
|
|
||||||
CORE_REG_SECT points to an array of bytes, which were obtained from
|
|
||||||
a core file which BFD thinks might contain register contents.
|
|
||||||
CORE_REG_SIZE is its size.
|
|
||||||
|
|
||||||
Normally, WHICH says which register set corelow suspects this is:
|
|
||||||
0 --- the general-purpose register set
|
|
||||||
2 --- the floating-point register set
|
|
||||||
However, for Irix 5, WHICH isn't used.
|
|
||||||
|
|
||||||
REG_ADDR is also unused. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
fetch_core_registers (struct regcache *regcache,
|
|
||||||
char *core_reg_sect, unsigned core_reg_size,
|
|
||||||
int which, CORE_ADDR reg_addr)
|
|
||||||
{
|
|
||||||
char *srcp = core_reg_sect;
|
|
||||||
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
|
||||||
int regsize = mips_isa_regsize (gdbarch);
|
|
||||||
int regno;
|
|
||||||
|
|
||||||
/* If regsize is 8, this is a N32 or N64 core file.
|
|
||||||
If regsize is 4, this is an O32 core file. */
|
|
||||||
if (core_reg_size != regsize * gdbarch_num_regs (gdbarch))
|
|
||||||
{
|
|
||||||
warning (_("wrong size gregset struct in core file"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
|
|
||||||
{
|
|
||||||
regcache_raw_supply (regcache, regno, srcp);
|
|
||||||
srcp += regsize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Register that we are able to handle irix5 core file formats.
|
|
||||||
This really is bfd_target_unknown_flavour. */
|
|
||||||
|
|
||||||
static struct core_fns irix5_core_fns =
|
|
||||||
{
|
|
||||||
bfd_target_unknown_flavour, /* core_flavour */
|
|
||||||
default_check_format, /* check_format */
|
|
||||||
default_core_sniffer, /* core_sniffer */
|
|
||||||
fetch_core_registers, /* core_read_registers */
|
|
||||||
NULL /* next */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
|
||||||
extern initialize_file_ftype _initialize_irix5_nat;
|
|
||||||
|
|
||||||
void
|
|
||||||
_initialize_irix5_nat (void)
|
|
||||||
{
|
|
||||||
struct target_ops *t;
|
|
||||||
|
|
||||||
t = procfs_target ();
|
|
||||||
procfs_use_watchpoints (t);
|
|
||||||
add_target (t);
|
|
||||||
|
|
||||||
deprecated_add_core_fns (&irix5_core_fns);
|
|
||||||
}
|
|
@ -1,294 +0,0 @@
|
|||||||
/* Target-dependent code for the MIPS architecture running on IRIX,
|
|
||||||
for GDB, the GNU Debugger.
|
|
||||||
|
|
||||||
Copyright (C) 2002-2014 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 "osabi.h"
|
|
||||||
#include "solib.h"
|
|
||||||
#include "solib-irix.h"
|
|
||||||
#include "elf-bfd.h"
|
|
||||||
#include "mips-tdep.h"
|
|
||||||
#include "trad-frame.h"
|
|
||||||
#include "tramp-frame.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
mips_irix_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect,
|
|
||||||
void *obj)
|
|
||||||
{
|
|
||||||
enum gdb_osabi *os_ident_ptr = obj;
|
|
||||||
const char *name;
|
|
||||||
unsigned int sectsize;
|
|
||||||
|
|
||||||
name = bfd_get_section_name (abfd, sect);
|
|
||||||
sectsize = bfd_section_size (abfd, sect);
|
|
||||||
|
|
||||||
/* The presence of a section named with a ".MIPS." prefix is usually
|
|
||||||
indicative of an IRIX binary, however there are exceptions that
|
|
||||||
are present universally, so check for those names and avoid
|
|
||||||
switching away from the default OS ABI in the case of a match. */
|
|
||||||
if (strncmp (name, ".MIPS.", 6) == 0
|
|
||||||
&& strcmp (name, ".MIPS.abiflags") != 0
|
|
||||||
&& strcmp (name, ".MIPS.options") != 0
|
|
||||||
&& strcmp (name, ".MIPS.stubs") != 0
|
|
||||||
&& sectsize > 0)
|
|
||||||
*os_ident_ptr = GDB_OSABI_IRIX;
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum gdb_osabi
|
|
||||||
mips_irix_elf_osabi_sniffer (bfd *abfd)
|
|
||||||
{
|
|
||||||
unsigned int elfosabi;
|
|
||||||
enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
|
|
||||||
|
|
||||||
/* If the generic sniffer gets a hit, return and let other sniffers
|
|
||||||
get a crack at it. */
|
|
||||||
bfd_map_over_sections (abfd,
|
|
||||||
generic_elf_osabi_sniff_abi_tag_sections,
|
|
||||||
&osabi);
|
|
||||||
if (osabi != GDB_OSABI_UNKNOWN)
|
|
||||||
return GDB_OSABI_UNKNOWN;
|
|
||||||
|
|
||||||
elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
|
|
||||||
|
|
||||||
if (elfosabi == ELFOSABI_NONE)
|
|
||||||
{
|
|
||||||
/* When elfosabi is ELFOSABI_NONE (0), then the ELF structures in the
|
|
||||||
file are conforming to the base specification for that machine
|
|
||||||
(there are no OS-specific extensions). In order to determine the
|
|
||||||
real OS in use we must look for OS notes that have been added.
|
|
||||||
|
|
||||||
For IRIX, we simply look for sections named with .MIPS. as
|
|
||||||
prefixes. */
|
|
||||||
bfd_map_over_sections (abfd,
|
|
||||||
mips_irix_elf_osabi_sniff_abi_tag_sections,
|
|
||||||
&osabi);
|
|
||||||
}
|
|
||||||
return osabi;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unwinding past the signal handler on mips-irix.
|
|
||||||
|
|
||||||
Note: The following has only been tested with N32, but can probably
|
|
||||||
be made to work with a small number of adjustments.
|
|
||||||
|
|
||||||
On mips-irix, the sigcontext_t structure is stored at the base
|
|
||||||
of the frame established by the _sigtramp function. The definition
|
|
||||||
of this structure can be found in <sys/signal.h> (comments have been
|
|
||||||
C++'ified to avoid a collision with the C-style comment delimiters
|
|
||||||
used by this comment):
|
|
||||||
|
|
||||||
typedef struct sigcontext {
|
|
||||||
__uint32_t sc_regmask; // regs to restore in sigcleanup
|
|
||||||
__uint32_t sc_status; // cp0 status register
|
|
||||||
__uint64_t sc_pc; // pc at time of signal
|
|
||||||
// General purpose registers
|
|
||||||
__uint64_t sc_regs[32]; // processor regs 0 to 31
|
|
||||||
// Floating point coprocessor state
|
|
||||||
__uint64_t sc_fpregs[32]; // fp regs 0 to 31
|
|
||||||
__uint32_t sc_ownedfp; // fp has been used
|
|
||||||
__uint32_t sc_fpc_csr; // fpu control and status reg
|
|
||||||
__uint32_t sc_fpc_eir; // fpu exception instruction reg
|
|
||||||
// implementation/revision
|
|
||||||
__uint32_t sc_ssflags; // signal stack state to restore
|
|
||||||
__uint64_t sc_mdhi; // Multiplier hi and low regs
|
|
||||||
__uint64_t sc_mdlo;
|
|
||||||
// System coprocessor registers at time of signal
|
|
||||||
__uint64_t sc_cause; // cp0 cause register
|
|
||||||
__uint64_t sc_badvaddr; // cp0 bad virtual address
|
|
||||||
__uint64_t sc_triggersave; // state of graphics trigger (SGI)
|
|
||||||
sigset_t sc_sigset; // signal mask to restore
|
|
||||||
__uint64_t sc_fp_rounded_result; // for Ieee 754 support
|
|
||||||
__uint64_t sc_pad[31];
|
|
||||||
} sigcontext_t;
|
|
||||||
|
|
||||||
The following macros provide the offset of some of the fields
|
|
||||||
used to retrieve the value of the registers before the signal
|
|
||||||
was raised. */
|
|
||||||
|
|
||||||
/* The size of the sigtramp frame. The sigtramp frame base can then
|
|
||||||
be computed by adding this size to the SP. */
|
|
||||||
#define SIGTRAMP_FRAME_SIZE 48
|
|
||||||
/* The offset in sigcontext_t where the PC is saved. */
|
|
||||||
#define SIGCONTEXT_PC_OFF 8
|
|
||||||
/* The offset in sigcontext_t where the GP registers are saved. */
|
|
||||||
#define SIGCONTEXT_REGS_OFF (SIGCONTEXT_PC_OFF + 8)
|
|
||||||
/* The offset in sigcontext_t where the FP regsiters are saved. */
|
|
||||||
#define SIGCONTEXT_FPREGS_OFF (SIGCONTEXT_REGS_OFF + 32 * 8)
|
|
||||||
/* The offset in sigcontext_t where the FP CSR register is saved. */
|
|
||||||
#define SIGCONTEXT_FPCSR_OFF (SIGCONTEXT_FPREGS_OFF + 32 * 8 + 4)
|
|
||||||
/* The offset in sigcontext_t where the multiplier hi register is saved. */
|
|
||||||
#define SIGCONTEXT_HI_OFF (SIGCONTEXT_FPCSR_OFF + 2 * 4)
|
|
||||||
/* The offset in sigcontext_t where the multiplier lo register is saved. */
|
|
||||||
#define SIGCONTEXT_LO_OFF (SIGCONTEXT_HI_OFF + 4)
|
|
||||||
|
|
||||||
/* Implement the "init" routine in struct tramp_frame for the N32 ABI
|
|
||||||
on mips-irix. */
|
|
||||||
static void
|
|
||||||
mips_irix_n32_tramp_frame_init (const struct tramp_frame *self,
|
|
||||||
struct frame_info *this_frame,
|
|
||||||
struct trad_frame_cache *this_cache,
|
|
||||||
CORE_ADDR func)
|
|
||||||
{
|
|
||||||
struct gdbarch *gdbarch = get_frame_arch (this_frame);
|
|
||||||
const int num_regs = gdbarch_num_regs (gdbarch);
|
|
||||||
int sp_cooked_regno = num_regs + MIPS_SP_REGNUM;
|
|
||||||
const CORE_ADDR sp = get_frame_register_signed (this_frame, sp_cooked_regno);
|
|
||||||
const CORE_ADDR sigcontext_base = sp + 48;
|
|
||||||
const struct mips_regnum *regs = mips_regnum (gdbarch);
|
|
||||||
int ireg;
|
|
||||||
|
|
||||||
trad_frame_set_reg_addr (this_cache, regs->pc + gdbarch_num_regs (gdbarch),
|
|
||||||
sigcontext_base + SIGCONTEXT_PC_OFF);
|
|
||||||
|
|
||||||
for (ireg = 1; ireg < 32; ireg++)
|
|
||||||
trad_frame_set_reg_addr (this_cache, ireg + MIPS_ZERO_REGNUM + num_regs,
|
|
||||||
sigcontext_base + SIGCONTEXT_REGS_OFF + ireg * 8);
|
|
||||||
|
|
||||||
for (ireg = 0; ireg < 32; ireg++)
|
|
||||||
trad_frame_set_reg_addr (this_cache, ireg + regs->fp0 + num_regs,
|
|
||||||
sigcontext_base + SIGCONTEXT_FPREGS_OFF
|
|
||||||
+ ireg * 8);
|
|
||||||
|
|
||||||
trad_frame_set_reg_addr (this_cache, regs->fp_control_status + num_regs,
|
|
||||||
sigcontext_base + SIGCONTEXT_FPCSR_OFF);
|
|
||||||
|
|
||||||
trad_frame_set_reg_addr (this_cache, regs->hi + num_regs,
|
|
||||||
sigcontext_base + SIGCONTEXT_HI_OFF);
|
|
||||||
|
|
||||||
trad_frame_set_reg_addr (this_cache, regs->lo + num_regs,
|
|
||||||
sigcontext_base + SIGCONTEXT_LO_OFF);
|
|
||||||
|
|
||||||
trad_frame_set_id (this_cache, frame_id_build (sigcontext_base, func));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The tramp_frame structure describing sigtramp frames on mips-irix N32.
|
|
||||||
|
|
||||||
Note that the list of instructions below is pretty much a pure dump
|
|
||||||
of function _sigtramp on mips-irix. A few instructions are actually
|
|
||||||
not tested (mask set to 0), because a portion of these instructions
|
|
||||||
contain an address which changes due to relocation. We could use
|
|
||||||
a smarter mask that checks the instrutction code alone, but given
|
|
||||||
the number of instructions already being checked, this seemed
|
|
||||||
unnecessary. */
|
|
||||||
|
|
||||||
static const struct tramp_frame mips_irix_n32_tramp_frame =
|
|
||||||
{
|
|
||||||
SIGTRAMP_FRAME,
|
|
||||||
4,
|
|
||||||
{
|
|
||||||
{ 0x3c0c8000, -1 }, /* lui t0,0x8000 */
|
|
||||||
{ 0x27bdffd0, -1 }, /* addiu sp,sp,-48 */
|
|
||||||
{ 0x008c6024, -1 }, /* and t0,a0,t0 */
|
|
||||||
{ 0xffa40018, -1 }, /* sd a0,24(sp) */
|
|
||||||
{ 0x00000000, 0 }, /* beqz t0,0xfaefcb8 <_sigtramp+40> */
|
|
||||||
{ 0xffa60028, -1 }, /* sd a2,40(sp) */
|
|
||||||
{ 0x01806027, -1 }, /* nor t0,t0,zero */
|
|
||||||
{ 0xffa00020, -1 }, /* sd zero,32(sp) */
|
|
||||||
{ 0x00000000, 0 }, /* b 0xfaefcbc <_sigtramp+44> */
|
|
||||||
{ 0x008c2024, -1 }, /* and a0,a0,t0 */
|
|
||||||
{ 0xffa60020, -1 }, /* sd a2,32(sp) */
|
|
||||||
{ 0x03e0c025, -1 }, /* move t8,ra */
|
|
||||||
{ 0x00000000, 0 }, /* bal 0xfaefcc8 <_sigtramp+56> */
|
|
||||||
{ 0x00000000, -1 }, /* nop */
|
|
||||||
{ 0x3c0c0007, -1 }, /* lui t0,0x7 */
|
|
||||||
{ 0x00e0c825, -1 }, /* move t9,a3 */
|
|
||||||
{ 0x658c80fc, -1 }, /* daddiu t0,t0,-32516 */
|
|
||||||
{ 0x019f602d, -1 }, /* daddu t0,t0,ra */
|
|
||||||
{ 0x0300f825, -1 }, /* move ra,t8 */
|
|
||||||
{ 0x8d8c9880, -1 }, /* lw t0,-26496(t0) */
|
|
||||||
{ 0x8d8c0000, -1 }, /* lw t0,0(t0) */
|
|
||||||
{ 0x8d8d0000, -1 }, /* lw t1,0(t0) */
|
|
||||||
{ 0xffac0008, -1 }, /* sd t0,8(sp) */
|
|
||||||
{ 0x0320f809, -1 }, /* jalr t9 */
|
|
||||||
{ 0xffad0010, -1 }, /* sd t1,16(sp) */
|
|
||||||
{ 0xdfad0010, -1 }, /* ld t1,16(sp) */
|
|
||||||
{ 0xdfac0008, -1 }, /* ld t0,8(sp) */
|
|
||||||
{ 0xad8d0000, -1 }, /* sw t1,0(t0) */
|
|
||||||
{ 0xdfa40020, -1 }, /* ld a0,32(sp) */
|
|
||||||
{ 0xdfa50028, -1 }, /* ld a1,40(sp) */
|
|
||||||
{ 0xdfa60018, -1 }, /* ld a2,24(sp) */
|
|
||||||
{ 0x24020440, -1 }, /* li v0,1088 */
|
|
||||||
{ 0x0000000c, -1 }, /* syscall */
|
|
||||||
{ TRAMP_SENTINEL_INSN, -1 }
|
|
||||||
},
|
|
||||||
mips_irix_n32_tramp_frame_init
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Implement the "init" routine in struct tramp_frame for the stack-based
|
|
||||||
trampolines used on mips-irix. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
mips_irix_n32_stack_tramp_frame_init (const struct tramp_frame *self,
|
|
||||||
struct frame_info *this_frame,
|
|
||||||
struct trad_frame_cache *this_cache,
|
|
||||||
CORE_ADDR func)
|
|
||||||
{
|
|
||||||
struct gdbarch *gdbarch = get_frame_arch (this_frame);
|
|
||||||
const int num_regs = gdbarch_num_regs (gdbarch);
|
|
||||||
int sp_cooked_regno = num_regs + MIPS_SP_REGNUM;
|
|
||||||
const CORE_ADDR sp = get_frame_register_signed (this_frame, sp_cooked_regno);
|
|
||||||
|
|
||||||
/* The previous frame's PC is stored in RA. */
|
|
||||||
trad_frame_set_reg_realreg (this_cache, gdbarch_pc_regnum (gdbarch),
|
|
||||||
num_regs + MIPS_RA_REGNUM);
|
|
||||||
|
|
||||||
trad_frame_set_id (this_cache, frame_id_build (sp, func));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A tramp_frame structure describing the stack-based trampoline
|
|
||||||
used on mips-irix. These trampolines are created on the stack
|
|
||||||
before being called. */
|
|
||||||
|
|
||||||
static const struct tramp_frame mips_irix_n32_stack_tramp_frame =
|
|
||||||
{
|
|
||||||
SIGTRAMP_FRAME,
|
|
||||||
4,
|
|
||||||
{
|
|
||||||
{ 0x8f210000, 0xffff0000 }, /* lw at, N(t9) */
|
|
||||||
{ 0x8f2f0000, 0xffff0000 }, /* lw t3, M(t9) */
|
|
||||||
{ 0x00200008, 0xffffffff }, /* jr at */
|
|
||||||
{ 0x0020c82d, 0xffffffff }, /* move t9, at */
|
|
||||||
{ TRAMP_SENTINEL_INSN, -1 }
|
|
||||||
},
|
|
||||||
mips_irix_n32_stack_tramp_frame_init
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
mips_irix_init_abi (struct gdbarch_info info,
|
|
||||||
struct gdbarch *gdbarch)
|
|
||||||
{
|
|
||||||
set_solib_ops (gdbarch, &irix_so_ops);
|
|
||||||
tramp_frame_prepend_unwinder (gdbarch, &mips_irix_n32_stack_tramp_frame);
|
|
||||||
tramp_frame_prepend_unwinder (gdbarch, &mips_irix_n32_tramp_frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
|
||||||
extern initialize_file_ftype _initialize_mips_irix_tdep;
|
|
||||||
|
|
||||||
void
|
|
||||||
_initialize_mips_irix_tdep (void)
|
|
||||||
{
|
|
||||||
/* Register an ELF OS ABI sniffer for IRIX binaries. */
|
|
||||||
gdbarch_register_osabi_sniffer (bfd_arch_mips,
|
|
||||||
bfd_target_elf_flavour,
|
|
||||||
mips_irix_elf_osabi_sniffer);
|
|
||||||
|
|
||||||
gdbarch_register_osabi (bfd_arch_mips, 0, GDB_OSABI_IRIX,
|
|
||||||
mips_irix_init_abi);
|
|
||||||
}
|
|
610
gdb/solib-irix.c
610
gdb/solib-irix.c
@ -1,610 +0,0 @@
|
|||||||
/* Shared library support for IRIX.
|
|
||||||
Copyright (C) 1993-2014 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This file was created using portions of irix5-nat.c originally
|
|
||||||
contributed to GDB by Ian Lance Taylor.
|
|
||||||
|
|
||||||
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 "symtab.h"
|
|
||||||
#include "bfd.h"
|
|
||||||
/* FIXME: ezannoni/2004-02-13 Verify that the include below is
|
|
||||||
really needed. */
|
|
||||||
#include "symfile.h"
|
|
||||||
#include "objfiles.h"
|
|
||||||
#include "gdbcore.h"
|
|
||||||
#include "target.h"
|
|
||||||
#include "inferior.h"
|
|
||||||
#include "infrun.h"
|
|
||||||
#include "gdbthread.h"
|
|
||||||
|
|
||||||
#include "solist.h"
|
|
||||||
#include "solib.h"
|
|
||||||
#include "solib-irix.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Link map info to include in an allocate so_list entry. Unlike some
|
|
||||||
of the other solib backends, this (Irix) backend chooses to decode
|
|
||||||
the link map info obtained from the target and store it as (mostly)
|
|
||||||
CORE_ADDRs which need no further decoding. This is more convenient
|
|
||||||
because there are three different link map formats to worry about.
|
|
||||||
We use a single routine (fetch_lm_info) to read (and decode) the target
|
|
||||||
specific link map data. */
|
|
||||||
|
|
||||||
struct lm_info
|
|
||||||
{
|
|
||||||
CORE_ADDR addr; /* address of obj_info or obj_list
|
|
||||||
struct on target (from which the
|
|
||||||
following information is obtained). */
|
|
||||||
CORE_ADDR next; /* address of next item in list. */
|
|
||||||
CORE_ADDR reloc_offset; /* amount to relocate by */
|
|
||||||
CORE_ADDR pathname_addr; /* address of pathname */
|
|
||||||
int pathname_len; /* length of pathname */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* It's not desirable to use the system header files to obtain the
|
|
||||||
structure of the obj_list or obj_info structs. Therefore, we use a
|
|
||||||
platform neutral representation which has been derived from the IRIX
|
|
||||||
header files. */
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
gdb_byte b[4];
|
|
||||||
}
|
|
||||||
gdb_int32_bytes;
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
gdb_byte b[8];
|
|
||||||
}
|
|
||||||
gdb_int64_bytes;
|
|
||||||
|
|
||||||
/* The "old" obj_list struct. This is used with old (o32) binaries.
|
|
||||||
The ``data'' member points at a much larger and more complicated
|
|
||||||
struct which we will only refer to by offsets. See
|
|
||||||
fetch_lm_info(). */
|
|
||||||
|
|
||||||
struct irix_obj_list
|
|
||||||
{
|
|
||||||
gdb_int32_bytes data;
|
|
||||||
gdb_int32_bytes next;
|
|
||||||
gdb_int32_bytes prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The ELF32 and ELF64 versions of the above struct. The oi_magic value
|
|
||||||
corresponds to the ``data'' value in the "old" struct. When this value
|
|
||||||
is 0xffffffff, the data will be in one of the following formats. The
|
|
||||||
``oi_size'' field is used to decide which one we actually have. */
|
|
||||||
|
|
||||||
struct irix_elf32_obj_info
|
|
||||||
{
|
|
||||||
gdb_int32_bytes oi_magic;
|
|
||||||
gdb_int32_bytes oi_size;
|
|
||||||
gdb_int32_bytes oi_next;
|
|
||||||
gdb_int32_bytes oi_prev;
|
|
||||||
gdb_int32_bytes oi_ehdr;
|
|
||||||
gdb_int32_bytes oi_orig_ehdr;
|
|
||||||
gdb_int32_bytes oi_pathname;
|
|
||||||
gdb_int32_bytes oi_pathname_len;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct irix_elf64_obj_info
|
|
||||||
{
|
|
||||||
gdb_int32_bytes oi_magic;
|
|
||||||
gdb_int32_bytes oi_size;
|
|
||||||
gdb_int64_bytes oi_next;
|
|
||||||
gdb_int64_bytes oi_prev;
|
|
||||||
gdb_int64_bytes oi_ehdr;
|
|
||||||
gdb_int64_bytes oi_orig_ehdr;
|
|
||||||
gdb_int64_bytes oi_pathname;
|
|
||||||
gdb_int32_bytes oi_pathname_len;
|
|
||||||
gdb_int32_bytes padding;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Union of all of the above (plus a split out magic field). */
|
|
||||||
|
|
||||||
union irix_obj_info
|
|
||||||
{
|
|
||||||
gdb_int32_bytes magic;
|
|
||||||
struct irix_obj_list ol32;
|
|
||||||
struct irix_elf32_obj_info oi32;
|
|
||||||
struct irix_elf64_obj_info oi64;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* MIPS sign extends its 32 bit addresses. We could conceivably use
|
|
||||||
extract_typed_address here, but to do so, we'd have to construct an
|
|
||||||
appropriate type. Calling extract_signed_integer seems simpler. */
|
|
||||||
|
|
||||||
static CORE_ADDR
|
|
||||||
extract_mips_address (void *addr, int len, enum bfd_endian byte_order)
|
|
||||||
{
|
|
||||||
return extract_signed_integer (addr, len, byte_order);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fetch and return the link map data associated with ADDR. Note that
|
|
||||||
this routine automatically determines which (of three) link map
|
|
||||||
formats is in use by the target. */
|
|
||||||
|
|
||||||
static struct lm_info
|
|
||||||
fetch_lm_info (CORE_ADDR addr)
|
|
||||||
{
|
|
||||||
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
|
||||||
struct lm_info li;
|
|
||||||
union irix_obj_info buf;
|
|
||||||
|
|
||||||
li.addr = addr;
|
|
||||||
|
|
||||||
/* The smallest region that we'll need is for buf.ol32. We'll read
|
|
||||||
that first. We'll read more of the buffer later if we have to deal
|
|
||||||
with one of the other cases. (We don't want to incur a memory error
|
|
||||||
if we were to read a larger region that generates an error due to
|
|
||||||
being at the end of a page or the like.) */
|
|
||||||
read_memory (addr, (gdb_byte *) &buf, sizeof (buf.ol32));
|
|
||||||
|
|
||||||
if (extract_unsigned_integer (buf.magic.b, sizeof (buf.magic), byte_order)
|
|
||||||
!= 0xffffffff)
|
|
||||||
{
|
|
||||||
/* Use buf.ol32... */
|
|
||||||
gdb_byte obj_buf[432];
|
|
||||||
CORE_ADDR obj_addr = extract_mips_address (&buf.ol32.data,
|
|
||||||
sizeof (buf.ol32.data),
|
|
||||||
byte_order);
|
|
||||||
|
|
||||||
li.next = extract_mips_address (&buf.ol32.next,
|
|
||||||
sizeof (buf.ol32.next), byte_order);
|
|
||||||
|
|
||||||
read_memory (obj_addr, obj_buf, sizeof (obj_buf));
|
|
||||||
|
|
||||||
li.pathname_addr = extract_mips_address (&obj_buf[236], 4, byte_order);
|
|
||||||
li.pathname_len = 0; /* unknown */
|
|
||||||
li.reloc_offset = extract_mips_address (&obj_buf[196], 4, byte_order)
|
|
||||||
- extract_mips_address (&obj_buf[248], 4, byte_order);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (extract_unsigned_integer (buf.oi32.oi_size.b,
|
|
||||||
sizeof (buf.oi32.oi_size), byte_order)
|
|
||||||
== sizeof (buf.oi32))
|
|
||||||
{
|
|
||||||
/* Use buf.oi32... */
|
|
||||||
|
|
||||||
/* Read rest of buffer. */
|
|
||||||
read_memory (addr + sizeof (buf.ol32),
|
|
||||||
((gdb_byte *) &buf) + sizeof (buf.ol32),
|
|
||||||
sizeof (buf.oi32) - sizeof (buf.ol32));
|
|
||||||
|
|
||||||
/* Fill in fields using buffer contents. */
|
|
||||||
li.next = extract_mips_address (&buf.oi32.oi_next,
|
|
||||||
sizeof (buf.oi32.oi_next), byte_order);
|
|
||||||
li.reloc_offset = extract_mips_address (&buf.oi32.oi_ehdr,
|
|
||||||
sizeof (buf.oi32.oi_ehdr),
|
|
||||||
byte_order)
|
|
||||||
- extract_mips_address (&buf.oi32.oi_orig_ehdr,
|
|
||||||
sizeof (buf.oi32.oi_orig_ehdr), byte_order);
|
|
||||||
li.pathname_addr = extract_mips_address (&buf.oi32.oi_pathname,
|
|
||||||
sizeof (buf.oi32.oi_pathname),
|
|
||||||
byte_order);
|
|
||||||
li.pathname_len = extract_unsigned_integer (buf.oi32.oi_pathname_len.b,
|
|
||||||
sizeof (buf.oi32.
|
|
||||||
oi_pathname_len),
|
|
||||||
byte_order);
|
|
||||||
}
|
|
||||||
else if (extract_unsigned_integer (buf.oi64.oi_size.b,
|
|
||||||
sizeof (buf.oi64.oi_size), byte_order)
|
|
||||||
== sizeof (buf.oi64))
|
|
||||||
{
|
|
||||||
/* Use buf.oi64... */
|
|
||||||
|
|
||||||
/* Read rest of buffer. */
|
|
||||||
read_memory (addr + sizeof (buf.ol32),
|
|
||||||
((gdb_byte *) &buf) + sizeof (buf.ol32),
|
|
||||||
sizeof (buf.oi64) - sizeof (buf.ol32));
|
|
||||||
|
|
||||||
/* Fill in fields using buffer contents. */
|
|
||||||
li.next = extract_mips_address (&buf.oi64.oi_next,
|
|
||||||
sizeof (buf.oi64.oi_next), byte_order);
|
|
||||||
li.reloc_offset = extract_mips_address (&buf.oi64.oi_ehdr,
|
|
||||||
sizeof (buf.oi64.oi_ehdr),
|
|
||||||
byte_order)
|
|
||||||
- extract_mips_address (&buf.oi64.oi_orig_ehdr,
|
|
||||||
sizeof (buf.oi64.oi_orig_ehdr), byte_order);
|
|
||||||
li.pathname_addr = extract_mips_address (&buf.oi64.oi_pathname,
|
|
||||||
sizeof (buf.oi64.oi_pathname),
|
|
||||||
byte_order);
|
|
||||||
li.pathname_len = extract_unsigned_integer (buf.oi64.oi_pathname_len.b,
|
|
||||||
sizeof (buf.oi64.
|
|
||||||
oi_pathname_len),
|
|
||||||
byte_order);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
error (_("Unable to fetch shared library obj_info or obj_list info."));
|
|
||||||
}
|
|
||||||
|
|
||||||
return li;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The symbol which starts off the list of shared libraries. */
|
|
||||||
#define DEBUG_BASE "__rld_obj_head"
|
|
||||||
|
|
||||||
static CORE_ADDR debug_base; /* Base of dynamic linker structures. */
|
|
||||||
|
|
||||||
/* Locate the base address of dynamic linker structs.
|
|
||||||
|
|
||||||
For both the SunOS and SVR4 shared library implementations, if the
|
|
||||||
inferior executable has been linked dynamically, there is a single
|
|
||||||
address somewhere in the inferior's data space which is the key to
|
|
||||||
locating all of the dynamic linker's runtime structures. This
|
|
||||||
address is the value of the symbol defined by the macro DEBUG_BASE.
|
|
||||||
The job of this function is to find and return that address, or to
|
|
||||||
return 0 if there is no such address (the executable is statically
|
|
||||||
linked for example).
|
|
||||||
|
|
||||||
For SunOS, the job is almost trivial, since the dynamic linker and
|
|
||||||
all of it's structures are statically linked to the executable at
|
|
||||||
link time. Thus the symbol for the address we are looking for has
|
|
||||||
already been added to the minimal symbol table for the executable's
|
|
||||||
objfile at the time the symbol file's symbols were read, and all we
|
|
||||||
have to do is look it up there. Note that we explicitly do NOT want
|
|
||||||
to find the copies in the shared library.
|
|
||||||
|
|
||||||
The SVR4 version is much more complicated because the dynamic linker
|
|
||||||
and it's structures are located in the shared C library, which gets
|
|
||||||
run as the executable's "interpreter" by the kernel. We have to go
|
|
||||||
to a lot more work to discover the address of DEBUG_BASE. Because
|
|
||||||
of this complexity, we cache the value we find and return that value
|
|
||||||
on subsequent invocations. Note there is no copy in the executable
|
|
||||||
symbol tables.
|
|
||||||
|
|
||||||
Irix 5 is basically like SunOS.
|
|
||||||
|
|
||||||
Note that we can assume nothing about the process state at the time
|
|
||||||
we need to find this address. We may be stopped on the first instruc-
|
|
||||||
tion of the interpreter (C shared library), the first instruction of
|
|
||||||
the executable itself, or somewhere else entirely (if we attached
|
|
||||||
to the process for example). */
|
|
||||||
|
|
||||||
static CORE_ADDR
|
|
||||||
locate_base (void)
|
|
||||||
{
|
|
||||||
struct bound_minimal_symbol msymbol;
|
|
||||||
CORE_ADDR address = 0;
|
|
||||||
|
|
||||||
msymbol = lookup_minimal_symbol (DEBUG_BASE, NULL, symfile_objfile);
|
|
||||||
if ((msymbol.minsym != NULL) && (BMSYMBOL_VALUE_ADDRESS (msymbol) != 0))
|
|
||||||
{
|
|
||||||
address = BMSYMBOL_VALUE_ADDRESS (msymbol);
|
|
||||||
}
|
|
||||||
return (address);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Arrange for dynamic linker to hit breakpoint.
|
|
||||||
|
|
||||||
This functions inserts a breakpoint at the entry point of the
|
|
||||||
main executable, where all shared libraries are mapped in. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
enable_break (void)
|
|
||||||
{
|
|
||||||
if (symfile_objfile != NULL && has_stack_frames ())
|
|
||||||
{
|
|
||||||
CORE_ADDR entry_point;
|
|
||||||
|
|
||||||
if (entry_point_address_query (&entry_point))
|
|
||||||
{
|
|
||||||
create_solib_event_breakpoint (target_gdbarch (), entry_point);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Implement the "handle_event" target_solib_ops method. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
irix_solib_handle_event (void)
|
|
||||||
{
|
|
||||||
/* We are now at the "mapping complete" breakpoint, we no longer
|
|
||||||
need it. Note that it is possible that we have stopped at a
|
|
||||||
location that is different from the location where we inserted
|
|
||||||
our breakpoint: On mips-irix, we can actually land in
|
|
||||||
__dbx_link(), so we should not check the PC against our
|
|
||||||
breakpoint address here. See procfs.c for more details. Note
|
|
||||||
we're being called by the bpstat handling code, and so can't
|
|
||||||
delete the breakpoint immediately. Mark it for later deletion,
|
|
||||||
which has the same effect (it'll be removed before we next resume
|
|
||||||
or if we're stopping). */
|
|
||||||
remove_solib_event_breakpoints_at_next_stop ();
|
|
||||||
|
|
||||||
/* The caller calls solib_add, which will add any shared libraries
|
|
||||||
that were mapped in. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Implement the "create_inferior_hook" target_solib_ops method.
|
|
||||||
|
|
||||||
For SunOS executables, this first instruction is typically the
|
|
||||||
one at "_start", or a similar text label, regardless of whether
|
|
||||||
the executable is statically or dynamically linked. The runtime
|
|
||||||
startup code takes care of dynamically linking in any shared
|
|
||||||
libraries, once gdb allows the inferior to continue.
|
|
||||||
|
|
||||||
For SVR4 executables, this first instruction is either the first
|
|
||||||
instruction in the dynamic linker (for dynamically linked
|
|
||||||
executables) or the instruction at "start" for statically linked
|
|
||||||
executables. For dynamically linked executables, the system
|
|
||||||
first exec's /lib/libc.so.N, which contains the dynamic linker,
|
|
||||||
and starts it running. The dynamic linker maps in any needed
|
|
||||||
shared libraries, maps in the actual user executable, and then
|
|
||||||
jumps to "start" in the user executable.
|
|
||||||
|
|
||||||
For both SunOS shared libraries, and SVR4 shared libraries, we
|
|
||||||
can arrange to cooperate with the dynamic linker to discover the
|
|
||||||
names of shared libraries that are dynamically linked, and the
|
|
||||||
base addresses to which they are linked.
|
|
||||||
|
|
||||||
This function is responsible for discovering those names and
|
|
||||||
addresses, and saving sufficient information about them to allow
|
|
||||||
their symbols to be read at a later time.
|
|
||||||
|
|
||||||
FIXME
|
|
||||||
|
|
||||||
Between enable_break() and disable_break(), this code does not
|
|
||||||
properly handle hitting breakpoints which the user might have
|
|
||||||
set in the startup code or in the dynamic linker itself. Proper
|
|
||||||
handling will probably have to wait until the implementation is
|
|
||||||
changed to use the "breakpoint handler function" method.
|
|
||||||
|
|
||||||
Also, what if child has exit()ed? Must exit loop somehow. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
irix_solib_create_inferior_hook (int from_tty)
|
|
||||||
{
|
|
||||||
struct inferior *inf;
|
|
||||||
struct thread_info *tp;
|
|
||||||
|
|
||||||
inf = current_inferior ();
|
|
||||||
|
|
||||||
/* If we are attaching to the inferior, the shared libraries
|
|
||||||
have already been mapped, so nothing more to do. */
|
|
||||||
if (inf->attach_flag)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Likewise when debugging from a core file, the shared libraries
|
|
||||||
have already been mapped, so nothing more to do. */
|
|
||||||
if (!target_can_run (¤t_target))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!enable_break ())
|
|
||||||
{
|
|
||||||
warning (_("shared library handler failed to enable breakpoint"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The target will eventually hit the breakpoint, at which point all
|
|
||||||
of the libraries will have been mapped in and we can go groveling
|
|
||||||
around in the dynamic linker structures to find out what we need
|
|
||||||
to know about them. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Implement the "current_sos" target_so_ops method. */
|
|
||||||
|
|
||||||
static struct so_list *
|
|
||||||
irix_current_sos (void)
|
|
||||||
{
|
|
||||||
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
|
||||||
int addr_size = gdbarch_addr_bit (target_gdbarch ()) / TARGET_CHAR_BIT;
|
|
||||||
CORE_ADDR lma;
|
|
||||||
gdb_byte addr_buf[8];
|
|
||||||
struct so_list *head = 0;
|
|
||||||
struct so_list **link_ptr = &head;
|
|
||||||
int is_first = 1;
|
|
||||||
struct lm_info lm;
|
|
||||||
|
|
||||||
/* Make sure we've looked up the inferior's dynamic linker's base
|
|
||||||
structure. */
|
|
||||||
if (!debug_base)
|
|
||||||
{
|
|
||||||
debug_base = locate_base ();
|
|
||||||
|
|
||||||
/* If we can't find the dynamic linker's base structure, this
|
|
||||||
must not be a dynamically linked executable. Hmm. */
|
|
||||||
if (!debug_base)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
read_memory (debug_base, addr_buf, addr_size);
|
|
||||||
lma = extract_mips_address (addr_buf, addr_size, byte_order);
|
|
||||||
|
|
||||||
while (lma)
|
|
||||||
{
|
|
||||||
lm = fetch_lm_info (lma);
|
|
||||||
if (!is_first)
|
|
||||||
{
|
|
||||||
int errcode;
|
|
||||||
char *name_buf;
|
|
||||||
int name_size;
|
|
||||||
struct so_list *new
|
|
||||||
= (struct so_list *) xmalloc (sizeof (struct so_list));
|
|
||||||
struct cleanup *old_chain = make_cleanup (xfree, new);
|
|
||||||
|
|
||||||
memset (new, 0, sizeof (*new));
|
|
||||||
|
|
||||||
new->lm_info = xmalloc (sizeof (struct lm_info));
|
|
||||||
make_cleanup (xfree, new->lm_info);
|
|
||||||
|
|
||||||
*new->lm_info = lm;
|
|
||||||
|
|
||||||
/* Extract this shared object's name. */
|
|
||||||
name_size = lm.pathname_len;
|
|
||||||
if (name_size == 0)
|
|
||||||
name_size = SO_NAME_MAX_PATH_SIZE - 1;
|
|
||||||
|
|
||||||
if (name_size >= SO_NAME_MAX_PATH_SIZE)
|
|
||||||
{
|
|
||||||
name_size = SO_NAME_MAX_PATH_SIZE - 1;
|
|
||||||
warning (_("current_sos: truncating name of "
|
|
||||||
"%d characters to only %d characters"),
|
|
||||||
lm.pathname_len, name_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
target_read_string (lm.pathname_addr, &name_buf,
|
|
||||||
name_size, &errcode);
|
|
||||||
if (errcode != 0)
|
|
||||||
warning (_("Can't read pathname for load map: %s."),
|
|
||||||
safe_strerror (errcode));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strncpy (new->so_name, name_buf, name_size);
|
|
||||||
new->so_name[name_size] = '\0';
|
|
||||||
xfree (name_buf);
|
|
||||||
strcpy (new->so_original_name, new->so_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
new->next = 0;
|
|
||||||
*link_ptr = new;
|
|
||||||
link_ptr = &new->next;
|
|
||||||
|
|
||||||
discard_cleanups (old_chain);
|
|
||||||
}
|
|
||||||
is_first = 0;
|
|
||||||
lma = lm.next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return head;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Implement the "open_symbol_file_object" target_so_ops method.
|
|
||||||
|
|
||||||
If no open symbol file, attempt to locate and open the main symbol
|
|
||||||
file. On IRIX, this is the first link map entry. If its name is
|
|
||||||
here, we can open it. Useful when attaching to a process without
|
|
||||||
first loading its symbol file. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
irix_open_symbol_file_object (void *from_ttyp)
|
|
||||||
{
|
|
||||||
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
|
||||||
int addr_size = gdbarch_addr_bit (target_gdbarch ()) / TARGET_CHAR_BIT;
|
|
||||||
CORE_ADDR lma;
|
|
||||||
gdb_byte addr_buf[8];
|
|
||||||
struct lm_info lm;
|
|
||||||
struct cleanup *cleanups;
|
|
||||||
int errcode;
|
|
||||||
int from_tty = *(int *) from_ttyp;
|
|
||||||
char *filename;
|
|
||||||
|
|
||||||
if (symfile_objfile)
|
|
||||||
if (!query (_("Attempt to reload symbols from process? ")))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ((debug_base = locate_base ()) == 0)
|
|
||||||
return 0; /* failed somehow... */
|
|
||||||
|
|
||||||
/* First link map member should be the executable. */
|
|
||||||
read_memory (debug_base, addr_buf, addr_size);
|
|
||||||
lma = extract_mips_address (addr_buf, addr_size, byte_order);
|
|
||||||
if (lma == 0)
|
|
||||||
return 0; /* failed somehow... */
|
|
||||||
|
|
||||||
lm = fetch_lm_info (lma);
|
|
||||||
|
|
||||||
if (lm.pathname_addr == 0)
|
|
||||||
return 0; /* No filename. */
|
|
||||||
|
|
||||||
/* Now fetch the filename from target memory. */
|
|
||||||
target_read_string (lm.pathname_addr, &filename, SO_NAME_MAX_PATH_SIZE - 1,
|
|
||||||
&errcode);
|
|
||||||
|
|
||||||
if (errcode)
|
|
||||||
{
|
|
||||||
warning (_("failed to read exec filename from attached file: %s"),
|
|
||||||
safe_strerror (errcode));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanups = make_cleanup (xfree, filename);
|
|
||||||
/* Have a pathname: read the symbol file. */
|
|
||||||
symbol_file_add_main (filename, from_tty);
|
|
||||||
|
|
||||||
do_cleanups (cleanups);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Implement the "special_symbol_handling" target_so_ops method.
|
|
||||||
|
|
||||||
For IRIX, there's nothing to do. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
irix_special_symbol_handling (void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Using the solist entry SO, relocate the addresses in SEC. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
irix_relocate_section_addresses (struct so_list *so,
|
|
||||||
struct target_section *sec)
|
|
||||||
{
|
|
||||||
sec->addr += so->lm_info->reloc_offset;
|
|
||||||
sec->endaddr += so->lm_info->reloc_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free the lm_info struct. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
irix_free_so (struct so_list *so)
|
|
||||||
{
|
|
||||||
xfree (so->lm_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear backend specific state. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
irix_clear_solib (void)
|
|
||||||
{
|
|
||||||
debug_base = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return 1 if PC lies in the dynamic symbol resolution code of the
|
|
||||||
run time loader. */
|
|
||||||
static int
|
|
||||||
irix_in_dynsym_resolve_code (CORE_ADDR pc)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct target_so_ops irix_so_ops;
|
|
||||||
|
|
||||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
|
||||||
extern initialize_file_ftype _initialize_irix_solib;
|
|
||||||
|
|
||||||
void
|
|
||||||
_initialize_irix_solib (void)
|
|
||||||
{
|
|
||||||
irix_so_ops.relocate_section_addresses = irix_relocate_section_addresses;
|
|
||||||
irix_so_ops.free_so = irix_free_so;
|
|
||||||
irix_so_ops.clear_solib = irix_clear_solib;
|
|
||||||
irix_so_ops.solib_create_inferior_hook = irix_solib_create_inferior_hook;
|
|
||||||
irix_so_ops.special_symbol_handling = irix_special_symbol_handling;
|
|
||||||
irix_so_ops.current_sos = irix_current_sos;
|
|
||||||
irix_so_ops.open_symbol_file_object = irix_open_symbol_file_object;
|
|
||||||
irix_so_ops.in_dynsym_resolve_code = irix_in_dynsym_resolve_code;
|
|
||||||
irix_so_ops.bfd_open = solib_bfd_open;
|
|
||||||
irix_so_ops.handle_event = irix_solib_handle_event;
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
/* Handle shared libraries for GDB, the GNU Debugger.
|
|
||||||
|
|
||||||
Copyright (C) 2007-2014 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 SOLIB_IRIX_H
|
|
||||||
#define SOLIB_IRIX_H
|
|
||||||
|
|
||||||
struct target_so_ops;
|
|
||||||
extern struct target_so_ops irix_so_ops;
|
|
||||||
|
|
||||||
#endif /* solib-irix.h */
|
|
@ -1,3 +1,13 @@
|
|||||||
|
2014-10-10 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/bigcore.exp: Remove references to IRIX.
|
||||||
|
* gdb.base/funcargs.exp: Likewise.
|
||||||
|
* gdb.base/interrupt.exp: Likewise.
|
||||||
|
* gdb.base/mips_pro.exp: Likewise.
|
||||||
|
* gdb.base/nodebug.exp: Likewise.
|
||||||
|
* gdb.base/setvar.exp: Likewise.
|
||||||
|
* lib/gdb.exp (gdb_compile_shlib): Remove mips-sgi-irix* case.
|
||||||
|
|
||||||
2014-10-10 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2014-10-10 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
Pedro Alves <palves@redhat.com>
|
Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
@ -39,13 +39,6 @@ if { [istarget "*-*-*bsd*"]
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
# This testcase causes too much stress (in terms of memory usage)
|
|
||||||
# on certain systems...
|
|
||||||
if { [istarget "*-*-*irix*"] } {
|
|
||||||
untested "Testcase too stressful for this system"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
standard_testfile .c
|
standard_testfile .c
|
||||||
set corefile [standard_output_file ${binfile}.corefile]
|
set corefile [standard_output_file ${binfile}.corefile]
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ proc float_and_integral_args {} {
|
|||||||
|
|
||||||
# Run; should stop at call2a and print actual arguments.
|
# Run; should stop at call2a and print actual arguments.
|
||||||
|
|
||||||
if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "mips-sgi-irix5*" }
|
if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" }
|
||||||
gdb_run_cmd
|
gdb_run_cmd
|
||||||
set test "run to call2a"
|
set test "run to call2a"
|
||||||
gdb_test_multiple "" $test {
|
gdb_test_multiple "" $test {
|
||||||
@ -181,7 +181,6 @@ proc float_and_integral_args {} {
|
|||||||
gdb_test "print d2" ".* = 5" "print d2 after run to call2a"
|
gdb_test "print d2" ".* = 5" "print d2 after run to call2a"
|
||||||
|
|
||||||
setup_xfail "rs6000-*-*"
|
setup_xfail "rs6000-*-*"
|
||||||
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" }
|
|
||||||
# Continue; should stop at call2b and print actual arguments.
|
# Continue; should stop at call2b and print actual arguments.
|
||||||
if [gdb_test "cont" ".* call2b \\(f1=4, s=1, d1=5, i=2, f2=4, l=3, d2=5, c=97 'a'\\) .*" "continue to call2b"] {
|
if [gdb_test "cont" ".* call2b \\(f1=4, s=1, d1=5, i=2, f2=4, l=3, d2=5, c=97 'a'\\) .*" "continue to call2b"] {
|
||||||
gdb_suppress_tests
|
gdb_suppress_tests
|
||||||
@ -486,10 +485,6 @@ proc discard_and_shuffle {} {
|
|||||||
|
|
||||||
setup_xfail "rs6000-*-*"
|
setup_xfail "rs6000-*-*"
|
||||||
|
|
||||||
if {!$gcc_compiled} {
|
|
||||||
setup_xfail "mips-sgi-irix5*"
|
|
||||||
}
|
|
||||||
|
|
||||||
gdb_test_multiple "backtrace 100" "backtrace from call6a" {
|
gdb_test_multiple "backtrace 100" "backtrace from call6a" {
|
||||||
-re " call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .* main \\(.*\\) .*$gdb_prompt $" {
|
-re " call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .* main \\(.*\\) .*$gdb_prompt $" {
|
||||||
pass "backtrace from call6a"
|
pass "backtrace from call6a"
|
||||||
@ -710,7 +705,7 @@ proc shuffle_round_robin {} {
|
|||||||
gdb_run_cmd
|
gdb_run_cmd
|
||||||
gdb_test "" "Breakpoint $decimal, call7a .*" "run to call7a"
|
gdb_test "" "Breakpoint $decimal, call7a .*" "run to call7a"
|
||||||
|
|
||||||
if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "mips-sgi-irix5*" }
|
if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" }
|
||||||
gdb_test_multiple "backtrace 100" "backtrace from call7a" {
|
gdb_test_multiple "backtrace 100" "backtrace from call7a" {
|
||||||
-re " call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .* main \\(.*\\) .*$gdb_prompt $" {
|
-re " call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .* main \\(.*\\) .*$gdb_prompt $" {
|
||||||
pass "backtrace from call7a"
|
pass "backtrace from call7a"
|
||||||
@ -863,7 +858,6 @@ proc shuffle_round_robin {} {
|
|||||||
|
|
||||||
gdb_continue call7k
|
gdb_continue call7k
|
||||||
|
|
||||||
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" }
|
|
||||||
gdb_test_sequence "backtrace 100" "backtrace from call7k" {
|
gdb_test_sequence "backtrace 100" "backtrace from call7k" {
|
||||||
"\[\r\n\]#0 .* call7k \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
"\[\r\n\]#0 .* call7k \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
"\[\r\n\]#1 .* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) "
|
"\[\r\n\]#1 .* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) "
|
||||||
|
@ -119,7 +119,6 @@ if ![file exists $binfile] then {
|
|||||||
setup_xfail "vax-*-*"
|
setup_xfail "vax-*-*"
|
||||||
setup_xfail "alpha-*-*"
|
setup_xfail "alpha-*-*"
|
||||||
setup_xfail "*-*-*bsd*"
|
setup_xfail "*-*-*bsd*"
|
||||||
setup_xfail "*-*-irix*"
|
|
||||||
setup_xfail "*-*-hpux*"
|
setup_xfail "*-*-hpux*"
|
||||||
setup_xfail "*-*-*lynx*"
|
setup_xfail "*-*-*lynx*"
|
||||||
fail "call function when asleep (stays asleep)"
|
fail "call function when asleep (stays asleep)"
|
||||||
|
@ -40,7 +40,7 @@ if [runto middle] then {
|
|||||||
# warning: Hit heuristic-fence-post without finding
|
# warning: Hit heuristic-fence-post without finding
|
||||||
# warning: enclosing function for pc 0x1006ead0
|
# warning: enclosing function for pc 0x1006ead0
|
||||||
if { [test_compiler_info gcc-*-*] } then {
|
if { [test_compiler_info gcc-*-*] } then {
|
||||||
setup_xfail "mips*-sgi-irix4*" "mips64*-*-elf"
|
setup_xfail "mips64*-*-elf"
|
||||||
}
|
}
|
||||||
# The call chain is main -> top -> middle. But gcc can optimize a tail
|
# The call chain is main -> top -> middle. But gcc can optimize a tail
|
||||||
# call to a jump, so the stack may contain either main -> top -> middle
|
# call to a jump, so the stack may contain either main -> top -> middle
|
||||||
|
@ -58,29 +58,17 @@ if [runto inner] then {
|
|||||||
# On alpha (and other ecoff systems) the native compilers put
|
# On alpha (and other ecoff systems) the native compilers put
|
||||||
# out debugging info for non-aggregate return values of functions
|
# out debugging info for non-aggregate return values of functions
|
||||||
# even without -g, which should be accepted.
|
# even without -g, which should be accepted.
|
||||||
# Irix5, even though it is ELF, counts as "ecoff" because it
|
|
||||||
# encapsulates ecoff debugging info in a .mdebug section.
|
|
||||||
# Irix6 gcc emits no debug info at all for static functions and
|
|
||||||
# variables, so all tests involving statics fail.
|
|
||||||
|
|
||||||
if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" "mips-sgi-irix6*" }
|
|
||||||
gdb_test "p top" \
|
gdb_test "p top" \
|
||||||
"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <\\.?top(\\(int\\)|)>"
|
"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <\\.?top(\\(int\\)|)>"
|
||||||
if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" "mips-sgi-irix6*" }
|
|
||||||
gdb_test "whatis top" \
|
gdb_test "whatis top" \
|
||||||
"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"
|
"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"
|
||||||
if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix6*" }
|
|
||||||
gdb_test "ptype top" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
|
gdb_test "ptype top" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
|
||||||
|
|
||||||
if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" }
|
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
gdb_test "p middle" \
|
gdb_test "p middle" \
|
||||||
"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <\\.?middle(\\(int\\)|)>"
|
"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <\\.?middle(\\(int\\)|)>"
|
||||||
if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" }
|
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
gdb_test "whatis middle" \
|
gdb_test "whatis middle" \
|
||||||
"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"
|
"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
gdb_test "ptype middle" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
|
gdb_test "ptype middle" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
|
||||||
|
|
||||||
gdb_test "p dataglobal" "= 3"
|
gdb_test "p dataglobal" "= 3"
|
||||||
@ -93,9 +81,7 @@ if [runto inner] then {
|
|||||||
# doesn't know the variables exist at all.
|
# doesn't know the variables exist at all.
|
||||||
setup_xfail "rs6000*-*-aix*"
|
setup_xfail "rs6000*-*-aix*"
|
||||||
setup_xfail "powerpc*-*-aix*"
|
setup_xfail "powerpc*-*-aix*"
|
||||||
if [test_compiler_info "gcc-*"] {
|
if ![test_compiler_info "gcc-*"] {
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
} else {
|
|
||||||
setup_xfail "hppa*-*-hpux*"
|
setup_xfail "hppa*-*-hpux*"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,9 +89,7 @@ if [runto inner] then {
|
|||||||
|
|
||||||
setup_xfail "rs6000*-*-aix*"
|
setup_xfail "rs6000*-*-aix*"
|
||||||
setup_xfail "powerpc*-*-aix*"
|
setup_xfail "powerpc*-*-aix*"
|
||||||
if [test_compiler_info "gcc-*"] {
|
if ![test_compiler_info "gcc-*"] {
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
} else {
|
|
||||||
setup_xfail "hppa*-*-hpux*"
|
setup_xfail "hppa*-*-hpux*"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,9 +97,7 @@ if [runto inner] then {
|
|||||||
|
|
||||||
setup_xfail "rs6000*-*-aix*"
|
setup_xfail "rs6000*-*-aix*"
|
||||||
setup_xfail "powerpc*-*-aix*"
|
setup_xfail "powerpc*-*-aix*"
|
||||||
if [test_compiler_info "gcc-*"] {
|
if ![test_compiler_info "gcc-*"] {
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
} else {
|
|
||||||
setup_xfail "hppa*-*-hpux*"
|
setup_xfail "hppa*-*-hpux*"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,9 +108,7 @@ if [runto inner] then {
|
|||||||
|
|
||||||
setup_xfail "rs6000*-*-aix*"
|
setup_xfail "rs6000*-*-aix*"
|
||||||
setup_xfail "powerpc*-*-aix*"
|
setup_xfail "powerpc*-*-aix*"
|
||||||
if [test_compiler_info "gcc-*"] {
|
if ![test_compiler_info "gcc-*"] {
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
} else {
|
|
||||||
setup_xfail "hppa*-*-hpux*"
|
setup_xfail "hppa*-*-hpux*"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,9 +116,7 @@ if [runto inner] then {
|
|||||||
|
|
||||||
setup_xfail "rs6000*-*-aix*"
|
setup_xfail "rs6000*-*-aix*"
|
||||||
setup_xfail "powerpc*-*-aix*"
|
setup_xfail "powerpc*-*-aix*"
|
||||||
if [test_compiler_info "gcc-*"] {
|
if ![test_compiler_info "gcc-*"] {
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
} else {
|
|
||||||
setup_xfail "hppa*-*-hpux*"
|
setup_xfail "hppa*-*-hpux*"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,17 +124,11 @@ if [runto inner] then {
|
|||||||
|
|
||||||
setup_xfail "rs6000*-*-aix*"
|
setup_xfail "rs6000*-*-aix*"
|
||||||
setup_xfail "powerpc*-*-aix*"
|
setup_xfail "powerpc*-*-aix*"
|
||||||
if [test_compiler_info "gcc-*"] {
|
if ![test_compiler_info "gcc-*"] {
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
} else {
|
|
||||||
setup_xfail "hppa*-*-hpux*"
|
setup_xfail "hppa*-*-hpux*"
|
||||||
}
|
}
|
||||||
gdb_test "ptype bsslocal" "<(data variable|variable), no debug info>"
|
gdb_test "ptype bsslocal" "<(data variable|variable), no debug info>"
|
||||||
|
|
||||||
if [test_compiler_info "gcc-*"] {
|
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
}
|
|
||||||
|
|
||||||
gdb_test "backtrace 10" "#0.*inner.*#1.*middle.*#2.*top.*#3.*main.*" \
|
gdb_test "backtrace 10" "#0.*inner.*#1.*middle.*#2.*top.*#3.*main.*" \
|
||||||
"backtrace from inner in nodebug.exp"
|
"backtrace from inner in nodebug.exp"
|
||||||
# Or if that doesn't work, at least hope for the external symbols
|
# Or if that doesn't work, at least hope for the external symbols
|
||||||
@ -167,9 +139,6 @@ if [runto inner] then {
|
|||||||
|
|
||||||
# This test is not as obscure as it might look. `p getenv ("TERM")'
|
# This test is not as obscure as it might look. `p getenv ("TERM")'
|
||||||
# is a real-world example, at least on many systems.
|
# is a real-world example, at least on many systems.
|
||||||
if { ! [test_compiler_info "gcc-*"]} {
|
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
}
|
|
||||||
if [target_info exists gdb,cannot_call_functions] {
|
if [target_info exists gdb,cannot_call_functions] {
|
||||||
setup_xfail "*-*-*" 2416
|
setup_xfail "*-*-*" 2416
|
||||||
fail "p/c array_index(\"abcdef\",2)"
|
fail "p/c array_index(\"abcdef\",2)"
|
||||||
@ -204,9 +173,6 @@ if [runto inner] then {
|
|||||||
|
|
||||||
# Now, try that we can give names of file-local symbols which happen
|
# Now, try that we can give names of file-local symbols which happen
|
||||||
# to be unique, and have it still work
|
# to be unique, and have it still work
|
||||||
if [test_compiler_info "gcc-*"] {
|
|
||||||
setup_xfail "mips-sgi-irix6*"
|
|
||||||
}
|
|
||||||
if [runto middle] then {
|
if [runto middle] then {
|
||||||
gdb_test "backtrace 10" "#0.*middle.*#1.*top.*#2.*main.*" \
|
gdb_test "backtrace 10" "#0.*middle.*#1.*top.*#2.*main.*" \
|
||||||
"backtrace from middle in nodebug.exp"
|
"backtrace from middle in nodebug.exp"
|
||||||
|
@ -56,9 +56,9 @@ proc setup_xfail_on_opaque_pointer {} {
|
|||||||
global gcc_compiled
|
global gcc_compiled
|
||||||
|
|
||||||
setup_xfail "vax-*-*" "i*86-sequent-bsd*"
|
setup_xfail "vax-*-*" "i*86-sequent-bsd*"
|
||||||
if {!$gcc_compiled} then {
|
if {!$gcc_compiled} then {
|
||||||
setup_xfail "alpha-*-*" "mips-sgi-irix5*"
|
setup_xfail "alpha-*-*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# This seems easier than trying to track different versions of xlc; I'm
|
# This seems easier than trying to track different versions of xlc; I'm
|
||||||
|
@ -123,7 +123,6 @@ test_set "set variable v_signed_char=97" "print v_signed_char" ".\[0-9\]* = 97 \
|
|||||||
test_set "set variable v_signed_char=126" "print v_signed_char" ".\[0-9\]* = 126 \'~\'" "set variable signed char=126 ('~')"
|
test_set "set variable v_signed_char=126" "print v_signed_char" ".\[0-9\]* = 126 \'~\'" "set variable signed char=126 ('~')"
|
||||||
test_set "set variable v_signed_char=127" "print v_signed_char" ".\[0-9\]* = 127 \'.177\'" "set variable signed char=127 (8-bit)"
|
test_set "set variable v_signed_char=127" "print v_signed_char" ".\[0-9\]* = 127 \'.177\'" "set variable signed char=127 (8-bit)"
|
||||||
gdb_test_no_output "set variable v_signed_char=-1"
|
gdb_test_no_output "set variable v_signed_char=-1"
|
||||||
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix4*" }
|
|
||||||
|
|
||||||
with_target_charset "ASCII" {
|
with_target_charset "ASCII" {
|
||||||
gdb_test "print v_signed_char" ".\[0-9\]* = -1 \'.377\'" \
|
gdb_test "print v_signed_char" ".\[0-9\]* = -1 \'.377\'" \
|
||||||
@ -131,7 +130,6 @@ with_target_charset "ASCII" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gdb_test_no_output "set variable v_signed_char=0xFF"
|
gdb_test_no_output "set variable v_signed_char=0xFF"
|
||||||
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix4*" }
|
|
||||||
|
|
||||||
with_target_charset "ASCII" {
|
with_target_charset "ASCII" {
|
||||||
gdb_test "print v_signed_char" ".\[0-9\]* = -1 \'.377\'" \
|
gdb_test "print v_signed_char" ".\[0-9\]* = -1 \'.377\'" \
|
||||||
|
@ -67,7 +67,6 @@ gdb_test "whatis v_char" \
|
|||||||
"type = (unsigned char|char)" \
|
"type = (unsigned char|char)" \
|
||||||
"whatis char"
|
"whatis char"
|
||||||
|
|
||||||
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" }
|
|
||||||
gdb_test "whatis v_signed_char" \
|
gdb_test "whatis v_signed_char" \
|
||||||
"type = (signed char|char)" \
|
"type = (signed char|char)" \
|
||||||
"whatis signed char"
|
"whatis signed char"
|
||||||
|
@ -2563,8 +2563,8 @@ set hp_aCC_compiler 0
|
|||||||
# if the build machine is the same as the host machine, which is
|
# if the build machine is the same as the host machine, which is
|
||||||
# usually true of the targets which are not gcc. But this code does
|
# usually true of the targets which are not gcc. But this code does
|
||||||
# not figure which compiler to call, and it always ends up using the C
|
# not figure which compiler to call, and it always ends up using the C
|
||||||
# compiler. Not good for setting hp_aCC_compiler. Targets
|
# compiler. Not good for setting hp_aCC_compiler. Target
|
||||||
# hppa*-*-hpux* and mips*-*-irix* used to do this.
|
# hppa*-*-hpux* used to do this.
|
||||||
#
|
#
|
||||||
# [ gdb_compile -E $ifile > $binfile.ci ]
|
# [ gdb_compile -E $ifile > $binfile.ci ]
|
||||||
# source $binfile.ci
|
# source $binfile.ci
|
||||||
@ -2975,10 +2975,6 @@ proc gdb_compile_shlib {sources dest options} {
|
|||||||
"hppa*-hp-hpux*" {
|
"hppa*-hp-hpux*" {
|
||||||
lappend obj_options "additional_flags=+z"
|
lappend obj_options "additional_flags=+z"
|
||||||
}
|
}
|
||||||
"mips-sgi-irix*" {
|
|
||||||
# Disable SGI compiler's implicit -Dsgi
|
|
||||||
lappend obj_options "additional_flags=-Usgi"
|
|
||||||
}
|
|
||||||
default {
|
default {
|
||||||
# don't know what the compiler is...
|
# don't know what the compiler is...
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user