routines getcall(), get_text() and getcc() move from get.c to this file
routines putactuals(), putcall(), and putcc() move from put.c to this file get.h, put.h, stdio.h, em_mnem.h and em_pseu.h included
This commit is contained in:
		
							parent
							
								
									f3e35f5432
								
							
						
					
					
						commit
						84ed8ee7ef
					
				
					 1 changed files with 201 additions and 0 deletions
				
			
		|  | @ -4,14 +4,19 @@ | ||||||
|  *  I L _ A U X . C |  *  I L _ A U X . C | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #include <stdio.h> | ||||||
| #include "../share/types.h" | #include "../share/types.h" | ||||||
| #include "il.h" | #include "il.h" | ||||||
| #include "../share/debug.h" | #include "../share/debug.h" | ||||||
|  | #include "../share/get.h" | ||||||
|  | #include "../share/put.h" | ||||||
| #include "../share/alloc.h" | #include "../share/alloc.h" | ||||||
| #include "../share/global.h" | #include "../share/global.h" | ||||||
| #include "../share/lset.h" | #include "../share/lset.h" | ||||||
| #include "../share/map.h" | #include "../share/map.h" | ||||||
| #include "../../../h/em_spec.h" | #include "../../../h/em_spec.h" | ||||||
|  | #include "../../../h/em_mnem.h" | ||||||
|  | #include "../../../h/em_pseu.h" | ||||||
| #include "il_aux.h" | #include "il_aux.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -180,3 +185,199 @@ remcc(head) | ||||||
| 		oldcalcnt(cc); | 		oldcalcnt(cc); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Extra I/O routines */ | ||||||
|  | 
 | ||||||
