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

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

Subject: Fix for dbx (part 3)
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 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/object.c	Fri Dec  9 11:57:21 1988
--- object.c	Thu Oct 12 14:37:18 1989
***************
*** 1,9 ****
! /* $Header:object.c 12.0$ */
! /* $ACIS:object.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/RCS/object.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:object.c 12.0$";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,8 ----
! /* $Header: object.c,v 12.1 89/10/12 17:37:17 brunner Locked $ */
! /* $Source: /fish/dbx/RCS/object.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: object.c,v 12.1 89/10/12 17:37:17 brunner Locked $";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 100,109 ****
      }
      blkstack[curlevel] = curblock;
      ++curlevel;
-     curblock = b;
      if (traceblocks) {
! 	printf("entering block %s\n", symname(b));
      }
  }
  
  /*
--- 99,109 ----
      }
      blkstack[curlevel] = curblock;
      ++curlevel;
      if (traceblocks) {
! 	printf("current = %s entering block %s\n",
! 		symname(curblock), symname(b));
      }
+     curblock = b;
  }
  
  /*
***************
*** 139,145 ****
      }
      --curlevel;
      if (traceblocks) {
! 	printf("exiting block %s\n", symname(curblock));
      }
      curblock = blkstack[curlevel];
  }
--- 139,146 ----
      }
      --curlevel;
      if (traceblocks) {
! 	printf("exiting block %s to block %s\n", 
! 		symname(curblock),symname(blkstack[curlevel]));
      }
      curblock = blkstack[curlevel];
  }
***************
*** 249,260 ****
  
  private foundglobals ()
  {
!     if (curblock->class != PROG) {
  	exitblock();
! 	if (curblock->class != PROG) {
! 	    exitblock();
! 	}
!     }
      enterline(0, (linep-1)->addr + 1);
  }
  
--- 250,258 ----
  
  private foundglobals ()
  {
!     while ( curblock->class != PROG )
  	exitblock();
! 
      enterline(0, (linep-1)->addr + 1);
  }
  
***************
*** 262,272 ****
   * Read in symbols from object file.
   */
  
  /* Has to be larger than maximum string table entry */
  #define STRBUFSIZ	(BUFSIZ * 4)
  private char strbuf[STRBUFSIZ];
  
! private readsyms (f, fstr)
  Fileid f, fstr;
  {
      register File fp;
--- 260,284 ----
   * Read in symbols from object file.
   */
  
+ pr_np(name,np)
+ 	char *name;
+ 	struct nlist *np;
+ {
+ 	    printf("entry: ");
+ 	    if (name != nil) {
+ 		printf("name %s,", name);
+ 	    }
+ 		else printf("<unnamed>");
+ 
+ 	    printf("ntype %2x, desc %x, value %x'\n",
+ 		np->n_type, np->n_desc, np->n_value);
+ }
+ 
  /* Has to be larger than maximum string table entry */
  #define STRBUFSIZ	(BUFSIZ * 4)
  private char strbuf[STRBUFSIZ];
  
! /*private*/ readsyms (f, fstr)
  Fileid f, fstr;
  {
      register File fp;
***************
*** 281,290 ****
--- 293,304 ----
      foundstab = false;
      np = &nl;
      symcounter = nlhdr.nsyms;
+ 
      if((symtabfp = fp = fdopen(f, "r")) == 0)
  	panic("fdopen1");
      if((fpstr = fdopen(fstr, "r")) == 0)
  	panic("fdopen2");
+ 
      while (symcounter--) {
  	fread(np, sizeof(*np), 1, fp);
  	i = np->n_un.n_strx;
***************
*** 306,311 ****
--- 320,328 ----
  	    name = nil;
  	} 
  
+ 	if ( tracesyms )
+ 		pr_np(name,np);
+ 
  	/*
  	 * Assumptions:
  	 *	not an N_STAB	==> name != nil
***************
*** 328,334 ****
  		    if (curcomm) {
  			curcomm->symvalue.common.chain = commchain;
  		    }
! 		    n = identname(name, true);
  		    curcomm = lookup(n);
  		    if (curcomm == nil) {
  			curcomm = insert(n);
--- 345,351 ----
  		    if (curcomm) {
  			curcomm->symvalue.common.chain = commchain;
  		    }
! 		    n = identname(name, false);
  		    curcomm = lookup(n);
  		    if (curcomm == nil) {
  			curcomm = insert(n);
***************
*** 374,380 ****
  		 * Source files.
  		 */
  		case N_SO:
! 		    n = identname(name, true);
  		    enterSourceModule(n, (Address) np->n_value);
  		    break;
  
--- 391,397 ----
  		 * Source files.
  		 */
  		case N_SO:
! 		    n = identname(name, false);
  		    enterSourceModule(n, (Address) np->n_value);
  		    break;
  
***************
*** 382,388 ****
  		 * Textually included files.
  		 */
  		case N_SOL:
! 		    enterfile(name, (Address) np->n_value);
  		    break;
  
  		/*
--- 399,406 ----
  		 * Textually included files.
  		 */
  		case N_SOL:
! 		    n = identname(name,false);
! 		    enterfile(ident(n), (Address) np->n_value);
  		    break;
  
  		/*
***************
*** 420,430 ****
  
  		default:
  		    printf("warning:  stab entry unrecognized: ");
! 		    if (name != nil) {
! 			printf("name %s,", name);
! 		    }
! 		    printf("ntype %2x, desc %x, value %x'\n",
! 			np->n_type, np->n_desc, np->n_value);
  		    break;
  	    }
  	} else if (afterlg) {
--- 438,444 ----
  
  		default:
  		    printf("warning:  stab entry unrecognized: ");
! 		    pr_np(name,np);
  		    break;
  	    }
  	} else if (afterlg) {
***************
*** 443,452 ****
--- 457,473 ----
  	} else if (name[0] == '_') {
  	    check_local(&name[1], np);
  	}
+ 	else if((np->n_type&N_BSS)==N_BSS)
+ 	{
+ 	}
+ 	else
+ 	    printf("readsym: ignored symbol: %s\n",name); 
      }
+ 
      if (!foundstab) {
  	warning("no source compiled with -g");
      }
+ 
      fclose(fp);
      fclose(fpstr);
  }
***************
*** 478,495 ****
  
  private initsyms ()
  {
-     curblock = nil;
      curlevel = 0;
      nesting = 0;
!     program = insert(identname("", true));
      program->class = PROG;
      program->language = primlang;
!     program->symvalue.funcv.beginaddr = CODESTART;
      program->symvalue.funcv.inline = false;
      newfunc(program, codeloc(program));
!     findbeginning(program);
!     enterblock(program);
      curmodule = program;
  }
  
  /*
--- 499,515 ----
  
  private initsyms ()
  {
      curlevel = 0;
      nesting = 0;
!     program = insert(identname("", false));
      program->class = PROG;
      program->language = primlang;
!     codeloc(program) = CODESTART;
      program->symvalue.funcv.inline = false;
      newfunc(program, codeloc(program));
!     curblock = program;
      curmodule = program;
+     enterblock(program);
  }
  
  /*
***************
*** 520,526 ****
      *var_isextref = false;
      find(s, n) where
  	(
! 	    s->level == program->level and (
  		s->class == EXTREF or s->class == VAR or
  		s->class == PROC or s->class == FUNC
  	    )
--- 540,546 ----
      *var_isextref = false;
      find(s, n) where
  	(
! 	    /*s->level == program->level and */(
  		s->class == EXTREF or s->class == VAR or
  		s->class == PROC or s->class == FUNC
  	    )
***************
*** 550,556 ****
  	r->class = FUNC;
  	r->symvalue.funcv.src = false;
  	r->symvalue.funcv.inline = false;
! 	fdata(r->name, r->symvalue.offset);
      }
      return r;
  }
