diff --git a/util/ego/ic/ic.c b/util/ego/ic/ic.c index 00eb717fd..42faf5ebe 100644 --- a/util/ego/ic/ic.c +++ b/util/ego/ic/ic.c @@ -29,41 +29,36 @@ #include "../share/put.h" #include "../share/aux.h" - /* Global variables */ +dblock_p db; +dblock_p hol0_db; /* dblock for ABS block */ +char* curhol; /* name of hol block in current scope */ +dblock_p ldblock; /* last dblock */ +proc_p lproc; /* last proc */ +short tabval; /* used by table1, table2 and table3 */ +offset tabval2; +char string[IDL + 1]; +line_p firstline; /* first line of current procedure */ +line_p lastline; /* last line read */ +int labelcount; /* # labels in current procedure */ +short fragm_type = DUNKNOWN; /* fragm. type: DCON, DROM or DUNKNOWN */ +short fragm_nr = 0; /* fragment number */ +obj_id lastoid = 0; +proc_id lastpid = 0; +dblock_id lastdid = 0; +lab_id lastlid = 0; -dblock_p db; -dblock_p hol0_db; /* dblock for ABS block */ -char *curhol; /* name of hol block in current scope */ -dblock_p ldblock; /* last dblock */ -proc_p lproc; /* last proc */ -short tabval; /* used by table1, table2 and table3 */ -offset tabval2; -char string[IDL+1]; -line_p firstline; /* first line of current procedure */ -line_p lastline; /* last line read */ -int labelcount; /* # labels in current procedure */ -short fragm_type = DUNKNOWN; /* fragm. type: DCON, DROM or DUNKNOWN */ -short fragm_nr = 0; /* fragment number */ -obj_id lastoid = 0; -proc_id lastpid = 0; -dblock_id lastdid = 0; -lab_id lastlid = 0; +offset mespar = UNKNOWN_SIZE; +/* argumument of ps_par message of current procedure */ -offset mespar = UNKNOWN_SIZE; - /* argumument of ps_par message of current procedure */ +extern process_lines(); +extern int readline(); +extern line_p readoperand(); +extern line_p inpseudo(); - -extern process_lines(); -extern int readline(); -extern line_p readoperand(); -extern line_p inpseudo(); - - -main(argc,argv) - int argc; - char *argv[]; +main(argc, argv) int argc; +char* argv[]; { /* The input files must be legal EM Compact * Assembly Language files, as produced by the EM Peephole @@ -77,25 +72,26 @@ main(argc,argv) * - ddump: the names of all data blocks */ - FILE *lfile, *dfile, *pfile, *pdump, *ddump; + FILE* lfile, *dfile, *pfile, *pdump, *ddump; - lfile = openfile(lname2,"w"); - pdump = openfile(argv[1],"w"); - ddump = openfile(argv[2],"w"); - hol0_db = block_of_lab((char *) 0); - while (next_file(argc,argv) != NULL) { + lfile = openfile(lname2, "w"); + pdump = openfile(argv[1], "w"); + ddump = openfile(argv[2], "w"); + hol0_db = block_of_lab((char*)0); + while (next_file(argc, argv) != NULL) + { /* Read all EM input files, process the code * and concatenate all output. */ - curhol = (char *) 0; + curhol = (char*)0; process_lines(lfile); - dump_procnames(prochash,NPROCHASH,pdump); - dump_dblocknames(symhash,NSYMHASH,ddump); + dump_procnames(prochash, NPROCHASH, pdump); + dump_dblocknames(symhash, NSYMHASH, ddump); /* Save the names of all procedures that were * first come accross in this file. */ - cleanprocs(prochash,NPROCHASH,PF_EXTERNAL); - cleandblocks(symhash,NSYMHASH,DF_EXTERNAL); + cleanprocs(prochash, NPROCHASH, PF_EXTERNAL); + cleandblocks(symhash, NSYMHASH, DF_EXTERNAL); /* Make all procedure names that were internal * in this input file invisible. */ @@ -104,29 +100,25 @@ main(argc,argv) fclose(pdump); fclose(ddump); - /* remove the remainder of the hashing tables */ - cleanprocs(prochash,NPROCHASH,0); - cleandblocks(symhash,NSYMHASH,0); + cleanprocs(prochash, NPROCHASH, 0); + cleandblocks(symhash, NSYMHASH, 0); /* Now write the datablock table and the proctable */ - dfile = openfile(dname2,"w"); + dfile = openfile(dname2, "w"); putdtable(fdblock, dfile); - pfile = openfile(pname2,"w"); - putptable(fproc, pfile,FALSE); + pfile = openfile(pname2, "w"); + putptable(fproc, pfile, FALSE); exit(0); } - - /* Value returned by readline */ -#define NORMAL 0 -#define WITH_OPERAND 1 -#define EOFILE 2 -#define PRO_INSTR 3 -#define END_INSTR 4 -#define DELETED_INSTR 5 - +#define NORMAL 0 +#define WITH_OPERAND 1 +#define EOFILE 2 +#define PRO_INSTR 3 +#define END_INSTR 4 +#define DELETED_INSTR 5 STATIC add_end() { @@ -137,13 +129,12 @@ STATIC add_end() lastline->l_instr = ps_end; } - process_lines(fout) - FILE *fout; + FILE* fout; { line_p lnp; - short instr; - bool eof; + short instr; + bool eof; /* Read and process the code contained in the current file, * on a per procedure basis. @@ -162,20 +153,23 @@ process_lines(fout) */ eof = FALSE; - firstline = (line_p) 0; - lastline = (line_p) 0; - while (!eof) { - linecount++; /* for error messages */ - switch(readline(&instr, &lnp)) { + firstline = (line_p)0; + lastline = (line_p)0; + while (!eof) + { + linecount++; /* for error messages */ + switch (readline(&instr, &lnp)) + { /* read one line, see what kind it is */ case WITH_OPERAND: /* instruction with operand, e.g. LOL 10 */ lnp = readoperand(instr); lnp->l_instr = instr; - /* Fall through! */ + /* Fall through! */ case NORMAL: VL(lnp); - if (lastline != (line_p) 0) { + if (lastline != (line_p)0) + { lastline->l_next = lnp; } lastline = lnp; @@ -183,21 +177,23 @@ process_lines(fout) case EOFILE: eof = TRUE; fragm_type = DUNKNOWN; - if (firstline != (line_p) 0) { + if (firstline != (line_p)0) + { add_end(); - putlines(firstline,fout); - firstline = (line_p) 0; + putlines(firstline, fout); + firstline = (line_p)0; } break; case PRO_INSTR: VL(lnp); labelcount = 0; - if (firstline != lnp) { + if (firstline != lnp) + { /* If PRO is not the first * instruction: */ add_end(); - putlines(firstline,fout); + putlines(firstline, fout); firstline = lnp; } lastline = lnp; @@ -205,12 +201,12 @@ process_lines(fout) case END_INSTR: curproc->p_nrformals = mespar; mespar = UNKNOWN_SIZE; - assert(lastline != (line_p) 0); + assert(lastline != (line_p)0); lastline->l_next = lnp; - putlines(firstline,fout); + putlines(firstline, fout); /* write and delete code */ - firstline = (line_p) 0; - lastline = (line_p) 0; + firstline = (line_p)0; + lastline = (line_p)0; cleaninstrlabs(); /* scope of instruction labels ends here, * so forget about them. @@ -226,11 +222,8 @@ process_lines(fout) } } - - -int readline(instr_out, lnp_out) - short *instr_out; - line_p *lnp_out; +int readline(instr_out, lnp_out) short* instr_out; +line_p* lnp_out; { register line_p lnp; short n; @@ -241,9 +234,10 @@ int readline(instr_out, lnp_out) * return the instruction code via instr_out. */ - VA((short *) instr_out); - VA((short *) lnp_out); - switch(table1()) { + VA((short*)instr_out); + VA((short*)lnp_out); + switch (table1()) + { /* table1 sets string, tabval or tabval2 and * returns an indication of what was read. */ @@ -259,10 +253,11 @@ int readline(instr_out, lnp_out) db = block_of_lab(string); /* global variable, used by inpseudo */ lnp = newline(OPSHORT); - SHORT(lnp) = (short) db->d_id; + SHORT(lnp) = (short)db->d_id; lnp->l_instr = ps_sym; *lnp_out = lnp; - if (firstline == (line_p) 0) { + if (firstline == (line_p)0) + { firstline = lnp; /* only a pseudo (e.g. PRO) or data label * can be the first instruction. @@ -280,43 +275,47 @@ int readline(instr_out, lnp_out) case PSEU: n = tabval; lnp = inpseudo(n); /* read a pseudo */ - if (n == ps_hol) n = ps_bss; - if (lnp == (line_p) 0) return DELETED_INSTR; + if (n == ps_hol) + n = ps_bss; + if (lnp == (line_p)0) + return DELETED_INSTR; *lnp_out = lnp; lnp->l_instr = n; - if (firstline == (line_p) 0) { + if (firstline == (line_p)0) + { firstline = lnp; /* only a pseudo (e.g. PRO) or data label * can be the first instruction. */ } - if (n == ps_end) return END_INSTR; - if (n == ps_pro) return PRO_INSTR; + if (n == ps_end) + return END_INSTR; + if (n == ps_pro) + return PRO_INSTR; return NORMAL; } /* NOTREACHED */ } - -line_p readoperand(instr) - short instr; +line_p readoperand(instr) short instr; { /* Read the operand of the given instruction. * Create a line struct and return a pointer to it. */ - register line_p lnp; short flag; VI(instr); - flag = em_flag[ instr - sp_fmnem] & EM_PAR; - if (flag == PAR_NO) { + flag = em_flag[instr - sp_fmnem] & EM_PAR; + if (flag == PAR_NO) + { return (newline(OPNO)); } - switch(table2()) { + switch (table2()) + { case sp_cend: - return(newline(OPNO)); + return (newline(OPNO)); case CSTX1: /* constant */ /* If the instruction has the address @@ -327,31 +326,31 @@ line_p readoperand(instr) * Similarly, the instruction may have * an instruction label as argument. */ - switch(flag) { - case PAR_G: - lnp = newline(OPOBJECT); - OBJ(lnp) = - object(curhol,(offset) tabval, - opr_size(instr)); - break; - case PAR_B: - lnp = newline(OPINSTRLAB); - INSTRLAB(lnp) = instr_lab(tabval); - break; - default: - lnp = newline(OPSHORT); - SHORT(lnp) = tabval; - break; + switch (flag) + { + case PAR_G: + lnp = newline(OPOBJECT); + OBJ(lnp) = object(curhol, (offset)tabval, + opr_size(instr)); + break; + case PAR_B: + lnp = newline(OPINSTRLAB); + INSTRLAB(lnp) = instr_lab(tabval); + break; + default: + lnp = newline(OPSHORT); + SHORT(lnp) = tabval; + break; } break; #ifdef LONGOFF case CSTX2: /* double constant */ - if (flag == PAR_G) { + if (flag == PAR_G) + { lnp = newline(OPOBJECT); - OBJ(lnp) = - object(curhol, tabval2, - opr_size(instr)); + OBJ(lnp) = object(curhol, tabval2, + opr_size(instr)); break; } lnp = newline(OPOFFSET); @@ -366,24 +365,24 @@ line_p readoperand(instr) case DLBX: /* applied occurrence data label */ lnp = newline(OPOBJECT); - OBJ(lnp) = object(string, (offset) 0, - opr_size(instr) ); + OBJ(lnp) = object(string, (offset)0, + opr_size(instr)); break; case VALX1: lnp = newline(OPOBJECT); - OBJ(lnp) = object(string, (offset) tabval, - opr_size(instr) ); + OBJ(lnp) = object(string, (offset)tabval, + opr_size(instr)); break; #ifdef LONGOFF case VALX2: lnp = newline(OPOBJECT); - OBJ(lnp) = object(string,tabval2, - opr_size(instr) ); + OBJ(lnp) = object(string, tabval2, + opr_size(instr)); break; #endif case sp_pnam: lnp = newline(OPPROC); - PROC(lnp) = proclookup(string,OCCURRING); + PROC(lnp) = proclookup(string, OCCURRING); VP(PROC(lnp)); break; default: @@ -392,36 +391,35 @@ line_p readoperand(instr) return lnp; } - -static char *hol_label() +static char* hol_label() { static int holno; line_p lnp; - extern char *lastname; + extern char* lastname; /* Create a label for a hol pseudo, so that it can be converted * into a bss. The label is appended to the list of instructions. */ sprintf(string, "_HH%d", ++holno); - symlookup(string, OCCURRING); /* to make it exa */ + symlookup(string, OCCURRING); /* to make it exa */ db = block_of_lab(string); lnp = newline(OPSHORT); - SHORT(lnp) = (short) db->d_id; + SHORT(lnp) = (short)db->d_id; lnp->l_instr = ps_sym; - if (firstline == (line_p) 0) { + if (firstline == (line_p)0) + { firstline = lnp; } - if (lastline != (line_p) 0) { + if (lastline != (line_p)0) + { lastline->l_next = lnp; } lastline = lnp; return lastname; } - -line_p inpseudo(n) - short n; +line_p inpseudo(n) short n; { int m; line_p lnp; @@ -436,45 +434,50 @@ line_p inpseudo(n) * be recorded in the datablock or procedure table. */ - - switch(n) { + switch (n) + { case ps_hol: /* hol pseudos are carefully converted into bss * pseudos, so that the IL phase will not be * bothered by this. Also, references to the ABS * block will still work when passed through EGO. */ - - if (lastline != (line_p) 0 && is_datalabel(lastline)) { - extern char *lastname; + + if (lastline != (line_p)0 && is_datalabel(lastline)) + { + extern char* lastname; curhol = lastname; } - else { + else + { curhol = hol_label(); } n = ps_bss; - /* fall through */ + /* fall through */ case ps_bss: case ps_rom: case ps_con: - if (lastline == (line_p) 0 || !is_datalabel(lastline)) { - assert(lastline != (line_p) 0); + if (lastline == (line_p)0 || !is_datalabel(lastline)) + { + assert(lastline != (line_p)0); nlast = INSTR(lastline); - if (n == nlast && - (n == ps_rom || n == ps_con)) { + if (n == nlast && (n == ps_rom || n == ps_con)) + { /* Two successive roms/cons are * combined into one data block * if the second is not preceded by * a data label. */ lnp = arglist(0); - pseu = (byte) (n == ps_rom?DROM:DCON); - combine(db,lastline,lnp,pseu); + pseu = (byte)(n == ps_rom ? DROM : DCON); + combine(db, lastline, lnp, pseu); oldline(lnp); - return (line_p) 0; - } else { - error("datablock without label"); + return (line_p)0; + } + else + { + error("datablock without label"); } } VD(db); @@ -483,14 +486,16 @@ line_p inpseudo(n) /* Read the arguments, 3 for hol or bss and a list * of undetermined length for rom and con. */ - dblockdef(db,n,lnp); + dblockdef(db, n, lnp); /* Fill in d_pseudo, d_size and d_values fields of db */ - if (fragm_type != db->d_pseudo) { + if (fragm_type != db->d_pseudo) + { /* Keep track of fragment numbers, * enter a new fragment. */ fragm_nr++; - switch(db->d_pseudo) { + switch (db->d_pseudo) + { case DCON: case DROM: fragm_type = db->d_pseudo; @@ -511,16 +516,16 @@ line_p inpseudo(n) * the EM visibility rules). * The result (a dblock pointer) is voided. */ - return (line_p) 0; + return (line_p)0; case ps_inp: - getproc(DEFINING); /* same idea */ - return (line_p) 0; + getproc(DEFINING); /* same idea */ + return (line_p)0; case ps_exa: getsym(OCCURRING); - return (line_p) 0; + return (line_p)0; case ps_exp: getproc(OCCURRING); - return (line_p) 0; + return (line_p)0; case ps_pro: curproc = getproc(DEFINING); /* This is a real defining occurrence of a proc */ @@ -531,7 +536,7 @@ line_p inpseudo(n) */ lnp = newline(OPPROC); PROC(lnp) = curproc; - lnp->l_instr = (byte) ps_pro; + lnp->l_instr = (byte)ps_pro; return lnp; case ps_end: curproc->p_nrlabels = labelcount; @@ -543,27 +548,28 @@ line_p inpseudo(n) return lnp; case ps_mes: lnp = arglist(0); - switch((int) aoff(ARG(lnp),0)) { - case ms_err: - error("ms_err encountered"); - case ms_opt: - error("ms_opt encountered"); - case ms_emx: - ws = aoff(ARG(lnp),1); - ps = aoff(ARG(lnp),2); - break; - case ms_ext: + switch ((int)aoff(ARG(lnp), 0)) + { + case ms_err: + error("ms_err encountered"); + case ms_opt: + error("ms_opt encountered"); + case ms_emx: + ws = aoff(ARG(lnp), 1); + ps = aoff(ARG(lnp), 2); + break; + case ms_ext: /* this message was already processed * by the lib package */ - case ms_src: - /* Don't bother about linecounts */ - oldline(lnp); - return (line_p) 0; - case ms_par: - mespar = aoff(ARG(lnp),1); - /* #bytes of parameters of current proc */ - break; + case ms_src: + /* Don't bother about linecounts */ + oldline(lnp); + return (line_p)0; + case ms_par: + mespar = aoff(ARG(lnp), 1); + /* #bytes of parameters of current proc */ + break; } return lnp; default: