Path: utzoo!utgpu!watmath!uunet!tut.cis.ohio-state.edu!UUNET.UU.NET!munnari!sibyl.eleceng.ua.oz.au!ian
From: munnari!sibyl.eleceng.ua.oz.au!ian@UUNET.UU.NET
Newsgroups: gnu.gdb.bug
Subject: GDB: support for vanilla System V (part 4 of 5)
Message-ID: <8811301845.AA17615@uunet.UU.NET>
Date: 1 Dec 88 05:25:36 GMT
Sender: daemon@tut.cis.ohio-state.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 874


(Sorry if you've seen this before but I sent it to bug-gnu-emacs
not realising that bug-gdb existed)

In GDB 2.7 on sibyl (usg-unix-v)

There are 5 parts because outgoing overseas mail from here must be
less than 25k. Part 1 contains a shar archive containing the new
files. Parts 2 to 5 contain shar archives of the patch files to make
the changes to the the existing files. The patch files are context
differences.

Part 4 of 5:

--------------Cut Here-----------------------
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by ian on Thu Nov 24 11:20:13 CST 1988
# Contents:  patch#3
 
echo x - patch#3
sed 's/^@//' > "patch#3" <<'@//E*O*F patch#3//'
*** ../gdb.dist/main.c	Thu Jul 21 05:21:34 1988
--- main.c	Wed Nov 16 01:02:16 1988
***************
*** 18,23
  anyone else from sharing it farther.  Help stamp out software hoarding!
  */
  
  #include 
  #include 
  #include 

--- 18,28 -----
  anyone else from sharing it farther.  Help stamp out software hoarding!
  */
  
+ #include "config.h"
+ #include "param.h"
+ #ifdef NS5
+ #include 
+ #endif
  #include 
  #include 
  #include 
***************
*** 25,31
  #include 
  #include "defs.h"
  #include "command.h"
- #include "param.h"
  
  #ifdef SET_STACK_LIMIT_HUGE
  #include 

--- 30,35 -----
  #include 
  #include "defs.h"
  #include "command.h"
  
  #ifdef SET_STACK_LIMIT_HUGE
  #include 
***************
*** 32,37
  #include 
  #endif
  
  /* Version number of GDB, as a string.  */
  
  extern char *version;

--- 36,47 -----
  #include 
  #endif
  
+ #ifdef NS5
+ #ifndef R_OK
+ #define R_OK (04)
+ #endif
+ #endif
+ 
  /* Version number of GDB, as a string.  */
  
  extern char *version;