--- 570,576 ----
  	r->class = FUNC;
  	r->symvalue.funcv.src = false;
  	r->symvalue.funcv.inline = false;
! 	dataloc(r) = r->symvalue.offset;
      }
      return r;
  }
***************
*** 612,625 ****
  char *name;
  Address addr;
  {
      if (s->class == VAR) {
  	s->symvalue.offset = addr;
      } else {
! 	s->symvalue.funcv.beginaddr = addr;
! 	if (name[0] == '_') {
  	    newfunc(s, codeloc(s));
  	    findbeginning(s);
  	}
      }
  }
  
--- 632,651 ----
  char *name;
  Address addr;
  {
+ 
      if (s->class == VAR) {
  	s->symvalue.offset = addr;
      } else {
! 	if (name[0] == '_' && name[1] == '.') {
! 	    codeloc(s) = addr;
  	    newfunc(s, codeloc(s));
  	    findbeginning(s);
  	}
+ 	/*****
+ 	else { /* assume dataloc 
+ 		dataloc(s) = addr;
+ 	}
+ 	*****/
      }
  }
  
***************
*** 666,678 ****
  	isfunc = false;
  	if (name[0] == '_') {
  	    if (name[1] == '.') {
! 		n = identname(&name[2], true);
  		isfunc = true;
  	    } else {
! 		n = identname(&name[1], true);
  	    }
  	} else {
! 	    n = identname(name, true);
  	    if (lookup(n) != nil) {
  		sprintf(buf, "$%s", name);
  		n = identname(buf, false);
--- 692,704 ----
  	isfunc = false;
  	if (name[0] == '_') {
  	    if (name[1] == '.') {
! 		n = identname(&name[2], false);
  		isfunc = true;
  	    } else {
! 		n = identname(&name[1], false);
  	    }
  	} else {
! 	    n = identname(name, false);
  	    if (lookup(n) != nil) {
  		sprintf(buf, "$%s", name);
  		n = identname(buf, false);
***************
*** 703,709 ****
  		    if (tracesyms) {
  			printdecl(t);
  		    }
! 		} else if (t->class == FUNC) {
  		    if (isfunc) {
  			updateTextSym(t, name, np->n_value);
  		    }
--- 729,735 ----
  		    if (tracesyms) {
  			printdecl(t);
  		    }
! 		} else if (t->class == FUNC || t->class == PROC) {
  		    if (isfunc) {
  			updateTextSym(t, name, np->n_value);
  		    }
***************
*** 776,782 ****
  			    return;
  			case PROC:
  			case FUNC:
! 			    fdata(n, np->n_value);
  			    return;
  			default:
  			    warning("global %s ignored", ident(n));
--- 802,808 ----
  			    return;
  			case PROC:
  			case FUNC:
! 			    dataloc(t) = np->n_value;
  			    return;
  			default:
  			    warning("global %s ignored", ident(n));
***************
*** 794,818 ****
  }
  
  /*
-  * Handle a data symbol with the same name as a known function.
-  * These contain the address of function data areas.
-  */
- 
- private fdata (n, addr)
- Name n;
- Address addr;
- {
-     char *str, *newstr;
-     Symbol v;
- 
-     str = ident(n);
-     newstr = mymalloc(strlen(str) + 2);
-     sprintf(newstr, ".%s", str);
-     v = defvar(identname(newstr, true), program, program->level);
-     v->symvalue.offset = addr;
- }
- 
- /*
   * Check to see if a local _name is known in the current scope.
   * If not then enter it.
   */
--- 820,825 ----
***************
*** 821,846 ****
  String name;
  register struct nlist *np;
  {
!     register Name n;
!     register Symbol s, t;
  
      if (name[0] == '.') {
! 	n = identname(&name[1], true);
      } else {
! 	n = identname(name, true);
      }
      s = lookup(n);
!     if ((np->n_type&N_TYPE) == N_TEXT) {
  	for (t = s; t != nil; t = t->next_sym) {
! 	    if (t->name == n && t->block == curmodule) {
! 		return;
! 	    }
  	}
! 	t = deffunc(n, curmodule, curmodule->level);
! 	t->symvalue.funcv.beginaddr = np->n_value;
! 	newfunc(t, codeloc(t));
! 	findbeginning(t);
!     } else {
  	for (t = s; t != nil; t = t->next_sym) {
  	    if (t->name == n && t->block == curblock) {
  		t->symvalue.offset = np->n_value;
--- 828,874 ----
  String name;
  register struct nlist *np;
  {
!     Name n;
!     Symbol s, t;
!     boolean is_code_addr, defined = false;
  
      if (name[0] == '.') {
! 	n = identname(&name[1], false);
! 	is_code_addr = true;
      } else {
! 	n = identname(name, false);
! 	is_code_addr = false;
      }
      s = lookup(n);
! 
! 	/*
! 	 * On the rt we have symbols that start with "_."
! 	 * these are the only symbols which contain the TEXT address of a 
! 	 * function, the associated stab & plain "_" symbols contain a data
! 	 * address which also contains the text address of the function.
! 	 */
! 
!     if ((np->n_type&N_TYPE) == N_TEXT|| (np->n_type == N_DATA)){
  	for (t = s; t != nil; t = t->next_sym) {
! 	       if (t->name == n && t->block == curmodule) {
! 	            defined = true;
! 		    break;
! 	       }
  	}
! 	if ( !defined )
! 		t = deffunc(n, curmodule, curmodule->level);
! 
! 	t->class = FUNC;
! 	if ( is_code_addr ){
! 		codeloc(t) = np->n_value;
! 		newfunc(t, codeloc(t));
! 		findbeginning(t);
! 	}
! 	else 	dataloc(t) = np->n_value;
!     }
!     else {
! 	/* update address if sym predefined in this block */
! 
  	for (t = s; t != nil; t = t->next_sym) {
  	    if (t->name == n && t->block == curblock) {
  		t->symvalue.offset = np->n_value;
***************
*** 847,855 ****
  		return;
  	    }
  	}
  	for (t = s; t != nil; t = t->next_sym) {
  	    if (t->name == n && t->block == curmodule && t->class == FUNC) {
! 		fdata(n, np->n_value);
  		return;
  	    }
  	}
--- 875,886 ----
  		return;
  	    }
  	}
+ 
+ 	/* set dataloc for func predefined in this module */
+ 
  	for (t = s; t != nil; t = t->next_sym) {
  	    if (t->name == n && t->block == curmodule && t->class == FUNC) {
! 		dataloc(t) = np->n_value;
  		return;
  	    }
  	}
***************
*** 879,885 ****
      while (mname[i] != '/' and i >= 0) {
  	--i;
      }
!     n = identname(&mname[i+1], true);
      find(s, n) where s->block == program and s->class == MODULE endfind(s);
      if (s == nil) {
  	s = insert(n);
--- 910,916 ----
      while (mname[i] != '/' and i >= 0) {
  	--i;
      }
!     n = identname(&mname[i+1], false);
      find(s, n) where s->block == program and s->class == MODULE endfind(s);
      if (s == nil) {
  	s = insert(n);
***************
*** 887,903 ****
  	s->class = MODULE;
  	s->level = program->level;
  	s->symvalue.funcv.beginaddr = 0;
! 	findbeginning(s);
! 	if (tracesyms) {
  	    printdecl(s);
- 	}
      }
!     if (curblock->class != PROG) {
  	exitblock();
- 	if (curblock->class != PROG) {
- 	    exitblock();
- 	}
-     }
      enterblock(s);
      curmodule = s;
  }
--- 918,929 ----
  	s->class = MODULE;
  	s->level = program->level;
  	s->symvalue.funcv.beginaddr = 0;
! 
! 	if (tracesyms) 
  	    printdecl(s);
      }
!     while (curblock->class != PROG)
  	exitblock();
      enterblock(s);
      curmodule = s;
  }
***************
*** 967,984 ****
  	*suffix = '\0';
      }
      if (!(*language_op(curlang, L_HASMODULES))()) {
! 	if (curblock->class != PROG) {
  	    exitblock();
! 	    if (curblock->class != PROG) {
! 		exitblock();
! 	    }
! 	}
! 	nn = identname(mname, true);
  	if (curmodule == nil or curmodule->name != nn) {
  	    s = insert(nn);
  	    s->class = MODULE;
  	    s->symvalue.funcv.beginaddr = 0;
- 	    findbeginning(s);
  	} else {
  	    s = curmodule;
  	}
--- 993,1006 ----
  	*suffix = '\0';
      }
      if (!(*language_op(curlang, L_HASMODULES))()) {
! 	while ( curblock->class != PROG )
  	    exitblock();
! 
! 	nn = identname(mname, false);
  	if (curmodule == nil or curmodule->name != nn) {
  	    s = insert(nn);
  	    s->class = MODULE;
  	    s->symvalue.funcv.beginaddr = 0;
  	} else {
  	    s = curmodule;
  	}
*** /usr/src/ucb/dbx/eval.c	Fri Dec  9 11:56:47 1988
--- eval.c	Thu Oct 12 14:36:58 1989
***************
*** 1,9 ****
! /* $Header:eval.c 12.0$ */
! /* $ACIS:eval.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/RCS/eval.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:eval.c 12.0$";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,8 ----
! /* $Header: eval.c,v 12.1 89/10/12 17:36:56 brunner Locked $ */
! /* $Source: /fish/dbx/RCS/eval.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: eval.c,v 12.1 89/10/12 17:36:56 brunner Locked $";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 31,36 ****
--- 30,36 ----
  #include <math.h>
  #include <ieee.h>
  
+ extern Node findvar();
  #ifndef public
  
  #include "machine.h"
***************
*** 144,155 ****
  	    if (s == retaddrsym) {
  		push(long, return_addr());
  	    } else if (isvariable(s)) {
- 		if (s != program && !isactive(container(s))) {
- 		    error("\"%s\" is not active", symname(s));
- 		}
  		addr = address(s, nil);
  		if (isvarparam(s) && !isopenarray(s)) {
! 		    if (s->storage == INREG || preg(s, nil) != -1) {
  			pushregvalue(s, addr, nil, sizeof(Address));
  		    } else {
  			rpush(addr, sizeof(Address));
--- 144,152 ----
  	    if (s == retaddrsym) {
  		push(long, return_addr());
  	    } else if (isvariable(s)) {
  		addr = address(s, nil);
  		if (isvarparam(s) && !isopenarray(s)) {
! 		    if (s->storage == INREG) {
  			pushregvalue(s, addr, nil, sizeof(Address));
  		    } else {
  			rpush(addr, sizeof(Address));
***************
*** 215,222 ****
  
  	case O_INDIR:
  	case O_RVAL:
- 	    addr = pop(long);
  	    s = p->nodetype;
  	    len = size(s);
  	    if (s->class != REF &&
  		(s->storage == INREG || (s->param && preg(s, nil) != -1))
--- 212,223 ----
  
  	case O_INDIR:
  	case O_RVAL:
  	    s = p->nodetype;
+ 
+ 	    if ( s->language == primlang && s->storage != INREG )
+ 		break;
+ 
+ 	    addr = ( sp > &stack[0] ) ? pop(long) : 0;
  	    len = size(s);
  	    if (s->class != REF &&
  		(s->storage == INREG || (s->param && preg(s, nil) != -1))
***************
*** 369,374 ****
--- 370,379 ----
  	    printnews();
  	    break;
  
+ 	case O_LISTI:
+ 	    listi(p);
+ 	    break;
+ 
  	case O_LIST:
  	    list(p);
  	    break;
***************
*** 422,437 ****
  	    break;
  
  	case O_STEP:
! 	    b = inst_tracing;
! 	    inst_tracing = (Boolean) (!p->value.step.source);
! 	    if (p->value.step.skipcalls) {
! 		next();
! 	    } else {
! 		stepc();
  	    }
- 	    inst_tracing = b;
- 	    useInstLoc = (Boolean) (!p->value.step.source);
- 	    printnews();
  	    break;
  
  	case O_WHATIS:
--- 427,447 ----
  	    break;
  
  	case O_STEP:
! 	    { 
! 	      int i;
! 	      b = inst_tracing;
! 	      inst_tracing = (Boolean) (!p->value.step.source);
! 
! 	      for(i = p->value.step.count; i ; i--)
! 	      {
! 		if (p->value.step.skipcalls) next();
! 		else stepc();
! 	      }
! 
! 	      inst_tracing = b;
! 	      useInstLoc = (Boolean) (!p->value.step.source);
! 	      printnews();
  	    }
  	    break;
  
  	case O_WHATIS:
***************
*** 508,513 ****
--- 518,531 ----
  	    }
  	    break;
  
+ 	case O_CLEAR:
+ 	    clearbps(p);
+ 	    break;
+ 
+ 	case O_CLEARI:
+ 	    clearbps_i(p);
+ 	    break;
+ 
  	case O_EDIT:
  	    edit(p->value.scon);
  	    break;
***************
*** 535,546 ****
  	    }
  	    break;
  
! 	case O_GRIPE:
! 	    gripe();
  	    break;
  
  	case O_HELP:
! 	    help();
  	    break;
  
  	case O_IGNORE:
--- 553,564 ----
  	    }
  	    break;
  
! 	case O_GOTO:
! 	    changepc(p);
  	    break;
  
  	case O_HELP:
! 	    help(p);
  	    break;
  
  	case O_IGNORE:
***************
*** 560,565 ****
--- 578,587 ----
  	    }
  	    break;
  
+ 	case O_REGS:
+ 	    registers();
+ 	    break;
+ 
  	case O_RUN:
  	    run();
  	    break;
***************
*** 620,625 ****
--- 642,651 ----
  	    }
  	    break;
  
+ 	case O_DELALL:
+ 	    deleteall();
+ 	    break;
+ 
  	case O_ENDX:
  	    endprogram();
  	    break;
***************
*** 639,647 ****
  	    break;
  
  	case O_PRINTIFCHANGED:
! 	    printifchanged(p->value.arg[0]);
  	    break;
  
  	case O_PRINTRTN:
  	    printrtn(p->value.sym);
  	    break;
--- 665,677 ----
  	    break;
  
  	case O_PRINTIFCHANGED:
! 	    printifchanged(p->value.arg[0],true);
  	    break;
  
+ 	case O_PRINTIIFCHANGED:
+ 	    printifchanged(p->value.arg[0],false);
+ 	    break;
+ 
  	case O_PRINTRTN:
  	    printrtn(p->value.sym);
  	    break;
***************
*** 654,664 ****
  		printlines(nil, curline, curline);
  	    } else if (p->value.arg[0]->op == O_QLINE) {
  		if (p->value.arg[0]->value.arg[1]->value.lcon == 0) {
- 		    printf("tracei: ");
  		    printinst(pc, pc);
  		} else {
  		    if (canReadSource()) {
- 			printf("trace:  ");
  			printlines(nil, curline, curline);
  		    }
  		}
--- 684,692 ----
***************
*** 678,686 ****
  	    break;
  
  	case O_STOPIFCHANGED:
! 	    stopifchanged(p->value.arg[0]);
  	    break;
  
  	case O_STOPX:
  	    isstopped = true;
  	    break;
--- 706,718 ----
  	    break;
  
  	case O_STOPIFCHANGED:
! 	    stopifchanged(p->value.arg[0],true);
  	    break;
  
+ 	case O_STOPIIFCHANGED:
+ 	    stopifchanged(p->value.arg[0],false);
+ 	    break;
+ 
  	case O_STOPX:
  	    isstopped = true;
  	    break;
***************
*** 1095,1101 ****
   * Set up breakpoint for tracing data.
   */
  
! private tracedata (op, exp, place, cond)
  Operator op;
  Node exp;
  Node place;
--- 1127,1133 ----
   * Set up breakpoint for tracing data.
   */
  
! private tracedata(op, exp, place, cond)
  Operator op;
  Node exp;
  Node place;
***************
*** 1112,1118 ****
      if (p == nil) {
  	p = program;
      }
!     action = build(O_PRINTIFCHANGED, exp);
      if (cond != nil) {
  	action = build(O_IF, cond, buildcmdlist(action));
      }
--- 1144,1151 ----
      if (p == nil) {
  	p = program;
      }
!     if(op == O_TRACE) action = build(O_PRINTIFCHANGED, exp);
!     else action = build(O_PRINTIIFCHANGED, exp);
      if (cond != nil) {
  	action = build(O_IF, cond, buildcmdlist(action));
      }
***************
*** 1128,1134 ****
   * Setting and unsetting of stops.
   */
  
! public stop (p)
  Node p;
  {
      Node exp, place, cond, t;
--- 1161,1167 ----
   * Setting and unsetting of stops.
   */
  
! public stop(p)
  Node p;
  {
      Node exp, place, cond, t;
***************
*** 1183,1188 ****
--- 1216,1223 ----
  	event = build(O_EQ, build(O_SYM, linesym), place);
      } else {
  	event = build(O_EQ, build(O_SYM, pcsym), place);
+         if(place->op == O_LCON && (int) place->value.lcon >= 0x10000000)
+ 		warning("instruction breakpoint set at data address");
      }
      e = addevent(event, buildcmdlist(action));
      if (isstdin()) {
***************
*** 1195,1201 ****
   * the variable list.
   */
  
! private stopvar (op, exp, place, cond)
  Operator op;
  Node exp;
  Node place;
--- 1230,1236 ----
   * the variable list.
   */
  
! private stopvar(op, exp, place, cond)
  Operator op;
  Node exp;
  Node place;
***************
*** 1220,1226 ****
      } else {
  	p = place->value.sym;
      }
!     action = build(O_STOPIFCHANGED, exp);
      if (cond != nil) {
  	action = build(O_IF, cond, buildcmdlist(action));
      }
--- 1255,1262 ----
      } else {
  	p = place->value.sym;
      }
!     if(op == O_STOP) action = build(O_STOPIFCHANGED, exp);
!     else action = build(O_STOPIIFCHANGED, exp);
      if (cond != nil) {
  	action = build(O_IF, cond, buildcmdlist(action));
      }
***************
*** 1498,1528 ****
  #   endif
  }
  
  /*
!  * Give the user some help.
   */
  
! public help ()
  {
!     puts("run                    - begin execution of the program");
!     puts("print <exp>            - print the value of the expression");
!     puts("where                  - print currently active procedures");
!     puts("stop at <line>         - suspend execution at the line");
!     puts("stop in <proc>         - suspend execution when <proc> is called");
!     puts("cont                   - continue execution");
!     puts("step                   - single step one line");
!     puts("next                   - step to next line (skip over calls)");
!     puts("trace <line#>          - trace execution of the line");
!     puts("trace <proc>           - trace calls to the procedure");
!     puts("trace <var>            - trace changes to the variable");
!     puts("trace <exp> at <line#> - print <exp> when <line> is reached");
!     puts("status                 - print trace/stop's in effect");
!     puts("delete <number>        - remove trace or stop of given number");
!     puts("call <proc>            - call a procedure in program");
!     puts("whatis <name>          - print the declaration of the name");
!     puts("list <line>, <line>    - list source lines");
!     puts("gripe                  - send mail to the person in charge of dbx");
!     puts("quit                   - exit dbx");
  }
  
  /*
--- 1534,1574 ----
  #   endif
  }
  
+ 
  /*
!  * Set the program counter to be at a particular place in the code.
   */
  
! public changepc (p)
! Node p;
  {
!     Address goaddr;
!     String fn;
!     long ln;
!     Symbol oldfunc;
! 
! /*    if (noexec)
! 	error("program is not executable");*/
!     oldfunc = curfunc;
!     if (p->value.arg[0]->op == O_QLINE) {
! 	fn = p->value.arg[0]->value.arg[0]->value.scon;
! 	ln = p->value.arg[0]->value.arg[1]->value.lcon;
! 	goaddr = objaddr(ln, fn);
!     } else {
!         eval(p->value.arg[0]);
!         goaddr = pop(long);
!     }
!     if (goaddr != NOADDR) {
! 	setcurfunc(whatblock(goaddr));
! 	if ((curfunc != oldfunc) && (!(varIsSet("$unsafegoto")))) {
! 	    curfunc = oldfunc;
! 	    error("Goto address is not within current function. (set $unsafegoto to override)");
! 	} else {
! 	    setreg(PROGCTR, pc = goaddr);
! 	    getsrcpos();	
! 	    printstatus();
! 	}
!     }
  }
  
  /*
***************
*** 1659,1662 ****
--- 1705,1865 ----
  		" mapped to %.17g\n",
  		xw[0],xw[1],xw[2], dsign?"-":"", g1, n, *(double *)t);
  	return ;
+ }
+ /*
+  * Execute a listi command.
+  */
+ 
+ private listi (p)
+ Node p;
+ {
+     static Address old_pc;
+     Address addr1, addr2;
+     long t1, t2;
+     Symbol f;
+     Node wnode;
+     int wsize;
+ 
+     wnode = findvar(identname("$listwindow",true));
+     if ( !wnode )
+       wsize = inst_windowsize;
+     else {
+        eval(wnode);
+        wsize = pop(integer);
+     }
+ 
+     if (p->value.arg[0]->op == O_SYM)
+     {
+ 	f = p->value.arg[0]->value.sym;
+ 	addr1 = firstline(f);
+ 	if (addr1 == NOADDR) {
+ 	    error("no source lines for \"%s\"", symname(f));
+ 	}
+ 	printninst(wsize,addr1);
+     } 
+     else 
+     {
+ 	eval(p->value.arg[0]);
+ 	t1 = pop(long);
+ 	addr1 = (Address) t1;
+ 	eval(p->value.arg[1]);
+ 	t2 =  pop(long);
+ 	addr2 = (Address) t2;
+ 	if ((t1 < 0) || (t2 < 0))
+         {
+ 	   beginerrmsg();
+ 	   fprintf(stderr, "Addresses must be positive\n");
+ 	   return;
+ 	}
+ 	if (addr2 == 0)
+         {
+ 	   if (addr1 == 0)           /* No line numbers specified */
+ 	   {
+ 	      if (prtaddr && (old_pc == pc))
+ 	         printninst(wsize,prtaddr);
+ 	      else
+ 	         printninst(wsize,pc);
+ 	   }
+ 	   else     	             /* Only 1st line specified   */
+ 	   {
+ 	      printninst(wsize,addr1);
+ 	   }
+ 	}                            /* end if no ending line specified */
+ 	else
+ 	{
+ 	   if (addr1 == 0)         /* print assembly code given source line # */
+ 	   {
+ 	      addr1 = objaddr(addr2,cursource);
+ 	      if (addr1 == NOADDR) {
+ 	          error("No assembly code for that source line number");
+ 	      }
+ 	      printninst(wsize,addr1);
+ 	   }
+ 	   else if (addr2 < addr1)
+            {
+ 	      beginerrmsg();
+ 	      fprintf(stderr, "second number must be greater than first\n");
+ 	      return;
+ 	   }
+ 	   else                                /* Both lines specified */
+ 	   {
+ 	      if ((addr2 - addr1) < wsize)
+ 	         printninst(wsize,addr1);
+ 	      else
+ 	         printinst(addr1,addr2, false);
+ 	   }
+ 	}
+     }
+     old_pc = pc;
+ }
+ 
+ /*
+  * Execute a registers command to print out the registers in readable form.
+  */
+ #define NGREG 16
+ /* Register mnemonics */
+ char *regnames[] = {
+ 	"r0",		/* register 00 */
+ 	"r1",		/* register 01 */
+ 	"r2",		/* register 02 */
+ 	"r3",		/* register 03 */
+ 	"r4",		/* register 04 */
+ 	"r5",		/* register 05 */
+ 	"r6",		/* register 06 */
+ 	"r7",		/* register 07 */
+ 	"r8",		/* register 08 */
+ 	"r9",		/* register 09 */
+ 	"r10",		/* register 0A */
+ 	"r11",		/* register 0B */
+ 	"r12",		/* register 0C */
+ 	"sp",		/* register 0D */
+ 	"r14",		/* register 0E */
+ 	"r15",		/* register 0F */ 
+ };
+ 
+ registers () {
+    int	p, i;
+    
+    for (p = 0; p < (NREG-1) / 4; ++p) 
+    {
+       for (i = 0; i < NREG-1; i += 4) 
+       {
+ 	 printf("%5s: ", regnames[p + i]);
+ 	 printf("%08x ", reg(p + i));
+       }
+       printf("\n");
+    }
+    printf("%5s: ","pc");
+    printf("%08X ", reg(PROGCTR));
+    printf("\n");
+ 
+    printf("\n");
+    if (varIsSet("$flregs")) 
+    {
+       prflregs();
+       printf("\n");
+    }
+ 
+ }
+ 
+ /*
+  * Print out the values of the floating point registers.
+  */
+ prflregs()
+ {
+    int	i;
+    union {
+       double	d;
+       float   f[2];
+       long	l[2];
+    }	u;
+    
+ 
+    printf("\n");
+    for (i = 0; i < NFLREG; i ++) 
+    {
+       printf("   dr%d: %08.8x  ", i,reg(i+NREG));
+       prtreal(true, (double) reg(i+NREG));
+       printf("\n");
+    }
  }
*** /usr/src/ucb/dbx/commands.y	Fri Dec  9 11:56:39 1988
--- commands.y	Thu Oct 12 14:37:33 1989
***************
*** 1,6 ****
!  /* $Header:commands.y 12.0$ */
!  /* $ACIS:commands.y 12.0$ */
!  /* $Source: /ibm/acis/usr/src/ucb/dbx/RCS/commands.y,v $ */
  %{
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,5 ----
!  /* $Header: commands.y,v 12.1 89/10/12 17:37:32 brunner Locked $ */
!  /* $Source: /fish/dbx/RCS/commands.y,v $ */
  %{
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 21,33 ****
  #include "lists.h"
  
  private String curformat = "X";
  
  %}
  
  %term
!     ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP
!     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR
!     PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS STEP STEPI
      STOP STOPI TRACE TRACEI UNALIAS UNSET UP USE
      WHATIS WHEN WHERE WHEREIS WHICH
  
--- 20,34 ----
  #include "lists.h"
  
  private String curformat = "X";
+ boolean instlevel = false;
  
  %}
  
  %term
!     ALIAS ALL AND ASSIGN AT CALL CATCH CLEAR CLEARI CONT DEBUG DELETE DIV DOWN DUMP
!     EDIT FILE FUNC GOTO GOTOI HELP IF IGNORE IN LIST LISTI MOD NEXT NEXTI NIL NOT OR
!     PRINT PSYM QUIT REGISTERS RERUN RETURN RUN SET SH SKIP SOURCE 
!     STATUS STEP STEPI
      STOP STOPI TRACE TRACEI UNALIAS UNSET UP USE
      WHATIS WHEN WHERE WHEREIS WHICH
  
***************
*** 64,75 ****
  %type <y_char>	    CHAR
  %type <y_real>	    REAL
  %type <y_string>    STRING redirectout filename opt_filename mode
! %type <y_name>	    ALIAS AND ASSIGN AT CALL CATCH CONT
  %type <y_name>	    DEBUG DELETE DIV DOWN DUMP
! %type <y_name>	    EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD
  %type <y_name>	    NEXT NEXTI NIL NOT OR
! %type <y_name>	    PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS
! %type <y_name>	    STEP STEPI STOP STOPI TRACE TRACEI
  %type <y_name>	    UNALIAS UNSET UP USE WHATIS WHEN WHERE WHEREIS WHICH
  %type <y_name>	    name NAME keyword
  %type <y_node>      opt_qual_symbol symbol
--- 65,76 ----
  %type <y_char>	    CHAR
  %type <y_real>	    REAL
  %type <y_string>    STRING redirectout filename opt_filename mode
! %type <y_name>	    ALIAS ALL AND ASSIGN AT CALL CATCH CLEAR CLEARI CONT
  %type <y_name>	    DEBUG DELETE DIV DOWN DUMP
! %type <y_name>	    EDIT FILE FUNC GOTO GOTOI HELP IF IGNORE IN LIST LISTI MOD
  %type <y_name>	    NEXT NEXTI NIL NOT OR
! %type <y_name>	    PRINT PSYM QUIT REGISTERS RERUN RETURN RUN SET SH SKIP 
! %type <y_name>	    SOURCE STATUS STEP STEPI STOP STOPI TRACE TRACEI
  %type <y_name>	    UNALIAS UNSET UP USE WHATIS WHEN WHERE WHEREIS WHICH
  %type <y_name>	    name NAME keyword
  %type <y_node>      opt_qual_symbol symbol
***************
*** 76,83 ****
  %type <y_node>	    command rcommand cmd step what where examine
  %type <y_node>	    event opt_exp_list opt_cond
  %type <y_node>	    exp_list exp term boolean_exp constant address
! %type <y_node>	    integer_list alias_command list_command line_number
! %type <y_cmdlist>   actions
  %type <y_list>      sourcepath name_list
  
  %%
--- 77,85 ----
  %type <y_node>	    command rcommand cmd step what where examine
  %type <y_node>	    event opt_exp_list opt_cond
  %type <y_node>	    exp_list exp term boolean_exp constant address
! %type <y_node>	    integer_list alias_command listi_command list_command 
! %type <y_node>      line_number
! %type <y_cmdlist>   actions actionlist
  %type <y_list>      sourcepath name_list
  
  %%
***************
*** 155,160 ****
--- 157,177 ----
  	$$ = build(O_CATCH, 0);
  }
  |
+     CLEAR line_number
+ {
+ 	$$ = build(O_CLEAR, build(O_SCON, strdup(cursource)), $2);
+ }
+ |
+     CLEARI address
+ {
+ 	$$ = build(O_CLEARI, $2);
+ }
+ |
+     CLEAR STRING ':' line_number
+ {
+ 	$$ = build(O_CLEAR, build(O_SCON, $2), $4);
+ }
+ |
      CONT
  {
  	$$ = build(O_CONT, (long) DEFSIG);
***************
*** 170,175 ****
--- 187,197 ----
  	$$ = build(O_DELETE, $2);
  }
  |
+     DELETE ALL
+ {
+ 	$$ = build(O_DELALL);
+ }
+ |
      DOWN
  {
  	$$ = build(O_DOWN, build(O_LCON, (long) 1));
***************
*** 200,213 ****
  	$$ = build(O_FUNC, $2);
  }
  |
!     GRIPE
  {
! 	$$ = build(O_GRIPE);
  }
  |
      HELP
  {
! 	$$ = build(O_HELP);
  }
  |
      IGNORE signal
--- 222,253 ----
  	$$ = build(O_FUNC, $2);
  }
  |
!     GOTO line_number
  {
! 	if (!instlevel)
! 	    $$ = build(O_GOTO, build(O_QLINE, build(O_SCON, strdup(cursource)), $2));
! 	else
! 	    $$ = build(O_GOTO, unrval($2));
  }
  |
+     GOTO STRING ':' line_number
+ {
+ 	$$ = build(O_GOTO, build(O_QLINE, build(O_SCON, $2), $4));
+ }
+ |
+     GOTOI address
+ {
+ 	$$ = build(O_GOTO, $2);
+ }
+ |
+     HELP name
+ {
+ 	$$ = build(O_HELP,build(O_NAME,$2));
+ }
+ |
      HELP
  {
! 	$$ = build(O_HELP, 0);
  }
  |
      IGNORE signal
***************
*** 220,225 ****
--- 260,270 ----
  	$$ = build(O_IGNORE, 0);
  }
  |
+     listi_command
+ {
+ 	$$ = $1;
+ }
+ |
      list_command
  {
  	$$ = $1;
***************
*** 291,296 ****
--- 336,346 ----
  	$$ = build($1, nil, $2, $3);
  }
  |
+     stop what where opt_cond
+ {
+ 	$$ = build($1, $2, $3, $4);
+ }
+ |
      stop what opt_cond
  {
  	$$ = build($1, $2, nil, $3);
***************
*** 364,372 ****
  	$$ = build(O_WHATIS, $2);
  }
  |
!     WHEN event '{' actions '}'
  {
! 	$$ = build(O_ADDEVENT, $2, $4);
  }
  |
      WHEREIS name
--- 414,422 ----
  	$$ = build(O_WHATIS, $2);
  }
  |
