[comp.sys.ibm.pc.rt] Fix for dbx, part 2 of 5, IBM/4.3

brunner@bullhead.uucp (10/21/89)

Subject: Fix for dbx (part 2)
Index: /usr/src/ucb/dbx IBM/4.3

Description:
	Several problems (too numerous to mention) exist
	with the December release of dbx. This is part 1 
	of a 5 part patch installation kit. The contents
	of the kit are:

part 1	shar file containing help.c
part 2	patchs to the following files:
	dbx/ibmrt/{coredump.c,decode.c,frame.c,procinfo.c}
part 3	patchs to the following files:
	dbx/{object.c,eval.c,commands.y,c.c,tree.c}
part 4	patchs to the following files:
	dbx/{runtime.c,symbols.c,execute.c,events.c,mappings.c}
part 5	patches to the following files:
	dbx/{stabstring.c,printsym.c,operators.c,process.c,
	     keywords.c,pascal.c,fortran.c,main.c,Makefile,
	     examine.c,scanner.c,source.c,library.c}


Fix:	Change directories to /usr/src/ucb/dbx/ibmrt and
	apply this patch file, e.g.,

		patch < this_file

	Proceede to the next part of the kit.

	Inconsistencies between the several compilers (hc,
	pp, f77) and the loader exist, stabs in particular.
	These will be corrected in a following patch to dbx,
	or in corrective releases of the compilers, or both.

*** /usr/src/ucb/dbx/ibmrt/coredump.c	Fri Dec  9 11:56:20 1988
--- coredump.c	Thu Oct 12 14:27:38 1989
***************
*** 1,9 ****
! /* $Header:coredump.c 12.0$ */
! /* $ACIS:coredump.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/ibmrt/RCS/coredump.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:coredump.c 12.0$";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,8 ----
! /* $Header: coredump.c,v 12.1 89/10/12 17:27:35 brunner Locked $ */
! /* $Source: /fish/dbx/ibmrt/RCS/coredump.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: coredump.c,v 12.1 89/10/12 17:27:35 brunner Locked $";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 26,32 ****
  #include <machine/reg.h>
  #include <machine/vmparam.h>
  #include <a.out.h>
! 
  #ifndef public
  
  #include "machine.h"
--- 25,31 ----
  #include <machine/reg.h>
  #include <machine/vmparam.h>
  #include <a.out.h>
! #include <sys/stat.h>
  #ifndef public
  
  #include "machine.h"
***************
*** 124,134 ****
      register struct user *up;
      char uarea[ctob(UPAGES)];
  
      objfile = fopen(objname, "r");
      if (objfile == nil) {
  	fatal("can't read \"%s\"", objname);
      }
!     get(objfile, hdr);
      if (vaddrs) {
  	datamap.begin = 0;
  	datamap.end = 0xffffffff;
--- 123,152 ----
      register struct user *up;
      char uarea[ctob(UPAGES)];
  
+ 	struct stat c_stat, o_stat;
+ 
+ 	/* stat core & object, if older core, error */
+ 
+ 	stat(objname,&o_stat);
+ 	stat(corefile,&c_stat);
+ 	if ( o_stat.st_mtime > c_stat.st_mtime ){
+ 		badcore = true;
+ 		coredump_close();
+ 		return;
+ 	}
+ 
+ 
      objfile = fopen(objname, "r");
      if (objfile == nil) {
  	fatal("can't read \"%s\"", objname);
      }