|  | call_p getcall(cf) | ||||||
|  | 	FILE *cf; | ||||||
|  | { | ||||||
|  | 	/* read a call from the call-file */ | ||||||
|  | 
 | ||||||
|  | 	call_p c; | ||||||
|  | 	proc_p voided; | ||||||
|  | 	actual_p act,*app; | ||||||
|  | 	short n,m; | ||||||
|  | 
 | ||||||
|  | 	curinp = cf; | ||||||
|  | 	c = newcall(); | ||||||
|  | 	n = getshort(); /* void nesting level */ | ||||||
|  | 	if (feof(curinp)) return (call_p) 0; | ||||||
|  | 	c->cl_caller = pmap[getshort()]; | ||||||
|  | 	c->cl_id     = getshort(); | ||||||
|  | 	c->cl_proc   = pmap[getshort()]; | ||||||
|  | 	c->cl_looplevel = getbyte(); | ||||||
|  | 	c->cl_flags = getbyte(); | ||||||
|  | 	c->cl_ratio  = getshort(); | ||||||
|  | 	app = &c->cl_actuals; | ||||||
|  | 	n = getshort(); | ||||||
|  | 	while(n--) { | ||||||
|  | 		act = newactual(); | ||||||
|  | 		m = getshort(); | ||||||
|  | 		act->ac_size = getoff(); | ||||||
|  | 		act->ac_inl = getbyte(); | ||||||
|  | 		act->ac_exp = getlines(cf,m,&voided); | ||||||
|  | 		*app = act; | ||||||
|  | 		app = &act->ac_next; | ||||||
|  | 	} | ||||||
|  | 	*app = (actual_p) 0; | ||||||
|  | 	return c; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | line_p get_text(lf,p_out) | ||||||
|  | 	FILE *lf; | ||||||
|  | 	proc_p *p_out; | ||||||
|  | { | ||||||
|  | 	/* Read the EM text of one unit
 | ||||||
|  | 	 * If it is a procedure, set p_out to | ||||||
|  | 	 * the proc. just read. Else set p_out | ||||||
|  | 	 * to 0. | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	line_p dumhead, l, lprev; | ||||||
|  | 	loop_p *oldlpmap = lpmap; | ||||||
|  | 	line_p *oldlmap = lmap; | ||||||
|  | 	short oldllength = llength; | ||||||
|  | 	short oldlastlabid = lastlabid; | ||||||
|  | 
 | ||||||
|  | 	curinp = lf; | ||||||
|  | 	*p_out = (proc_p) 0; | ||||||
|  | 	dumhead = newline(OPNO); | ||||||
|  | 	/* The list of instructions is preceeded by a dummy
 | ||||||
|  | 	 * line, to simplify list manipulation | ||||||
|  | 	 */ | ||||||
|  | 	dumhead->l_instr = op_nop; /* just for fun */ | ||||||
|  | 	lprev = dumhead; | ||||||
|  | 	for (;;) { | ||||||
|  | 		l = read_line(p_out); | ||||||
|  | 		if (feof(curinp)) return (line_p) 0; | ||||||
|  | 		lprev->l_next = l; | ||||||
|  | 		PREV(l) = lprev; | ||||||
|  | 		if (INSTR(l) == ps_end) break; | ||||||
|  | 		if (INSTR(l) == ps_mes) { | ||||||
|  | 			message(l); | ||||||
|  | 		} | ||||||
|  | 		lprev = l; | ||||||
|  | 	} | ||||||
|  | 	/* The tables that map labels to instructions
 | ||||||
|  | 	 * and labels to basic blocks are not used. | ||||||
|  | 	 */ | ||||||
|  | 	if (*p_out != (proc_p) 0) { | ||||||
|  | 		oldmap(lmap,llength); | ||||||
|  | 		oldmap(lbmap,llength); | ||||||
|  | 		lmap = oldlmap; | ||||||
|  | 		lpmap = oldlpmap; | ||||||
|  | 	} | ||||||
|  | 	llength = oldllength; | ||||||
|  | 	lastlabid = oldlastlabid; | ||||||
|  | 	return dumhead; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | calcnt_p getcc(ccf,p) | ||||||
|  | 	FILE *ccf; | ||||||
|  | 	proc_p p; | ||||||
|  | { | ||||||
|  | 	/* Get call-count info of procedure p */ | ||||||
|  | 
 | ||||||
|  | 	calcnt_p head,cc,*ccp; | ||||||
|  | 	short i; | ||||||
|  | 
 | ||||||
|  | 	fseek(ccf,p->p_extend->px_il.p_ccaddr,0); | ||||||
|  | 	curinp = ccf; | ||||||
|  | 	head = (calcnt_p) 0; | ||||||
|  | 	ccp = &head; | ||||||
|  | 	for (i = getshort(); i != (short) 0; i--) { | ||||||
|  | 		cc = *ccp = newcalcnt(); | ||||||
|  | 		cc->cc_proc = pmap[getshort()]; | ||||||
|  | 		cc->cc_count = getshort(); | ||||||
|  | 		ccp = &cc->cc_next; | ||||||
|  | 	} | ||||||
|  | 	return head; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* The following routines are only used by the Inline Substitution phase */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | STATIC putactuals(alist,cfile) | ||||||
|  | 	actual_p alist; | ||||||
|  | 	FILE     *cfile; | ||||||
|  | { | ||||||
|  | 	/* output a list of actual parameters */ | ||||||
|  | 
 | ||||||
|  | 	actual_p a,next; | ||||||
|  | 	line_p l; | ||||||
|  | 	int count; | ||||||
|  | 
 | ||||||
|  | 	count = 0; | ||||||
|  | 	for (a = alist; a != (actual_p) 0; a = a->ac_next) count++; | ||||||
|  | 	outshort(count); /* number of actuals */ | ||||||
|  | 	for (a = alist; a != (actual_p) 0; a = next) { | ||||||
|  | 		next = a->ac_next; | ||||||
|  | 		count = 0; | ||||||
|  | 		for (l = a->ac_exp; l != (line_p) 0; l= l->l_next) count++; | ||||||
|  | 		outshort(count); /* length of actual */ | ||||||
|  | 		outoff(a->ac_size); | ||||||
|  | 		outbyte(a->ac_inl); | ||||||
|  | 		count = putlines(a->ac_exp,cfile); | ||||||
|  | 		oldactual(a); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | putcall(c,cfile,level) | ||||||
|  | 	call_p c; | ||||||
|  | 	FILE   *cfile; | ||||||
|  | 	short  level; | ||||||
|  | { | ||||||
|  | 	/* output a call */ | ||||||
|  | 
 | ||||||
|  | 	call_p nc,nextc; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	curoutp = cfile; | ||||||
|  | 	outshort(level);  /* nesting level */ | ||||||
|  | 	outshort(c->cl_caller->p_id);	/* calling proc */ | ||||||
|  | 	outshort(c->cl_id); | ||||||
|  | 	outshort(c->cl_proc->p_id);	/* called proc */ | ||||||
|  | 	outbyte(c->cl_looplevel); | ||||||
|  | 	outbyte(c->cl_flags); | ||||||
|  | 	outshort(c->cl_ratio); | ||||||
|  | 	putactuals(c->cl_actuals,cfile); | ||||||
|  | 	nc = c->cl_car; | ||||||
|  | 	oldcall(c); | ||||||
|  | 	for (; nc != (call_p) 0; nc = nextc) { | ||||||
|  | 		/* take care of nested calls */ | ||||||
|  | 		nextc = nc->cl_cdr; | ||||||
|  | 		putcall(nc,cfile,level+1); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | long putcc(head,ccf) | ||||||
|  | 	calcnt_p head; | ||||||
|  | 	FILE     *ccf; | ||||||
|  | { | ||||||
|  | 	/* Write call-count information to file ccf.
 | ||||||
|  | 	 * Return the disk address of the info written. | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	calcnt_p cc; | ||||||
|  | 	long addr; | ||||||
|  | 	short cnt; | ||||||
|  | 
 | ||||||
|  | 	addr = ftell(ccf); | ||||||
|  | 	curoutp = ccf; | ||||||
|  | 	cnt = 0; | ||||||
|  | 	for (cc = head; cc != (calcnt_p) 0;cc = cc->cc_next) cnt++; | ||||||
|  | 	outshort(cnt); | ||||||
|  | 	for (cc = head; cc != (calcnt_p) 0; cc = cc->cc_next) { | ||||||
|  | 		outproc(cc->cc_proc); | ||||||
|  | 		outshort(cc->cc_count); | ||||||
|  | 	} | ||||||
|  | 	return addr; | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue