Annotation of 42BSD/ucb/pascal/pdx/process/step.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)step.c 1.2 2/11/82";
                      4: 
                      5: /*
                      6:  * Continue execution up to the next source line.
                      7:  *
                      8:  * We call "nextaddr" from the machine module to figure out
                      9:  * what the object address is that corresponds to the next source line.
                     10:  * If nextaddr returns -1, then the end of the program has been reached.
                     11:  *
                     12:  * There are two ways to define the next source line depending on what
                     13:  * is desired when a procedure or function call is encountered.  Step
                     14:  * stops at the beginning of the procedure or call; next skips over it.
                     15:  */
                     16: 
                     17: #include "defs.h"
                     18: #include "process.h"
                     19: #include "machine.h"
                     20: #include "breakpoint.h"
                     21: #include "source.h"
                     22: #include "mappings.h"
                     23: #include "process.rep"
                     24: 
                     25: #   if (isvax)
                     26: #       include "machine/vaxops.h"
                     27: 
                     28:        LOCAL ADDRESS getcall();
                     29: #   endif
                     30: 
                     31: /*
                     32:  * Stepc is what is called when the step command is given.
                     33:  * It has to play with the "isstopped" information.
                     34:  */
                     35: 
                     36: stepc()
                     37: {
                     38:     if (!isstopped) {
                     39:        error("can't continue execution");
                     40:     }
                     41:     isstopped = FALSE;
                     42:     dostep(FALSE);
                     43:     isstopped = TRUE;
                     44: }
                     45: 
                     46: next()
                     47: {
                     48:     if (!isstopped) {
                     49:        error("can't continue execution");
                     50:     }
                     51:     isstopped = FALSE;
                     52:     dostep(TRUE);
                     53:     isstopped = TRUE;
                     54: }
                     55: 
                     56: step()
                     57: {
                     58:     dostep(FALSE);
                     59: }
                     60: 
                     61: /*
                     62:  * Resume execution up to the given address.  It is assumed that
                     63:  * no breakpoints exist between the current address and the one
                     64:  * we're stepping to.  This saves us from setting all the breakpoints.
                     65:  */
                     66: 
                     67: stepto(addr)
                     68: ADDRESS addr;
                     69: {
                     70:     setbp(addr);
                     71:     resume();
                     72:     unsetbp(addr);
                     73:     if (!isbperr()) {
                     74:        printstatus();
                     75:     }
                     76: }
                     77: 
                     78: LOCAL dostep(isnext)
                     79: BOOLEAN isnext;
                     80: {
                     81:     register ADDRESS addr;
                     82:     register LINENO line;
                     83:     char *filename;
                     84: 
                     85:     addr = pc;
                     86:     do {
                     87: #       if (isvaxpx)
                     88:            addr = nextaddr(addr, isnext);
                     89: #       else
                     90:            if (isnext && (addr = getcall(addr)) != 0) {
                     91:                stepto(addr);
                     92:            } else {
                     93:                pstep(process);
                     94:                addr = process->pc;
                     95:                pc = process->pc;
                     96:                errnum = process->signo;
                     97:                if (!isbperr()) {
                     98:                    printstatus();
                     99:                }
                    100:            }
                    101: #       endif
                    102:        line = linelookup(addr);
                    103:     } while (line == 0 && !ss_instructions);
                    104:     stepto(addr);
                    105:     curline = line;
                    106: }
                    107: 
                    108: # if (isvax)
                    109: 
                    110: /*
                    111:  * If the current address contains a call instruction, return the
                    112:  * address of the instruction where control will return.
                    113:  *
                    114:  * This function is intentionally dependent on a particular type
                    115:  * of calling sequence.
                    116:  */
                    117: 
                    118: LOCAL ADDRESS getcall(addr)
                    119: ADDRESS addr;
                    120: {
                    121:     VAXOP op;
                    122: 
                    123:     iread(&op, addr, sizeof(addr));
                    124:     if (op == O_CALLS) {
                    125:        return(addr + 7);
                    126:     } else {
                    127:        return(0);
                    128:     }
                    129: }
                    130: 
                    131: # endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.