Pristine Ack-5.5
[Ack-5.5.git] / util / ass / ass60.c
1 /*
2  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3  * See the copyright notice in the ACK home directory, in the file "Copyright".
4  *
5  */
6
7 #include        "ass00.h"
8 #include        "assex.h"
9 #include        "ip_spec.h"
10
11 #ifndef NORCSID
12 static char rcs_id[] = "$Id: ass60.c,v 2.7 1994/06/24 10:15:17 ceriel Exp $" ;
13 #endif
14
15 #ifdef DUMP
16 static  char    *typestr[] =
17      {"missing","const","procname","glosym","locsym","glosym+off","pseudo"};
18 static  char    *labstr[]  = {"EMPTY","no","yes","seen","notpresent"};
19 static  char    formstr[] = { 'm','s','-','1','2','4','8' };
20 static  char    *r_data[] = { "null","glob","head","loc","adr" };
21
22 cons_t nicepr(typ,ap) addr_u *ap; {
23         register proc_t *pl;
24
25         switch (typ) {
26                 case CONST:
27                         return(ap->ad_i);
28                 case LOCSYM:
29                         return(int_cast ap->ad_lp);
30                 case GLOOFF:
31                         return(ap->ad_df.df_gp - mglobs);
32                 case GLOSYM:
33                         return(ap->ad_gp - mglobs);
34                 case PROCNAME:
35                         pl = ap->ad_pp;;
36                         if (pl->p_status&EXT)
37                                 return((pl-xprocs)+1000);
38                         else
39                                 return(pl-mprocs);
40                 default:
41                         if ( typ>=VALLOW && typ<=VALHIGH ) return VAL1(typ) ;
42                         break ;
43         }
44         return(0);
45 }
46
47 char *pflags(flg) int flg ; {
48         static char res[9] ;
49         register char *cp ;
50
51         cp=res ;
52         if ( flg&OPESC ) *cp++ = 'e' ;
53         switch ( flg&OPRANGE ) {
54         case OP_NEG : *cp++ = 'N' ; break ;
55         case OP_POS : *cp++ = 'P' ; break ;
56         }
57         if ( flg&OPWORD ) *cp++ = 'w' ;
58         if ( flg&OPNZ ) *cp++ = 'o' ;
59         *cp++ = formstr[flg&OPTYPE] ;
60         *cp++ = 0 ;
61         return res ;
62 }
63
64
65 dump(n)
66 {
67         register glob_t *gb;
68         register line_t *ln;
69         register locl_t *lbp;
70         register locl_t *lbhead;
71         proc_t *pl;
72         int i;
73         int insno;
74         extern char em_mnem[][4] ;
75
76         if (d_flag==0) return;
77 if ( (n==0 && d_flag) || (n==4 && d_flag>=2) || (n<100 && d_flag>=3) ) {
78         printf("\nEM1-assembler      *****   pass %1d complete:\n",n);
79         printf("current size %ld\n",prog_size) ;
80         printf("  %9.9s%9.9s%14.14s%8.8s%8.8s\n", "instr_nr",
81                 "type1","addr1","length","format");
82         for (ln = pstate.s_fline ; ln ;
83              ln = ln->l_next, n>=3 || n==0 ? i++ : i-- ) {
84                 insno = ctrunc(ln->instr_num) ;
85                 if ( insno==sp_fpseu ) {
86                         i= ln->ad.ad_ln.ln_first ;
87                         continue ;
88                 }
89                 printf("%4d  ",i) ;
90                 switch(insno) {
91                 default:
92                         printf(
93                                 " %3.3s",em_mnem[insno]) ;
94                         break ;
95                 case sp_ilb1:
96                         printf("l   ");
97                         break;
98                 case sp_fpseu:
99                         printf("p   ");
100                         break;
101                 }
102                 printf(" %9.9s%14ld",
103                         typestr[ln->type1<VALLOW ? ln->type1 : CONST],
104                         nicepr(ln->type1,&ln->ad)) ;
105                 if ( ln->opoff != NO_OFF )
106                         printf("%5d     %.6s",
107                         oplength(*(ln->opoff)),pflags(*(ln->opoff)));
108                 printf("\n");
109         }
110         printf("\n    %8s%8s%8s%8s%8s\n","labnum","labid","minval","maxval",
111                 "defined");
112         for ( i = 0, lbhead= *pstate.s_locl ; i<LOCLABSIZE ; lbhead++,i++) {
113                 if ( lbhead->l_defined!=EMPTY ) printf("%4d\n",i);
114                 for (lbp= lbhead; lbp != lbp_cast 0; lbp= lbp->l_chain) {
115                         if (lbp->l_defined!=EMPTY)
116                                 printf("    %8d%8d%8d%8d  %-s\n",
117                                 lbp->l_hinum*LOCLABSIZE + i,
118                                 int_cast lbp,lbp->l_min,
119                                 lbp->l_max, labstr[lbp->l_defined]);
120                 }
121         }
122 }
123 if ( ( (n==0 || n>=100) && d_flag) || (n<=1 && d_flag>=2) ) {
124         if ( n==0 || n==100 ) {
125                 printf("File %s",curfile) ;
126                 if ( archmode ) printf("(%.14s)",archhdr.ar_name);
127                 printf(" :\n\n") ;
128         }
129         printf("Local data labels:\n");
130         printf(
131            "\n\t%8.8s  %8.8s  %8.8s\n","g_name","g_status","g_addr");
132         for (gb = mglobs,i = 0;gb < &mglobs[oursize->n_mlab]; gb++, i++)
133             if (gb->g_name[0] != 0) {
134                 printf("%5d\t%8.6s",i,gb->g_name);
135                 printf("  %8o  %8ld\n",gb->g_status,gb->g_val.g_addr);
136             }
137         printf("\n\nGlobal data labels\n");
138         printf("\n\t%8.8s  %8.8s  %8.8s\n",
139                 "g_name","g_status","g_addr");
140         for (gb = xglobs,i = 0;gb < &xglobs[oursize->n_glab]; gb++, i++)
141             if (gb->g_name != 0) {
142                 printf("%5d\t%8.6s",i,gb->g_name);
143                 printf("  %8o  %8ld\n",gb->g_status,gb->g_val.g_addr);
144             }
145         printf("\n\nLocal procedures\n");
146         printf("\n\t%8.8s%8s%8s\t%8s%8s\n",
147                 "name","status","num","off","locals");
148         for (pl=mprocs;pl< &mprocs[oursize->n_mproc]; pl++)
149             if (pl->p_name) {
150                 printf("%4d\t%-8s%8o%8d",
151                         pl-mprocs,pl->p_name,pl->p_status,pl->p_num);
152                 if (pl->p_status&DEF)
153                         printf("\t%8ld%8ld",proctab[pl->p_num].pr_off,
154                                 proctab[pl->p_num].pr_loc);
155                 printf("\n");
156         }
157         printf("\nGlobal procedures\n");
158         printf("\n\t%8s%8s%8s\t%8s%8s\n",
159                 "name","status","num","off","locals");
160         for (pl=xprocs;pl< &xprocs[oursize->n_xproc]; pl++)
161             if (pl->p_name) {
162                 printf("%4d\t%-8s%8o%8d",
163                         pl-xprocs,pl->p_name,pl->p_status,pl->p_num);
164                 if (pl->p_status&DEF)
165                         printf("\t%8ld%8ld",proctab[pl->p_num].pr_off,
166                                 proctab[pl->p_num].pr_loc);
167                 printf("\n");
168         }
169         if ( r_flag ) {
170                 register relc_t *rl ;
171                 printf("\nData relocation\n") ;
172                 printf("\n\t%10s %10s %10s\n","offset","type","value");
173                 for ( rl=f_data ; rl ; rl= rl->r_next ) {
174                         printf("\t%10ld %10s ",rl->r_off,r_data[rl->r_typ]);
175                         switch(rl->r_typ) {
176                         case RELADR:
177                         case RELHEAD:
178                                 printf("%10ld\n",rl->r_val.rel_i) ;
179                                 break ;
180                         case RELGLO:
181                                 printf("%8.8s\n",rl->r_val.rel_gp->g_name) ;
182                                 break ;
183                         case RELLOC:
184                                 printf("%10d\n",rl->r_val.rel_lp) ;
185                                 break ;
186                         case RELNULL:
187                                 printf("\n"); break ;
188                         }
189                 }
190                 printf("\n\nText relocation\n") ;
191                 printf("\n\t%10s %10s %10s\n","offset","flags","value");
192                 for ( rl=f_text; rl ; rl= rl->r_next ) {
193                         printf("\t%10ld %10s ",
194                          rl->r_off,pflags(opchoice[rl->r_typ&~RELMNS])) ;
195                         if ( rl->r_typ&RELMNS )
196                                 printf("%10ld\n",rl->r_val.rel_i) ;
197                         else    printf("\n") ;
198                 }
199         }
200
201
202 }
203 }
204 #endif