! 
!     if ( !get(objfile, hdr) ){
! 	badcore = true;
! 	coredump_close();
! 	return;
!     }
! 
      if (vaddrs) {
  	datamap.begin = 0;
  	datamap.end = 0xffffffff;
***************
*** 137,142 ****
--- 155,166 ----
      } else {
  	fread(uarea, ctob(UPAGES), 1, corefile);
  	up = (struct user *) (&uarea[(int)uoffset]);
+ 	if(strncmp(up->u_comm,objname,strlen(objname))){
+ 		badcore = true;
+ 		coredump_close();
+ 		return;
+ 	}
+ 
  /* u_exdata is not part of 4.3 uarea
  	if (up->u_exdata.ux_tsize != hdr.a_text ||
  	    up->u_exdata.ux_dsize != hdr.a_data ||
***************
*** 153,166 ****
  	stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
  	switch (hdr.a_magic) {
  	    case OMAGIC:
! 		datamap.begin = CODESTART;
  		datamap.end = CODESTART + ctob(up->u_tsize) + ctob(up->u_dsize);
  		break;
  
  	    case NMAGIC:
  	    case ZMAGIC:
! 		datamap.begin = (Address)
! 		    ptob(btop(ctob(up->u_tsize) - 1) + 1) + CODESTART;
  		datamap.end = datamap.begin + ctob(up->u_dsize);
  		break;
  
--- 177,191 ----
  	stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
  	switch (hdr.a_magic) {
  	    case OMAGIC:
! 		datamap.begin = CODESTART ; /* this may be wrong too??? */
  		datamap.end = CODESTART + ctob(up->u_tsize) + ctob(up->u_dsize);
  		break;
  
  	    case NMAGIC:
  	    case ZMAGIC:
! 		datamap.begin = (Address) 0x10000000;
! /*		    ptob(btop(ctob(up->u_tsize) - 1) + 1) + CODESTART;*/
! 		  /* the data segment on the RT starts at 0x10000000 */
  		datamap.end = datamap.begin + ctob(up->u_dsize);
  		break;
  
***************
*** 172,178 ****
  
  public coredump_close ()
  {
!     fclose(objfile);
  }
  
  public coredump_readtext (buff, addr, nbytes)
--- 197,205 ----
  
  public coredump_close ()
  {
!     coredump = false;
!     if ( corefile ) fclose(corefile);
!     if ( objfile ) fclose(objfile);
  }
  
  public coredump_readtext (buff, addr, nbytes)
***************
*** 331,336 ****
--- 358,364 ----
  integer nbytes;
  {
      integer fileaddr;
+ 
  
      if (a < stkmap.begin) {
  	fileaddr = datamap.seekaddr + a - datamap.begin;
*** /usr/src/ucb/dbx/ibmrt/decode.c	Fri Dec  9 11:56:22 1988
--- decode.c	Thu Oct 12 14:27:42 1989
***************
*** 1,9 ****
! /* $Header:decode.c 12.0$ */
! /* $ACIS:decode.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/ibmrt/RCS/decode.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:decode.c 12.0$";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,8 ----
! /* $Header: decode.c,v 12.1 89/10/12 17:27:38 brunner Locked $ */
! /* $Source: /fish/dbx/ibmrt/RCS/decode.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: decode.c,v 12.1 89/10/12 17:27:38 brunner Locked $";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 106,112 ****
      info = ltab[ ifmt = tp->fmt];
      newaddr = addr + info;	/* add length of instruction to address */
  
!     printf("%08x  ",addr);
      cp = tp->opc;
      bp = buf+1;
      while( *buf++ = *cp++);
--- 105,114 ----
      info = ltab[ ifmt = tp->fmt];
      newaddr = addr + info;	/* add length of instruction to address */
  
!     /* Print the instruction address */
!     addrprint(stdout, addr, true);
! 
! /*    printf("%08x  ",addr);*/
      cp = tp->opc;
      bp = buf+1;
      while( *buf++ = *cp++);
***************
*** 385,390 ****
--- 387,401 ----
      return addr;
  }
  
+ private boolean skipfunc (f)
+ Symbol f;
+ {
+     boolean b;
+ 
+     b = (boolean) (!inst_tracing && nlhdr.nlines && f && nosource(f));
+     return b;
+ }
+ 
  public Address nextaddr (startaddr, isnext)
  Address startaddr;
  Boolean isnext;
***************
*** 394,399 ****
--- 405,411 ----
      YOpCode inst;
      int info;
      int opcode, extend;
+     Symbol s;
  
      addr = usignal(process);
      if (addr != 0 && addr != 1) {
***************
*** 422,427 ****
--- 434,448 ----
  		    }
  		} else {
  		    addr = dojump(startaddr, info, true);
+ 		    s = whatblock(addr);
+ 
+ 		    if (skipfunc(s)) 
+ 		    {
+ 		       /* get the return address and continue to it */
+ 		       addr = reg(15);
+ 		       contto(addr);
+ 		       bpact();
+ 		    }
  		}
  		break;
  	    case 0xe:		/* extended branch - calls? */
***************
*** 435,440 ****
--- 456,470 ----
  		    }
  		} else {
  		    addr = dojump(startaddr, info, true);
+ 		    s = whatblock(addr);
+ 
+ 		    if (skipfunc(s)) 
+ 		    {
+ 		       /* get the return address and continue to it */
+ 		       addr = reg(15);
+ 		       contto(addr);
+ 		       bpact();
+ 		    }
  		}
  		break;
  	    /*
***************
*** 454,491 ****
  
  #define CALLSIZE 4	/* size of call instruction */
  
