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

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

unix.superglobalmegacorp.com

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