!     WHEN event actions 
  {
! 	$$ = build(O_ADDEVENT, $2, $3);
  }
  |
      WHEREIS name
***************
*** 456,478 ****
  step:
      STEP
  {
! 	$$ = build(O_STEP, true, false);
  }
  |
      STEPI
  {
! 	$$ = build(O_STEP, false, false);
  }
  |
      NEXT
  {
! 	$$ = build(O_STEP, true, true);
  }
  |
      NEXTI
  {
! 	$$ = build(O_STEP, false, true);
  }
  ;
  shellmode:
      /* empty */
--- 506,548 ----
  step:
      STEP
  {
! 	$$ = build(O_STEP, true, false, 1);
  }
  |
      STEPI
  {
! 	$$ = build(O_STEP, false, false, 1);
  }
  |
      NEXT
  {
! 	$$ = build(O_STEP, true, true, 1);
  }
  |
      NEXTI
  {
! 	$$ = build(O_STEP, false, true, 1);
  }
+ |
+     STEP INT
+ {
+ 	$$ = build(O_STEP, true, false, $2);
+ }
+ |
+     STEPI INT
+ {
+ 	$$ = build(O_STEP, false, false, $2);
+ }
+ |
+     NEXT INT
+ {
+ 	$$ = build(O_STEP, true, true, $2);
+ }
+ |
+     NEXTI INT
+ {
+ 	$$ = build(O_STEP, false, true, $2);
+ }
  ;
  shellmode:
      /* empty */
