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:
parent
74ea5e0bd7
commit
64578a3afd
|
@ -26,7 +26,7 @@ PREFLAGS= $(INCLDIR) -DPRIVATE=static# -DDEBUG
|
|||
# from the patterns file each time an optimization is performed.
|
||||
#PREFLAGS= $(PREFLAGS) -DSTATS
|
||||
PROFFLAG= -O
|
||||
CFLAGS = $(PREFLAGS) $(PROFFLAG) -J
|
||||
CFLAGS = $(PREFLAGS) $(PROFFLAG)
|
||||
LLOPT =
|
||||
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
|
||||
|
||||
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\
|
||||
incalls.r.save pseudo.d
|
||||
dfa.c dfa.c.new trans.h trans.h.new trans.c trans.c.new\
|
||||
incalls.d incalls.r incalls.r.new pseudo.d
|
||||
|
||||
all: em_nopt $(LIBOPT)
|
||||
|
||||
|
@ -78,15 +78,9 @@ $(LIBOPT): $(NOFILES) mkstrct.o pseudo.d incalls.d
|
|||
-sh -c 'ranlib $(LIBOPT)'
|
||||
|
||||
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
|
||||
parser </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
|
||||
|
||||
# How to build program to parse patterns table and build c files.
|
||||
|
@ -108,7 +102,7 @@ nopt.o: nopt.h
|
|||
mkstrct.o: nopt.h
|
||||
aux.o: nopt.h
|
||||
pseudo.d: nopt.h makefuns.awk
|
||||
dfa.o: nopt.h dfadummy
|
||||
dfa.o: nopt.h trans.h dfadummy
|
||||
trans.o: nopt.h dfadummy
|
||||
incalls.d: nopt.h makefuns.awk
|
||||
incalls.r: dfadummy
|
||||
|
|
|
@ -30,7 +30,7 @@ findworst(repl)
|
|||
int s;
|
||||
int mostbackups = 0;
|
||||
if(n==0) {
|
||||
fprintf(ofile,"\t\t\tOO_backup(%d);\n", longestpattern-1);
|
||||
fprintf(ofile,"\t\tOO_backup(%d);\n", longestpattern-1);
|
||||
return;
|
||||
}
|
||||
for(s=1;s<=higheststate;s++) {
|
||||
|
@ -57,11 +57,12 @@ findworst(repl)
|
|||
}
|
||||
}
|
||||
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 *resout, *rescpy, *resgto;
|
||||
{
|
||||
/*
|
||||
/* If pattern matching fails in 'state', how many outputs and how many
|
||||
|
@ -85,12 +86,16 @@ findfail(state)
|
|||
continue;
|
||||
if((leftmatch(patterns[s],patterns[state],i,n)==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;
|
||||
}
|
||||
}
|
||||
}
|
||||
fprintf(ofile,"\t{%d,0,0},",n);
|
||||
*resout = n;
|
||||
*rescpy = 0;
|
||||
*resgto = 0;
|
||||
}
|
||||
|
||||
PRIVATE int
|
||||
|
|
|
@ -117,6 +117,15 @@ OO_free(p)
|
|||
*OO_nxtifree++ = p;
|
||||
}
|
||||
|
||||
OO_nfree(n)
|
||||
register int n;
|
||||
{
|
||||
while(n--) {
|
||||
OO_free(*--OO_nxtpatt);
|
||||
}
|
||||
OO_state = 0;
|
||||
}
|
||||
|
||||
char *
|
||||
OO_freestr(str)
|
||||
char *str;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include <em_comp.h>
|
||||
#include <system.h>
|
||||
#include <idf_pkg.spec>
|
||||
#include "emO_code.h"
|
||||
#include <emO_code.h>
|
||||
|
||||
#define OTHER 255
|
||||
|
||||
|
|
|
@ -9,10 +9,6 @@ outputincalls()
|
|||
struct idf *op;
|
||||
int opcode;
|
||||
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) {
|
||||
opcode = op->id_opcode;
|
||||
s = op->id_text;
|
||||
|
|
|
@ -9,22 +9,97 @@ FILE *ofile;
|
|||
|
||||
outputnopt()
|
||||
{
|
||||
if((ofile=fopen("dfa.c","w"))==NULL) {
|
||||
fprintf(stderr,"Couldn't open dfa.c for output\n");
|
||||
sys_stop(S_EXIT);
|
||||
}
|
||||
openofile("dfa.c");
|
||||
outheaders();
|
||||
outtables();
|
||||
outdfa();
|
||||
outdodefault();
|
||||
installofile();
|
||||
openofile("trans.h");
|
||||
outtranshdr();
|
||||
installofile();
|
||||
openofile("trans.c");
|
||||
outdotrans();
|
||||
installofile();
|
||||
openofile("incalls.r");
|
||||
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
|
||||
outheaders()
|
||||
{
|
||||
fprintf(ofile,"#include \"nopt.h\"\n");
|
||||
fprintf(ofile,"#include \"trans.h\"\n");
|
||||
fprintf(ofile,"\n");
|
||||
fprintf(ofile,"int OO_maxpattern = %d;\n", longestpattern);
|
||||
fprintf(ofile,"\n");
|
||||
|
@ -34,15 +109,21 @@ PRIVATE
|
|||
outtables()
|
||||
{
|
||||
int s;
|
||||
int nout, ncpy, ngto;
|
||||
fprintf(ofile,"static struct defact {\n");
|
||||
fprintf(ofile,"\tint numoutput;\n");
|
||||
fprintf(ofile,"\tint numcopy;\n");
|
||||
fprintf(ofile,"\tint nextstate;\n");
|
||||
fprintf(ofile,"\tint (*transstate)();\n");
|
||||
fprintf(ofile,"} defaultactions[] = {\n");
|
||||
for(s=0;s<=higheststate;s++) {
|
||||
findfail(s);
|
||||
if(s%4==3)
|
||||
fprintf(ofile,"\n");
|
||||
findfail(s,&nout,&ncpy,&ngto);
|
||||
fprintf(ofile,"\t{%d, %d, %d, ",nout,ncpy,ngto);
|
||||
if(actions[ngto]==NULL)
|
||||
fprintf(ofile,"0");
|
||||
else
|
||||
fprintf(ofile,"OO_%ddotrans",ngto);
|
||||
fprintf(ofile,"},\n");
|
||||
}
|
||||
fprintf(ofile,"};\n");
|
||||
fprintf(ofile,"\n");
|
||||
|
@ -75,7 +156,7 @@ outdfa()
|
|||
fprintf(ofile,"\t\t\tcase %d: ",s);
|
||||
if(actions[p->goto_state]==(struct action *)NULL)
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
@ -115,6 +196,16 @@ outmnems(l)
|
|||
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
|
||||
outdotrans()
|
||||
{
|
||||
|
@ -122,30 +213,25 @@ outdotrans()
|
|||
int i;
|
||||
struct state *p;
|
||||
struct action *a;
|
||||
int firsttest;
|
||||
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,"\nOO_dotrans(s) int s; {\n");
|
||||
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++)
|
||||
for(s=0;s<=higheststate;s++) {
|
||||
if(actions[s]!=(struct action *)NULL) {
|
||||
fprintf(ofile,"\tcase %d: /*",s);
|
||||
fprintf(ofile,"\nOO_%ddotrans() {\n",s);
|
||||
fprintf(ofile,"\t/* ");
|
||||
outmnems(patterns[s]);
|
||||
fprintf(ofile," */\n");
|
||||
fprintf(ofile,"\tregister p_instr *patt = OO_patternqueue;\n");
|
||||
seennontested=0;
|
||||
firsttest=1;
|
||||
for(a=actions[s];a!=(struct action *)NULL;a=a->next) {
|
||||
if(a->test!=(struct exp_node *)NULL) {
|
||||
fprintf(ofile,"\t\tif(");
|
||||
fprintf(ofile,"\tif(");
|
||||
outexp(a->test,s);
|
||||
fprintf(ofile,") {\n");
|
||||
outoneaction(s,a);
|
||||
fprintf(ofile,"\t\t\tgoto free%d;\n",patterns[s].m_len);
|
||||
fprintf(ofile,"\t\t}\n");
|
||||
fprintf(ofile,"\t\tgoto free;\n\t}\n");
|
||||
}
|
||||
else {
|
||||
if(seennontested) {
|
||||
|
@ -154,19 +240,19 @@ outdotrans()
|
|||
}
|
||||
seennontested++;
|
||||
outoneaction(s,a);
|
||||
fprintf(ofile,"\t\t\tgoto free%d;\n",patterns[s].m_len);
|
||||
}
|
||||
}
|
||||
if(!seennontested)
|
||||
fprintf(ofile,"\t\treturn;\n");
|
||||
if(!seennontested) {
|
||||
fprintf(ofile,"\tOO_state=%d;\n",s);
|
||||
fprintf(ofile,"\treturn;\n");
|
||||
}
|
||||
fprintf(ofile,"\t}\n");
|
||||
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,"free:\tOO_nfree(%d);\n",patterns[s].m_len);
|
||||
fprintf(ofile,"}\n");
|
||||
fprintf(ofile,"\n");
|
||||
}
|
||||
/*
|
||||
* else fprintf(ofile,"\nOO_%ddotrans() {\n\tOO_state=%d;\n}\n",s,s);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
PRIVATE
|
||||
|
@ -176,7 +262,8 @@ outdodefault()
|
|||
fprintf(ofile,"\tregister struct defact *p = &defaultactions[OO_state];\n");
|
||||
fprintf(ofile,"\tOO_pushback(*--OO_nxtpatt);\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");
|
||||
}
|
||||
|
||||
|
@ -185,12 +272,11 @@ outoneaction(s,a)
|
|||
int s;
|
||||
struct action *a;
|
||||
{
|
||||
fprintf(ofile,"\t\t/* ");
|
||||
fprintf(ofile," -> ");
|
||||
fprintf(ofile,"\t\t/* -> ");
|
||||
outmnems(a->replacement);
|
||||
fprintf(ofile," */\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");
|
||||
outrepl(s,patterns[s],a->replacement);
|
||||
findworst(a->replacement);
|
||||
|
@ -212,31 +298,31 @@ outrepl(state,patt,repl)
|
|||
char *mnem = ri->op_code->id_text;
|
||||
switch(ri->op_code->id_argfmt) {
|
||||
case NOARG:
|
||||
fprintf(ofile,"\t\t\tOO_outop(op_%s);\n",mnem);
|
||||
fprintf(ofile,"\t\tOO_outop(op_%s);\n",mnem);
|
||||
break;
|
||||
case CST:
|
||||
case CSTOPT:
|
||||
fprintf(ofile,"\t\t\tOO_outcst(op_%s,",mnem);
|
||||
fprintf(ofile,"\t\tOO_outcst(op_%s,",mnem);
|
||||
outexp(ri->arg,state);
|
||||
fprintf(ofile,");\n");
|
||||
break;
|
||||
case LAB:
|
||||
fprintf(ofile,"\t\t\tOO_outlab(op_%s,",mnem);
|
||||
fprintf(ofile,"\t\tOO_outlab(op_%s,",mnem);
|
||||
outexp(ri->arg,state);
|
||||
fprintf(ofile,");\n");
|
||||
break;
|
||||
case DEFILB:
|
||||
fprintf(ofile,"\t\t\tOO_outdefilb(op_%s,",mnem);
|
||||
fprintf(ofile,"\t\tOO_outdefilb(op_%s,",mnem);
|
||||
outexp(ri->arg,state);
|
||||
fprintf(ofile,");\n");
|
||||
break;
|
||||
case PNAM:
|
||||
fprintf(ofile,"\t\t\tOO_outpnam(op_%s,",mnem);
|
||||
fprintf(ofile,"\t\tOO_outpnam(op_%s,",mnem);
|
||||
outexp(ri->arg,state);
|
||||
fprintf(ofile,");\n");
|
||||
break;
|
||||
case EXT:
|
||||
fprintf(ofile,"\t\t\tOO_outext(op_%s,",mnem);
|
||||
fprintf(ofile,"\t\tOO_outext(op_%s,",mnem);
|
||||
outexp(ri->arg,state);
|
||||
fprintf(ofile,");\n");
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue