|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.