***************
*** 498,515 ****
      exp
  ;
  actions:
!     actions cmd ';'
  {
! 	$$ = $1;
! 	cmdlist_append($2, $$);
  }
  |
!     cmd ';'
  {
! 	$$ = list_alloc();
! 	cmdlist_append($1, $$);
  }
  ;
  cmd:
      command
  |
--- 568,594 ----
      exp
  ;
  actions:
!     '{' actionlist '}'
  {
! 	$$ = $2;
  }
  |
!     '{' actionlist ';' '}'
  {
! 	$$ = $2;
  }
  ;
+ actionlist:
+     cmd 
+ {
+ 	$$ = buildcmdlist($1); 
+ }
+ |
+     actionlist ';' cmd 
+ {
+ 	cmdlist_append($3, $$);
+ }
+ ;
  cmd:
      command
  |
***************
*** 565,570 ****
--- 644,654 ----
  	$$ = build(O_DUMP, build(O_SYM, curfunc));
  }
  |
+     REGISTERS
+ {
+ 	$$ = build(O_REGS, nil);
+ }
+ |
      STATUS
  {
  	$$ = build(O_STATUS);
***************
*** 615,625 ****
--- 699,711 ----
  trace:
      TRACE
  {
+         instlevel = false;
  	$$ = O_TRACE;
  }
  |
      TRACEI
  {
+         instlevel = true;
  	$$ = O_TRACEI;
  }
  ;
***************
*** 626,636 ****
--- 712,724 ----
  stop:
      STOP
  {
+         instlevel = false;
  	$$ = O_STOP;
  }
  |
      STOPI
  {
+         instlevel = true;
  	$$ = O_STOPI;
  }
  ;
***************
*** 651,660 ****
  	$$ = unrval($2);
  }
  |