***************
*** 148,153
       char **envp;
  {
    extern void request_quit ();
    int count;
    int inhibit_gdbinit = 0;
    int quiet = 0;

--- 158,164 -----
       char **envp;
  {
    extern void request_quit ();
+   char *getenv();
    int count;
    int inhibit_gdbinit = 0;
    int quiet = 0;
***************
*** 871,877
  automatically terminated.  However, parties who have received computer\n\
  software programs from you with this License Agreement will not have\n\
  their licenses terminated so long as such parties remain in full compliance.\n\
! \n\
    5. If you wish to incorporate parts of GDB into other free\n\
  programs whose distribution conditions are different, write to the Free\n\
  Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet\n\

--- 882,889 -----
  automatically terminated.  However, parties who have received computer\n\
  software programs from you with this License Agreement will not have\n\
  their licenses terminated so long as such parties remain in full compliance.\n\
! \n");
!   printf ("\
    5. If you wish to incorporate parts of GDB into other free\n\
  programs whose distribution conditions are different, write to the Free\n\
  Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet\n\
***************
*** 986,991
  static void
  quit_command ()
  {
    if (have_inferior_p ())
      {
        if (query ("The program is running.  Quit anyway? "))

--- 998,1004 -----
  static void
  quit_command ()
  {
+   void exit();
    if (have_inferior_p ())
      {
        if (query ("The program is running.  Quit anyway? "))
*** ../gdb.dist/ns32k-pinsn.c	Wed Jun 22 13:15:44 1988
--- ns32k-pinsn.c	Fri Nov 18 02:07:28 1988
***************
*** 18,23
  anyone else from sharing it farther.  Help stamp out software hoarding!
  */
  
  #include 
  
  #include "defs.h"

--- 18,24 -----
  anyone else from sharing it farther.  Help stamp out software hoarding!
  */
  
+ #include "config.h"
  #include 
  
  #include "defs.h"
***************
*** 40,48
   * into buffer
   */
  
! int
! bit_extract (buffer, offset, count)
!      char *buffer;
       int offset;
       int count;
  {

--- 41,49 -----
   * into buffer
   */
  
! void
! bit_extract (buffer, offset, count, result)
!      char *buffer, *result;
       int offset;
       int count;
  {
***************
*** 46,52
       int offset;
       int count;
  {
!   int result;
    int mask;
    int bit;
  

--- 47,53 -----
       int offset;
       int count;
  {
!   int i;
    int mask;
    int bit;
  
***************
*** 52,60
  
    buffer += offset >> 3;
    offset &= 7;
!   bit = 1;
!   result = 0;
!   while (count--) 
      {
        if ((*buffer & (1 << offset)))
  	result |= bit;

--- 53,59 -----
  
    buffer += offset >> 3;
    offset &= 7;
!   while (count)
      {
        for (i = min(8, count), bit = 1, *result = 0; i--; count--, bit <<= 1)
  	{
***************
*** 56,64
    result = 0;
    while (count--) 
      {
!       if ((*buffer & (1 << offset)))
! 	result |= bit;
!       if (++offset == 8)
  	{
  	  offset = 0;
  	  buffer++;

--- 55,61 -----
    offset &= 7;
    while (count)
      {
!       for (i = min(8, count), bit = 1, *result = 0; i--; count--, bit <<= 1)
  	{
  	  if ((*buffer & (1 << offset)))
  	    *result |= bit;
***************
*** 60,67
  	result |= bit;
        if (++offset == 8)
  	{
! 	  offset = 0;
! 	  buffer++;
  	}
        bit <<= 1;
      }

--- 57,69 -----
      {
        for (i = min(8, count), bit = 1, *result = 0; i--; count--, bit <<= 1)
  	{
! 	  if ((*buffer & (1 << offset)))
! 	    *result |= bit;
! 	  if (++offset == 8)
! 	    {
! 	      offset = 0;
! 	      buffer++;
! 	    }
  	}
        result++;
      }
***************
*** 63,69
  	  offset = 0;
  	  buffer++;
  	}
!       bit <<= 1;
      }
    return result;
  }

--- 65,71 -----
  	      buffer++;
  	    }
  	}
!       result++;
      }
  }
  
***************
*** 65,71
  	}
        bit <<= 1;
      }
-   return result;
  }
  
  float

--- 67,72 -----
  	}
        result++;
      }
  }
  
  
***************
*** 68,80
    return result;
  }
  
- float
- fbit_extract (buffer, offset, count)
- {
-   union {
-     int ival;
-     float fval;
-   } foo;
  
    foo.ival = bit_extract (buffer, offset, 32);
    return foo.fval;

--- 69,74 -----
      }
  }
  
  
  sign_extend (value, bits)
       int value, bits;
***************
*** 76,98
      float fval;
    } foo;
  
-   foo.ival = bit_extract (buffer, offset, 32);
-   return foo.fval;
- }
- 
- double
- dbit_extract (buffer, offset, count)
- {
-   union {
-     struct {int low, high; } ival;
-     double dval;
-   } foo;
- 
-   foo.ival.low = bit_extract (buffer, offset, 32);
-   foo.ival.high = bit_extract (buffer, offset+32, 32);
-   return foo.dval;
- }
- 
  sign_extend (value, bits)
  {
    value = value & ((1 << bits) - 1);

--- 70,75 -----
  }
  
  
  sign_extend (value, bits)
       int value, bits;
  {
***************
*** 94,99
  }
  
  sign_extend (value, bits)
  {
    value = value & ((1 << bits) - 1);
    return (value & (1 << (bits-1))

--- 71,77 -----
  
  
  sign_extend (value, bits)
+      int value, bits;
  {
    value = value & ((1 << bits) - 1);
    return (value & (1 << (bits-1))
***************
*** 222,228
      case 'W':
      case 'D':
      case 'A':
!       addr_mode = bit_extract (buffer, ioffset-5, 5);
        ioffset -= 5;
        switch (addr_mode)
  	{

--- 200,207 -----
      case 'W':
      case 'D':
      case 'A':
!       bit_extract (buffer, ioffset-5, 5, (char *) &addr_mode);
!       addr_mode &= ((1 << 5) - 1);
        ioffset -= 5;
        switch (addr_mode)
  	{
***************
*** 258,264
  	  switch (d)
  	    {
  	    case 'B':
! 	      Ivalue = bit_extract (buffer, *aoffsetp, 8);
  	      Ivalue = sign_extend (Ivalue, 8);
  	      *aoffsetp += 8;
  	      sprintf (result, "$%d", Ivalue);

--- 237,244 -----
  	  switch (d)
  	    {
  	    case 'B':
! 	      bit_extract (buffer, *aoffsetp, 8, (char *) &Ivalue);
! 	      Ivalue &= ((1 << 8) - 1);
  	      Ivalue = sign_extend (Ivalue, 8);
  	      *aoffsetp += 8;
  	      sprintf (result, "$%d", Ivalue);
***************
*** 264,270
  	      sprintf (result, "$%d", Ivalue);
  	      break;
  	    case 'W':
! 	      Ivalue = bit_extract (buffer, *aoffsetp, 16);
  	      flip_bytes (&Ivalue, 2);
  	      *aoffsetp += 16;
  	      Ivalue = sign_extend (Ivalue, 16);

--- 244,251 -----
  	      sprintf (result, "$%d", Ivalue);
  	      break;
  	    case 'W':
! 	      bit_extract (buffer, *aoffsetp, 16, (char *) &Ivalue);
! 	      Ivalue &= ((1 << 16) - 1);
  	      flip_bytes (&Ivalue, 2);
  	      *aoffsetp += 16;
  	      Ivalue = sign_extend (Ivalue, 16);
***************
*** 271,277
  	      sprintf (result, "$%d", Ivalue);
  	      break;
  	    case 'D':
! 	      Ivalue = bit_extract (buffer, *aoffsetp, 32);
  	      flip_bytes (&Ivalue, 4);
  	      *aoffsetp += 32;
  	      sprintf (result, "$%d", Ivalue);

--- 252,258 -----
  	      sprintf (result, "$%d", Ivalue);
  	      break;
  	    case 'D':
! 	      bit_extract (buffer, *aoffsetp, 32, (char *) &Ivalue);
  	      flip_bytes (&Ivalue, 4);
  	      *aoffsetp += 32;
  	      sprintf (result, "$%d", Ivalue);
***************
*** 277,283
  	      sprintf (result, "$%d", Ivalue);
  	      break;
  	    case 'A':
! 	      Ivalue = bit_extract (buffer, *aoffsetp, 32);
  	      flip_bytes (&Ivalue, 4);
  	      *aoffsetp += 32;
  	      sprintf (result, "$|%d|", Ivalue);

--- 258,264 -----
  	      sprintf (result, "$%d", Ivalue);
  	      break;
  	    case 'A':
! 	      bit_extract (buffer, *aoffsetp, 32, (char *) &Ivalue);
  	      flip_bytes (&Ivalue, 4);
  	      *aoffsetp += 32;
  	      sprintf (result, "$|%d|", Ivalue);
***************
*** 283,289
  	      sprintf (result, "$|%d|", Ivalue);
  	      break;
  	    case 'F':
! 	      Fvalue = fbit_extract (buffer, *aoffsetp, 32);
  	      flip_bytes (&Fvalue, 4);
  	      *aoffsetp += 32;
  	      sprintf (result, "$%g", Fvalue);

--- 264,270 -----
  	      sprintf (result, "$|%d|", Ivalue);
  	      break;
  	    case 'F':
! 	      bit_extract (buffer, *aoffsetp, 32, (char *) &Fvalue);
  	      flip_bytes (&Fvalue, 4);
  	      *aoffsetp += 32;
  	      if (INVALID_FLOAT (&Fvalue, 4))
***************
*** 286,292
  	      Fvalue = fbit_extract (buffer, *aoffsetp, 32);
  	      flip_bytes (&Fvalue, 4);
  	      *aoffsetp += 32;
! 	      sprintf (result, "$%g", Fvalue);
  	      break;
  	    case 'L':
  	      Lvalue = dbit_extract (buffer, *aoffsetp, 64);

--- 267,276 -----
  	      bit_extract (buffer, *aoffsetp, 32, (char *) &Fvalue);
  	      flip_bytes (&Fvalue, 4);
  	      *aoffsetp += 32;
! 	      if (INVALID_FLOAT (&Fvalue, 4))
! 		sprintf (result, "<>", *(int *) &Fvalue);
! 	      else
! 		sprintf (result, "$%g", Fvalue);
  	      break;
  	    case 'L':
  	      bit_extract (buffer, *aoffsetp, 64, (char *) &Lvalue);
***************
*** 289,295
  	      sprintf (result, "$%g", Fvalue);
  	      break;
  	    case 'L':
! 	      Lvalue = dbit_extract (buffer, *aoffsetp, 64);
  	      flip_bytes (&Lvalue, 8);
  	      *aoffsetp += 64;
  	      sprintf (result, "$%g", Lvalue);

--- 273,279 -----
  		sprintf (result, "$%g", Fvalue);
  	      break;
  	    case 'L':
! 	      bit_extract (buffer, *aoffsetp, 64, (char *) &Lvalue);
  	      flip_bytes (&Lvalue, 8);
  	      *aoffsetp += 64;
  	      if (INVALID_FLOAT (&Lvalue, 8))
***************
*** 292,298
  	      Lvalue = dbit_extract (buffer, *aoffsetp, 64);
  	      flip_bytes (&Lvalue, 8);
  	      *aoffsetp += 64;
! 	      sprintf (result, "$%g", Lvalue);
  	      break;
  	    }
  	  break;

--- 276,286 -----
  	      bit_extract (buffer, *aoffsetp, 64, (char *) &Lvalue);
  	      flip_bytes (&Lvalue, 8);
  	      *aoffsetp += 64;
! 	      if (INVALID_FLOAT (&Lvalue, 8))
! 		sprintf (result, "<>",
! 			 *(((int *) &Lvalue) + 1), *(int *) &Lvalue);
! 	      else
! 		sprintf (result, "$%g", Lvalue);
  	      break;
  	    }
  	  break;
***************
*** 328,334
  	case 0x1d:
  	case 0x1e:
  	case 0x1f:
! 	  index = bit_extract (buffer, *aoffsetp, 8);
  	  *aoffsetp += 8;
  	  print_insn_arg (d, *aoffsetp, aoffsetp, buffer, addr,
  			  result);

--- 316,323 -----
  	case 0x1d:
  	case 0x1e:
  	case 0x1f:
! 	  bit_extract (buffer, *aoffsetp, 8, (char *) &index);
! 	  index &= ((1 << 8) - 1);
  	  *aoffsetp += 8;
  	  print_insn_arg (d, *aoffsetp, aoffsetp, buffer, addr,
  			  result);
***************
*** 344,350
  	}
        break;
      case 'q':
!       Ivalue = bit_extract (buffer, ioffset-4, 4);
        Ivalue = sign_extend (Ivalue, 4);
        sprintf (result, "%d", Ivalue);
        ioffset -= 4;

--- 333,340 -----
  	}
        break;
      case 'q':
!       bit_extract (buffer, ioffset-4, 4, (char *) &Ivalue);
!       Ivalue &= ((1 << 4) - 1);
        Ivalue = sign_extend (Ivalue, 4);
        sprintf (result, "%d", Ivalue);
        ioffset -= 4;
***************
*** 350,356
        ioffset -= 4;
        break;
      case 'r':
!       Ivalue = bit_extract (buffer, ioffset-3, 3);
        sprintf (result, "r%d", Ivalue&7);
        ioffset -= 3;
        break;

--- 340,347 -----
        ioffset -= 4;
        break;
      case 'r':
!       bit_extract (buffer, ioffset-3, 3, (char *) &Ivalue);
!       Ivalue &= ((1 << 3) - 1);
        sprintf (result, "r%d", Ivalue&7);
        ioffset -= 3;
        break;
***************
*** 363,369
  	       NEXT_IS_ADDR);
        break;
      case 'i':
!       Ivalue = bit_extract (buffer, *aoffsetp, 8);
        *aoffsetp += 8;
        sprintf (result, "0x%x", Ivalue);
        break;

--- 354,361 -----
  	       NEXT_IS_ADDR);
        break;
      case 'i':
!       bit_extract (buffer, *aoffsetp, 8, (char *) &Ivalue);
!       Ivalue &= ((1 << 8) - 1);
        *aoffsetp += 8;
        sprintf (result, "0x%x", Ivalue);
        break;
***************
*** 377,383
  {
    int Ivalue;
  
!   Ivalue = bit_extract (buffer, *aoffsetp, 8);
    switch (Ivalue & 0xc0)
      {
      case 0x00:

--- 369,376 -----
  {
    int Ivalue;
  
!   bit_extract (buffer, *aoffsetp, 8, (char *) &Ivalue);
!   Ivalue &= ((1 << 8) - 1);
    switch (Ivalue & 0xc0)
      {
      case 0x00:
***************
*** 386,392
        *aoffsetp += 8;
        break;
      case 0x80:
!       Ivalue = bit_extract (buffer, *aoffsetp, 16);
        flip_bytes (&Ivalue, 2);
        Ivalue = sign_extend (Ivalue, 14);
        *aoffsetp += 16;

--- 379,386 -----
        *aoffsetp += 8;
        break;
      case 0x80:
!       bit_extract (buffer, *aoffsetp, 16, (char *) &Ivalue);
!       Ivalue &= ((1 << 16) - 1);
        flip_bytes (&Ivalue, 2);
        Ivalue = sign_extend (Ivalue, 14);
        *aoffsetp += 16;
***************
*** 392,398
        *aoffsetp += 16;
        break;
      case 0xc0:
!       Ivalue = bit_extract (buffer, *aoffsetp, 32);
        flip_bytes (&Ivalue, 4);
        Ivalue = sign_extend (Ivalue, 30);
        *aoffsetp += 32;

--- 386,392 -----
        *aoffsetp += 16;
        break;
      case 0xc0:
!       bit_extract (buffer, *aoffsetp, 32, (char *) &Ivalue);
        flip_bytes (&Ivalue, 4);
        Ivalue = sign_extend (Ivalue, 30);
        *aoffsetp += 32;
***************
*** 437,443
  ns32k_get_enter_addr (pc)
       CORE_ADDR pc;
  {
!   CORE_ADDR enter_addr;
    unsigned char op;
  
    if (ABOUT_TO_RETURN (pc))

--- 431,437 -----
  ns32k_get_enter_addr (pc)
       CORE_ADDR pc;
  {
!   CORE_ADDR enter_addr, get_pc_function_start();
    unsigned char op;
  
    if (ABOUT_TO_RETURN (pc))
***************
*** 454,457
      return 0;		/* function has no enter/exit */
  
    return enter_addr;	/* pc is between enter and exit */
  }

--- 448,472 -----
      return 0;		/* function has no enter/exit */
  
    return enter_addr;	/* pc is between enter and exit */
+ }
+ 
+ int invalid_float(p, len)
+      register union { double d;
+ 	     float f;
+ 	     struct { unsigned m:23, e:8, :1} sf;
+ 	     struct { unsigned lm; unsigned m:20, e:11, :1} sd;
+ 	   } *p;
+      register int len;
+ {
+   register val;
+ 
+   if ( len == sizeof (float) )
+     val = (p->sf.e == 0xff
+ 	   || (p->sf.e == 0 && p->sf.m != 0));
+   else if ( len == sizeof (double) )
+     val = (p->sd.e == 0x7ff
+ 	   || (p->sd.e == 0 && (p->sd.m != 0 || p->sd.lm != 0)));
+   else
+     val = 1;
+   return (val);
  }
*** ../gdb.dist/printcmd.c	Sat Jul 23 13:43:34 1988
--- printcmd.c	Thu Nov 17 00:51:18 1988
***************
*** 18,23
  anyone else from sharing it farther.  Help stamp out software hoarding!
  */
  
  #include 
  #include "defs.h"
  #include "initialize.h"

--- 18,24 -----
  anyone else from sharing it farther.  Help stamp out software hoarding!
  */
  
+ #include "config.h"
  #include 
  #include "defs.h"
  #include "initialize.h"
***************
*** 64,70
  
  void do_displays ();
  void print_address ();
! void print_scalar_formatted ();
  
  START_FILE
  

--- 65,71 -----
  
  void do_displays ();
  void print_address ();
! void print_scalar_formatted (), get_selected_block(), dont_repeat();
  
  START_FILE
  
***************
*** 171,176
       int size;
       FILE *stream;
  {
    long val_long;
    int len = TYPE_LENGTH (type);
  

--- 172,178 -----
       int size;
       FILE *stream;
  {
+   extern void print_invalid_float();
    long val_long;
    int len = TYPE_LENGTH (type);
  
***************
*** 236,241
  	type = builtin_type_float;
        if (len == sizeof (double))
  	type = builtin_type_double;
  #ifdef IEEE_FLOAT
        if (is_nan (unpack_double (type, valaddr)))
  	{

--- 238,252 -----
  	type = builtin_type_float;
        if (len == sizeof (double))
  	type = builtin_type_double;
+ 
+       /* Test for invalid float here because "unpack_double" can't handle
+ 	 invalid floats very elegantly */
+       if (INVALID_FLOAT(valaddr, len))
+ 	{
+ 	  print_invalid_float(stdout, valaddr, len);
+ 	  break;
+ 	}
+ 
  #ifdef IEEE_FLOAT
        if (is_nan (unpack_double (type, valaddr)))
  	{
*** ../gdb.dist/remote.c	Fri Apr  8 11:06:11 1988
--- remote.c	Wed Nov  9 02:02:21 1988
***************
*** 62,67
  	kill req	k
  */
  
  #include 
  #include 
  

--- 62,68 -----
  	kill req	k
  */
  
+ #include "config.h"
  #include 
  #include 
  
***************
*** 74,79
  #include "wait.h"
  #include 
  #include 
  #include 
  
  #ifdef HAVE_TERMIO

--- 75,83 -----
  #include "wait.h"
  #include 
  #include 
+ #ifdef NS5
+ #include 
+ #include 
  #include 
  #endif
  
***************
*** 75,80
  #include 
  #include 
  #include 
  
  #ifdef HAVE_TERMIO
  #include 

--- 79,85 -----
  #include 
  #include 
  #include 
+ #endif
  
  #ifdef HAVE_TERMIO
  #include 
@//E*O*F patch#3//
chmod u=rw,g=r,o=r patch#3
 
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
    836   2379  18153 patch#3
!!!
wc  patch#3 | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0