211 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  *
 | |
|  *          This product is part of the Amsterdam Compiler Kit.
 | |
|  *
 | |
|  * Permission to use, sell, duplicate or disclose this software must be
 | |
|  * obtained in writing. Requests for such permissions may be sent to
 | |
|  *
 | |
|  *      Dr. Andrew S. Tanenbaum
 | |
|  *      Wiskundig Seminarium
 | |
|  *      Vrije Universiteit
 | |
|  *      Postbox 7161
 | |
|  *      1007 MC Amsterdam
 | |
|  *      The Netherlands
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include        "ass00.h"
 | |
| #include        "assex.h"
 | |
| #include        "ip_spec.h"
 | |
| 
 | |
| #ifdef DUMP
 | |
| static  char    *typestr[] =
 | |
|      {"missing","const","procname","glosym","locsym","glosym+off","pseudo"};
 | |
| static  char    *labstr[]  = {"EMPTY","no","yes","seen","notpresent"};
 | |
| static  char    formstr[] = { 'm','s','-','1','2','4','8' };
 | |
| static  char    *r_data[] = { "null","glob","head","loc","adr" };
 | |
| 
 | |
| cons_t nicepr(typ,ap) addr_u *ap; char typ; {
 | |
| 	register proc_t *pl;
 | |
| 
 | |
| 	switch (typ) {
 | |
| 		case CONST:
 | |
| 			return(ap->ad_i);
 | |
| 		case LOCSYM:
 | |
| 			return(int_cast ap->ad_lp);
 | |
| 		case GLOOFF:
 | |
| 			return(ap->ad_df.df_gp - mglobs);
 | |
| 		case GLOSYM:
 | |
| 			return(ap->ad_gp - mglobs);
 | |
| 		case PROCNAME:
 | |
| 			pl = ap->ad_pp;;
 | |
| 			if (pl->p_status&EXT)
 | |
| 				return((pl-xprocs)+1000);
 | |
| 			else
 | |
| 				return(pl-mprocs);
 | |
| 		default:
 | |
| 			if ( typ>=VALLOW && typ<=VALHIGH ) return VAL1(typ) ;
 | |
| 			break ;
 | |
| 	}
 | |
| 	return(0);
 | |
| }
 | |
| 
 | |
| char *pflags(flg) int flg ; {
 | |
| 	static char res[9] ;
 | |
| 	register char *cp ;
 | |
| 
 | |
| 	cp=res ;
 | |
| 	if ( flg&OPESC ) *cp++ = 'e' ;
 | |
| 	switch ( flg&OPRANGE ) {
 | |
| 	case OP_NEG : *cp++ = 'N' ; break ;
 | |
| 	case OP_POS : *cp++ = 'P' ; break ;
 | |
| 	}
 | |
| 	if ( flg&OPWORD ) *cp++ = 'w' ;
 | |
| 	if ( flg&OPNZ ) *cp++ = 'o' ;
 | |
| 	*cp++ = formstr[flg&OPTYPE] ;
 | |
| 	*cp++ = 0 ;
 | |
| 	return res ;
 | |
| }
 | |
| 
 | |
| 
 | |
| dump(n)
 | |