!     AT line_number
  {
  	$$ = build(O_QLINE, build(O_SCON, strdup(cursource)), $2);
  }
  |
      AT STRING ':' line_number
  {
--- 739,756 ----
  	$$ = unrval($2);
  }
  |
! /*    AT line_number
  {
  	$$ = build(O_QLINE, build(O_SCON, strdup(cursource)), $2);
  }
+ */
+     AT address
+ {
+ 	if (!instlevel)
+ 	    $$ = build(O_QLINE, build(O_SCON, strdup(cursource)), $2);
+ 	else
+ 	    $$ = unrval($2);
+ }
  |
      AT STRING ':' line_number
  {
***************
*** 689,694 ****
--- 785,816 ----
  	$$ = nil;
  }
  ;
+ listi_command:
+     LISTI
+ {
+ 	$$ = build(O_LISTI, build(O_LCON, (long) 0), build(O_LCON, (long) 0));
+ }
+ |
+     LISTI address
+ {
+ 	$$ = build(O_LISTI, $2, build(O_LCON, (long) 0));
+ }
+ |
+     LISTI address ',' address
+ {
+ 	$$ = build(O_LISTI, $2, $4);
+ }
+ |
+     LISTI opt_qual_symbol
+ {
+ 	$$ = build(O_LISTI, $2);
+ }
+ |
+     LISTI AT line_number
+ {
+ 	$$ = build(O_LISTI, build(O_LCON, (long) 0), $3);
+ }
+ ;
  list_command:
      LIST
  {
***************
*** 764,770 ****
  	$$ = build(O_LCON, (long) prtaddr);
  }
  |
