Changed trans.c from switch statement into series of small procedures. Output files from parser now only written if changed

This commit is contained in:
bruce 1987-07-09 09:02:41 +00:00
parent 74ea5e0bd7
commit 64578a3afd
6 changed files with 153 additions and 63 deletions

View file

@ -26,7 +26,7 @@ PREFLAGS= $(INCLDIR) -DPRIVATE=static# -DDEBUG
# from the patterns file each time an optimization is performed. # from the patterns file each time an optimization is performed.
#PREFLAGS= $(PREFLAGS) -DSTATS #PREFLAGS= $(PREFLAGS) -DSTATS
PROFFLAG= -O PROFFLAG= -O
CFLAGS = $(PREFLAGS) $(PROFFLAG) -J CFLAGS = $(PREFLAGS) $(PROFFLAG)
LLOPT = LLOPT =
CMD = '$(CC) -c $(CFLAGS)' CMD = '$(CC) -c $(CFLAGS)'
@ -45,8 +45,8 @@ NOFILES = nopt.o dfa.o trans.o aux.o
POFILES = parser.o syntax.o outputdfa.o outcalls.o findworst.o initlex.o Lpars.o POFILES = parser.o syntax.o outputdfa.o outcalls.o findworst.o initlex.o Lpars.o
GENFILES = Lpars.h Lpars.c parserdummy parser.c syntax.c dfadummy\ GENFILES = Lpars.h Lpars.c parserdummy parser.c syntax.c dfadummy\
dfa.c dfa.c.save trans.c trans.c.save incalls.d incalls.r\ dfa.c dfa.c.new trans.h trans.h.new trans.c trans.c.new\
incalls.r.save pseudo.d incalls.d incalls.r incalls.r.new pseudo.d
all: em_nopt $(LIBOPT) all: em_nopt $(LIBOPT)
@ -78,15 +78,9 @@ $(LIBOPT): $(NOFILES) mkstrct.o pseudo.d incalls.d
-sh -c 'ranlib $(LIBOPT)' -sh -c 'ranlib $(LIBOPT)'
dfadummy: patterns parser dfadummy: patterns parser
-mv dfa.c dfa.c.save
-mv trans.c trans.c.save
-mv incalls.r incalls.r.save
-/lib/cpp patterns | $(HOWMUCH) >/tmp/patts -/lib/cpp patterns | $(HOWMUCH) >/tmp/patts
parser </tmp/patts parser </tmp/patts
-rm /tmp/patts -rm /tmp/patts
-if cmp -s dfa.c dfa.c.save; then mv dfa.c.save dfa.c; else exit 0; fi
-if cmp -s trans.c trans.c.save; then mv trans.c.save trans.c; else exit 0; fi
-if cmp -s incalls.r incalls.r.save; then mv incalls.r.save incalls.r; else exit 0; fi
touch dfadummy touch dfadummy
# How to build program to parse patterns table and build c files. # How to build program to parse patterns table and build c files.
@ -108,7 +102,7 @@ nopt.o: nopt.h
mkstrct.o: nopt.h mkstrct.o: nopt.h
aux.o: nopt.h aux.o: nopt.h
pseudo.d: nopt.h makefuns.awk pseudo.d: nopt.h makefuns.awk
dfa.o: nopt.h dfadummy dfa.o: nopt.h trans.h dfadummy
trans.o: nopt.h dfadummy trans.o: nopt.h dfadummy
incalls.d: nopt.h makefuns.awk incalls.d: nopt.h makefuns.awk
incalls.r: dfadummy incalls.r: dfadummy

View file