| {
 | |
| 	register glob_t *gb;
 | |
| 	register line_t *ln;
 | |
| 	register locl_t *lbp;
 | |
| 	register locl_t *lbhead;
 | |
| 	proc_t *pl;
 | |
| 	int i;
 | |
| 	int insno;
 | |
| 	extern char em_mnem[][4] ;
 | |
| 
 | |
| 	if (d_flag==0) return;
 | |
| if ( (n==0 && d_flag) || (n==4 && d_flag>=2) || (n<100 && d_flag>=3) ) {
 | |
| 	printf("\nEM1-assembler      *****   pass %1d complete:\n",n);
 | |
| 	printf("current size %D\n",prog_size) ;
 | |
| 	printf("  %9.9s%9.9s%14.14s%8.8s%8.8s\n", "instr_nr",
 | |
| 		"type1","addr1","length","format");
 | |
| 	for (ln = pstate.s_fline ; ln ;
 | |
| 	     ln = ln->l_next, n>=3 || n==0 ? i++ : i-- ) {
 | |
| 		insno = ctrunc(ln->instr_num) ;
 | |
| 		if ( insno==sp_fpseu ) {
 | |
| 			i= ln->ad.ad_ln.ln_first ;
 | |
| 			continue ;
 | |
| 		}
 | |
| 		printf("%4d  ",i) ;
 | |
| 		switch(insno) {
 | |
| 		default:
 | |
| 			printf(
 | |
| 				" %3.3s",em_mnem[insno]) ;
 | |
| 			break ;
 | |
| 		case sp_ilb1:
 | |
| 			printf("l   ");
 | |
| 			break;
 | |
| 		case sp_fpseu:
 | |
| 			printf("p   ");
 | |
| 			break;
 | |
| 		}
 | |
| 		printf(" %9.9s%14D",
 | |
| 			typestr[ln->type1<VALLOW ? ln->type1 : CONST],
 | |
| 			nicepr(ln->type1,&ln->ad)) ;
 | |
| 		if ( ln->opoff != NO_OFF )
 | |
| 			printf("%5d     %.6s",
 | |
| 			oplength(*(ln->opoff)),pflags(*(ln->opoff)));
 | |
| 		printf("\n");
 | |
| 	}
 | |
| 	printf("\n    %8s%8s%8s%8s%8s\n","labnum","labid","minval","maxval",
 | |
| 		"defined");
 | |
| 	for ( i = 0, lbhead= *pstate.s_locl ; i<LOCLABSIZE ; lbhead++,i++) {
 | |
| 		if ( lbhead->l_defined!=EMPTY ) printf("%4d\n",i);
 | |
| 		for (lbp= lbhead; lbp != lbp_cast 0; lbp= lbp->l_chain) {
 | |
| 			if (lbp->l_defined!=EMPTY)
 | |
| 				printf("    %8d%8d%8d%8d  %-s\n",
 | |
| 				lbp->l_hinum*LOCLABSIZE + i,
 | |
| 				int_cast lbp,lbp->l_min,
 | |
| 				lbp->l_max, labstr[lbp->l_defined]);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| if ( ( (n==0 || n>=100) && d_flag) || (n<=1 && d_flag>=2) ) {
 | |
| 	if ( n==0 || n==100 ) {
 | |
| 		printf("File %s",curfile) ;
 | |
| 		if ( archmode ) printf("(%.14s)",archhdr.ar_name);
 | |
| 		printf(" :\n\n") ;
 | |
| 	}
 | |
| 	printf("Local data labels:\n");
 | |
| 	printf(
 | |
| 	   "\n\t%8.8s  %8.8s  %8.8s\n","g_name","g_status","g_addr");
 | |
| 	for (gb = mglobs,i = 0;gb < &mglobs[oursize->n_mlab]; gb++, i++)
 | |
| 	    if (gb->g_name[0] != 0) {
 | |
| 		printf("%5d\t%8.6s",i,gb->g_name);
 | |
| 		printf("  %8o  %8ld\n",gb->g_status,gb->g_val.g_addr);
 | |
| 	    }
 | |
| 	printf("\n\nGlobal data labels\n");
 | |
| 	printf("\n\t%8.8s  %8.8s  %8.8s\n",
 | |
| 		"g_name","g_status","g_addr");
 | |
| 	for (gb = xglobs,i = 0;gb < &xglobs[oursize->n_glab]; gb++, i++)
 | |
| 	    if (gb->g_name[0] != 0) {
 | |
| 		printf("%5d\t%8.6s",i,gb->g_name);
 | |
| 		printf("  %8o  %8ld\n",gb->g_status,gb->g_val.g_addr);
 | |
| 	    }
 | |
| 	printf("\n\nLocal procedures\n");
 | |
| 	printf("\n\t%8.8s%8s%8s\t%8s%8s\n",
 | |
| 		"name","status","num","off","locals");
 | |
| 	for (pl=mprocs;pl< &mprocs[oursize->n_mproc]; pl++)
 | |
| 	    if (pl->p_name[0]) {
 | |
| 		printf("%4d\t%-8s%8o%8d",
 | |
| 			pl-mprocs,pl->p_name,pl->p_status,pl->p_num);
 | |
| 		if (pl->p_status&DEF)
 | |
| 			printf("\t%8ld%8ld",proctab[pl->p_num].pr_off,
 | |
| 				proctab[pl->p_num].pr_loc);
 | |
| 		printf("\n");
 | |
| 	}
 | |
| 	printf("\nGlobal procedures\n");
 | |
| 	printf("\n\t%8s%8s%8s\t%8s%8s\n",
 | |
| 		"name","status","num","off","locals");
 | |
| 	for (pl=xprocs;pl< &xprocs[oursize->n_xproc]; pl++)
 | |
| 	    if (pl->p_name[0]) {
 | |
| 		printf("%4d\t%-8s%8o%8d",
 | |
| 			pl-xprocs,pl->p_name,pl->p_status,pl->p_num);
 | |
| 		if (pl->p_status&DEF)
 | |
| 			printf("\t%8ld%8ld",proctab[pl->p_num].pr_off,
 | |
| 				proctab[pl->p_num].pr_loc);
 | |
| 		printf("\n");
 | |
| 	}
 | |
| 	if ( r_flag ) {
 | |
| 		register relc_t *rl ;
 | |
| 		printf("\nData relocation\n") ;
 | |
| 		printf("\n\t%10s %10s %10s\n","offset","type","value");
 | |
| 		for ( rl=f_data ; rl ; rl= rl->r_next ) {
 | |
| 			printf("\t%10D %10s ",rl->r_off,r_data[rl->r_typ]);
 | |
| 			switch(rl->r_typ) {
 | |
| 			case RELADR:
 | |
| 			case RELHEAD:
 | |
| 				printf("%10D\n",rl->r_val.rel_i) ;
 | |
| 				break ;
 | |
| 			case RELGLO:
 | |
| 				printf("%8.8s\n",rl->r_val.rel_gp->g_name) ;
 | |
| 				break ;
 | |
| 			case RELLOC:
 | |
| 				printf("%10d\n",rl->r_val.rel_lp) ;
 | |
| 				break ;
 | |
| 			case RELNULL:
 | |
| 				printf("\n"); break ;
 | |
| 			}
 | |
| 		}
 | |
| 		printf("\n\nText relocation\n") ;
 | |
| 		printf("\n\t%10s %10s %10s\n","offset","flags","value");
 | |
| 		for ( rl=f_text; rl ; rl= rl->r_next ) {
 | |
| 			printf("\t%10D %10s ",
 | |
| 			 rl->r_off,pflags(opchoice[rl->r_typ&~RELMNS])) ;
 | |
| 			if ( rl->r_typ&RELMNS )
 | |
| 				printf("%10D\n",rl->r_val.rel_i) ;
 | |
| 			else    printf("\n") ;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| }
 | |
| }
 | |
| #endif
 |