Ultrix-3.1/src/cmd/adb/findfn.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

#
static char *sccsid = "@(#)findfn.c 3.0 4/21/86";
/*
 *
 *	UNIX debugger
 *
 */

#include "defs.h"

MSG		NOCFN;

int callpc,uovnum,numovly,wantov,cwantov,unxkern,magic;
long ovbase;
char 	localok;
struct symtab 	symbol;
char *errflg;


findroutine(cframe)
long 	cframe;
{
	int 	narg, lastpc, wantpc, back2, inst;
	int	isov1, ovnum, isov2, ovrtn, rtncnt;
	char 	v;

	v=0; 
	localok=0; 
	lastpc=callpc;
	callpc=get(cframe+2, DSP); 
	if(magic >= 0430 && !unxkern){
		inst = get(cframe-2,DSP);
		if((inst > 7 || inst < 0) && lastpc < shorten(ovbase))
			cwantov = uovnum;
		else
			cwantov = inst;
	}
	back2=get(leng(callpc-2), ISP);
	if((inst=get(leng(callpc-4), ISP)) == 04737 /* jsr pc,*$... */)
	{
		narg = 1;
	}
	else if((inst&~077)==04700		/* jsr pc,... */)
	{
		narg=0; 
		v=(inst!=04767);
	}
	else if((back2&~077)==04700)
	{
		narg=0; 
		v=(-1);
	}
	else{
		goto finderr;
	}
	wantpc = (v ? lastpc : ((inst==04767?callpc:0)+back2));
	if(magic >= 0430 && !unxkern)
	{
		isov1 = get(leng(wantpc), ISP);
		ovnum = get(leng(wantpc+2), ISP);
		isov2 = get(leng(wantpc+4), ISP);
		ovrtn = get(leng(wantpc+016), ISP);
		if(isov1 == 012700 && isov2 == 020037
		  && ovnum <= numovly)
		{
			wantpc = ovrtn;
			wantov = ovnum;
		}
		else
		{
			wantov = cwantov;
		}
	}
	if(findsym(wantpc ,ISYM) == -1 && !v)
	{
		symbol.symc[0] = '?';
		symbol.symc[1] = 0;
		symbol.symv = 0;
	}
	else{
		localok=(-1);
	}
	inst = get(leng(callpc), ISP);
	if(inst == 05726		/* tst (sp)+ */)
	{
/* 
		cwantov = 0;
 */
		return(narg+1);
	}
	if(inst == 022626		/* cmp (sp)+,(sp)+ */)
	{
/*
		cwantov = 0;
 */
		return(narg+2);
	}
	if(inst == 062706		/* add $n,sp */)
	{
		rtncnt = get(leng(callpc+2), ISP);
/*
		cwantov = 0;
 */
		return(narg+rtncnt/2);
	}
/*
	cwantov = 0;
 */
	return(narg);
finderr:
/*
	cwantov = 0;
 */
	errflg=NOCFN;
	return(0);
}