@ -30,7 +30,7 @@ findworst(repl)
int s; int s;
int mostbackups = 0; int mostbackups = 0;
if(n==0) { if(n==0) {
fprintf(ofile,"\t\t\tOO_backup(%d);\n", longestpattern-1); fprintf(ofile,"\t\tOO_backup(%d);\n", longestpattern-1);
return; return;
} }
for(s=1;s<=higheststate;s++) { for(s=1;s<=higheststate;s++) {
@ -57,11 +57,12 @@ findworst(repl)
} }
} }
if(mostbackups) if(mostbackups)
fprintf(ofile,"\t\t\tOO_backup(%d);\n",mostbackups); fprintf(ofile,"\t\tOO_backup(%d);\n",mostbackups);
} }
findfail(state) findfail(state,resout,rescpy,resgto)
int state; int state;
int *resout, *rescpy, *resgto;
{ {
/* /*
/* If pattern matching fails in 'state', how many outputs and how many /* If pattern matching fails in 'state', how many outputs and how many
@ -85,12 +86,16 @@ findfail(state)
continue; continue;
if((leftmatch(patterns[s],patterns[state],i,n)==1)&& if((leftmatch(patterns[s],patterns[state],i,n)==1)&&
patterns[s].m_len==(n-i+1)) { patterns[s].m_len==(n-i+1)) {
fprintf(ofile,"\t{%d,%d,%d},",i-1,n-i+1,s); *resout = i-1;
*rescpy = n-i+1;
*resgto = s;
return; return;
} }
} }
} }
fprintf(ofile,"\t{%d,0,0},",n); *resout = n;
*rescpy = 0;
*resgto = 0;
} }
PRIVATE int PRIVATE int

View file

@ -117,6 +117,15 @@ OO_free(p)
*OO_nxtifree++ = p; *OO_nxtifree++ = p;
} }
OO_nfree(n)
register int n;
{
while(n--) {
OO_free(*--OO_nxtpatt);
}
OO_state = 0;
}
char * char *
OO_freestr(str) OO_freestr(str)
char *str; char *str;

View file

@ -11,7 +11,7 @@
#include <em_comp.h> #include <em_comp.h>
#include <system.h> #include <system.h>
#include <idf_pkg.spec> #include <idf_pkg.spec>
#include "emO_code.h" #include <emO_code.h>
#define OTHER 255 #define OTHER 255

View file

@ -9,10 +9,6 @@ outputincalls()
struct idf *op; struct idf *op;
int opcode; int opcode;
char *s; char *s;
if((ofile=fopen("incalls.r","w"))==NULL) {
fprintf(stderr,"Fatal Error: cannot open output file incalls.r\n");
sys_stop(S_EXIT);
}
for(op=ops;op!=(struct idf *)NULL;op=op->id_nextidf) { for(op=ops;op!=(struct idf *)NULL;op=op->id_nextidf) {
opcode = op->id_opcode; opcode = op->id_opcode;
s = op->id_text; s = op->id_text;

View file

@ -9,22 +9,97 @@ FILE *ofile;
outputnopt() outputnopt()
{ {
if((ofile=fopen("dfa.c","w"))==NULL) { openofile("dfa.c");
fprintf(stderr,"Couldn't open dfa.c for output\n");
sys_stop(S_EXIT);
}
outheaders(); outheaders();
outtables(); outtables();
outdfa(); outdfa();
outdodefault(); outdodefault();
installofile();
openofile("trans.h");
outtranshdr();
installofile();
openofile("trans.c");
outdotrans(); outdotrans();
installofile();
openofile("incalls.r");
outputincalls(); outputincalls();
installofile();
}
static char ofilename[80];
static char ofiletemp[80];
PRIVATE
openofile(filename)
char *filename;
{
strcpy(ofilename,filename);
strcpy(ofiletemp,filename);
strcat(ofiletemp,".new");
if((ofile=fopen(ofiletemp,"w"))==NULL) {
fprintf(stderr,"Fatal Error: cannot open output file %s\n",ofiletemp);
sys_stop(S_EXIT);
}
}
PRIVATE
installofile()
{
/*
* if contents of newly generated ofiletemp is different
* from that of ofilename then copy over old file else
* delete newly generated file
*/
register FILE *f1, *f2;
register int c1, c2;
fclose(ofile);
if((f1 = fopen(ofiletemp,"r")) == NULL) {
fprintf(stderr,"Fatal Error: cannont reopen file %s\n",ofiletemp);
sys_stop(S_EXIT);
}
if((f2 = fopen(ofilename,"r")) == NULL) {
fclose(f1);
RENAME(ofiletemp,ofilename);
return;
}
do {
c1 = getc(f1);
c2 = getc(f2);
} while (c1 == c2 && c1 != EOF);
fclose(f1);
fclose(f2);
if (c1 != c2) {
RENAME(ofiletemp,ofilename);
}
else UNLINK(ofiletemp);
}
PRIVATE
UNLINK(x)
char *x;
{
/* Must remove the file "x" */
unlink(x); /* systemcall to remove file */
}
PRIVATE
RENAME(x,y)
char *x, *y;
{
/* Must move the file "x" to the file "y" */
unlink(y);
if(link(x,y)!=0) {
fprintf(stderr,"Cannot link to %s",y);
sys_stop(S_EXIT);
}
unlink(x);
} }
PRIVATE PRIVATE
outheaders() outheaders()
{ {
fprintf(ofile,"#include \"nopt.h\"\n"); fprintf(ofile,"#include \"nopt.h\"\n");
fprintf(ofile,"#include \"trans.h\"\n");
fprintf(ofile,"\n"); fprintf(ofile,"\n");
fprintf(ofile,"int OO_maxpattern = %d;\n", longestpattern); fprintf(ofile,"int OO_maxpattern = %d;\n", longestpattern);
fprintf(ofile,"\n"); fprintf(ofile,"\n");
@ -34,15 +109,21 @@ PRIVATE
outtables() outtables()
{ {
int s; int s;
int nout, ncpy, ngto;
fprintf(ofile,"static struct defact {\n"); fprintf(ofile,"static struct defact {\n");
fprintf(ofile,"\tint numoutput;\n"); fprintf(ofile,"\tint numoutput;\n");
fprintf(ofile,"\tint numcopy;\n"); fprintf(ofile,"\tint numcopy;\n");
fprintf(ofile,"\tint nextstate;\n"); fprintf(ofile,"\tint nextstate;\n");
fprintf(ofile,"\tint (*transstate)();\n");
fprintf(ofile,"} defaultactions[] = {\n"); fprintf(ofile,"} defaultactions[] = {\n");
for(s=0;s<=higheststate;s++) { for(s=0;s<=higheststate;s++) {
findfail(s); findfail(s,&nout,&ncpy,&ngto);
if(s%4==3) fprintf(ofile,"\t{%d, %d, %d, ",nout,ncpy,ngto);
fprintf(ofile,"\n"); if(actions[ngto]==NULL)
fprintf(ofile,"0");
else
fprintf(ofile,"OO_%ddotrans",ngto);
fprintf(ofile,"},\n");
} }
fprintf(ofile,"};\n"); fprintf(ofile,"};\n");
fprintf(ofile,"\n"); fprintf(ofile,"\n");
@ -75,7 +156,7 @@ outdfa()
fprintf(ofile,"\t\t\tcase %d: ",s); fprintf(ofile,"\t\t\tcase %d: ",s);
if(actions[p->goto_state]==(struct action *)NULL) if(actions[p->goto_state]==(struct action *)NULL)
fprintf(ofile,"OO_state = %d; ",p->goto_state); fprintf(ofile,"OO_state = %d; ",p->goto_state);
else fprintf(ofile,"OO_dotrans(%d); ",p->goto_state); else fprintf(ofile,"OO_%ddotrans(); ",p->goto_state);
fprintf(ofile,"break;\n"); fprintf(ofile,"break;\n");
} }
} }
@ -115,6 +196,16 @@ outmnems(l)
fprintf(ofile,"%s ",l.m_elems[i-1]->op_code->id_text); fprintf(ofile,"%s ",l.m_elems[i-1]->op_code->id_text);
} }
PRIVATE
outtranshdr()
{
register int s;
for(s=0;s<=higheststate;s++) {
if(actions[s]!=NULL)
fprintf(ofile,"extern OO_%ddotrans();\n",s);
}
}
PRIVATE PRIVATE
outdotrans() outdotrans()
{ {
@ -122,30 +213,25 @@ outdotrans()
int i; int i;
struct state *p; struct state *p;
struct action *a; struct action *a;
int firsttest;
int seennontested; int seennontested;
if((ofile=fopen("trans.c","w"))==NULL) {
fprintf(stderr,"Fatal Error: cannot open output file trans.c\n");
sys_stop(S_EXIT);
}
fprintf(ofile,"#include \"nopt.h\"\n\n"); fprintf(ofile,"#include \"nopt.h\"\n\n");
fprintf(ofile,"\nOO_dotrans(s) int s; {\n"); for(s=0;s<=higheststate;s++) {
fprintf(ofile,"\tregister p_instr *patt = OO_patternqueue;\n");
fprintf(ofile,"\tswitch(OO_state=s) {\n");
fprintf(ofile,"\tdefault: return;\n");
for(s=0;s<=higheststate;s++)
if(actions[s]!=(struct action *)NULL) { if(actions[s]!=(struct action *)NULL) {
fprintf(ofile,"\tcase %d: /*",s); fprintf(ofile,"\nOO_%ddotrans() {\n",s);
fprintf(ofile,"\t/* ");
outmnems(patterns[s]); outmnems(patterns[s]);
fprintf(ofile," */\n"); fprintf(ofile," */\n");
fprintf(ofile,"\tregister p_instr *patt = OO_patternqueue;\n");
seennontested=0; seennontested=0;
firsttest=1;
for(a=actions[s];a!=(struct action *)NULL;a=a->next) { for(a=actions[s];a!=(struct action *)NULL;a=a->next) {
if(a->test!=(struct exp_node *)NULL) { if(a->test!=(struct exp_node *)NULL) {
fprintf(ofile,"\t\tif("); fprintf(ofile,"\tif(");
outexp(a->test,s); outexp(a->test,s);
fprintf(ofile,") {\n"); fprintf(ofile,") {\n");
outoneaction(s,a); outoneaction(s,a);
fprintf(ofile,"\t\t\tgoto free%d;\n",patterns[s].m_len); fprintf(ofile,"\t\tgoto free;\n\t}\n");
fprintf(ofile,"\t\t}\n");
} }
else { else {
if(seennontested) { if(seennontested) {
@ -154,19 +240,19 @@ outdotrans()
} }
seennontested++; seennontested++;
outoneaction(s,a); outoneaction(s,a);
fprintf(ofile,"\t\t\tgoto free%d;\n",patterns[s].m_len);
} }
} }
if(!seennontested) if(!seennontested) {
fprintf(ofile,"\t\treturn;\n"); fprintf(ofile,"\tOO_state=%d;\n",s);
fprintf(ofile,"\treturn;\n");
} }
fprintf(ofile,"\t}\n"); fprintf(ofile,"free:\tOO_nfree(%d);\n",patterns[s].m_len);
for(i=longestpattern;i>0;i--)
fprintf(ofile," free%d: OO_free(*--OO_nxtpatt);\n",i);
fprintf(ofile," free0: ;\n");
fprintf(ofile,"\tOO_state=0;\n");
fprintf(ofile,"}\n"); fprintf(ofile,"}\n");
fprintf(ofile,"\n"); }
/*
* else fprintf(ofile,"\nOO_%ddotrans() {\n\tOO_state=%d;\n}\n",s,s);
*/
}
} }
PRIVATE PRIVATE
@ -176,7 +262,8 @@ outdodefault()
fprintf(ofile,"\tregister struct defact *p = &defaultactions[OO_state];\n"); fprintf(ofile,"\tregister struct defact *p = &defaultactions[OO_state];\n");
fprintf(ofile,"\tOO_pushback(*--OO_nxtpatt);\n"); fprintf(ofile,"\tOO_pushback(*--OO_nxtpatt);\n");
fprintf(ofile,"\tOO_dodefault(p->numoutput,p->numcopy);\n"); fprintf(ofile,"\tOO_dodefault(p->numoutput,p->numcopy);\n");
fprintf(ofile,"\tOO_dotrans(p->nextstate);\n"); fprintf(ofile,"\tOO_state=p->nextstate;\n");
fprintf(ofile,"\tif(p->transstate) (*(p->transstate))();\n");
fprintf(ofile,"}\n"); fprintf(ofile,"}\n");
} }
@ -185,12 +272,11 @@ outoneaction(s,a)
int s; int s;
struct action *a; struct action *a;
{ {
fprintf(ofile,"\t\t/* "); fprintf(ofile,"\t\t/* -> ");
fprintf(ofile," -> ");
outmnems(a->replacement); outmnems(a->replacement);
fprintf(ofile," */\n"); fprintf(ofile," */\n");
fprintf(ofile,"#ifdef STATS\n"); fprintf(ofile,"#ifdef STATS\n");
fprintf(ofile,"\t\t\tif(OO_wrstats) fprintf(stderr,\"%d\\n\");\n",a->linenum); fprintf(ofile,"\t\tif(OO_wrstats) fprintf(stderr,\"%d\\n\");\n",a->linenum);
fprintf(ofile,"#endif\n"); fprintf(ofile,"#endif\n");
outrepl(s,patterns[s],a->replacement); outrepl(s,patterns[s],a->replacement);
findworst(a->replacement); findworst(a->replacement);
@ -212,31 +298,31 @@ outrepl(state,patt,repl)
char *mnem = ri->op_code->id_text; char *mnem = ri->op_code->id_text;
switch(ri->op_code->id_argfmt) { switch(ri->op_code->id_argfmt) {
case NOARG: case NOARG:
fprintf(ofile,"\t\t\tOO_outop(op_%s);\n",mnem); fprintf(ofile,"\t\tOO_outop(op_%s);\n",mnem);
break; break;
case CST: case CST:
case CSTOPT: case CSTOPT:
fprintf(ofile,"\t\t\tOO_outcst(op_%s,",mnem); fprintf(ofile,"\t\tOO_outcst(op_%s,",mnem);
outexp(ri->arg,state); outexp(ri->arg,state);
fprintf(ofile,");\n"); fprintf(ofile,");\n");
break; break;
case LAB: case LAB:
fprintf(ofile,"\t\t\tOO_outlab(op_%s,",mnem); fprintf(ofile,"\t\tOO_outlab(op_%s,",mnem);
outexp(ri->arg,state); outexp(ri->arg,state);
fprintf(ofile,");\n"); fprintf(ofile,");\n");
break; break;
case DEFILB: case DEFILB:
fprintf(ofile,"\t\t\tOO_outdefilb(op_%s,",mnem); fprintf(ofile,"\t\tOO_outdefilb(op_%s,",mnem);
outexp(ri->arg,state); outexp(ri->arg,state);
fprintf(ofile,");\n"); fprintf(ofile,");\n");
break; break;
case PNAM: case PNAM:
fprintf(ofile,"\t\t\tOO_outpnam(op_%s,",mnem); fprintf(ofile,"\t\tOO_outpnam(op_%s,",mnem);
outexp(ri->arg,state); outexp(ri->arg,state);
fprintf(ofile,");\n"); fprintf(ofile,");\n");
break; break;
case EXT: case EXT:
fprintf(ofile,"\t\t\tOO_outext(op_%s,",mnem); fprintf(ofile,"\t\tOO_outext(op_%s,",mnem);
outexp(ri->arg,state); outexp(ri->arg,state);
fprintf(ofile,");\n"); fprintf(ofile,");\n");
break; break;