fix: resolve forward references if definition is needed in lookfor()

This commit is contained in:
ceriel 1988-09-20 13:31:57 +00:00
parent f8fb06210d
commit 7e502b0937
4 changed files with 58 additions and 15 deletions

View file

@ -12,13 +12,15 @@ CID = $(EMHOME)/bin/cid
CURRDIR = . CURRDIR = .
INCLUDES = -I$(MHDIR) -I$(EMHOME)/h -I$(PKGDIR) INCLUDES = -I$(MHDIR) -I$(EMHOME)/h -I$(PKGDIR)
OLIBS = $(LIBDIR)/libem_mes.a $(OBJECTCODE) $(LIBDIR)/libinput.a $(LIBDIR)/libassert.a $(LIBDIR)/liballoc.a $(MALLOC) $(LIBDIR)/libprint.a $(LIBDIR)/libstring.a $(LIBDIR)/libsystem.a
GF = program.g declar.g expression.g statement.g GF = program.g declar.g expression.g statement.g
GENGFILES= tokenfile.g GENGFILES= tokenfile.g
GFILES =$(GENGFILES) $(GF) GFILES =$(GENGFILES) $(GF)
LLGENOPTIONS = -v LLGENOPTIONS = -v
PROFILE = PROFILE =
CFLAGS = $(PROFILE) $(INCLUDES) -O -DSTATIC= COPTIONS=
CFLAGS = $(PROFILE) $(INCLUDES) $(COPTIONS) -O -DSTATIC=
LINTFLAGS = -DSTATIC= -DNORCSID LINTFLAGS = -DSTATIC= -DNORCSID
MALLOC = $(LIBDIR)/malloc.o MALLOC = $(LIBDIR)/malloc.o
LDFLAGS = -i $(PROFILE) LDFLAGS = -i $(PROFILE)
@ -56,6 +58,18 @@ all: Cfiles
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) $(CURRDIR)/main ; else EMHOME=$(EMHOME); export EMHOME; sh Resolve main ; fi' sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) $(CURRDIR)/main ; else EMHOME=$(EMHOME); export EMHOME; sh Resolve main ; fi'
@rm -f nmclash.o a.out @rm -f nmclash.o a.out
Omain: Cfiles
rm -f *.o
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) "COPTIONS="-DPEEPHOLE $(CURRDIR)/omain ; else EMHOME=$(EMHOME); export EMHOME; ./Resolve omain ; fi'
@rm -f nmclash.o a.out
mv *.o PEEPHOLE
CEmain: Cfiles
rm -f *.o
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) "COPTIONS="-DCODE_EXPANDER $(CURRDIR)/cemain ; else EMHOME=$(EMHOME); export EMHOME; ./Resolve cemain ; fi'
@rm -f nmclash.o a.out
mv *.o CODE_EXPANDER
install: all install: all
cp $(CURRDIR)/main $(EMHOME)/lib/em_m2 cp $(CURRDIR)/main $(EMHOME)/lib/em_m2
rm -f $(EMHOME)/man/em_m2.6 $(EMHOME)/man/modula-2.1 rm -f $(EMHOME)/man/em_m2.6 $(EMHOME)/man/modula-2.1
@ -63,8 +77,8 @@ install: all
cmp: all cmp: all
-cmp $(CURRDIR)/main $(EMHOME)/lib/em_m2 -cmp $(CURRDIR)/main $(EMHOME)/lib/em_m2
-cmp $(CURRDIR)/em_m2.6 $(EMHOME)/man/em_m2.6 -cmp $(CURRDIR)/em_m2.6 $(EMHOME)/man/em_m2.6
-cmp $(CURRDIR)/modula-2.1 $(EMHOME)/man/modula-2.1 -cmp $(CURRDIR)/modula-2.1 $(EMHOME)/man/modula-2.1
opr: opr:
make pr | opr make pr | opr
@ -86,14 +100,14 @@ longnames: $(SRC) $(HFILES)
# entry points not to be used directly # entry points not to be used directly
Cfiles: hfiles LLfiles $(GENC) $(GENH) Makefile Cfiles: hfiles LLfiles $(GENC) $(GENH) Makefile
echo $(SRC) $(HFILES) > Cfiles echo $(SRC) $(HFILES) > Cfiles
LLfiles: $(GFILES) LLfiles: $(GFILES)
$(LLGEN) $(LLGENOPTIONS) $(GFILES) $(LLGEN) $(LLGENOPTIONS) $(GFILES)
@touch LLfiles @touch LLfiles
hfiles: Parameters make.hfiles hfiles: Parameters make.hfiles
make.hfiles Parameters make.hfiles Parameters
touch hfiles touch hfiles
@ -125,10 +139,10 @@ next.c: $(NEXTFILES) ./make.next
char.c: char.tab tab char.c: char.tab tab
tab -fchar.tab >char.c tab -fchar.tab >char.c
tab: tab:
$(CC) tab.c -o tab $(CC) tab.c -o tab
depend: Cfiles depend: Cfiles
sed '/^#AUTOAUTO/,$$d' Makefile > Makefile.new sed '/^#AUTOAUTO/,$$d' Makefile > Makefile.new
echo '#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO' >> Makefile.new echo '#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO' >> Makefile.new
$(MKDEP) $(SRC) |\ $(MKDEP) $(SRC) |\
@ -149,10 +163,19 @@ Xlint:
$(LIBDIR)/llib-lstring.ln \ $(LIBDIR)/llib-lstring.ln \
$(LIBDIR)/llib-lsystem.ln $(LIBDIR)/llib-lsystem.ln
$(CURRDIR)/main: $(OBJ) $(CURRDIR)/main: $(OBJ) $(CURRDIR)/Makefile
$(CC) $(LDFLAGS) $(OBJ) $(LIBDIR)/libem_mes.a $(OBJECTCODE) $(LIBDIR)/libinput.a $(LIBDIR)/libassert.a $(LIBDIR)/liballoc.a $(MALLOC) $(LIBDIR)/libprint.a $(LIBDIR)/libstring.a $(LIBDIR)/libsystem.a -o $(CURRDIR)/main $(CC) $(LDFLAGS) $(OBJ) $(OLIBS) -o $(CURRDIR)/main
-size $(CURRDIR)/main -size $(CURRDIR)/main
$(CURRDIR)/omain: $(OBJ) $(CURRDIR)/Makefile
$(CC) $(LDFLAGS) $(OBJ) $(OLIBS) -o $(CURRDIR)/omain
size $(CURRDIR)/omain
$(CURRDIR)/cemain: $(OBJ) $(CURRDIR)/Makefile
$(CC) $(LDFLAGS) $(OBJ) $(OLIBS) -o $(CURRDIR)/cemain
size $(CURRDIR)/cemain
#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO #AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
LLlex.o: LLlex.h LLlex.o: LLlex.h
LLlex.o: Lpars.h LLlex.o: Lpars.h

