ass60.c 5.3 KB

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