Research V7 development
[unix-history] / usr / src / cmd / adb / findfn.c
CommitLineData
d94e2462
M
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9
10
11MSG NOCFN;
12
13INT callpc;
14BOOL localok;
15SYMTAB symbol;
16
17STRING errflg;
18
19
20findroutine(cframe)
21 L_INT cframe;
22{
23 REG INT narg, inst;
24 INT lastpc, back2;
25 BOOL v;
26
27 v=FALSE; localok=FALSE; lastpc=callpc;
28 callpc=get(cframe+2, DSP); back2=get(leng(callpc-2), ISP);
29 IF (inst=get(leng(callpc-4), ISP)) == 04737 /* jsr pc,*$... */
30 THEN narg = 1;
31 ELIF (inst&~077)==04700 /* jsr pc,... */
32 THEN narg=0; v=(inst!=04767);
33 ELIF (back2&~077)==04700
34 THEN narg=0; v=TRUE;
35 ELSE errflg=NOCFN;
36 return(0);
37 FI
38 IF findsym( (v ? lastpc : ((inst==04767?callpc:0) + back2) ),ISYM) == -1
39 ANDF !v
40 THEN symbol.symc[0] = '?';
41 symbol.symc[1] = 0;
42 symbol.symv = 0;
43 ELSE localok=TRUE;
44 FI
45 inst = get(leng(callpc), ISP);
46 IF inst == 05726 /* tst (sp)+ */
47 THEN return(narg+1);
48 FI
49 IF inst == 022626 /* cmp (sp)+,(sp)+ */
50 THEN return(narg+2);
51 FI
52 IF inst == 062706 /* add $n,sp */
53 THEN return(narg+get(leng(callpc+2), ISP)/2);
54 FI
55 return(narg);
56}
57