!     '&' term
  {
  	$$ = amper($2);
  }
--- 886,893 ----
  	$$ = build(O_LCON, (long) prtaddr);
  }
  |
! /*    '&' term*/
!     '&' exp %prec NOT
  {
  	$$ = amper($2);
  }
***************
*** 1080,1089 ****
  	$$ = $1;
  }
  keyword:
!     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 
!     DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST |
!     MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT |
!     RERUN | RETURN | RUN | SET | SH | SKIP | SOURCE | STATUS | STEP | STEPI |
      STOP | STOPI | TRACE | TRACEI | UNALIAS | UNSET | UP | USE |
      WHATIS | WHEN | WHERE | WHEREIS | WHICH
  ;
--- 1203,1213 ----
  	$$ = $1;
  }
  keyword:
!     ALIAS | ALL | AND | ASSIGN | AT | CALL | CATCH | CLEAR | CLEARI | CONT | DEBUG | DELETE | DIV | 
!     DOWN | DUMP | EDIT | FILE | FUNC | GOTO | GOTOI | HELP | IGNORE | IN | LIST |
!     LISTI | MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT |
!     REGISTERS | RERUN | RETURN | RUN | SET | SH | SKIP | SOURCE | 
!     STATUS | STEP | STEPI |
      STOP | STOPI | TRACE | TRACEI | UNALIAS | UNSET | UP | USE |
      WHATIS | WHEN | WHERE | WHEREIS | WHICH
  ;