! public beginproc (p, argc)
! Symbol p;
! int argc;
  {
!     Word dest;
!     Word save, callinst;
!     Address addr;
!     Name n;
!     Symbol data;
!     char buf[100];
  
!     sprintf(buf, ".%s", symname(p));
!     n = identname(buf, false);
!     data = lookup(n);
!     if (data == nil || data->class != VAR) {
! 	error("no data area for %s\n", symname(p));
!     }
!     addr = 4;
!     iread(&save, addr, CALLSIZE);
!     pc = 6;
!     dest = codeloc(p);
!     callinst = 0xdb00ecff;
!     iwrite(&callinst, addr, CALLSIZE);
!     setreg(15, dest);
!     setreg(PROGCTR, pc);
!     setreg(0, data->symvalue.offset);
!     pstep(process, DEFSIG);
!     iwrite(&save, addr, CALLSIZE);
!     pc = reg(PROGCTR);
!     if (not isbperr()) {
! 	printstatus();
!     }
  }
  
  /*
--- 484,506 ----
  
  #define CALLSIZE 4	/* size of call instruction */
  
! public beginproc (p)
!      Symbol p;
  {
! 	if ( !dataloc(p) )
!  		error("no data area for %s\n", symname(p));
!     
! 	/* alter PC, set r0 to dataloc, set r15 to current PC for return addr */
  
! 	pc = reg(PROGCTR);
! 	setreg(PROGCTR,codeloc(p));
! 	setreg(0,dataloc(p));
! 	setreg(15,pc);
! 	pc = codeloc(p);
! 
!      if ( !isbperr() ) {
!        printstatus();
!      }
  }
  
  /*
***************
*** 539,541 ****
--- 554,597 ----
      }
      sp += n;
  }
+ 
+ /* 
+  *  Print out the address of an instruction or a destination.  Nicely.
+  */
+ 
+ public addrprint(f, addr, pad)
+ File f;
+ Address addr;
+ Boolean pad;
+ {
+     static Address funcaddr = 0;
+     static Symbol lastfunc = nil;
+     static char *funcname = nil;
+     Symbol newfunc;
+     int offset, l;
+ 
+     if((newfunc = whatblock(addr)) && symname(newfunc)) {
+ 	/* Find the containing function */
+ 	fprintf(f, "%08x ",addr);
+ /*	newfunc = whatblock(addr);*/
+ 	if (newfunc != lastfunc) {
+ 	    funcaddr = codeloc(newfunc);
+ 	    funcname = symname(newfunc);
+ 	    lastfunc = newfunc;
+ 	}
+ 	offset = addr - funcaddr;
+ 
+ 	if (offset)
+ 	    l = fprintf(f,"(%s+0x%x) ",funcname, offset);
+ 	else
+ 	    l = fprintf(f,"(%s) ",funcname);
+         if ( pad )
+ 	  while ( l++ < 16 )
+ 	    fputc(' ',f);
+     } 
+     else {
+ 	fprintf(f,"%08x ",addr);
+     }
+ }
+ 
+ 
*** /usr/src/ucb/dbx/ibmrt/frame.c	Fri Dec  9 11:56:25 1988
--- frame.c	Thu Oct 12 14:27:47 1989
***************
*** 1,9 ****
! /* $Header:frame.c 12.0$ */
! /* $ACIS:frame.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/ibmrt/RCS/frame.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:frame.c 12.0$";
  #endif
  
  
--- 1,8 ----
! /* $Header: frame.c,v 12.1 89/10/12 17:27:43 brunner Locked $ */
! /* $Source: /fish/dbx/ibmrt/RCS/frame.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: frame.c,v 12.1 89/10/12 17:27:43 brunner Locked $";
  #endif
  
  
***************
*** 173,178 ****
--- 172,179 ----
      register Address a;
      char buf[4];
  
+     addr = tracetable_addr(addr);
+ 
      for (a = addr; ; a++) {
  	if (!ValidText(a)) {
  	    break;
***************
*** 330,335 ****
--- 331,337 ----
  	    frp->reg[i] = reg(i);
  	}
      }
+ 	else { error("getcurframe: findframe failed for addr 0x%x\n",a); }
  }
  
  /*
***************
*** 355,363 ****
  	return nil;
      }
      if (frp->prolog) {
! 	callpc = frp->reg[15];
      } else {
  	dread(&callpc, frp->ap - LINKSIZE - 4, sizeof(callpc));
      }
      if (inSignalHandler(callpc)) {
  	sc = (struct sigcontext *) (frp->reg[1] + 3*sizeof(Word));
--- 357,366 ----
  	return nil;
      }
      if (frp->prolog) {
! 	callpc = frp->reg[15]-4;
      } else {
  	dread(&callpc, frp->ap - LINKSIZE - 4, sizeof(callpc));
+ 	callpc -= 4;
      }
      if (inSignalHandler(callpc)) {
  	sc = (struct sigcontext *) (frp->reg[1] + 3*sizeof(Word));
***************
*** 696,757 ****
   * Push the value associated with the current function.
   */
  
