From cd10c7e3886bd28dc6ada58dcd5d93685a3ce865 Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Fri, 27 Oct 1995 17:48:36 +0000 Subject: [PATCH] * breakpoint.c (breakpoint_re_set): #ifdef GET_LONGJMP_TARGET around calls to create_longjmp_breakpoint. Why install the breakpoints if we can't find the longjmp target? * infrun.c (wait_for_inferior): Cleanup comments near call test. * remote-mips.c: Fixed a bunch of prototypes to avoid char/int complaint from picky compilers. Add comment to mips_expect. Replace all instances of sr_get_debug with remote_debug. * (mips_readchar): Don't jam init string to monitor. mips_initialize() handles that. * (mips_receive_header): Print better message when we get too much garbage. * (mips_request): Allow caller to pass in buff to allow them to analyze the returned message. * (mips_initialize): Re-do initialization to try sending a BREAK, a ^C, and then a download escape sequence. Cleanup protocol startup. Eliminate sleeps. Clear breakpoints (if using monitor breakpoints). Re-init frame. * (mips_detach): Close down target. start-sanitize-gm * (mips_resume): Pass signal down to target. * (mips_create_inferior): Start target with TARGET_SIGNAL_PWR. end-sanitize-gm * (mips_wait): Handle return status with registers, or breakpoint stuff. * (mips_kill): Add ^C handling. * (mips_insert_breakpoint mips_remove_breakpoint): Call new breakpoint stuff if enabled. * (calculate_mask remote_mips_set_watchpoint remote_mips_remove_watchpoint remote_mips_stopped_by_watchpoint): Hardware watchpoint/breakpoint stuff. * (common_breakpoint): Common code for new monitor breakpoint commands. * (mips_load): Don't use `prompt'. It's a global variable. * top.c (dont_repeat_command): New command for use in user-defined commands to suppress auto-repeat (by hittin return key). start-sanitize-gm * utils.c (request_quit): Call target_kill here. Good idea. Needs a better implementation. end-sanitize-gm * valops.c: Add start of auto function-call abandonment capability. start-sanitize-gm * c-exp.y: Add code (currently disabled) to handle GM dynamic structures (it conflicts with @!). * eval.c (evaluate_subexp_standard): ditto. * expprint.c (print_subexp dump_expression): ditto. * expression.h (enum exp_opcode): ditto. * parse.c (length_of_subexp): ditto. * configure, configure.in: Add mip*-*-magic* target. * magic.c magic.h: Special routines to handle GM stuff (like stepping through dispatcher). end-sanitize-gm --- gdb/.Sanitize | 41 +++++ gdb/ChangeLog | 53 ++++++ gdb/breakpoint.c | 17 +- gdb/c-exp.y | 9 + gdb/configure | 272 +++++++++++++++++++++++------- gdb/configure.in | 3 + gdb/eval.c | 37 +++- gdb/expprint.c | 114 ++++++------- gdb/expression.h | 26 ++- gdb/magic.c | 420 ++++++++++++++++++++++++++++++++++++++++++++++ gdb/magic.h | 6 + gdb/parse.c | 5 + gdb/remote-mips.c | 405 +++++++++++++++++++++++++++++++++++++------- gdb/top.c | 12 ++ gdb/utils.c | 30 ++-- 15 files changed, 1235 insertions(+), 215 deletions(-) create mode 100644 gdb/magic.c create mode 100644 gdb/magic.h diff --git a/gdb/.Sanitize b/gdb/.Sanitize index b2c72a8bb79..e34b5865522 100644 --- a/gdb/.Sanitize +++ b/gdb/.Sanitize @@ -60,6 +60,20 @@ else fi fi +gm_files="magic.c magic.h" + +if ( echo $* | grep keep\-gm > /dev/null ) ; then + keep_these_too="${gm_files} ${keep_these_too}" + if [ -n "${verbose}" ] ; then + echo Keeping ${gm_files} + fi +else + lose_these_too="${gm_files} ${lose_these_too}" + if [ -n "${verbose}" ] ; then + echo Deleting ${gm_files} + fi +fi + # All files listed between the "Things-to-keep:" line and the # "Files-to-sed:" line will be kept. All other files will be removed. # Directories listed in this section will have their own Sanitize @@ -488,6 +502,33 @@ else done fi +if ( echo $* | grep keep\-gm > /dev/null ) ; then + for i in * ; do + if test ! -d $i && (grep sanitize-gm $i > /dev/null) ; then + if [ -n "${verbose}" ] ; then + echo Keeping gm stuff in $i + fi + fi + done +else + for i in * ; do + if test ! -d $i && (grep sanitize-gm $i > /dev/null) ; then + if [ -n "${verbose}" ] ; then + echo Removing traces of \"gm\" from $i... + fi + cp $i new + sed '/start\-sanitize\-gm/,/end-\sanitize\-gm/d' < $i > new + if [ -n "${safe}" -a ! -f .Recover/$i ] ; then + if [ -n "${verbose}" ] ; then + echo Caching $i in .Recover... + fi + mv $i .Recover + fi + mv new $i + fi + done +fi + for i in * ; do if test ! -d $i && (grep sanitize $i > /dev/null) ; then echo '***' Some mentions of Sanitize are still left in $i! 1>&2 diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8b8b6b02a61..3bd54c5c04c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,56 @@ +Fri Oct 27 09:54:07 1995 Stu Grossman (grossman@cygnus.com) + + * breakpoint.c (breakpoint_re_set): #ifdef GET_LONGJMP_TARGET + around calls to create_longjmp_breakpoint. Why install the + breakpoints if we can't find the longjmp target? + * infrun.c (wait_for_inferior): Cleanup comments near call test. + * remote-mips.c: Fixed a bunch of prototypes to avoid char/int + complaint from picky compilers. Add comment to mips_expect. + Replace all instances of sr_get_debug with remote_debug. + * (mips_readchar): Don't jam init string to monitor. + mips_initialize() handles that. + * (mips_receive_header): Print better message when we get too + much garbage. + * (mips_request): Allow caller to pass in buff to allow them to + analyze the returned message. + * (mips_initialize): Re-do initialization to try sending a BREAK, + a ^C, and then a download escape sequence. Cleanup protocol + startup. Eliminate sleeps. Clear breakpoints (if using monitor + breakpoints). Re-init frame. + * (mips_detach): Close down target. +start-sanitize-gm + * (mips_resume): Pass signal down to target. + * (mips_create_inferior): Start target with TARGET_SIGNAL_PWR. +end-sanitize-gm + * (mips_wait): Handle return status with registers, or breakpoint stuff. + * (mips_kill): Add ^C handling. + * (mips_insert_breakpoint mips_remove_breakpoint): Call new + breakpoint stuff if enabled. + * (calculate_mask remote_mips_set_watchpoint + remote_mips_remove_watchpoint remote_mips_stopped_by_watchpoint): + Hardware watchpoint/breakpoint stuff. + * (common_breakpoint): Common code for new monitor breakpoint commands. + * (mips_load): Don't use `prompt'. It's a global variable. + * top.c (dont_repeat_command): New command for use in + user-defined commands to suppress auto-repeat (by hittin return key). +start-sanitize-gm + * utils.c (request_quit): Call target_kill here. Good idea. + Needs a better implementation. +end-sanitize-gm + * valops.c: Add start of auto function-call abandonment capability. + +start-sanitize-gm + * c-exp.y: Add code (currently disabled) to handle GM dynamic + structures (it conflicts with @!). + * eval.c (evaluate_subexp_standard): ditto. + * expprint.c (print_subexp dump_expression): ditto. + * expression.h (enum exp_opcode): ditto. + * parse.c (length_of_subexp): ditto. + * configure, configure.in: Add mip*-*-magic* target. + * magic.c magic.h: Special routines to handle GM stuff (like + stepping through dispatcher). +end-sanitize-gm + Thu Oct 26 22:02:27 1995 Stan Shebs * mpw-config.in: Add support for PowerMac host, add beginnings diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 0b388adc4e3..aebc62ae04d 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -16,7 +16,7 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include @@ -28,7 +28,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "gdbcore.h" #include "gdbcmd.h" #include "value.h" -#include "ctype.h" #include "command.h" #include "inferior.h" #include "thread.h" @@ -1953,7 +1952,7 @@ set_raw_breakpoint (sal) } static void -create_longjmp_breakpoint(func_name) +create_longjmp_breakpoint (func_name) char *func_name; { struct symtab_and_line sal; @@ -1976,7 +1975,7 @@ create_longjmp_breakpoint(func_name) sal.symtab = NULL; sal.line = 0; - b = set_raw_breakpoint(sal); + b = set_raw_breakpoint (sal); if (!b) return; b->type = func_name != NULL ? bp_longjmp : bp_longjmp_resume; @@ -3420,10 +3419,12 @@ breakpoint_re_set () set_language (save_language); input_radix = save_input_radix; - create_longjmp_breakpoint("longjmp"); - create_longjmp_breakpoint("_longjmp"); - create_longjmp_breakpoint("siglongjmp"); - create_longjmp_breakpoint(NULL); +#ifdef GET_LONGJMP_TARGET + create_longjmp_breakpoint ("longjmp"); + create_longjmp_breakpoint ("_longjmp"); + create_longjmp_breakpoint ("siglongjmp"); + create_longjmp_breakpoint (NULL); +#endif #if 0 /* Took this out (temporaliy at least), since it produces an extra diff --git a/gdb/c-exp.y b/gdb/c-exp.y index eae0794766c..21096e01fc7 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -294,6 +294,15 @@ exp : exp '.' name write_exp_elt_opcode (STRUCTOP_STRUCT); } ; +/* start-sanitize-gm +Need to find a better way to do this... +exp : exp '@' name + { write_exp_elt_opcode (STRUCTOP_FIELD); + write_exp_string ($3); + write_exp_elt_opcode (STRUCTOP_FIELD); + } + end-sanitize-gm */ + exp : exp '.' qualified_name { /* exp.type::name becomes exp.*(&type::name) */ /* Note: this doesn't work if name is a diff --git a/gdb/configure b/gdb/configure index 6be8cf9ba4c..78491b15f51 100755 --- a/gdb/configure +++ b/gdb/configure @@ -1,7 +1,7 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.4 +# Generated automatically using autoconf version 2.4.2 # Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation @@ -39,6 +39,18 @@ target=NONE verbose= x_includes=NONE x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +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' # Initialize some other variables. subdirs= @@ -63,9 +75,14 @@ do case "$ac_option" in - -build | --build | --buil | --bui | --bu | --b) + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*) + -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ @@ -75,6 +92,12 @@ do | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. @@ -125,12 +148,26 @@ Configuration: Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] - --exec-prefix=PREFIX install architecture-dependent files in PREFIX + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names +EOF + cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] @@ -151,6 +188,44 @@ EOF -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; @@ -163,6 +238,15 @@ EOF | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) @@ -203,6 +287,23 @@ EOF | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) @@ -213,6 +314,13 @@ EOF -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) @@ -222,7 +330,7 @@ EOF verbose=yes ;; -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.4" + echo "configure generated by autoconf version 2.4.2" exit 0 ;; -with-* | --with-*) @@ -387,9 +495,12 @@ fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' +ac_cpp='echo $CPP $CPPFLAGS 1>&5; +$CPP $CPPFLAGS' +ac_compile='echo ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5; +${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' +ac_link='echo ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5; +${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. @@ -416,7 +527,7 @@ else ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do + for ac_dir in cc; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" @@ -450,6 +561,7 @@ else ac_cv_prog_gcc=no fi fi + echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes @@ -467,7 +579,8 @@ fi rm -f conftest* fi - echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 + +echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 if test $ac_cv_prog_gcc_g = yes; then CFLAGS="-g -O" else @@ -494,7 +607,7 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error @@ -508,7 +621,7 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error @@ -535,7 +648,7 @@ echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for AIX""... $ac_c" 1>&6 cat > conftest.$ac_ext <&6 else cat > conftest.$ac_ext < EOF @@ -680,10 +793,17 @@ else esac done IFS="$ac_save_ifs" - # As a last resort, use the slow shell script. - test -z "$ac_cv_path_install" && ac_cv_path_install="$ac_install_sh" + fi - INSTALL="$ac_cv_path_install" + 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 + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi fi echo "$ac_t""$INSTALL" 1>&6 @@ -703,7 +823,7 @@ else ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do + for ac_dir in :; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_RANLIB="ranlib" @@ -887,7 +1007,7 @@ else ac_cv_c_cross=yes else cat > conftest.$ac_ext <&6 +cross_compiling=$ac_cv_c_cross echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -930,7 +1051,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -948,7 +1069,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -969,7 +1090,7 @@ if test "$cross_compiling" = yes; then ac_cv_header_stdc=no else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -990,6 +1111,7 @@ fi rm -fr conftest* fi fi + echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF @@ -1006,7 +1128,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF @@ -1024,7 +1146,7 @@ rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` + ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdedfghijklmnopqrstuvwxyz./\055' 'ABCDEDFGHIJKLMNOPQRSTUVWXYZ___'` cat >> confdefs.h <&6 else cat > conftest.$ac_ext < #include @@ -1080,6 +1202,7 @@ fi rm -f conftest* fi + echo "$ac_t""$ac_cv_header_stat_broken" 1>&6 if test $ac_cv_header_stat_broken = yes; then cat >> confdefs.h <<\EOF @@ -1097,7 +1220,7 @@ else ac_cv_func_mmap=no else cat > conftest.$ac_ext <&6 if test $ac_cv_func_mmap = yes; then cat >> confdefs.h <<\EOF @@ -1195,8 +1319,8 @@ ENABLE_CLIBS= ENABLE_OBS= # Check whether --enable-netrom or --disable-netrom was given. -enableval="$enable_netrom" -if test -n "$enableval"; then +if test "${enable_netrom+set}" = set; then + enableval="$enable_netrom" case "${enableval}" in yes) enable_netrom=yes ;; no) enable_netrom=no ;; @@ -1213,8 +1337,8 @@ fi ENABLE_GDBTK= # Check whether --enable-gdbtk or --disable-gdbtk was given. -enableval="$enable_gdbtk" -if test -n "$enableval"; then +if test "${enable_gdbtk+set}" = set; then + enableval="$enable_gdbtk" case "${enableval}" in yes) enable_gdbtk=yes ;; no) enable_gdbtk=no ;; @@ -1231,8 +1355,8 @@ if test "${enable_gdbtk}" = "yes"; then echo $ac_n "checking for X""... $ac_c" 1>&6 # Check whether --with-x or --without-x was given. -withval="$with_x" -if test -n "$withval"; then +if test "${with_x+set}" = set; then + withval="$with_x" : fi @@ -1285,7 +1409,7 @@ test -z "$x_direct_test_library" && x_direct_test_library=Xt test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h cat > conftest.$ac_ext < EOF @@ -1348,7 +1472,7 @@ rm -f conftest* ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&6 -if eval "test \"`echo '$''{'ac_cv_lib_ICE'+set}'`\" = set"; then +ac_lib_var=`echo ICE | tr '+./' 'p__'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lICE $LIBS" cat > conftest.$ac_ext <&6 X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" else @@ -1503,13 +1628,14 @@ fi # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for -ldnet""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_dnet'+set}'`\" = set"; then +ac_lib_var=`echo dnet | tr '+./' 'p__'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" else @@ -1537,13 +1663,14 @@ fi if test $ac_cv_lib_dnet = no; then echo $ac_n "checking for -ldnet_stub""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_dnet_stub'+set}'`\" = set"; then +ac_lib_var=`echo dnet_stub | tr '+./' 'p__'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" else @@ -1576,13 +1703,14 @@ fi # Not sure which flavor of 386 UNIX this is, but it seems harmless to # check for it. echo $ac_n "checking for -lnsl""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_nsl'+set}'`\" = set"; then +ac_lib_var=`echo nsl | tr '+./' 'p__'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" else @@ -1614,13 +1742,14 @@ fi # But -lsocket is broken on IRIX, according to simon@lia.di.epfl.ch. if test "`(uname) 2>/dev/null`" != IRIX; then echo $ac_n "checking for -lsocket""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_lib_socket'+set}'`\" = set"; then +ac_lib_var=`echo socket | tr '+./' 'p__'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lsocket" else @@ -1677,7 +1806,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF @@ -1779,7 +1908,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF @@ -2207,6 +2336,9 @@ mips64*el-*-elf*) gdb_target=idtl64 ;; mips64*-*-elf*) gdb_target=idt64 ;; mips*el-*-ecoff*) gdb_target=idtl ;; mips*-*-ecoff*) gdb_target=idt ;; +# start-sanitize-gm +mips*-*-magic*) gdb_target=magic ;; +# end-sanitize-gm mips*el-*-elf*) gdb_target=idtl ;; mips*-*-elf*) gdb_target=idt ;; mips*-little-*) gdb_target=littlemips ;; @@ -2435,7 +2567,7 @@ do echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.4" + echo "$CONFIG_STATUS generated by autoconf version 2.4.2" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; @@ -2462,6 +2594,18 @@ s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g s%@CC@%$CC%g s%@CPP@%$CPP%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g diff --git a/gdb/configure.in b/gdb/configure.in index fbe72df2c7a..38114d1380f 100644 --- a/gdb/configure.in +++ b/gdb/configure.in @@ -417,6 +417,9 @@ mips64*el-*-elf*) gdb_target=idtl64 ;; mips64*-*-elf*) gdb_target=idt64 ;; mips*el-*-ecoff*) gdb_target=idtl ;; mips*-*-ecoff*) gdb_target=idt ;; +# start-sanitize-gm +mips*-*-magic*) gdb_target=magic ;; +# end-sanitize-gm mips*el-*-elf*) gdb_target=idtl ;; mips*-*-elf*) gdb_target=idt ;; mips*-little-*) gdb_target=littlemips ;; diff --git a/gdb/eval.c b/gdb/eval.c index 9bc898c8214..0e2404158d4 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -29,6 +29,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "demangle.h" #include "language.h" /* For CAST_IS_CONVERSION */ #include "f-lang.h" /* for array bound stuff */ +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS +#include "magic.h" +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ /* Prototypes for local functions. */ @@ -839,6 +844,36 @@ evaluate_subexp_standard (expect_type, exp, pos, noside) NULL, "structure pointer"); } +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS + case STRUCTOP_FIELD: + tem = longest_to_int (exp->elts[pc + 1].longconst); + (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1); + arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + if (noside == EVAL_SKIP) + goto nosideret; + { + CORE_ADDR object = value_as_long (arg1); + struct type *type = type_of_object (object); + + if (noside == EVAL_AVOID_SIDE_EFFECTS) + return value_zero (lookup_struct_elt_type (type, + &exp->elts[pc + 2].string, + 0), + lval_memory); + else + { + value_ptr temp = value_from_longest (builtin_type_unsigned_long, + baseptr_of_object (value_as_long(arg1))); + + VALUE_TYPE (temp) = type; + return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string, + NULL, "structure pointer"); + } + } +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ + case STRUCTOP_MEMBER: arg1 = evaluate_subexp_for_address (exp, pos, noside); goto handle_pointer_to_member; @@ -1259,8 +1294,6 @@ evaluate_subexp_standard (expect_type, exp, pos, noside) error ("Non-integral right operand for \"@\" operator."); if (noside == EVAL_AVOID_SIDE_EFFECTS) { - if (VALUE_REPEATED (arg1)) - error ("Cannot create artificial arrays of artificial arrays."); return allocate_repeat_value (VALUE_TYPE (arg1), longest_to_int (value_as_long (arg2))); } diff --git a/gdb/expprint.c b/gdb/expprint.c index 7eda09728b9..4effea27c24 100644 --- a/gdb/expprint.c +++ b/gdb/expprint.c @@ -15,7 +15,7 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include "symtab.h" @@ -30,9 +30,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ static void print_subexp PARAMS ((struct expression *, int *, GDB_FILE *, enum precedence)); -static void -print_simple_m2_func PARAMS ((char *, struct expression *, int *, GDB_FILE *)); - void print_expression (exp, stream) struct expression *exp; @@ -153,6 +150,13 @@ print_subexp (exp, pos, stream, prec) fputs_filtered (")", stream); return; + case OP_NAME: + case OP_EXPRSTRING: + nargs = longest_to_int (exp -> elts[pc + 1].longconst); + (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1); + fputs_filtered (&exp->elts[pc + 2].string, stream); + return; + case OP_STRING: nargs = longest_to_int (exp -> elts[pc + 1].longconst); (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1); @@ -163,8 +167,11 @@ print_subexp (exp, pos, stream, prec) return; case OP_BITSTRING: - error ("support for OP_BITSTRING unimplemented"); - break; + nargs = longest_to_int (exp -> elts[pc + 1].longconst); + (*pos) + += 3 + BYTES_TO_EXP_ELEM ((nargs + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT); + fprintf (stream, "B''"); + return; case OP_ARRAY: (*pos) += 3; @@ -266,6 +273,16 @@ print_subexp (exp, pos, stream, prec) fputs_filtered (")", stream); return; + case TERNOP_SLICE: + case TERNOP_SLICE_COUNT: + print_subexp (exp, pos, stream, PREC_SUFFIX); + fputs_filtered ("(", stream); + print_subexp (exp, pos, stream, PREC_ABOVE_COMMA); + fputs_filtered (opcode == TERNOP_SLICE ? " : " : " UP ", stream); + print_subexp (exp, pos, stream, PREC_ABOVE_COMMA); + fputs_filtered (")", stream); + return; + case STRUCTOP_STRUCT: tem = longest_to_int (exp->elts[pc + 1].longconst); (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1); @@ -283,6 +300,19 @@ print_subexp (exp, pos, stream, prec) fputs_filtered (&exp->elts[pc + 2].string, stream); return; +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS + case STRUCTOP_FIELD: + tem = longest_to_int (exp->elts[pc + 1].longconst); + (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1); + print_subexp (exp, pos, stream, PREC_SUFFIX); + fputs_filtered ("@", stream); + fputs_filtered (&exp->elts[pc + 2].string, stream); + return; + +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ + case BINOP_SUBSCRIPT: print_subexp (exp, pos, stream, PREC_SUFFIX); fputs_filtered ("[", stream); @@ -386,46 +416,6 @@ print_subexp (exp, pos, stream, prec) print_subexp(exp,pos,stream,PREC_PREFIX); fprintf_unfiltered(stream,")"); return; - - case UNOP_CAP: - print_simple_m2_func("CAP",exp,pos,stream); - return; - - case UNOP_CHR: - print_simple_m2_func("CHR",exp,pos,stream); - return; - - case UNOP_ORD: - print_simple_m2_func("ORD",exp,pos,stream); - return; - - case UNOP_ABS: - print_simple_m2_func("ABS",exp,pos,stream); - return; - - case UNOP_FLOAT: - print_simple_m2_func("FLOAT",exp,pos,stream); - return; - - case UNOP_HIGH: - print_simple_m2_func("HIGH",exp,pos,stream); - return; - - case UNOP_MAX: - print_simple_m2_func("MAX",exp,pos,stream); - return; - - case UNOP_MIN: - print_simple_m2_func("MIN",exp,pos,stream); - return; - - case UNOP_ODD: - print_simple_m2_func("ODD",exp,pos,stream); - return; - - case UNOP_TRUNC: - print_simple_m2_func("TRUNC",exp,pos,stream); - return; case BINOP_INCL: case BINOP_EXCL: @@ -450,6 +440,7 @@ print_subexp (exp, pos, stream, prec) error ("Invalid expression"); } + /* Note that PREC_BUILTIN will always emit parentheses. */ if ((int) myprec < (int) prec) fputs_filtered ("(", stream); if ((int) opcode > (int) BINOP_END) @@ -464,7 +455,11 @@ print_subexp (exp, pos, stream, prec) { /* Unary prefix operator. */ fputs_filtered (op_str, stream); + if (myprec == PREC_BUILTIN_FUNCTION) + fputs_filtered ("(", stream); print_subexp (exp, pos, stream, PREC_PREFIX); + if (myprec == PREC_BUILTIN_FUNCTION) + fputs_filtered (")", stream); } } else @@ -493,23 +488,6 @@ print_subexp (exp, pos, stream, prec) fputs_filtered (")", stream); } -/* Print out something of the form (). - This is used to print out some builtin Modula-2 - functions. - FIXME: There is probably some way to get the precedence - rules to do this (print a unary operand with parens around it). */ -static void -print_simple_m2_func(s,exp,pos,stream) - char *s; - register struct expression *exp; - register int *pos; - GDB_FILE *stream; -{ - fprintf_unfiltered(stream,"%s(",s); - print_subexp(exp,pos,stream,PREC_PREFIX); - fprintf_unfiltered(stream,")"); -} - /* Return the operator corresponding to opcode OP as a string. NULL indicates that the opcode was not found in the current language table. */ @@ -596,6 +574,8 @@ dump_expression (exp, stream, note) case BINOP_CONCAT: opcode_name = "BINOP_CONCAT"; break; case BINOP_END: opcode_name = "BINOP_END"; break; case TERNOP_COND: opcode_name = "TERNOP_COND"; break; + case TERNOP_SLICE: opcode_name = "TERNOP_SLICE"; break; + case TERNOP_SLICE_COUNT: opcode_name = "TERNOP_SLICE_COUNT"; break; case OP_LONG: opcode_name = "OP_LONG"; break; case OP_DOUBLE: opcode_name = "OP_DOUBLE"; break; case OP_VAR_VALUE: opcode_name = "OP_VAR_VALUE"; break; @@ -618,6 +598,9 @@ dump_expression (exp, stream, note) case UNOP_PREDECREMENT: opcode_name = "UNOP_PREDECREMENT"; break; case UNOP_POSTDECREMENT: opcode_name = "UNOP_POSTDECREMENT"; break; case UNOP_SIZEOF: opcode_name = "UNOP_SIZEOF"; break; + case UNOP_LOWER: opcode_name = "UNOP_LOWER"; break; + case UNOP_UPPER: opcode_name = "UNOP_UPPER"; break; + case UNOP_LENGTH: opcode_name = "UNOP_LENGTH"; break; case UNOP_PLUS: opcode_name = "UNOP_PLUS"; break; case UNOP_CAP: opcode_name = "UNOP_CAP"; break; case UNOP_CHR: opcode_name = "UNOP_CHR"; break; @@ -633,6 +616,11 @@ dump_expression (exp, stream, note) case OP_M2_STRING: opcode_name = "OP_M2_STRING"; break; case STRUCTOP_STRUCT: opcode_name = "STRUCTOP_STRUCT"; break; case STRUCTOP_PTR: opcode_name = "STRUCTOP_PTR"; break; +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS ++ case STRUCTOP_FIELD: opcode_name = "STRUCTOP_FIELD"; break; +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ case OP_THIS: opcode_name = "OP_THIS"; break; case OP_SCOPE: opcode_name = "OP_SCOPE"; break; case OP_TYPE: opcode_name = "OP_TYPE"; break; diff --git a/gdb/expression.h b/gdb/expression.h index cac4dadb5cf..9561b1c6dcf 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -15,7 +15,7 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if !defined (EXPRESSION_H) #define EXPRESSION_H 1 @@ -247,6 +247,9 @@ enum exp_opcode UNOP_ODD, UNOP_TRUNC, + /* Chill builtin functions. */ + UNOP_LOWER, UNOP_UPPER, UNOP_LENGTH, + OP_BOOL, /* Modula-2 builtin BOOLEAN type */ OP_M2_STRING, /* Modula-2 string constants */ @@ -264,6 +267,14 @@ enum exp_opcode STRUCTOP_STRUCT, STRUCTOP_PTR, +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS + /* STRUCTOP_FIELD is for handling field access for Magic Cap dynamic objects. + */ + STRUCTOP_FIELD, +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ + /* C++ */ /* OP_THIS is just a placeholder for the class instance variable. It just comes in a tight (OP_THIS, OP_THIS) pair. */ @@ -287,7 +298,13 @@ enum exp_opcode /* OP_TYPE is for parsing types, and used with the "ptype" command so we can look up types that are qualified by scope, either with the GDB "::" operator, or the Modula-2 '.' operator. */ - OP_TYPE + OP_TYPE, + + /* An un-looked-up identifier. */ + OP_NAME, + + /* An unparsed expression. Used for Scheme (for now at least) */ + OP_EXPRSTRING }; union exp_element @@ -319,8 +336,6 @@ struct expression #define BYTES_TO_EXP_ELEM(bytes) \ (((bytes) + sizeof (union exp_element) - 1) / sizeof (union exp_element)) -#include "value.h" - /* From parse.c */ extern struct expression *parse_expression PARAMS ((char *)); @@ -354,9 +369,6 @@ enum noside extern struct value* evaluate_subexp_standard PARAMS ((struct type *, struct expression *, int*, enum noside)); -extern value_ptr evaluate_subexp_with_coercion PARAMS ((struct expression *, - int *, enum noside)); - /* From expprint.c */ extern void print_expression PARAMS ((struct expression *, GDB_FILE *)); diff --git a/gdb/magic.c b/gdb/magic.c new file mode 100644 index 00000000000..6576e232801 --- /dev/null +++ b/gdb/magic.c @@ -0,0 +1,420 @@ +#include "defs.h" +#include "gdbcmd.h" +#include "symtab.h" +#include "value.h" +#include +#include +#ifdef DYNAMIC_COMMAND_SUPPORT +#include +#endif + +typedef unsigned long ulong; + +#ifdef DYNAMIC_COMMAND_SUPPORT +static void +dlopen_command PARAMS ((char *, int)); +#endif + +#ifdef DYNAMIC_COMMAND_SUPPORT +/* ARGSUSED */ +static void +dlopen_command (arg, from_tty) + char *arg; + int from_tty; +{ + char *p; + void *hdl; + void (*sym)(); + + if (arg == 0) { + error ("No arguments specified."); + return; + } + p = arg; + while(*p != ' ' && *p != '\0') + p++; + if (*p != ' ') { + error ("Not enough arguments."); + return; + } + *p++ = '\0'; + + hdl = dlopen(arg, RTLD_NOW); + if (hdl == NULL) { + fprintf(stderr, "%s: %s\n", arg, dlerror()); + return; + } + sym = dlsym(hdl, p); + + if (sym == NULL) { + fprintf(stderr, "%s: %s\n", p, dlerror()); + return; + } + + sym(); +} +#endif + +static void +local_shell_escape (char *arg) +{ +#ifdef CANT_FORK + /* FIXME: what about errors (I don't know how GO32 system() handles + them)? */ + system (arg); +#else /* Can fork. */ + int rc, status, pid; + char *p, *user_shell; + + if ((user_shell = (char *) getenv ("SHELL")) == NULL) + user_shell = "/bin/sh"; + + /* Get the name of the shell for arg0 */ + if ((p = strrchr (user_shell, '/')) == NULL) + p = user_shell; + else + p++; /* Get past '/' */ + + if ((pid = fork()) == 0) + { + if (!arg) + execl (user_shell, p, 0); + else + execl (user_shell, p, "-c", arg, 0); + + fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", user_shell, + safe_strerror (errno)); + gdb_flush (gdb_stderr); + _exit (0177); + } + + if (pid != -1) + while ((rc = wait (&status)) != pid && rc != -1) + ; + else + error ("Fork failed"); +#endif /* Can fork. */ +} + +static void +GetClassName(long objectID, char* name) +{ + register value_ptr val; + register struct symbol *sym; + struct minimal_symbol *msymbol; + struct type *type; + value_ptr blocklen; + LONGEST maddr; + + /* Find the address of RemoteGetClassName in the inferior. */ + + sym = lookup_symbol ("RemoteGetClassName", 0, VAR_NAMESPACE, 0, NULL); + if (sym != NULL) + { + if (SYMBOL_CLASS (sym) != LOC_BLOCK) + { + error ("\"RemoteGetClassName\" exists in this program but is not a function."); + } + val = value_of_variable (sym, NULL); + } + else + { + msymbol = lookup_minimal_symbol ("RemoteGetClassName", "", (struct objfile *) NULL); + if (msymbol != NULL) + { + type = lookup_pointer_type (builtin_type_char); + type = lookup_function_type (type); + type = lookup_pointer_type (type); + maddr = (LONGEST) SYMBOL_VALUE_ADDRESS (msymbol); + val = value_from_longest (type, maddr); + } + else + { + error ("evaluation of this expression requires the program to have a function \"RemoteGetClassName\"."); + } + } + + blocklen = value_from_longest (builtin_type_int, (LONGEST) objectID); + val = call_function_by_hand (val, 1, &blocklen); + if (value_logical_not (val)) + { + error ("Could not get class name."); + } + read_memory(value_as_pointer(val), name, 32); + +} + +static CORE_ADDR +GetBasePtr(long objectID) +{ + register value_ptr val; + register struct symbol *sym; + struct minimal_symbol *msymbol; + struct type *type; + value_ptr blocklen; + LONGEST maddr; + + /* Find the address of RemoteGetBasePtr in the inferior. */ + + sym = lookup_symbol ("RemoteGetBasePtr", 0, VAR_NAMESPACE, 0, NULL); + if (sym != NULL) + { + if (SYMBOL_CLASS (sym) != LOC_BLOCK) + { + error ("\"RemoteGetBasePtr\" exists in this program but is not a function."); + } + val = value_of_variable (sym, NULL); + } + else + { + msymbol = lookup_minimal_symbol ("RemoteGetBasePtr", "", (struct objfile *) NULL); + if (msymbol != NULL) + { + type = lookup_pointer_type (builtin_type_char); + type = lookup_function_type (type); + type = lookup_pointer_type (type); + maddr = (LONGEST) SYMBOL_VALUE_ADDRESS (msymbol); + val = value_from_longest (type, maddr); + } + else + { + error ("evaluation of this expression requires the program to have a function \"RemoteGetBasePtr\"."); + } + } + + blocklen = value_from_longest (builtin_type_int, (LONGEST) objectID); + val = call_function_by_hand (val, 1, &blocklen); + if (value_logical_not (val)) + { + error ("Could not get base pointer to object."); + } + return value_as_pointer(val); +} + +static void +dump_extra_data(CORE_ADDR addr, ulong length) +{ + ulong buf[5], chunk, i; + char *p; + + while (length > 3) { + chunk = (length > 16) ? 16 : length; + + memset(buf, 0, 5*sizeof(long)); + read_memory(addr, &buf, chunk); + fprintf(gdb_stdout, "%08lx %08lx %08lx %08lx | ", buf[0], + buf[1], buf[2], buf[3]); + for (i = 0, p = (char*)buf; i < chunk; i++, p++) { + if (!isprint(*p)) + *p = '.'; + } + fprintf(gdb_stdout, "%s |\n", buf); + addr += chunk; + length -= chunk; + } +} + +struct type *type_of_object(CORE_ADDR object) +{ + char className[32], classAllFieldsName[128]; + struct type *type = NULL; + GetClassName(object, className); + sprintf(classAllFieldsName, "%s_AllFields", className); + + type = lookup_typename(classAllFieldsName, (struct block *)NULL, 0); + return lookup_pointer_type(type); +} + +CORE_ADDR baseptr_of_object(ulong object) +{ + return GetBasePtr(object) + 12; +} + +/* ARGSUSED */ +static void +print_object (arg, dump) + char *arg; + int dump; +{ + CORE_ADDR addr; + ulong object, objectLength, typeLength = 0; + char className[32], classAllFieldsName[128]; + struct type* type = NULL; + + object = parse_and_eval_address(arg); + + GetClassName(object, className); + sprintf(classAllFieldsName, "%s_AllFields", className); + + type = lookup_typename(classAllFieldsName, (struct block *)NULL, 0); + typeLength = TYPE_LENGTH(type); + addr = GetBasePtr(object); + read_memory(addr, &objectLength, 4); + objectLength -= 12; + addr += 12; + if (TYPE_CODE(type) != TYPE_CODE_UNDEF && !(TYPE_FLAGS(type)&TYPE_FLAG_STUB)) { + if (dump) { + value_ptr valptr = value_at_lazy(type, addr); + int histindex = record_latest_value(valptr); + printf_filtered("Object 0x%08lx at address 0x%08lx of class %s\n", + object, addr, className); + if (histindex >= 0) printf_filtered ("$%d = ", histindex); + value_print(valptr, gdb_stdout, 0, Val_prettyprint); + objectLength -= typeLength; + addr += typeLength; + printf_filtered("\n"); + dump_extra_data(addr, objectLength); + printf_filtered("\n"); + } else { + value_ptr valptr = value_from_longest(lookup_pointer_type(type), addr); + int histindex = record_latest_value(valptr); + if (histindex >= 0) printf_filtered ("$%d = ", histindex); + value_print(valptr, gdb_stdout, 0, Val_prettyprint); + printf_filtered("\n"); + } + } +} + +/* ARGSUSED */ +static void +dobj_command (arg, from_tty) + char *arg; + int from_tty; +{ + print_object(arg, 1); +} + +/* ARGSUSED */ +static void +pobj_command (arg, from_tty) + char *arg; + int from_tty; +{ + print_object(arg, 0); +} + +/* ARGSUSED */ +static void +getint_command (arg, from_tty) + char *arg; + int from_tty; +{ + char shellCommand[128]; + + sprintf(shellCommand, "getint %s", arg); + local_shell_escape(shellCommand); +} + +/* ARGSUSED */ +static void +getindexical_command (arg, from_tty) + char *arg; + int from_tty; +{ + char shellCommand[128]; + + sprintf(shellCommand, "getindexical %s", arg); + local_shell_escape(shellCommand); +} + +/* ARGSUSED */ +static void +exc_command (arg, from_tty) + char *arg; + int from_tty; +{ + char shellCommand[128]; + ulong exception; + + sprintf(shellCommand, "getexc %s", arg); + local_shell_escape(shellCommand); +} + +static CORE_ADDR dispatch_method_addr = -1, dispatch_inherited_addr = -1, dispatch_delegated_addr = -1, dispatch_intrinsic_addr = -1; +CORE_ADDR do_dispatch_method_addr = -1, do_dispatch_intrinsic_addr = -1; + +static CORE_ADDR +lookup_address(const char *name) +{ + struct symbol *sym = lookup_symbol(name, NULL, VAR_NAMESPACE, NULL, NULL); + if (sym) + return BLOCK_START(SYMBOL_BLOCK_VALUE(sym)); + else + { +/* printf("Couldn't find %s!\n", name); */ + return -1; + } +} + +void +init_magic() +{ + dispatch_method_addr = lookup_address("__DispatchMethod"); + dispatch_inherited_addr = lookup_address("__DispatchInherited"); + dispatch_delegated_addr = lookup_address("__DispatchDelegated"); + dispatch_intrinsic_addr = lookup_address("__DispatchIntrinsic"); + do_dispatch_method_addr = lookup_address("__DoTheDispatch"); + do_dispatch_intrinsic_addr = lookup_address("__DoDispatchIntrinsic"); +} + +int +is_dispatch(CORE_ADDR pc) +{ + return (pc == dispatch_method_addr) || (pc == dispatch_inherited_addr) || (pc == dispatch_delegated_addr); +} + +int +is_dispatch_intrinsic(CORE_ADDR pc) +{ + return pc == dispatch_intrinsic_addr; +} + +/* If we are stopped at one of the entry points to the dispatcher, we want to continue until just + before we jump to the implementation. If we are at that point, we want to continue until we + actually get to the implementation. Likewise for the intrinsic dispatcher + */ +CORE_ADDR +deal_with_dispatch(CORE_ADDR stop_pc) +{ + if (is_dispatch(stop_pc)) + return do_dispatch_method_addr; + else if (is_dispatch_intrinsic(stop_pc)) + return do_dispatch_intrinsic_addr; + else if (stop_pc == do_dispatch_method_addr) + /* This assumes that we branch through t6 */ + return read_register(14); + else if (stop_pc == do_dispatch_intrinsic_addr) + /* This assumes that we branch through t0 */ + return read_register(8); + else + return 0; +} + +void +magic_create_inferior_hook() +{ + struct symbol *sym = lookup_symbol("gHandleError", NULL, VAR_NAMESPACE, NULL, NULL); + if (sym) + { + CORE_ADDR addr = SYMBOL_VALUE(sym); + unsigned long errorDebugger = 2; + target_write_memory(addr, &errorDebugger, 4); + } + + init_magic (); +} + + +_initialize_magic () +{ + add_com ("dobj", class_support, dobj_command, "Display Object Contents"); + add_com ("pobj", class_support, pobj_command, "Print object base pointer"); + add_com ("getint", class_support, getint_command, "Convert intrinsic name to number or vice versa."); + add_com ("getindexical", class_support, getindexical_command, "Convert indexical name to number or vice versa."); + add_com ("exc", class_support, exc_command, "Convert exception name to number or vice versa."); + +#ifdef DYNAMIC_COMMAND_SUPPORT + add_com ("dlopen", class_support, dlopen_command, + "Load the dynamic library specified and execute the specified symbol"); +#endif +} diff --git a/gdb/magic.h b/gdb/magic.h new file mode 100644 index 00000000000..7ff366c75f0 --- /dev/null +++ b/gdb/magic.h @@ -0,0 +1,6 @@ +/* magic.h - Interface to the General Magic debugger extras */ + +extern void init_magic(); +extern CORE_ADDR deal_with_dispatch(CORE_ADDR pc); +extern struct type *type_of_object(CORE_ADDR object); +extern CORE_ADDR baseptr_of_object(CORE_ADDR object); diff --git a/gdb/parse.c b/gdb/parse.c index 7bbe0a8f8ff..f22814b3502 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -599,6 +599,11 @@ length_of_subexp (expr, endpos) case OP_LABELED: case STRUCTOP_STRUCT: case STRUCTOP_PTR: +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS + case STRUCTOP_FIELD: +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ args = 1; /* fall through */ case OP_M2_STRING: diff --git a/gdb/remote-mips.c b/gdb/remote-mips.c index fde8f23bc5a..7514aa935fb 100644 --- a/gdb/remote-mips.c +++ b/gdb/remote-mips.c @@ -61,8 +61,9 @@ static void mips_send_packet PARAMS ((const char *s, int get_ack)); static int mips_receive_packet PARAMS ((char *buff, int throw_error, int timeout)); -static int mips_request PARAMS ((char cmd, unsigned int addr, - unsigned int data, int *perr, int timeout)); +static int mips_request PARAMS ((int cmd, unsigned int addr, + unsigned int data, int *perr, int timeout, + char *buff)); static void mips_initialize PARAMS ((void)); @@ -102,9 +103,11 @@ static void mips_mourn_inferior PARAMS ((void)); static void mips_load PARAMS ((char *file, int from_tty)); -static int mips_make_srec PARAMS ((char *buffer, char type, CORE_ADDR memaddr, +static int mips_make_srec PARAMS ((char *buffer, int type, CORE_ADDR memaddr, unsigned char *myaddr, int len)); +static int common_breakpoint PARAMS ((int cmd, CORE_ADDR addr, CORE_ADDR mask, + char *flags)); /* A forward declaration. */ extern struct target_ops mips_ops; @@ -274,6 +277,23 @@ static int mips_need_reply = 0; /* Handle used to access serial I/O stream. */ static serial_t mips_desc; +/* Counts the number of times the user tried to interrupt the target (usually + via ^C. */ +static int interrupt_count; + +/* If non-zero, means that the target is running. */ +static int mips_wait_flag = 0; + +/* If non-zero, monitor supports breakpoint commands. */ +static monitor_supports_breakpoints = 0; + +/* Data cache header. */ + +static DCACHE *mips_dcache; + +/* Non-zero means that we've just hit a read or write watchpoint */ +static int hit_watchpoint; + /* Handle low-level error that we can't recover from. Note that just error()ing out from target_wait or some such low-level place will cause all hell to break loose--the rest of GDB will tend to get left in an @@ -305,6 +325,7 @@ mips_error (va_alist) vfprintf_filtered (gdb_stderr, string, args); fprintf_filtered (gdb_stderr, "\n"); va_end (args); + gdb_flush (gdb_stderr); /* Clean up in such a way that mips_close won't try to talk to the board (it almost surely won't work since we weren't able to talk to @@ -318,6 +339,9 @@ mips_error (va_alist) return_to_top_level (RETURN_ERROR); } +/* Wait until STRING shows up in mips_desc. Returns 1 if successful, else 0 if + timed out. */ + int mips_expect (string) char *string; @@ -398,7 +422,7 @@ mips_readchar (timeout) mips_error ("End of file from remote"); if (ch == SERIAL_ERROR) mips_error ("Error reading from remote: %s", safe_strerror (errno)); - if (sr_get_debug () > 1) + if (remote_debug > 1) { /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ @@ -417,12 +441,10 @@ mips_readchar (timeout) && state == (sizeof(nextstate) / sizeof(char)) && ! mips_initializing) { - if (sr_get_debug () > 0) + if (remote_debug > 0) /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ printf_unfiltered ("Reinitializing MIPS debugging mode\n"); - SERIAL_WRITE (mips_desc, "\015db tty0\015", sizeof "\015db tty0\015" - 1); - sleep (1); mips_need_reply = 0; mips_initialize (); @@ -474,7 +496,7 @@ mips_receive_header (hdr, pgarbage, ch, timeout) what the program is outputting, if the debugging is being done on the console port. Don't use _filtered; we can't deal with a QUIT out of target_wait. */ - if (! mips_initializing || sr_get_debug () > 0) + if (! mips_initializing || remote_debug > 0) { if (ch < 0x20 && ch != '\n') { @@ -488,7 +510,8 @@ mips_receive_header (hdr, pgarbage, ch, timeout) ++*pgarbage; if (*pgarbage > mips_syn_garbage) - mips_error ("Remote debugging protocol failure"); + mips_error ("Debug protocol failure: more than %d characters before a sync.", + mips_syn_garbage); } } @@ -612,7 +635,7 @@ mips_send_packet (s, get_ack) int garbage; int ch; - if (sr_get_debug () > 0) + if (remote_debug > 0) { /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ @@ -673,7 +696,7 @@ mips_send_packet (s, get_ack) != TRLR_GET_CKSUM (trlr)) continue; - if (sr_get_debug () > 0) + if (remote_debug > 0) { hdr[HDR_LENGTH] = '\0'; trlr[TRLR_LENGTH] = '\0'; @@ -746,7 +769,7 @@ mips_receive_packet (buff, throw_error, timeout) { /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ - if (sr_get_debug () > 0) + if (remote_debug > 0) printf_unfiltered ("Ignoring unexpected ACK\n"); continue; } @@ -756,7 +779,7 @@ mips_receive_packet (buff, throw_error, timeout) { /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ - if (sr_get_debug () > 0) + if (remote_debug > 0) printf_unfiltered ("Ignoring sequence number %d (want %d)\n", HDR_GET_SEQ (hdr), mips_receive_seq); continue; @@ -788,7 +811,7 @@ mips_receive_packet (buff, throw_error, timeout) { /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ - if (sr_get_debug () > 0) + if (remote_debug > 0) printf_unfiltered ("Got new SYN after %d chars (wanted %d)\n", i, len); continue; @@ -806,7 +829,7 @@ mips_receive_packet (buff, throw_error, timeout) { /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ - if (sr_get_debug () > 0) + if (remote_debug > 0) printf_unfiltered ("Got SYN when wanted trailer\n"); continue; } @@ -814,7 +837,7 @@ mips_receive_packet (buff, throw_error, timeout) if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr)) break; - if (sr_get_debug () > 0) + if (remote_debug > 0) /* Don't use _filtered; we can't deal with a QUIT out of target_wait, and I think this might be called from there. */ printf_unfiltered ("Bad checksum; data %d, trailer %d\n", @@ -834,7 +857,7 @@ mips_receive_packet (buff, throw_error, timeout) ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum); ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum); - if (sr_get_debug () > 0) + if (remote_debug > 0) { ack[HDR_LENGTH + TRLR_LENGTH] = '\0'; /* Don't use _filtered; we can't deal with a QUIT out of @@ -852,7 +875,7 @@ mips_receive_packet (buff, throw_error, timeout) } } - if (sr_get_debug () > 0) + if (remote_debug > 0) { buff[len] = '\0'; /* Don't use _filtered; we can't deal with a QUIT out of @@ -874,7 +897,7 @@ mips_receive_packet (buff, throw_error, timeout) ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum); ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum); - if (sr_get_debug () > 0) + if (remote_debug > 0) { ack[HDR_LENGTH + TRLR_LENGTH] = '\0'; /* Don't use _filtered; we can't deal with a QUIT out of @@ -920,20 +943,24 @@ mips_receive_packet (buff, throw_error, timeout) target board reports. */ static int -mips_request (cmd, addr, data, perr, timeout) - char cmd; +mips_request (cmd, addr, data, perr, timeout, buff) + int cmd; unsigned int addr; unsigned int data; int *perr; int timeout; + char *buff; { - char buff[DATA_MAXLEN + 1]; + char myBuff[DATA_MAXLEN + 1]; int len; int rpid; char rcmd; int rerrflg; int rresponse; + if (buff == (char *) NULL) + buff = myBuff; + if (cmd != '\0') { if (mips_need_reply) @@ -989,7 +1016,7 @@ mips_initialize_cleanups (arg) static void mips_initialize () { - char cr; + char cr, cc; char buff[DATA_MAXLEN + 1]; int err; struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL); @@ -1003,6 +1030,7 @@ mips_initialize () return; } + mips_wait_flag = 0; mips_initializing = 1; mips_send_seq = 0; @@ -1011,47 +1039,72 @@ mips_initialize () if (mips_receive_packet (buff, 0, 3) < 0) { char cc; - int i; + int i, j; char srec[10]; /* We did not receive the packet we expected; try resetting the board and trying again. */ - /* We are possibly in binary download mode, having aborted in the middle - of an S-record. ^C won't work because of binary mode. The only - reliable way out is to send enough termination packets (8 bytes) to - fill up and then overflow the largest size S-record (255 bytes in this - case). This amounts to 256/8 + 1. */ - - mips_make_srec (srec, '7', 0, NULL, 0); + /* Force the system into the IDT monitor. After this we *should* be at + the prompt. */ - for (i = 1; i <= 33; i++) + for (j = 1; j <= 4; j++) { - SERIAL_WRITE (mips_desc, srec, 8); + switch (j) + { + case 1: /* First, try sending a break */ + SERIAL_SEND_BREAK (mips_desc); + break; + case 2: /* Then, try a ^C */ + SERIAL_WRITE (mips_desc, "\003", 1); /* Send a ^C to wake up the monitor */ + break; + case 3: /* Then, try escaping from download */ + /* We are possibly in binary download mode, having aborted in the middle + of an S-record. ^C won't work because of binary mode. The only + reliable way out is to send enough termination packets (8 bytes) to + fill up and then overflow the largest size S-record (255 bytes in this + case). This amounts to 256/8 + 1 packets. */ + + mips_make_srec (srec, '7', 0, NULL, 0); - if (SERIAL_READCHAR (mips_desc, 0) >= 0) - break; /* Break immediatly if we get something from + for (i = 1; i <= 33; i++) + { + SERIAL_WRITE (mips_desc, srec, 8); + + if (SERIAL_READCHAR (mips_desc, 0) >= 0) + break; /* Break immediatly if we get something from the board. */ + } + break; + case 4: + mips_error ("Failed to initialize."); + } + if (mips_expect ("\015\012")) + break; } - printf_filtered ("Failed to initialize; trying to reset board\n"); - cc = '\003'; - SERIAL_WRITE (mips_desc, &cc, 1); - sleep (2); - SERIAL_WRITE (mips_desc, "\015db tty0\015", sizeof "\015db tty0\015" - 1); - sleep (1); - cr = '\015'; - SERIAL_WRITE (mips_desc, &cr, 1); + SERIAL_WRITE (mips_desc, "db tty0\015", sizeof "db tty0\015" - 1); + mips_expect ("db tty0\015\012"); /* Eat the echo */ + + SERIAL_WRITE (mips_desc, "\015", sizeof "\015" - 1); - mips_receive_packet (buff, 1, 3); + if (mips_receive_packet (buff, 1, 3) < 0) + mips_error ("Failed to initialize (didn't receive packet)."); } + if (common_breakpoint ('b', -1, 0, NULL)) /* Clear all breakpoints */ + monitor_supports_breakpoints = 0; /* Failed, don't use it anymore */ + else + monitor_supports_breakpoints = 1; + do_cleanups (old_cleanups); /* If this doesn't call error, we have connected; we don't care if the request itself succeeds or fails. */ mips_request ('r', (unsigned int) 0, (unsigned int) 0, &err, - mips_receive_wait); + mips_receive_wait, NULL); + set_current_frame (create_new_frame (read_fp (), read_pc ())); + select_frame (get_current_frame (), 0); } /* Open a connection to the remote board. */ @@ -1132,7 +1185,7 @@ mips_close (quitting) /* Get the board out of remote debugging mode. */ mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err, - mips_receive_wait); + mips_receive_wait, NULL); SERIAL_CLOSE (mips_desc); } @@ -1149,6 +1202,9 @@ mips_detach (args, from_tty) error ("Argument given to \"detach\" when remotely debugging."); pop_target (); + + mips_close (1); + if (from_tty) printf_unfiltered ("Ending remote MIPS debugging.\n"); } @@ -1161,16 +1217,21 @@ mips_resume (pid, step, siggnal) int pid, step; enum target_signal siggnal; { + +/* start-sanitize-gm */ +#ifndef GENERAL_MAGIC_HACKS if (siggnal != TARGET_SIGNAL_0) warning ("Can't send signals to a remote system. Try `handle %s ignore'.", target_signal_to_name (siggnal)); +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ mips_request (step ? 's' : 'c', (unsigned int) 1, - (unsigned int) 0, + (unsigned int) siggnal, (int *) NULL, - mips_receive_wait); + mips_receive_wait, NULL); } /* Return the signal corresponding to SIG, where SIG is the number which @@ -1202,6 +1263,13 @@ mips_wait (pid, status) { int rstatus; int err; + char buff[DATA_MAXLEN]; + int rpc, rfp, rsp; + char flags[20]; + int nfields; + + interrupt_count = 0; + hit_watchpoint = 0; /* If we have not sent a single step or continue command, then the board is waiting for us to do something. Return a status @@ -1214,10 +1282,46 @@ mips_wait (pid, status) } /* No timeout; we sit here as long as the program continues to execute. */ - rstatus = mips_request ('\0', (unsigned int) 0, (unsigned int) 0, &err, -1); + mips_wait_flag = 1; + rstatus = mips_request ('\000', (unsigned int) 0, (unsigned int) 0, &err, -1, + buff); + mips_wait_flag = 0; if (err) mips_error ("Remote failure: %s", safe_strerror (errno)); + nfields = sscanf (buff, "0x%*x %*c 0x%*x 0x%*x 0x%x 0x%x 0x%x 0x%*x %s", + &rpc, &rfp, &rsp, flags); + + /* See if we got back extended status. If so, pick out the pc, fp, sp, etc... */ + + if (nfields == 7 || nfields == 9) + { + char buf[MAX_REGISTER_RAW_SIZE]; + + store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rpc); + supply_register (PC_REGNUM, buf); + + store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rfp); + supply_register (30, buf); /* This register they are avoiding and so it is unnamed */ + + store_unsigned_integer (buf, REGISTER_RAW_SIZE (SP_REGNUM), rsp); + supply_register (SP_REGNUM, buf); + + store_unsigned_integer (buf, REGISTER_RAW_SIZE (FP_REGNUM), 0); + supply_register (FP_REGNUM, buf); + + if (nfields == 9) + { + int i; + + for (i = 0; i <= 2; i++) + if (flags[i] == 'r' || flags[i] == 'w') + hit_watchpoint = 1; + else if (flags[i] == '\000') + break; + } + } + /* Translate a MIPS waitstatus. We use constants here rather than WTERMSIG and so on, because the constants we want here are determined by the MIPS protocol and have nothing to do with what host we are running on. */ @@ -1297,7 +1401,7 @@ mips_fetch_registers (regno) else { val = mips_request ('r', (unsigned int) mips_map_regno (regno), - (unsigned int) 0, &err, mips_receive_wait); + (unsigned int) 0, &err, mips_receive_wait, NULL); if (err) mips_error ("Can't read register %d: %s", regno, safe_strerror (errno)); @@ -1338,7 +1442,7 @@ mips_store_registers (regno) mips_request ('R', (unsigned int) mips_map_regno (regno), (unsigned int) read_register (regno), - &err, mips_receive_wait); + &err, mips_receive_wait, NULL); if (err) mips_error ("Can't write register %d: %s", regno, safe_strerror (errno)); } @@ -1353,12 +1457,12 @@ mips_fetch_word (addr) int err; val = mips_request ('d', (unsigned int) addr, (unsigned int) 0, &err, - mips_receive_wait); + mips_receive_wait, NULL); if (err) { /* Data space failed; try instruction space. */ val = mips_request ('i', (unsigned int) addr, (unsigned int) 0, &err, - mips_receive_wait); + mips_receive_wait, NULL); if (err) mips_error ("Can't read address 0x%x: %s", addr, safe_strerror (errno)); } @@ -1380,13 +1484,13 @@ mips_store_word (addr, val, old_contents) oldcontents = mips_request ('D', (unsigned int) addr, (unsigned int) val, &err, - mips_receive_wait); + mips_receive_wait, NULL); if (err) { /* Data space failed; try instruction space. */ oldcontents = mips_request ('I', (unsigned int) addr, (unsigned int) val, &err, - mips_receive_wait); + mips_receive_wait, NULL); if (err) return errno; } @@ -1496,6 +1600,41 @@ mips_files_info (ignore) static void mips_kill () { + if (!mips_wait_flag) + return; + + interrupt_count++; + + if (interrupt_count >= 2) + { + interrupt_count = 0; + + target_terminal_ours (); + + if (query ("Interrupted while waiting for the program.\n\ +Give up (and stop debugging it)? ")) + { + /* Clean up in such a way that mips_close won't try to talk to the + board (it almost surely won't work since we weren't able to talk to + it). */ + mips_wait_flag = 0; + mips_is_open = 0; + SERIAL_CLOSE (mips_desc); + + printf_unfiltered ("Ending remote MIPS debugging.\n"); + target_mourn_inferior (); + + return_to_top_level (RETURN_QUIT); + } + + target_terminal_inferior (); + } + + if (remote_debug > 0) + printf_unfiltered ("Sending break\n"); + + SERIAL_SEND_BREAK (mips_desc); + #if 0 if (mips_is_open) { @@ -1537,7 +1676,16 @@ Can't pass arguments to remote MIPS board; arguments ignored."); /* FIXME: Should we set inferior_pid here? */ +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS + magic_create_inferior_hook (); + proceed (entry_pt, TARGET_SIGNAL_PWR, 0); +#else +/* end-sanitize-gm */ proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0); +/* start-sanitize-gm */ +#endif +/* end-sanitize-gm */ } /* Clean up after a process. Actually nothing to do. */ @@ -1573,6 +1721,9 @@ mips_insert_breakpoint (addr, contents_cache) { int status; + if (monitor_supports_breakpoints) + return common_breakpoint ('B', addr, 0x3, "f"); + return mips_store_word (addr, BREAK_INSN, contents_cache); } @@ -1581,9 +1732,146 @@ mips_remove_breakpoint (addr, contents_cache) CORE_ADDR addr; char *contents_cache; { + if (monitor_supports_breakpoints) + return common_breakpoint ('b', addr, 0, NULL); + return target_write_memory (addr, contents_cache, BREAK_INSN_SIZE); } +/* Compute a don't care mask for the region bounding ADDR and ADDR + LEN - 1. + This is used for memory ref breakpoints. */ + +static unsigned long +calculate_mask (addr, len) + CORE_ADDR addr; + int len; +{ + unsigned long mask; + int i; + + mask = addr ^ (addr + len - 1); + + for (i = 32; i >= 0; i--) + if (mask == 0) + break; + else + mask >>= 1; + + mask = (unsigned long) 0xffffffff >> i; + + return mask; +} + +/* Set a data watchpoint. ADDR and LEN should be obvious. TYPE is either 1 + for a read watchpoint, or 2 for a read/write watchpoint. */ + +int +remote_mips_set_watchpoint (addr, len, type) + CORE_ADDR addr; + int len; + int type; +{ + CORE_ADDR first_addr; + unsigned long mask; + char *flags; + + mask = calculate_mask (addr, len); + + first_addr = addr & ~mask; + + switch (type) + { + case 0: /* write */ + flags = "w"; + break; + case 1: /* read */ + flags = "r"; + break; + case 2: /* read/write */ + flags = "rw"; + break; + default: + abort (); + } + + if (common_breakpoint ('B', first_addr, mask, flags)) + return -1; + + return 0; +} + +int +remote_mips_remove_watchpoint (addr, len, type) + CORE_ADDR addr; + int len; + int type; +{ + CORE_ADDR first_addr; + unsigned long mask; + + mask = calculate_mask (addr, len); + + first_addr = addr & ~mask; + + if (common_breakpoint ('b', first_addr, 0, NULL)) + return -1; + + return 0; +} + +int +remote_mips_stopped_by_watchpoint () +{ + return hit_watchpoint; +} + +/* This routine generates the a breakpoint command of the form: + + 0x0 + + Where is one of: `B' to set, or `b' to clear a breakpoint. is + the address of the breakpoint. is a don't care mask for addresses. + is any combination of `r', `w', or `f' for read/write/or fetch. */ + +static int +common_breakpoint (cmd, addr, mask, flags) + int cmd; + CORE_ADDR addr; + CORE_ADDR mask; + char *flags; +{ + int len; + char buf[DATA_MAXLEN + 1]; + char rcmd; + int rpid, rerrflg, rresponse; + int nfields; + + if (flags) + sprintf (buf, "0x0 %c 0x%x 0x%x %s", cmd, addr, mask, flags); + else + sprintf (buf, "0x0 %c 0x%x", cmd, addr); + + mips_send_packet (buf, 1); + + len = mips_receive_packet (buf, 1, mips_receive_wait); + + nfields = sscanf (buf, "0x%x %c 0x%x 0x%x", &rpid, &rcmd, &rerrflg, &rresponse); + + if (nfields != 4 + || rcmd != cmd) + mips_error ("common_breakpoint: Bad response from remote board: %s", buf); + + if (rerrflg != 0) + { + if (rerrflg != EINVAL) + fprintf_unfiltered (stderr, "common_breakpoint (0x%x): Got error: 0x%x\n", + addr, rresponse); + return 1; + } + + return 0; +} + static void send_srec (srec, len, addr) char *srec; @@ -1740,7 +2028,7 @@ mips_load_srec (args) static int mips_make_srec (buf, type, memaddr, myaddr, len) char *buf; - char type; + int type; CORE_ADDR memaddr; unsigned char *myaddr; int len; @@ -1782,14 +2070,13 @@ mips_load (file, from_tty) int from_tty; { int err; - static char prompt[] = TARGET_MONITOR_PROMPT; /* Get the board out of remote debugging mode. */ mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err, - mips_receive_wait); + mips_receive_wait, NULL); - if (!mips_expect ("\015\012") || !mips_expect (prompt)) + if (!mips_expect ("\015\012") || !mips_expect (TARGET_MONITOR_PROMPT)) error ("mips_load: Couldn't get into monitor mode."); mips_load_srec (file); diff --git a/gdb/top.c b/gdb/top.c index 612c2a15247..ea6541add58 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -3033,6 +3033,15 @@ echo_command (text, from_tty) gdb_flush (gdb_stdout); } +/* ARGSUSED */ +static void +dont_repeat_command (ignored, from_tty) + char *ignored; + int from_tty; +{ + *line = 0; /* Can't call dont_repeat here because we're not + necessarily reading from stdin. */ +} #ifdef TARGET_BYTE_ORDER_SELECTABLE @@ -3467,6 +3476,9 @@ when gdb is started.", &cmdlist); add_com_alias ("q", "quit", class_support, 1); add_com_alias ("h", "help", class_support, 1); + add_com ("dont-repeat", class_support, dont_repeat_command, "Don't repeat this command.\n\ +Primarily used inside of user-defined commands that should not be repeated when\n\ +hitting return."); c = add_set_cmd ("verbose", class_support, var_boolean, (char *)&info_verbose, "Set ", diff --git a/gdb/utils.c b/gdb/utils.c index 98872b9b3ff..8bd01f8a5b7 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -602,6 +602,12 @@ request_quit (signo) about USG defines and stuff like that. */ signal (signo, request_quit); +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC_HACKS + target_kill (); +#endif /* GENERAL_MAGIC_HACKS */ +/* end-sanitize-gm */ + #ifdef REQUEST_QUIT REQUEST_QUIT; #else @@ -1508,7 +1514,7 @@ vfprintf_maybe_filtered (stream, format, args, filter) void vfprintf_filtered (stream, format, args) FILE *stream; - char *format; + const char *format; va_list args; { vfprintf_maybe_filtered (stream, format, args, 1); @@ -1517,7 +1523,7 @@ vfprintf_filtered (stream, format, args) void vfprintf_unfiltered (stream, format, args) FILE *stream; - char *format; + const char *format; va_list args; { char *linebuffer; @@ -1536,7 +1542,7 @@ vfprintf_unfiltered (stream, format, args) void vprintf_filtered (format, args) - char *format; + const char *format; va_list args; { vfprintf_maybe_filtered (gdb_stdout, format, args, 1); @@ -1544,7 +1550,7 @@ vprintf_filtered (format, args) void vprintf_unfiltered (format, args) - char *format; + const char *format; va_list args; { vfprintf_unfiltered (gdb_stdout, format, args); @@ -1553,7 +1559,7 @@ vprintf_unfiltered (format, args) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -fprintf_filtered (FILE *stream, char *format, ...) +fprintf_filtered (FILE *stream, const char *format, ...) #else fprintf_filtered (va_alist) va_dcl @@ -1577,7 +1583,7 @@ fprintf_filtered (va_alist) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -fprintf_unfiltered (FILE *stream, char *format, ...) +fprintf_unfiltered (FILE *stream, const char *format, ...) #else fprintf_unfiltered (va_alist) va_dcl @@ -1604,7 +1610,7 @@ fprintf_unfiltered (va_alist) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -fprintfi_filtered (int spaces, FILE *stream, char *format, ...) +fprintfi_filtered (int spaces, FILE *stream, const char *format, ...) #else fprintfi_filtered (va_alist) va_dcl @@ -1633,7 +1639,7 @@ fprintfi_filtered (va_alist) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -printf_filtered (char *format, ...) +printf_filtered (const char *format, ...) #else printf_filtered (va_alist) va_dcl @@ -1656,7 +1662,7 @@ printf_filtered (va_alist) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -printf_unfiltered (char *format, ...) +printf_unfiltered (const char *format, ...) #else printf_unfiltered (va_alist) va_dcl @@ -1681,7 +1687,7 @@ printf_unfiltered (va_alist) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -printfi_filtered (int spaces, char *format, ...) +printfi_filtered (int spaces, const char *format, ...) #else printfi_filtered (va_alist) va_dcl @@ -1710,14 +1716,14 @@ printfi_filtered (va_alist) void puts_filtered (string) - char *string; + const char *string; { fputs_filtered (string, gdb_stdout); } void puts_unfiltered (string) - char *string; + const char *string; { fputs_unfiltered (string, gdb_stdout); } -- 2.30.2