*** /usr/src/ucb/dbx/c.c	Fri Dec  9 11:56:33 1988
--- c.c	Thu Oct 12 14:36:53 1989
***************
*** 1,9 ****
! /* $Header:c.c 12.0$ */
! /* $ACIS:c.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/RCS/c.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:c.c 12.0$";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,8 ----
! /* $Header: c.c,v 12.1 89/10/12 17:36:52 brunner Locked $ */
! /* $Source: /fish/dbx/RCS/c.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: c.c,v 12.1 89/10/12 17:36:52 brunner Locked $";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 35,40 ****
--- 34,40 ----
  
  #define isrange(t, name) (t->class == RANGE && istypename(t->type, name))
  
+ extern Boolean expandunions;
  private Language langC;
  private Language langCplpl;
  
***************
*** 450,458 ****
  public c_printval (s)
  Symbol s;
  {
!     register Symbol t;
!     register Address a;
!     integer i, len;
  
      switch (s->class) {
  	case CONST:
--- 450,458 ----
  public c_printval (s)
  Symbol s;
  {
!     Symbol t;
!     Address a;
!     int i, len;
  
      switch (s->class) {
  	case CONST:
***************
*** 464,469 ****
--- 464,476 ----
  	    c_printval(s->type);
  	    break;
  
+ 	case VARNT:
+ 	    if ( expandunions )
+ 	        printunion(s);
+ 	    else
+ 	        goto DEFAULT;
+ 	    break;
+ 
  	case FIELD:
  	    if (isbitfield(s)) {
  		i = extractField(s);
***************
*** 560,565 ****
--- 567,573 ----
  	   break;
  
  	default:
+ DEFAULT:
  	    if (ord(s->class) > ord(TYPEREF)) {
  		panic("printval: bad class %d", ord(s->class));
  	    }
***************
*** 584,590 ****
      savesp = sp;
      printf("(");
      f = s->chain;
!     for (;;) {
  	off = f->symvalue.field.offset;
  	len = f->symvalue.field.length;
  	n = (off + len + BITSPERBYTE - 1) div BITSPERBYTE;
--- 592,598 ----
      savesp = sp;
      printf("(");
      f = s->chain;
!     for (;f;) {
  	off = f->symvalue.field.offset;
  	len = f->symvalue.field.length;
  	n = (off + len + BITSPERBYTE - 1) div BITSPERBYTE;
***************
*** 597,602 ****
--- 605,645 ----
  	printf(", ");
      }
      printf(")");
+ }
+ 
+ printunion(s)
+ Symbol s;
+ {
+    Symbol t;
+    long i;
+    Stack *sp_top, *sp_base;
+ 
+    sp_top = sp;
+    sp_base = sp - size(s);
+ 
+    printf( "union: (");
+    for ( s = s->chain; s; s = s->chain ){
+       printf( "%s = ", symname(s));
+ 
+       sp = sp_base + size(s);
+       if ( isbitfield(s) ){
+ 	i = extractField(s);
+ 	t = rtype(s->type);
+ 	if ( t->class == SCAL )
+ 	   printEnum(i, t);
+ 	else
+ 	   printRangeVal(i, t);
+       } 
+       else
+          c_printval(s->type);
+       sp = sp_top;
+ 
+       if ( s->chain ){
+           printf( ", ");
+       }
+    }
+    sp = sp_base;
+    printf( ")");
  }
  
  /*
*** /usr/src/ucb/dbx/tree.c	Fri Dec  9 11:57:50 1988
--- tree.c	Thu Oct 12 14:37:31 1989
***************
*** 1,9 ****
! /* $Header:tree.c 12.0$ */
! /* $ACIS:tree.c 12.0$ */
! /* $Source: /ibm/acis/usr/src/ucb/dbx/RCS/tree.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header:tree.c 12.0$";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
--- 1,8 ----
! /* $Header: tree.c,v 12.1 89/10/12 17:37:30 brunner Locked $ */
! /* $Source: /fish/dbx/RCS/tree.c,v $ */
  
  #ifndef lint