! public pushretval (len, isindirect)
! integer len;
! boolean isindirect;
  {
!     Word r0;
  
!     r0 = reg(2);
!     if (isindirect) {
! 	rpush((Address) r0, len);
!     } else {
! 	switch (len) {
! 	    case sizeof(char):
! 		push(char, r0);
! 		break;
  
! 	    case sizeof(short):
! 		push(short, r0);
! 		break;
  
! 	    default:
! 		if (len == sizeof(Word)) {
! 		    push(Word, r0);
! 		} else if (len == 2*sizeof(Word)) {
! 		    push(Word, r0);
! 		    push(Word, reg(3));
! 		} else {
! 		    error("[internal error: bad size %d in pushretval]", len);
! 		}
! 		break;
! 	}
      }
! }
  
! /*
!  * Flush the debuggee's standard output.
!  *
!  * This is VERY dependent on the use of stdio.
!  */
  
! public flushoutput ()
! {
!     Symbol p, iob;
! 
!     p = lookup(identname("fflush", true));
!     while (p != nil and not isblock(p)) {
! 	p = p->next_sym;
!     }
!     if (p != nil) {
! 	iob = lookup(identname("_iob", true));
! 	if (iob != nil) {
! 	    pushenv();
! 	    pc = codeloc(p) - FUNCOFFSET;
! 	    setreg(2, address(iob, nil) + sizeof(*stdout));
! 	    beginproc(p, 1);
! 	    stepto(return_addr());
! 	    popenv();
  	}
      }
  }
--- 699,763 ----
   * Push the value associated with the current function.
   */
  
! #define isdouble(t) ( t->class == RANGE && \
!     (t->symvalue.rangev.upper == 0 && t->symvalue.rangev.lower == 8) )
! 
! #define isfloat(t) ( t->class == RANGE && \
!     (t->symvalue.rangev.upper == 0 && t->symvalue.rangev.lower == 4) )
! 
! public pushretval (s)
!      Symbol s;
  {
!     int len;
!     boolean indirect;
!     Symbol t;
!     Word reg2;
!     union {
! 	double	d;
! 	float f;
! 	long	l[2];
!     }	u;
  
!     len = size(s);
!     t = rtype(s);
!     indirect = (t->class == RECORD || t->class == VARNT );
  
!     reg2 = reg(2);	/* funky RT function return in r2 */
  
!     if ( indirect ){
! 	rpush((Address) reg2, len);
!     } 
!     else if ( isfloat(t) ){ /* in case they use float regs someday.. */
!        u.l[0] = reg2;
!        push(float, u.f);
      }
!     else if ( isdouble(t) ){
!        u.l[0] = reg2;
!        u.l[1] = reg(3);
!        push(double, u.d )
!     }
!     else {
! 	switch ( len ){
! 	 case sizeof(char):
! 	   push(char, reg2);
! 	   break;
  
! 	 case sizeof(short):
! 	   push(short, reg2);
! 	   break;
  
! 	 default:
! 	   if ( len == sizeof(Word) ){
! 	      push(Word, reg2);
! 	   } 
! 	   else if ( len == 2*sizeof(Word) ){
! 	      push(Word, reg2);
! 	      push(Word, reg(3));
! 	   } 
! 	   else {
! 	      error("[internal error: bad size %d in pushretval]", len);
! 	   }
! 	   break;
  	}
      }
  }
*** /usr/src/ucb/dbx/ibmrt/procinfo.c	Fri Dec  9 11:56:28 1988
--- procinfo.c	Thu Oct 12 14:30:51 1989
***************
*** 1,9 ****
! /* $Header:procinfo.c 12.0$ */
! /* $ACIS:procinfo.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/ibmrt/RCS/procinfo.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:procinfo.c 12.0$";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,8 ----
! /* $Header: procinfo.c,v 12.1 89/10/12 17:30:50 brunner Locked $ */
! /* $Source: /fish/dbx/ibmrt/RCS/procinfo.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: procinfo.c,v 12.1 89/10/12 17:30:50 brunner Locked $";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 104,110 ****
      }
      for (i = 0; i < NFLREG; i++) {
  	sprintf(buf, "$fr%d", i);
! 	defregname(identname(buf, false), i + NREG);
      }
      defregname(identname("$ap", true), ARGP);
      defregname(identname("$fp", true), FRP);
--- 103,110 ----
      }
      for (i = 0; i < NFLREG; i++) {
  	sprintf(buf, "$fr%d", i);
! /*	defregname(identname(buf, false), i + NREG);*/
! 	deffregname(identname(buf, false), i + NREG,8);
      }
      defregname(identname("$ap", true), ARGP);
      defregname(identname("$fp", true), FRP);

Eric Brunner, IBM AWD Palo Alto
inet: brunner@monet.berkeley.edu or brunner%ibmsupt@uunet.uu.net
uucp: uunet!ibmsupt!brunner		(415) 855-4486