View file

@ -12,6 +12,9 @@ currdir=`pwd`
case $1 in case $1 in
main) target=$currdir/$1 main) target=$currdir/$1
;; ;;
omain) target=$currdir/$1
options=-DPEEPHOLE
;;
Xlint) target=$1 Xlint) target=$1
;; ;;
*) echo "$0: $1: Illegal argument" 1>&2 *) echo "$0: $1: Illegal argument" 1>&2
@ -51,4 +54,4 @@ $i: clashes $PW/$i
\$(CID) -Fclashes < $PW/$i > $i \$(CID) -Fclashes < $PW/$i > $i
EOF EOF
done done
make EMHOME=$EMHOME CURRDIR=$currdir $target make EMHOME=$EMHOME CURRDIR=$currdir COPTIONS=$options $target

View file

@ -111,6 +111,7 @@ define(id, scope, kind)
*/ */
register t_def *df; register t_def *df;
DO_DEBUG(options['S'], print("define %s, %x\n", id->id_text, kind));
df = lookup(id, scope, D_IMPORT, 0); df = lookup(id, scope, D_IMPORT, 0);
if ( /* Already in this scope */ if ( /* Already in this scope */
df df

View file

@ -24,6 +24,9 @@
#include "misc.h" #include "misc.h"
extern int pass_1; extern int pass_1;
#ifdef DEBUG
extern char options[];
#endif
t_def * t_def *
lookup(id, scope, import, flags) lookup(id, scope, import, flags)
@ -65,6 +68,7 @@ lookup(id, scope, import, flags)
assert(df->imp_def != 0); assert(df->imp_def != 0);
df = df->imp_def; df = df->imp_def;
} }
DO_DEBUG(options['S'], print("lookup %s, %x\n", id->id_text, df->df_kind));
} }
return df; return df;
} }
@ -78,24 +82,36 @@ lookfor(id, vis, message, flags)
If it is not defined create a dummy definition and, If it is not defined create a dummy definition and,
if message is set, give an error message if message is set, give an error message
*/ */
register t_scopelist *sc = vis; register t_scopelist *sc;
t_scopelist *sc1 = 0;
t_def *df; t_def *df;
while (sc) { for (sc = vis; sc; sc = nextvisible(sc)) {
df = lookup(id->nd_IDF, sc->sc_scope, D_IMPORTED, flags); df = lookup(id->nd_IDF, sc->sc_scope, D_IMPORTED, flags);
if (df) { if (df) {
if (message && df->df_kind == D_FORWARD) {
if (! sc1) sc1 = sc;
while (sc && sc->sc_scope != df->df_scope) {
sc = enclosing(sc);
}
if (sc) continue;
break;
}
if (pass_1 && message) { if (pass_1 && message) {
if (sc1) sc = sc1;
while (vis->sc_scope->sc_level > while (vis->sc_scope->sc_level >
sc->sc_scope->sc_level) { sc->sc_scope->sc_level ||
(sc1 &&
vis->sc_scope->sc_level >=
sc->sc_scope->sc_level)) {
define( id->nd_IDF, define( id->nd_IDF,
vis->sc_scope, vis->sc_scope,
D_INUSE)-> imp_def = df; D_INUSE)-> imp_def = df;
vis = nextvisible(vis); vis = enclosing(vis);
} }
} }
return df; return df;
} }
sc = nextvisible(sc);
} }
if (message) id_not_declared(id); if (message) id_not_declared(id);