! static char *rcsid = "$Header: tree.c,v 12.1 89/10/12 17:37:30 brunner Locked $";
  #endif
  
  /* Copyright (c) 1982 Regents of the University of California */
***************
*** 39,44 ****
--- 38,44 ----
  #include "events.h"
  
  #define MAXNARGS 5
+ extern boolean hexaddr;
  
  struct Node {
      Operator op;
***************
*** 62,67 ****
--- 62,68 ----
  	struct {
  	    Boolean source;
  	    Boolean skipcalls;
+ 	    int count;
  	} step;
  	struct {
  	    String mode;
***************
*** 178,183 ****
--- 179,185 ----
  	case O_STEP:
  	    p->value.step.source = va_arg(ap, Boolean);
  	    p->value.step.skipcalls = va_arg(ap, Boolean);
+ 	    p->value.step.count = va_arg(ap, int);
  	    break;
  
  	case O_EXAMINE:
***************
*** 281,287 ****
  	case O_SYM:
  	    s = p->value.sym;
  	    if (isblock(s)) {
! 		r = build(O_LCON, codeloc(s));
  	    } else {
  		notregsym(s);
  		r = build(O_LCON, address(s, nil));
--- 283,291 ----
  	case O_SYM:
  	    s = p->value.sym;
  	    if (isblock(s)) {
! 		if ( s->class == PROC || s->class == FUNC && !isinline(s) )
! 			r = build(O_LCON, dataloc(s));
! 		else	r = build(O_LCON, codeloc(s));
  	    } else {
  		notregsym(s);
  		r = build(O_LCON, address(s, nil));
***************
*** 348,355 ****
--- 352,361 ----
  
      switch (cmd->op) {
  	case O_PRINTIFCHANGED:
+ 	case O_PRINTIIFCHANGED:
  	case O_PRINTSRCPOS:
  	case O_STOPIFCHANGED:
+ 	case O_STOPIIFCHANGED:
  	case O_TRACEON:
  	    break;
  
***************
*** 470,476 ****
  	    prtree(f, ifcmd->value.event.cond);
  	    done = true;
  	}
!     } else if (ifcmd->op == O_STOPIFCHANGED) {
  	fprintf(f, "stop");
  	fprintI(f, cmd->value.trace.inst);
  	fprintf(f, " ");
--- 476,482 ----
  	    prtree(f, ifcmd->value.event.cond);
  	    done = true;
  	}
!     } else if (ifcmd->op == O_STOPIFCHANGED || ifcmd->op == O_STOPIIFCHANGED){
  	fprintf(f, "stop");
  	fprintI(f, cmd->value.trace.inst);
  	fprintf(f, " ");
***************
*** 521,527 ****
  		break;
  
  	    case O_LCON:
! 		fprintf(f, "%d", p->value.lcon);
  		break;
  
  	    case O_CCON:
--- 527,538 ----
  		break;
  
  	    case O_LCON:
! 		if (hexaddr) {
! 		    fprintf(f, "0x");
! 		    if( (int) p->value.lcon < 0x10000000 ) addrprint(f,p->value.lcon,false);
! 		    else fprintf(f,"%x" ,p->value.lcon);
! 	    	} else
! 			fprintf(f, "%d", p->value.lcon);
  		break;
  
  	    case O_CCON:

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