introduction of lint source code, governed by ifdef LINT
This commit is contained in:
parent
7e502b0937
commit
6839d8afb1
35 changed files with 3200 additions and 17 deletions
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* L E X I C A L A N A L Y Z E R */
|
/* L E X I C A L A N A L Y Z E R */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include "idfsize.h"
|
#include "idfsize.h"
|
||||||
|
@ -72,6 +73,9 @@ LLlex()
|
||||||
ASIDE = 0;
|
ASIDE = 0;
|
||||||
}
|
}
|
||||||
else { /* read ahead and return the old one */
|
else { /* read ahead and return the old one */
|
||||||
|
#ifdef LINT
|
||||||
|
move_NOT2s();
|
||||||
|
#endif LINT
|
||||||
dot = ahead;
|
dot = ahead;
|
||||||
/* the following test is performed due to the dual
|
/* the following test is performed due to the dual
|
||||||
task of LLlex(): it is also called for parsing the
|
task of LLlex(): it is also called for parsing the
|
||||||
|
@ -472,6 +476,10 @@ skipcomment()
|
||||||
|
|
||||||
NoUnstack++;
|
NoUnstack++;
|
||||||
LoadChar(c);
|
LoadChar(c);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_comment(-2);
|
||||||
|
lint_comment(c);
|
||||||
|
#endif LINT
|
||||||
do {
|
do {
|
||||||
while (c != '*') {
|
while (c != '*') {
|
||||||
if (class(c) == STNL)
|
if (class(c) == STNL)
|
||||||
|
@ -482,8 +490,14 @@ skipcomment()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LoadChar(c);
|
LoadChar(c);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_comment(c);
|
||||||
|
#endif LINT
|
||||||
} /* last Character seen was '*' */
|
} /* last Character seen was '*' */
|
||||||
LoadChar(c);
|
LoadChar(c);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_comment(c);
|
||||||
|
#endif LINT
|
||||||
} while (c != '/');
|
} while (c != '/');
|
||||||
NoUnstack--;
|
NoUnstack--;
|
||||||
}
|
}
|
||||||
|
|
139
lang/cem/cemcom/LintPars
Normal file
139
lang/cem/cemcom/LintPars
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
!File: lint.h
|
||||||
|
#define LINT 1 /* if defined, 'lint' is produced */
|
||||||
|
|
||||||
|
|
||||||
|
!File: pathlength.h
|
||||||
|
#define PATHLENGTH 1024 /* max. length of path to file */
|
||||||
|
|
||||||
|
|
||||||
|
!File: errout.h
|
||||||
|
#define ERROUT STDERR /* file pointer for writing messages */
|
||||||
|
#define MAXERR_LINE 5 /* maximum number of error messages given
|
||||||
|
on the same input line. */
|
||||||
|
|
||||||
|
|
||||||
|
!File: idfsize.h
|
||||||
|
#define IDFSIZE 64 /* maximum significant length of an identifier */
|
||||||
|
|
||||||
|
|
||||||
|
!File: numsize.h
|
||||||
|
#define NUMSIZE 256 /* maximum length of a numeric constant */
|
||||||
|
|
||||||
|
|
||||||
|
!File: nparams.h
|
||||||
|
#define NPARAMS 32 /* maximum number of parameters of macros */
|
||||||
|
|
||||||
|
|
||||||
|
!File: ifdepth.h
|
||||||
|
#define IFDEPTH 256 /* maximum number of nested if-constructions */
|
||||||
|
|
||||||
|
|
||||||
|
!File: density.h
|
||||||
|
#define DENSITY 2 /* see switch.[ch] for an explanation */
|
||||||
|
|
||||||
|
|
||||||
|
!File: lapbuf.h
|
||||||
|
#define LAPBUF 4096 /* size of macro actual parameter buffer */
|
||||||
|
|
||||||
|
|
||||||
|
!File: strsize.h
|
||||||
|
#define ISTRSIZE 32 /* minimum number of bytes allocated for
|
||||||
|
storing a string */
|
||||||
|
#define RSTRSIZE 8 /* step size in enlarging the memory for
|
||||||
|
the storage of a string */
|
||||||
|
|
||||||
|
|
||||||
|
!File: target_sizes.h
|
||||||
|
#define MAXSIZE 8 /* the maximum of the SZ_* constants */
|
||||||
|
|
||||||
|
/* target machine sizes */
|
||||||
|
#define SZ_CHAR (arith)1
|
||||||
|
#define SZ_SHORT (arith)2
|
||||||
|
#define SZ_WORD (arith)4
|
||||||
|
#define SZ_INT (arith)4
|
||||||
|
#define SZ_LONG (arith)4
|
||||||
|
#ifndef NOFLOAT
|
||||||
|
#define SZ_FLOAT (arith)4
|
||||||
|
#define SZ_DOUBLE (arith)8
|
||||||
|
#endif NOFLOAT
|
||||||
|
#define SZ_POINTER (arith)4
|
||||||
|
|
||||||
|
/* target machine alignment requirements */
|
||||||
|
#define AL_CHAR 1
|
||||||
|
#define AL_SHORT SZ_SHORT
|
||||||
|
#define AL_WORD SZ_WORD
|
||||||
|
#define AL_INT SZ_WORD
|
||||||
|
#define AL_LONG SZ_WORD
|
||||||
|
#ifndef NOFLOAT
|
||||||
|
#define AL_FLOAT SZ_WORD
|
||||||
|
#define AL_DOUBLE SZ_WORD
|
||||||
|
#endif NOFLOAT
|
||||||
|
#define AL_POINTER SZ_WORD
|
||||||
|
#define AL_STRUCT 1
|
||||||
|
#define AL_UNION 1
|
||||||
|
|
||||||
|
|
||||||
|
!File: botch_free.h
|
||||||
|
#undef BOTCH_FREE 1 /* when defined, botch freed memory, as a check */
|
||||||
|
|
||||||
|
|
||||||
|
!File: dataflow.h
|
||||||
|
#undef DATAFLOW 1 /* produce some compile-time xref */
|
||||||
|
|
||||||
|
|
||||||
|
!File: debug.h
|
||||||
|
#undef DEBUG 1 /* perform various self-tests */
|
||||||
|
|
||||||
|
|
||||||
|
!File: use_tmp.h
|
||||||
|
#undef USE_TMP 1 /* collect exa, exp, ina and inp commands
|
||||||
|
and let them precede the rest of
|
||||||
|
the generated compact code */
|
||||||
|
|
||||||
|
|
||||||
|
!File: parbufsize.h
|
||||||
|
#define PARBUFSIZE 1024
|
||||||
|
|
||||||
|
|
||||||
|
!File: textsize.h
|
||||||
|
#define ITEXTSIZE 8 /* 1st piece of memory for repl. text */
|
||||||
|
#define RTEXTSIZE 8 /* stepsize for enlarging repl.text */
|
||||||
|
|
||||||
|
|
||||||
|
!File: inputtype.h
|
||||||
|
#define INP_READ_IN_ONE 1 /* read input file in one */
|
||||||
|
|
||||||
|
|
||||||
|
!File: nopp.h
|
||||||
|
#undef NOPP 1 /* if NOT defined, use built-int preprocessor */
|
||||||
|
|
||||||
|
|
||||||
|
!File: nobitfield.h
|
||||||
|
#undef NOBITFIELD 1 /* if NOT defined, implement bitfields */
|
||||||
|
|
||||||
|
|
||||||
|
!File: spec_arith.h
|
||||||
|
/* describes internal compiler arithmetics */
|
||||||
|
#undef SPECIAL_ARITHMETICS /* something different from native long */
|
||||||
|
|
||||||
|
|
||||||
|
!File: static.h
|
||||||
|
#define GSTATIC /* for large global "static" arrays */
|
||||||
|
|
||||||
|
|
||||||
|
!File: nofloat.h
|
||||||
|
#undef NOFLOAT 1 /* if NOT defined, floats are implemented */
|
||||||
|
|
||||||
|
|
||||||
|
!File: noRoption.h
|
||||||
|
#undef NOROPTION 1 /* if NOT defined, R option is implemented */
|
||||||
|
|
||||||
|
|
||||||
|
!File: nocross.h
|
||||||
|
#undef NOCROSS 1 /* if NOT defined, cross compiler */
|
||||||
|
|
||||||
|
|
||||||
|
!File: regcount.h
|
||||||
|
#undef REGCOUNT 1 /* count occurrences for register messages */
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,8 @@ OLIBS = $(INPLIB) $(EMMESOLIB) $(EMOLIB) $(EMKLIB) $(PRTLIB) $(STRLIB) \
|
||||||
$(ALLOCLIB) $(MALLOC) $(SYSLIB)
|
$(ALLOCLIB) $(MALLOC) $(SYSLIB)
|
||||||
CELIBS = $(INPLIB) $(EMMESCELIB) $(EMCELIB) $(PRTLIB) $(STRLIB) \
|
CELIBS = $(INPLIB) $(EMMESCELIB) $(EMCELIB) $(PRTLIB) $(STRLIB) \
|
||||||
$(ALLOCLIB) $(MALLOC) $(SYSLIB)
|
$(ALLOCLIB) $(MALLOC) $(SYSLIB)
|
||||||
|
LLIBS = $(INPLIB) $(EMMESLIB) $(PRTLIB) $(STRLIB) \
|
||||||
|
$(ALLOCLIB) $(MALLOC) $(SYSLIB)
|
||||||
LIB_INCLUDES = -I$(EMHOME)/modules/h -I$(EMHOME)/modules/pkg
|
LIB_INCLUDES = -I$(EMHOME)/modules/h -I$(EMHOME)/modules/pkg
|
||||||
EM_INCLUDES = -I$(EMHOME)/h
|
EM_INCLUDES = -I$(EMHOME)/h
|
||||||
SYSLLIB = $(EMHOME)/modules/lib/llib-lsystem.ln
|
SYSLLIB = $(EMHOME)/modules/lib/llib-lsystem.ln
|
||||||
|
@ -66,7 +68,8 @@ CSRC = main.c idf.c declarator.c decspecs.c struct.c \
|
||||||
input.c domacro.c replace.c init.c options.c \
|
input.c domacro.c replace.c init.c options.c \
|
||||||
scan.c skip.c stack.c type.c ch7mon.c label.c eval.c \
|
scan.c skip.c stack.c type.c ch7mon.c label.c eval.c \
|
||||||
switch.c conversion.c util.c \
|
switch.c conversion.c util.c \
|
||||||
blocks.c dataflow.c Version.c
|
blocks.c dataflow.c Version.c \
|
||||||
|
l_lint.c l_states.c l_misc.c l_ev_ord.c l_outdef.c l_comment.c l_dummy.c
|
||||||
COBJ = main.o idf.o declarator.o decspecs.o struct.o \
|
COBJ = main.o idf.o declarator.o decspecs.o struct.o \
|
||||||
expr.o ch7.o ch7bin.o cstoper.o arith.o \
|
expr.o ch7.o ch7bin.o cstoper.o arith.o \
|
||||||
asm.o code.o dumpidf.o error.o field.o\
|
asm.o code.o dumpidf.o error.o field.o\
|
||||||
|
@ -74,7 +77,8 @@ COBJ = main.o idf.o declarator.o decspecs.o struct.o \
|
||||||
input.o domacro.o replace.o init.o options.o \
|
input.o domacro.o replace.o init.o options.o \
|
||||||
scan.o skip.o stack.o type.o ch7mon.o label.o eval.o \
|
scan.o skip.o stack.o type.o ch7mon.o label.o eval.o \
|
||||||
switch.o conversion.o util.o \
|
switch.o conversion.o util.o \
|
||||||
blocks.o dataflow.o Version.o
|
blocks.o dataflow.o Version.o \
|
||||||
|
l_lint.o l_states.o l_misc.o l_ev_ord.o l_outdef.o l_comment.o l_dummy.o
|
||||||
|
|
||||||
# Objects of other generated C files
|
# Objects of other generated C files
|
||||||
GCSRC = char.c symbol2str.c next.c
|
GCSRC = char.c symbol2str.c next.c
|
||||||
|
@ -82,16 +86,18 @@ GOBJ = char.o symbol2str.o next.o
|
||||||
|
|
||||||
STRSRC = code.str declar.str decspecs.str def.str expr.str field.str \
|
STRSRC = code.str declar.str decspecs.str def.str expr.str field.str \
|
||||||
estack.str util.str \
|
estack.str util.str \
|
||||||
idf.str macro.str stack.str stmt.str struct.str switch.str type.str
|
idf.str macro.str stack.str stmt.str struct.str switch.str type.str \
|
||||||
|
l_brace.str l_state.str l_outdef.str
|
||||||
# generated source files
|
# generated source files
|
||||||
GHSTRSRC = code.h declar.h decspecs.h def.h expr.h field.h \
|
GHSTRSRC = code.h declar.h decspecs.h def.h expr.h field.h \
|
||||||
estack.h util.h \
|
estack.h util.h \
|
||||||
idf.h macro.h stack.h stmt.h struct.h switch.h type.h
|
idf.h macro.h stack.h stmt.h struct.h switch.h type.h \
|
||||||
|
l_brace.h l_state.h l_outdef.h
|
||||||
GSRC = $(GCSRC) $(GHSTRSRC)
|
GSRC = $(GCSRC) $(GHSTRSRC)
|
||||||
|
|
||||||
# .h files generated by `make hfiles LLfiles'; PLEASE KEEP THIS UP-TO-DATE!
|
# .h files generated by `make hfiles LLfiles'; PLEASE KEEP THIS UP-TO-DATE!
|
||||||
GHSRC = botch_free.h dataflow.h debug.h density.h errout.h \
|
GHSRC = botch_free.h dataflow.h debug.h density.h errout.h \
|
||||||
idfsize.h ifdepth.h inputtype.h lapbuf.h \
|
idfsize.h ifdepth.h inputtype.h lapbuf.h lint.h \
|
||||||
nobitfield.h nofloat.h nopp.h noRoption.h nocross.h \
|
nobitfield.h nofloat.h nopp.h noRoption.h nocross.h \
|
||||||
nparams.h numsize.h parbufsize.h pathlength.h Lpars.h \
|
nparams.h numsize.h parbufsize.h pathlength.h Lpars.h \
|
||||||
strsize.h target_sizes.h textsize.h use_tmp.h spec_arith.h static.h \
|
strsize.h target_sizes.h textsize.h use_tmp.h spec_arith.h static.h \
|
||||||
|
@ -99,7 +105,7 @@ GHSRC = botch_free.h dataflow.h debug.h density.h errout.h \
|
||||||
|
|
||||||
HSRC = LLlex.h align.h arith.h assert.h atw.h class.h \
|
HSRC = LLlex.h align.h arith.h assert.h atw.h class.h \
|
||||||
input.h interface.h label.h level.h mes.h sizes.h specials.h \
|
input.h interface.h label.h level.h mes.h sizes.h specials.h \
|
||||||
file_info.h tokenname.h
|
file_info.h tokenname.h l_lint.h
|
||||||
|
|
||||||
HFILES = $(HSRC) $(GHSRC) $(GHSTRSRC)
|
HFILES = $(HSRC) $(GHSRC) $(GHSTRSRC)
|
||||||
|
|
||||||
|
@ -111,6 +117,12 @@ GENERATED = tab tokenfile.g Lpars.h LLfiles LL.output lint.out \
|
||||||
OBJ = $(COBJ) $(LOBJ) $(GOBJ)
|
OBJ = $(COBJ) $(LOBJ) $(GOBJ)
|
||||||
SRC = $(CSRC) $(LCSRC) $(GCSRC)
|
SRC = $(CSRC) $(LCSRC) $(GCSRC)
|
||||||
|
|
||||||
|
LINT = /usr/bin/lint
|
||||||
|
LINTFLAGS =
|
||||||
|
|
||||||
|
MYLINT = ../lint
|
||||||
|
MYLINTFLAGS = #-xh
|
||||||
|
|
||||||
#EXCLEXCLEXCLEXCL
|
#EXCLEXCLEXCLEXCL
|
||||||
|
|
||||||
.SUFFIXES: .str .h
|
.SUFFIXES: .str .h
|
||||||
|
@ -135,6 +147,11 @@ CEmain: Cfiles
|
||||||
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'
|
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 *.o
|
@rm -f nmclash.o a.out *.o
|
||||||
|
|
||||||
|
Lnt: Cfiles
|
||||||
|
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) $(CURRDIR)/lnt ; else EMHOME=$(EMHOME); export EMHOME; ./Resolve lnt ; fi'
|
||||||
|
make "EMHOME="$(EMHOME) $(CURRDIR)/lnt
|
||||||
|
@rm -f nmclash.o a.out
|
||||||
|
|
||||||
install: Main
|
install: Main
|
||||||
rm -f $(EMHOME)/lib/em_cemcom $(EMHOME)/man/em_cemcom.6
|
rm -f $(EMHOME)/lib/em_cemcom $(EMHOME)/man/em_cemcom.6
|
||||||
cp $(CURRDIR)/main $(EMHOME)/lib/em_cemcom
|
cp $(CURRDIR)/main $(EMHOME)/lib/em_cemcom
|
||||||
|
@ -162,6 +179,10 @@ lint: Cfiles
|
||||||
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) Xlint ; else sh Resolve Xlint ; fi'
|
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) Xlint ; else sh Resolve Xlint ; fi'
|
||||||
@rm -f nmclash.o a.out
|
@rm -f nmclash.o a.out
|
||||||
|
|
||||||
|
mylint: Cfiles
|
||||||
|
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) Xmylint ; else sh Resolve Xmylint ; fi'
|
||||||
|
@rm -f nmclash.o a.out
|
||||||
|
|
||||||
longnames: $(SRC) $(HFILES)
|
longnames: $(SRC) $(HFILES)
|
||||||
sh -c 'if test -f longnames ; then : ; else touch longnames ; fi ; $(PRID) -l7 longnames $? > Xlongnames ; mv Xlongnames longnames'
|
sh -c 'if test -f longnames ; then : ; else touch longnames ; fi ; $(PRID) -l7 longnames $? > Xlongnames ; mv Xlongnames longnames'
|
||||||
|
|
||||||
|
@ -208,6 +229,9 @@ switch.h: make.allocd
|
||||||
type.h: make.allocd
|
type.h: make.allocd
|
||||||
estack.h: make.allocd
|
estack.h: make.allocd
|
||||||
util.h: make.allocd
|
util.h: make.allocd
|
||||||
|
l_brace.h: make.allocd
|
||||||
|
l_state.h: make.allocd
|
||||||
|
l_outdef.h: make.allocd
|
||||||
|
|
||||||
depend: Cfiles
|
depend: Cfiles
|
||||||
sed '/^#AUTOAUTO/,$$d' Makefile >Makefile.new
|
sed '/^#AUTOAUTO/,$$d' Makefile >Makefile.new
|
||||||
|
@ -234,8 +258,15 @@ $(CURRDIR)/cemain: $(OBJ) $(CURRDIR)/Makefile
|
||||||
$(CC) $(COPTIONS) $(LDFLAGS) $(OBJ) $(CELIBS) -o $(CURRDIR)/cemain
|
$(CC) $(COPTIONS) $(LDFLAGS) $(OBJ) $(CELIBS) -o $(CURRDIR)/cemain
|
||||||
size $(CURRDIR)/cemain
|
size $(CURRDIR)/cemain
|
||||||
|
|
||||||
Xlint:
|
$(CURRDIR)/lnt: $(OBJ) $(CURRDIR)/Makefile
|
||||||
lint $(CDEFS) $(LINTFLAGS) $(SRC)
|
$(CC) $(COPTIONS) $(LDFLAGS) $(OBJ) $(LLIBS) -o $(CURRDIR)/lnt
|
||||||
|
size $(CURRDIR)/lnt
|
||||||
|
|
||||||
|
Xlint: $(SRC)
|
||||||
|
$(LINT) $(CDEFS) $(LINTFLAGS) $(SRC)
|
||||||
|
|
||||||
|
Xmylint: $(SRC)
|
||||||
|
$(MYLINT) $(CDEFS) $(MYLINTFLAGS) $(SRC)
|
||||||
|
|
||||||
#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
|
#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
|
||||||
main.o: LLlex.h
|
main.o: LLlex.h
|
||||||
|
@ -249,6 +280,7 @@ main.o: idf.h
|
||||||
main.o: input.h
|
main.o: input.h
|
||||||
main.o: inputtype.h
|
main.o: inputtype.h
|
||||||
main.o: level.h
|
main.o: level.h
|
||||||
|
main.o: lint.h
|
||||||
main.o: noRoption.h
|
main.o: noRoption.h
|
||||||
main.o: nobitfield.h
|
main.o: nobitfield.h
|
||||||
main.o: nocross.h
|
main.o: nocross.h
|
||||||
|
@ -276,6 +308,7 @@ idf.o: idf.h
|
||||||
idf.o: idfsize.h
|
idf.o: idfsize.h
|
||||||
idf.o: label.h
|
idf.o: label.h
|
||||||
idf.o: level.h
|
idf.o: level.h
|
||||||
|
idf.o: lint.h
|
||||||
idf.o: noRoption.h
|
idf.o: noRoption.h
|
||||||
idf.o: nobitfield.h
|
idf.o: nobitfield.h
|
||||||
idf.o: nocross.h
|
idf.o: nocross.h
|
||||||
|
@ -305,9 +338,12 @@ declarator.o: target_sizes.h
|
||||||
declarator.o: type.h
|
declarator.o: type.h
|
||||||
decspecs.o: Lpars.h
|
decspecs.o: Lpars.h
|
||||||
decspecs.o: arith.h
|
decspecs.o: arith.h
|
||||||
|
decspecs.o: assert.h
|
||||||
|
decspecs.o: debug.h
|
||||||
decspecs.o: decspecs.h
|
decspecs.o: decspecs.h
|
||||||
decspecs.o: def.h
|
decspecs.o: def.h
|
||||||
decspecs.o: level.h
|
decspecs.o: level.h
|
||||||
|
decspecs.o: lint.h
|
||||||
decspecs.o: noRoption.h
|
decspecs.o: noRoption.h
|
||||||
decspecs.o: nobitfield.h
|
decspecs.o: nobitfield.h
|
||||||
decspecs.o: nofloat.h
|
decspecs.o: nofloat.h
|
||||||
|
@ -325,6 +361,7 @@ struct.o: field.h
|
||||||
struct.o: file_info.h
|
struct.o: file_info.h
|
||||||
struct.o: idf.h
|
struct.o: idf.h
|
||||||
struct.o: level.h
|
struct.o: level.h
|
||||||
|
struct.o: lint.h
|
||||||
struct.o: noRoption.h
|
struct.o: noRoption.h
|
||||||
struct.o: nobitfield.h
|
struct.o: nobitfield.h
|
||||||
struct.o: nocross.h
|
struct.o: nocross.h
|
||||||
|
@ -348,6 +385,7 @@ expr.o: file_info.h
|
||||||
expr.o: idf.h
|
expr.o: idf.h
|
||||||
expr.o: label.h
|
expr.o: label.h
|
||||||
expr.o: level.h
|
expr.o: level.h
|
||||||
|
expr.o: lint.h
|
||||||
expr.o: noRoption.h
|
expr.o: noRoption.h
|
||||||
expr.o: nobitfield.h
|
expr.o: nobitfield.h
|
||||||
expr.o: nocross.h
|
expr.o: nocross.h
|
||||||
|
@ -365,6 +403,7 @@ ch7.o: def.h
|
||||||
ch7.o: expr.h
|
ch7.o: expr.h
|
||||||
ch7.o: idf.h
|
ch7.o: idf.h
|
||||||
ch7.o: label.h
|
ch7.o: label.h
|
||||||
|
ch7.o: lint.h
|
||||||
ch7.o: nobitfield.h
|
ch7.o: nobitfield.h
|
||||||
ch7.o: nofloat.h
|
ch7.o: nofloat.h
|
||||||
ch7.o: nopp.h
|
ch7.o: nopp.h
|
||||||
|
@ -401,7 +440,6 @@ cstoper.o: target_sizes.h
|
||||||
cstoper.o: type.h
|
cstoper.o: type.h
|
||||||
arith.o: Lpars.h
|
arith.o: Lpars.h
|
||||||
arith.o: arith.h
|
arith.o: arith.h
|
||||||
arith.o: botch_free.h
|
|
||||||
arith.o: expr.h
|
arith.o: expr.h
|
||||||
arith.o: field.h
|
arith.o: field.h
|
||||||
arith.o: idf.h
|
arith.o: idf.h
|
||||||
|
@ -427,8 +465,10 @@ code.o: def.h
|
||||||
code.o: expr.h
|
code.o: expr.h
|
||||||
code.o: file_info.h
|
code.o: file_info.h
|
||||||
code.o: idf.h
|
code.o: idf.h
|
||||||
|
code.o: l_lint.h
|
||||||
code.o: label.h
|
code.o: label.h
|
||||||
code.o: level.h
|
code.o: level.h
|
||||||
|
code.o: lint.h
|
||||||
code.o: noRoption.h
|
code.o: noRoption.h
|
||||||
code.o: nobitfield.h
|
code.o: nobitfield.h
|
||||||
code.o: nocross.h
|
code.o: nocross.h
|
||||||
|
@ -450,6 +490,7 @@ dumpidf.o: expr.h
|
||||||
dumpidf.o: field.h
|
dumpidf.o: field.h
|
||||||
dumpidf.o: idf.h
|
dumpidf.o: idf.h
|
||||||
dumpidf.o: label.h
|
dumpidf.o: label.h
|
||||||
|
dumpidf.o: lint.h
|
||||||
dumpidf.o: nobitfield.h
|
dumpidf.o: nobitfield.h
|
||||||
dumpidf.o: nofloat.h
|
dumpidf.o: nofloat.h
|
||||||
dumpidf.o: nopp.h
|
dumpidf.o: nopp.h
|
||||||
|
@ -461,10 +502,12 @@ dumpidf.o: type.h
|
||||||
error.o: LLlex.h
|
error.o: LLlex.h
|
||||||
error.o: arith.h
|
error.o: arith.h
|
||||||
error.o: debug.h
|
error.o: debug.h
|
||||||
|
error.o: def.h
|
||||||
error.o: errout.h
|
error.o: errout.h
|
||||||
error.o: expr.h
|
error.o: expr.h
|
||||||
error.o: file_info.h
|
error.o: file_info.h
|
||||||
error.o: label.h
|
error.o: label.h
|
||||||
|
error.o: lint.h
|
||||||
error.o: nofloat.h
|
error.o: nofloat.h
|
||||||
error.o: nopp.h
|
error.o: nopp.h
|
||||||
error.o: spec_arith.h
|
error.o: spec_arith.h
|
||||||
|
@ -479,6 +522,7 @@ field.o: expr.h
|
||||||
field.o: field.h
|
field.o: field.h
|
||||||
field.o: idf.h
|
field.o: idf.h
|
||||||
field.o: label.h
|
field.o: label.h
|
||||||
|
field.o: lint.h
|
||||||
field.o: nobitfield.h
|
field.o: nobitfield.h
|
||||||
field.o: nocross.h
|
field.o: nocross.h
|
||||||
field.o: nofloat.h
|
field.o: nofloat.h
|
||||||
|
@ -507,6 +551,7 @@ LLlex.o: file_info.h
|
||||||
LLlex.o: idf.h
|
LLlex.o: idf.h
|
||||||
LLlex.o: idfsize.h
|
LLlex.o: idfsize.h
|
||||||
LLlex.o: input.h
|
LLlex.o: input.h
|
||||||
|
LLlex.o: lint.h
|
||||||
LLlex.o: nocross.h
|
LLlex.o: nocross.h
|
||||||
LLlex.o: nofloat.h
|
LLlex.o: nofloat.h
|
||||||
LLlex.o: nopp.h
|
LLlex.o: nopp.h
|
||||||
|
@ -575,6 +620,7 @@ options.o: class.h
|
||||||
options.o: dataflow.h
|
options.o: dataflow.h
|
||||||
options.o: idf.h
|
options.o: idf.h
|
||||||
options.o: idfsize.h
|
options.o: idfsize.h
|
||||||
|
options.o: lint.h
|
||||||
options.o: macro.h
|
options.o: macro.h
|
||||||
options.o: noRoption.h
|
options.o: noRoption.h
|
||||||
options.o: nobitfield.h
|
options.o: nobitfield.h
|
||||||
|
@ -610,6 +656,7 @@ stack.o: debug.h
|
||||||
stack.o: def.h
|
stack.o: def.h
|
||||||
stack.o: idf.h
|
stack.o: idf.h
|
||||||
stack.o: level.h
|
stack.o: level.h
|
||||||
|
stack.o: lint.h
|
||||||
stack.o: mes.h
|
stack.o: mes.h
|
||||||
stack.o: noRoption.h
|
stack.o: noRoption.h
|
||||||
stack.o: nobitfield.h
|
stack.o: nobitfield.h
|
||||||
|
@ -625,6 +672,7 @@ type.o: arith.h
|
||||||
type.o: botch_free.h
|
type.o: botch_free.h
|
||||||
type.o: def.h
|
type.o: def.h
|
||||||
type.o: idf.h
|
type.o: idf.h
|
||||||
|
type.o: lint.h
|
||||||
type.o: nobitfield.h
|
type.o: nobitfield.h
|
||||||
type.o: nocross.h
|
type.o: nocross.h
|
||||||
type.o: nofloat.h
|
type.o: nofloat.h
|
||||||
|
@ -640,6 +688,7 @@ ch7mon.o: def.h
|
||||||
ch7mon.o: expr.h
|
ch7mon.o: expr.h
|
||||||
ch7mon.o: idf.h
|
ch7mon.o: idf.h
|
||||||
ch7mon.o: label.h
|
ch7mon.o: label.h
|
||||||
|
ch7mon.o: lint.h
|
||||||
ch7mon.o: nobitfield.h
|
ch7mon.o: nobitfield.h
|
||||||
ch7mon.o: nofloat.h
|
ch7mon.o: nofloat.h
|
||||||
ch7mon.o: nopp.h
|
ch7mon.o: nopp.h
|
||||||
|
@ -651,6 +700,7 @@ label.o: def.h
|
||||||
label.o: idf.h
|
label.o: idf.h
|
||||||
label.o: label.h
|
label.o: label.h
|
||||||
label.o: level.h
|
label.o: level.h
|
||||||
|
label.o: lint.h
|
||||||
label.o: noRoption.h
|
label.o: noRoption.h
|
||||||
label.o: nobitfield.h
|
label.o: nobitfield.h
|
||||||
label.o: nofloat.h
|
label.o: nofloat.h
|
||||||
|
@ -670,6 +720,7 @@ eval.o: expr.h
|
||||||
eval.o: idf.h
|
eval.o: idf.h
|
||||||
eval.o: label.h
|
eval.o: label.h
|
||||||
eval.o: level.h
|
eval.o: level.h
|
||||||
|
eval.o: lint.h
|
||||||
eval.o: mes.h
|
eval.o: mes.h
|
||||||
eval.o: nobitfield.h
|
eval.o: nobitfield.h
|
||||||
eval.o: nocross.h
|
eval.o: nocross.h
|
||||||
|
@ -700,6 +751,7 @@ switch.o: switch.h
|
||||||
switch.o: type.h
|
switch.o: type.h
|
||||||
conversion.o: Lpars.h
|
conversion.o: Lpars.h
|
||||||
conversion.o: arith.h
|
conversion.o: arith.h
|
||||||
|
conversion.o: lint.h
|
||||||
conversion.o: nobitfield.h
|
conversion.o: nobitfield.h
|
||||||
conversion.o: nocross.h
|
conversion.o: nocross.h
|
||||||
conversion.o: nofloat.h
|
conversion.o: nofloat.h
|
||||||
|
@ -710,6 +762,7 @@ conversion.o: type.h
|
||||||
util.o: Lpars.h
|
util.o: Lpars.h
|
||||||
util.o: align.h
|
util.o: align.h
|
||||||
util.o: def.h
|
util.o: def.h
|
||||||
|
util.o: lint.h
|
||||||
util.o: nocross.h
|
util.o: nocross.h
|
||||||
util.o: nofloat.h
|
util.o: nofloat.h
|
||||||
util.o: regcount.h
|
util.o: regcount.h
|
||||||
|
@ -723,6 +776,7 @@ blocks.o: align.h
|
||||||
blocks.o: arith.h
|
blocks.o: arith.h
|
||||||
blocks.o: atw.h
|
blocks.o: atw.h
|
||||||
blocks.o: label.h
|
blocks.o: label.h
|
||||||
|
blocks.o: lint.h
|
||||||
blocks.o: nocross.h
|
blocks.o: nocross.h
|
||||||
blocks.o: nofloat.h
|
blocks.o: nofloat.h
|
||||||
blocks.o: sizes.h
|
blocks.o: sizes.h
|
||||||
|
@ -730,10 +784,116 @@ blocks.o: spec_arith.h
|
||||||
blocks.o: stack.h
|
blocks.o: stack.h
|
||||||
blocks.o: target_sizes.h
|
blocks.o: target_sizes.h
|
||||||
dataflow.o: dataflow.h
|
dataflow.o: dataflow.h
|
||||||
|
l_lint.o: LLlex.h
|
||||||
|
l_lint.o: Lpars.h
|
||||||
|
l_lint.o: arith.h
|
||||||
|
l_lint.o: code.h
|
||||||
|
l_lint.o: def.h
|
||||||
|
l_lint.o: expr.h
|
||||||
|
l_lint.o: file_info.h
|
||||||
|
l_lint.o: idf.h
|
||||||
|
l_lint.o: l_lint.h
|
||||||
|
l_lint.o: l_outdef.h
|
||||||
|
l_lint.o: l_state.h
|
||||||
|
l_lint.o: label.h
|
||||||
|
l_lint.o: level.h
|
||||||
|
l_lint.o: lint.h
|
||||||
|
l_lint.o: nobitfield.h
|
||||||
|
l_lint.o: nofloat.h
|
||||||
|
l_lint.o: nopp.h
|
||||||
|
l_lint.o: spec_arith.h
|
||||||
|
l_lint.o: stack.h
|
||||||
|
l_lint.o: type.h
|
||||||
|
l_states.o: LLlex.h
|
||||||
|
l_states.o: Lpars.h
|
||||||
|
l_states.o: arith.h
|
||||||
|
l_states.o: assert.h
|
||||||
|
l_states.o: code.h
|
||||||
|
l_states.o: debug.h
|
||||||
|
l_states.o: def.h
|
||||||
|
l_states.o: expr.h
|
||||||
|
l_states.o: file_info.h
|
||||||
|
l_states.o: idf.h
|
||||||
|
l_states.o: l_brace.h
|
||||||
|
l_states.o: l_lint.h
|
||||||
|
l_states.o: l_outdef.h
|
||||||
|
l_states.o: l_state.h
|
||||||
|
l_states.o: label.h
|
||||||
|
l_states.o: level.h
|
||||||
|
l_states.o: lint.h
|
||||||
|
l_states.o: nobitfield.h
|
||||||
|
l_states.o: nofloat.h
|
||||||
|
l_states.o: nopp.h
|
||||||
|
l_states.o: spec_arith.h
|
||||||
|
l_states.o: stack.h
|
||||||
|
l_states.o: type.h
|
||||||
|
l_misc.o: LLlex.h
|
||||||
|
l_misc.o: Lpars.h
|
||||||
|
l_misc.o: arith.h
|
||||||
|
l_misc.o: code.h
|
||||||
|
l_misc.o: def.h
|
||||||
|
l_misc.o: expr.h
|
||||||
|
l_misc.o: file_info.h
|
||||||
|
l_misc.o: idf.h
|
||||||
|
l_misc.o: l_state.h
|
||||||
|
l_misc.o: label.h
|
||||||
|
l_misc.o: level.h
|
||||||
|
l_misc.o: lint.h
|
||||||
|
l_misc.o: nobitfield.h
|
||||||
|
l_misc.o: nofloat.h
|
||||||
|
l_misc.o: nopp.h
|
||||||
|
l_misc.o: spec_arith.h
|
||||||
|
l_misc.o: stack.h
|
||||||
|
l_misc.o: type.h
|
||||||
|
l_ev_ord.o: LLlex.h
|
||||||
|
l_ev_ord.o: Lpars.h
|
||||||
|
l_ev_ord.o: arith.h
|
||||||
|
l_ev_ord.o: code.h
|
||||||
|
l_ev_ord.o: def.h
|
||||||
|
l_ev_ord.o: expr.h
|
||||||
|
l_ev_ord.o: file_info.h
|
||||||
|
l_ev_ord.o: idf.h
|
||||||
|
l_ev_ord.o: l_lint.h
|
||||||
|
l_ev_ord.o: l_state.h
|
||||||
|
l_ev_ord.o: label.h
|
||||||
|
l_ev_ord.o: level.h
|
||||||
|
l_ev_ord.o: lint.h
|
||||||
|
l_ev_ord.o: nobitfield.h
|
||||||
|
l_ev_ord.o: nofloat.h
|
||||||
|
l_ev_ord.o: nopp.h
|
||||||
|
l_ev_ord.o: spec_arith.h
|
||||||
|
l_ev_ord.o: stack.h
|
||||||
|
l_ev_ord.o: type.h
|
||||||
|
l_outdef.o: LLlex.h
|
||||||
|
l_outdef.o: Lpars.h
|
||||||
|
l_outdef.o: arith.h
|
||||||
|
l_outdef.o: def.h
|
||||||
|
l_outdef.o: expr.h
|
||||||
|
l_outdef.o: field.h
|
||||||
|
l_outdef.o: file_info.h
|
||||||
|
l_outdef.o: idf.h
|
||||||
|
l_outdef.o: l_class.h
|
||||||
|
l_outdef.o: l_lint.h
|
||||||
|
l_outdef.o: l_outdef.h
|
||||||
|
l_outdef.o: label.h
|
||||||
|
l_outdef.o: level.h
|
||||||
|
l_outdef.o: lint.h
|
||||||
|
l_outdef.o: nobitfield.h
|
||||||
|
l_outdef.o: nofloat.h
|
||||||
|
l_outdef.o: nopp.h
|
||||||
|
l_outdef.o: spec_arith.h
|
||||||
|
l_outdef.o: stack.h
|
||||||
|
l_outdef.o: struct.h
|
||||||
|
l_outdef.o: type.h
|
||||||
|
l_comment.o: arith.h
|
||||||
|
l_comment.o: l_state.h
|
||||||
|
l_comment.o: lint.h
|
||||||
|
l_comment.o: spec_arith.h
|
||||||
tokenfile.o: Lpars.h
|
tokenfile.o: Lpars.h
|
||||||
declar.o: LLlex.h
|
declar.o: LLlex.h
|
||||||
declar.o: Lpars.h
|
declar.o: Lpars.h
|
||||||
declar.o: arith.h
|
declar.o: arith.h
|
||||||
|
declar.o: code.h
|
||||||
declar.o: debug.h
|
declar.o: debug.h
|
||||||
declar.o: declar.h
|
declar.o: declar.h
|
||||||
declar.o: decspecs.h
|
declar.o: decspecs.h
|
||||||
|
@ -742,8 +902,11 @@ declar.o: expr.h
|
||||||
declar.o: field.h
|
declar.o: field.h
|
||||||
declar.o: file_info.h
|
declar.o: file_info.h
|
||||||
declar.o: idf.h
|
declar.o: idf.h
|
||||||
|
declar.o: l_lint.h
|
||||||
|
declar.o: l_state.h
|
||||||
declar.o: label.h
|
declar.o: label.h
|
||||||
declar.o: level.h
|
declar.o: level.h
|
||||||
|
declar.o: lint.h
|
||||||
declar.o: nobitfield.h
|
declar.o: nobitfield.h
|
||||||
declar.o: nocross.h
|
declar.o: nocross.h
|
||||||
declar.o: nofloat.h
|
declar.o: nofloat.h
|
||||||
|
@ -763,7 +926,10 @@ statement.o: def.h
|
||||||
statement.o: expr.h
|
statement.o: expr.h
|
||||||
statement.o: file_info.h
|
statement.o: file_info.h
|
||||||
statement.o: idf.h
|
statement.o: idf.h
|
||||||
|
statement.o: l_lint.h
|
||||||
|
statement.o: l_state.h
|
||||||
statement.o: label.h
|
statement.o: label.h
|
||||||
|
statement.o: lint.h
|
||||||
statement.o: nobitfield.h
|
statement.o: nobitfield.h
|
||||||
statement.o: nofloat.h
|
statement.o: nofloat.h
|
||||||
statement.o: nopp.h
|
statement.o: nopp.h
|
||||||
|
@ -773,10 +939,12 @@ statement.o: type.h
|
||||||
expression.o: LLlex.h
|
expression.o: LLlex.h
|
||||||
expression.o: Lpars.h
|
expression.o: Lpars.h
|
||||||
expression.o: arith.h
|
expression.o: arith.h
|
||||||
|
expression.o: code.h
|
||||||
expression.o: expr.h
|
expression.o: expr.h
|
||||||
expression.o: file_info.h
|
expression.o: file_info.h
|
||||||
expression.o: idf.h
|
expression.o: idf.h
|
||||||
expression.o: label.h
|
expression.o: label.h
|
||||||
|
expression.o: lint.h
|
||||||
expression.o: noRoption.h
|
expression.o: noRoption.h
|
||||||
expression.o: nobitfield.h
|
expression.o: nobitfield.h
|
||||||
expression.o: nofloat.h
|
expression.o: nofloat.h
|
||||||
|
@ -793,7 +961,9 @@ program.o: def.h
|
||||||
program.o: expr.h
|
program.o: expr.h
|
||||||
program.o: file_info.h
|
program.o: file_info.h
|
||||||
program.o: idf.h
|
program.o: idf.h
|
||||||
|
program.o: l_state.h
|
||||||
program.o: label.h
|
program.o: label.h
|
||||||
|
program.o: lint.h
|
||||||
program.o: nobitfield.h
|
program.o: nobitfield.h
|
||||||
program.o: nofloat.h
|
program.o: nofloat.h
|
||||||
program.o: nopp.h
|
program.o: nopp.h
|
||||||
|
@ -804,6 +974,7 @@ ival.o: LLlex.h
|
||||||
ival.o: Lpars.h
|
ival.o: Lpars.h
|
||||||
ival.o: arith.h
|
ival.o: arith.h
|
||||||
ival.o: assert.h
|
ival.o: assert.h
|
||||||
|
ival.o: code.h
|
||||||
ival.o: debug.h
|
ival.o: debug.h
|
||||||
ival.o: def.h
|
ival.o: def.h
|
||||||
ival.o: estack.h
|
ival.o: estack.h
|
||||||
|
@ -811,8 +982,10 @@ ival.o: expr.h
|
||||||
ival.o: field.h
|
ival.o: field.h
|
||||||
ival.o: file_info.h
|
ival.o: file_info.h
|
||||||
ival.o: idf.h
|
ival.o: idf.h
|
||||||
|
ival.o: l_lint.h
|
||||||
ival.o: label.h
|
ival.o: label.h
|
||||||
ival.o: level.h
|
ival.o: level.h
|
||||||
|
ival.o: lint.h
|
||||||
ival.o: noRoption.h
|
ival.o: noRoption.h
|
||||||
ival.o: nobitfield.h
|
ival.o: nobitfield.h
|
||||||
ival.o: nocross.h
|
ival.o: nocross.h
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
!File: lint.h
|
||||||
|
#undef LINT 1 /* if defined, 'lint' is produced */
|
||||||
|
|
||||||
|
|
||||||
!File: pathlength.h
|
!File: pathlength.h
|
||||||
#define PATHLENGTH 1024 /* max. length of path to file */
|
#define PATHLENGTH 1024 /* max. length of path to file */
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ esac
|
||||||
PW=`pwd`
|
PW=`pwd`
|
||||||
options=
|
options=
|
||||||
case $1 in
|
case $1 in
|
||||||
main|emain)
|
main|emain|lnt)
|
||||||
target=$PW/$1
|
target=$PW/$1
|
||||||
;;
|
;;
|
||||||
omain)
|
omain)
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* B L O C K S T O R I N G A N D L O A D I N G */
|
/* B L O C K S T O R I N G A N D L O A D I N G */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
#ifndef LINT
|
||||||
|
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
#include <em_reg.h>
|
#include <em_reg.h>
|
||||||
#include "arith.h"
|
#include "arith.h"
|
||||||
|
@ -161,3 +164,5 @@ copy_loop(sz, src, dst)
|
||||||
}
|
}
|
||||||
#endif STB
|
#endif STB
|
||||||
|
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* S E M A N T I C A N A L Y S I S -- C H A P T E R 7 RM */
|
/* S E M A N T I C A N A L Y S I S -- C H A P T E R 7 RM */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "nobitfield.h"
|
#include "nobitfield.h"
|
||||||
|
@ -218,6 +219,10 @@ ch7cast(expp, oper, tp)
|
||||||
if (oper != CAST)
|
if (oper != CAST)
|
||||||
expr_warning(*expp, "incompatible pointers in %s",
|
expr_warning(*expp, "incompatible pointers in %s",
|
||||||
symbol2str(oper));
|
symbol2str(oper));
|
||||||
|
#ifdef LINT
|
||||||
|
if (oper == CAST)
|
||||||
|
lint_ptr_conv(oldtp->tp_up->tp_fund, tp->tp_up->tp_fund);
|
||||||
|
#endif LINT
|
||||||
(*expp)->ex_type = tp; /* free conversion */
|
(*expp)->ex_type = tp; /* free conversion */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* C O D E - G E N E R A T I N G R O U T I N E S */
|
/* C O D E - G E N E R A T I N G R O U T I N E S */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
#include "botch_free.h"
|
#include "botch_free.h"
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
|
@ -29,6 +30,10 @@
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "noRoption.h"
|
#include "noRoption.h"
|
||||||
#include "file_info.h"
|
#include "file_info.h"
|
||||||
|
#ifdef LINT
|
||||||
|
#include "l_lint.h"
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
label lab_count = 1;
|
label lab_count = 1;
|
||||||
label datlab_count = 1;
|
label datlab_count = 1;
|
||||||
|
|
||||||
|
@ -49,6 +54,7 @@ static int pro_id;
|
||||||
extern char options[];
|
extern char options[];
|
||||||
extern char *symbol2str();
|
extern char *symbol2str();
|
||||||
|
|
||||||
|
#ifndef LINT
|
||||||
init_code(dst_file)
|
init_code(dst_file)
|
||||||
char *dst_file;
|
char *dst_file;
|
||||||
{
|
{
|
||||||
|
@ -64,6 +70,8 @@ init_code(dst_file)
|
||||||
C_insertpart(tmp_id = C_getid());
|
C_insertpart(tmp_id = C_getid());
|
||||||
#endif USE_TMP
|
#endif USE_TMP
|
||||||
}
|
}
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
static struct string_cst *str_list = 0;
|
static struct string_cst *str_list = 0;
|
||||||
|
|
||||||
code_string(val, len, dlb)
|
code_string(val, len, dlb)
|
||||||
|
@ -262,6 +270,7 @@ end_proc(fbytes)
|
||||||
if (return_expr_occurred) C_asp(-func_size);
|
if (return_expr_occurred) C_asp(-func_size);
|
||||||
C_df_ilb(return_label);
|
C_df_ilb(return_label);
|
||||||
prc_exit();
|
prc_exit();
|
||||||
|
#ifndef LINT
|
||||||
if (return_expr_occurred) {
|
if (return_expr_occurred) {
|
||||||
if (func_res_label != 0) {
|
if (func_res_label != 0) {
|
||||||
C_lae_dlb(func_res_label, (arith)0);
|
C_lae_dlb(func_res_label, (arith)0);
|
||||||
|
@ -273,6 +282,8 @@ end_proc(fbytes)
|
||||||
C_ret(func_size);
|
C_ret(func_size);
|
||||||
}
|
}
|
||||||
else C_ret((arith) 0);
|
else C_ret((arith) 0);
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
/* getting the number of "local" bytes is posponed until here,
|
/* getting the number of "local" bytes is posponed until here,
|
||||||
because copying the function result in "func_res_label" may
|
because copying the function result in "func_res_label" may
|
||||||
need temporaries! However, local_level is now L_FORMAL2, because
|
need temporaries! However, local_level is now L_FORMAL2, because
|
||||||
|
@ -466,6 +477,7 @@ loc_init(expr, id)
|
||||||
}
|
}
|
||||||
else { /* not embraced */
|
else { /* not embraced */
|
||||||
ch7cast(&expr, '=', tp); /* may modify expr */
|
ch7cast(&expr, '=', tp); /* may modify expr */
|
||||||
|
#ifndef LINT
|
||||||
{
|
{
|
||||||
struct value vl;
|
struct value vl;
|
||||||
|
|
||||||
|
@ -475,6 +487,9 @@ loc_init(expr, id)
|
||||||
vl.vl_value = (arith)0;
|
vl.vl_value = (arith)0;
|
||||||
store_val(&vl, tp);
|
store_val(&vl, tp);
|
||||||
}
|
}
|
||||||
|
#else LINT
|
||||||
|
id->id_def->df_set = 1;
|
||||||
|
#endif LINT
|
||||||
free_expression(expr);
|
free_expression(expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -522,6 +537,9 @@ formal_cvt(df)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
/*ARGSUSED*/
|
||||||
|
#endif LINT
|
||||||
code_expr(expr, val, code, tlbl, flbl)
|
code_expr(expr, val, code, tlbl, flbl)
|
||||||
struct expr *expr;
|
struct expr *expr;
|
||||||
label tlbl, flbl;
|
label tlbl, flbl;
|
||||||
|
@ -530,9 +548,13 @@ code_expr(expr, val, code, tlbl, flbl)
|
||||||
generator. If line number trace is wanted, it generates a
|
generator. If line number trace is wanted, it generates a
|
||||||
lin instruction. EVAL() is called directly.
|
lin instruction. EVAL() is called directly.
|
||||||
*/
|
*/
|
||||||
|
#ifndef LINT
|
||||||
if (! options['L']) /* profiling */
|
if (! options['L']) /* profiling */
|
||||||
C_lin((arith)(expr->ex_line));
|
C_lin((arith)(expr->ex_line));
|
||||||
EVAL(expr, val, code, tlbl, flbl);
|
EVAL(expr, val, code, tlbl, flbl);
|
||||||
|
#else LINT
|
||||||
|
pre_lint_expr(expr, RVAL, code ? USED : IGNORED);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The FOR/WHILE/DO/SWITCH stacking mechanism:
|
/* The FOR/WHILE/DO/SWITCH stacking mechanism:
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* C O N V E R S I O N - C O D E G E N E R A T O R */
|
/* C O N V E R S I O N - C O D E G E N E R A T O R */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
#ifndef LINT
|
||||||
|
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
#include "arith.h"
|
#include "arith.h"
|
||||||
|
@ -149,3 +152,5 @@ convtype(tp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
/* DECLARATION SYNTAX PARSER */
|
/* DECLARATION SYNTAX PARSER */
|
||||||
|
|
||||||
{
|
{
|
||||||
|
#include "lint.h"
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#include "nobitfield.h"
|
#include "nobitfield.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -24,6 +25,11 @@
|
||||||
#include "expr.h"
|
#include "expr.h"
|
||||||
#include "sizes.h"
|
#include "sizes.h"
|
||||||
#include "level.h"
|
#include "level.h"
|
||||||
|
#ifdef LINT
|
||||||
|
#include "l_lint.h"
|
||||||
|
#include "l_state.h"
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
extern char options[];
|
extern char options[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,6 +164,9 @@ init_declarator(register struct decspecs *ds;)
|
||||||
{
|
{
|
||||||
reject_params(&Dc);
|
reject_params(&Dc);
|
||||||
declare_idf(ds, &Dc, level);
|
declare_idf(ds, &Dc, level);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_declare_idf(Dc.dc_idf, ds->ds_sc);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
[
|
[
|
||||||
initializer(Dc.dc_idf, ds->ds_sc)
|
initializer(Dc.dc_idf, ds->ds_sc)
|
||||||
|
@ -166,6 +175,9 @@ init_declarator(register struct decspecs *ds;)
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
add_auto(Dc.dc_idf);
|
||||||
|
#endif LINT
|
||||||
remove_declarator(&Dc);
|
remove_declarator(&Dc);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -193,6 +205,9 @@ initializer(struct idf *idf; int sc;)
|
||||||
*/
|
*/
|
||||||
]
|
]
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
lint_statement();
|
||||||
|
#endif LINT
|
||||||
if (globalflag) {
|
if (globalflag) {
|
||||||
struct expr ex;
|
struct expr ex;
|
||||||
code_declaration(idf, &ex, level, sc);
|
code_declaration(idf, &ex, level, sc);
|
||||||
|
@ -208,6 +223,10 @@ initializer(struct idf *idf; int sc;)
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
print_expr("initializer-expression", expr);
|
print_expr("initializer-expression", expr);
|
||||||
#endif DEBUG
|
#endif DEBUG
|
||||||
|
#ifdef LINT
|
||||||
|
change_state(idf, SET);
|
||||||
|
pre_lint_expr(expr, RVAL, USED);
|
||||||
|
#endif LINT
|
||||||
code_declaration(idf, expr, level, sc);
|
code_declaration(idf, expr, level, sc);
|
||||||
}
|
}
|
||||||
init_idf(idf);
|
init_idf(idf);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* IDENTIFIER DEFINITION DESCRIPTOR */
|
/* IDENTIFIER DEFINITION DESCRIPTOR */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
struct def { /* for ordinary tags */
|
struct def { /* for ordinary tags */
|
||||||
struct def *next;
|
struct def *next;
|
||||||
|
@ -21,6 +22,11 @@ struct def { /* for ordinary tags */
|
||||||
char df_used; /* set if idf is used */
|
char df_used; /* set if idf is used */
|
||||||
char *df_file; /* file containing the definition */
|
char *df_file; /* file containing the definition */
|
||||||
unsigned int df_line; /* line number of the definition */
|
unsigned int df_line; /* line number of the definition */
|
||||||
|
#ifdef LINT
|
||||||
|
char df_set;
|
||||||
|
int df_firstbrace; /* brace number of its first occurrence */
|
||||||
|
int df_minlevel; /* the lowest level needed for this def */
|
||||||
|
#endif LINT
|
||||||
char df_formal_array; /* to warn if sizeof is taken */
|
char df_formal_array; /* to warn if sizeof is taken */
|
||||||
arith df_address;
|
arith df_address;
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <system.h>
|
#include <system.h>
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "nopp.h"
|
#include "nopp.h"
|
||||||
#include "errout.h"
|
#include "errout.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -34,6 +35,10 @@
|
||||||
int err_occurred = 0;
|
int err_occurred = 0;
|
||||||
|
|
||||||
extern char options[];
|
extern char options[];
|
||||||
|
#ifdef LINT
|
||||||
|
extern char loptions[];
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
/* There are three general error-message functions:
|
/* There are three general error-message functions:
|
||||||
lexerror() lexical and pre-processor error messages
|
lexerror() lexical and pre-processor error messages
|
||||||
error() syntactic and semantic error messages
|
error() syntactic and semantic error messages
|
||||||
|
@ -110,6 +115,54 @@ expr_warning(va_alist) /* expr, fmt, args */
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
|
||||||
|
/*VARARGS*/
|
||||||
|
def_warning(va_alist) /* def, fmt, args */
|
||||||
|
va_dcl
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap);
|
||||||
|
{
|
||||||
|
register struct def *def = va_arg(ap, struct def *);
|
||||||
|
|
||||||
|
_error(WARNING, def->df_file, def->df_line, ap);
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*VARARGS*/
|
||||||
|
hwarning(va_alist) /* fmt, args */
|
||||||
|
va_dcl
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap);
|
||||||
|
{
|
||||||
|
if (loptions['h'])
|
||||||
|
_error(WARNING, dot.tk_file, dot.tk_line, ap);
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*VARARGS*/
|
||||||
|
awarning(va_alist) /* fmt, args */
|
||||||
|
va_dcl
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap);
|
||||||
|
{
|
||||||
|
if (loptions['a'])
|
||||||
|
_error(WARNING, dot.tk_file, dot.tk_line, ap);
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
/*VARARGS*/
|
/*VARARGS*/
|
||||||
lexerror(va_alist) /* fmt, args */
|
lexerror(va_alist) /* fmt, args */
|
||||||
va_dcl
|
va_dcl
|
||||||
|
@ -186,9 +239,11 @@ _error(class, fn, ln, ap)
|
||||||
/* _error attempts to limit the number of error messages
|
/* _error attempts to limit the number of error messages
|
||||||
for a given line to MAXERR_LINE.
|
for a given line to MAXERR_LINE.
|
||||||
*/
|
*/
|
||||||
|
#ifndef LINT
|
||||||
static char *last_fn = 0;
|
static char *last_fn = 0;
|
||||||
static unsigned int last_ln = 0;
|
static unsigned int last_ln = 0;
|
||||||
static int e_seen = 0;
|
static int e_seen = 0;
|
||||||
|
#endif LINT
|
||||||
char *remark;
|
char *remark;
|
||||||
char *fmt = va_arg(ap, char *);
|
char *fmt = va_arg(ap, char *);
|
||||||
|
|
||||||
|
@ -215,7 +270,11 @@ _error(class, fn, ln, ap)
|
||||||
/* the remark */
|
/* the remark */
|
||||||
switch (class) {
|
switch (class) {
|
||||||
case WARNING:
|
case WARNING:
|
||||||
|
#ifndef LINT
|
||||||
remark = "(warning)";
|
remark = "(warning)";
|
||||||
|
#else LINT
|
||||||
|
remark = 0;
|
||||||
|
#endif LINT
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ERROR:
|
case ERROR:
|
||||||
|
@ -233,6 +292,7 @@ _error(class, fn, ln, ap)
|
||||||
/*NOTREACHED*/;
|
/*NOTREACHED*/;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef LINT
|
||||||
if (ln == last_ln && fn && last_fn && strcmp(fn, last_fn) == 0) {
|
if (ln == last_ln && fn && last_fn && strcmp(fn, last_fn) == 0) {
|
||||||
/* we've seen this place before */
|
/* we've seen this place before */
|
||||||
e_seen++;
|
e_seen++;
|
||||||
|
@ -249,6 +309,20 @@ _error(class, fn, ln, ap)
|
||||||
last_ln = ln;
|
last_ln = ln;
|
||||||
e_seen = 0;
|
e_seen = 0;
|
||||||
}
|
}
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
if ( /* there is a file name */
|
||||||
|
fn
|
||||||
|
&& /* the file name is global */
|
||||||
|
fn[0] == '/'
|
||||||
|
&& /* it is not a .c file */
|
||||||
|
strcmp(&fn[strlen(fn)-2], ".c") != 0
|
||||||
|
) {
|
||||||
|
/* we skip this message */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
if (fn)
|
if (fn)
|
||||||
fprint(ERROUT, "\"%s\", line %u: ", fn, ln);
|
fprint(ERROUT, "\"%s\", line %u: ", fn, ln);
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* EXPRESSION-CODE GENERATOR */
|
/* EXPRESSION-CODE GENERATOR */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
#ifndef LINT
|
||||||
|
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
#include <em_reg.h>
|
#include <em_reg.h>
|
||||||
|
@ -969,3 +972,5 @@ load_cst(val, siz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* EXPRESSION TREE HANDLING */
|
/* EXPRESSION TREE HANDLING */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include "botch_free.h"
|
#include "botch_free.h"
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
|
@ -181,7 +182,9 @@ idf2expr(expr)
|
||||||
expr->ex_type = error_type;
|
expr->ex_type = error_type;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
#ifndef LINT
|
||||||
def->df_used = 1;
|
def->df_used = 1;
|
||||||
|
#endif LINT
|
||||||
expr->ex_type = def->df_type;
|
expr->ex_type = def->df_type;
|
||||||
if (expr->ex_type == error_type)
|
if (expr->ex_type == error_type)
|
||||||
expr->ex_flags |= EX_ERROR;
|
expr->ex_flags |= EX_ERROR;
|
||||||
|
@ -196,12 +199,14 @@ idf2expr(expr)
|
||||||
expr->VL_CLASS = Const;
|
expr->VL_CLASS = Const;
|
||||||
expr->VL_VALUE = def->df_address;
|
expr->VL_VALUE = def->df_address;
|
||||||
}
|
}
|
||||||
|
#ifndef LINT
|
||||||
else
|
else
|
||||||
if (def->df_sc == STATIC && def->df_level >= L_LOCAL) {
|
if (def->df_sc == STATIC && def->df_level >= L_LOCAL) {
|
||||||
expr->VL_CLASS = Label;
|
expr->VL_CLASS = Label;
|
||||||
expr->VL_LBL = def->df_address;
|
expr->VL_LBL = def->df_address;
|
||||||
expr->VL_VALUE = (arith)0;
|
expr->VL_VALUE = (arith)0;
|
||||||
}
|
}
|
||||||
|
#endif LINT
|
||||||
else {
|
else {
|
||||||
expr->VL_CLASS = Name;
|
expr->VL_CLASS = Name;
|
||||||
expr->VL_IDF = idf;
|
expr->VL_IDF = idf;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
/* EXPRESSION SYNTAX PARSER */
|
/* EXPRESSION SYNTAX PARSER */
|
||||||
|
|
||||||
{
|
{
|
||||||
|
#include "lint.h"
|
||||||
#include "arith.h"
|
#include "arith.h"
|
||||||
#include "LLlex.h"
|
#include "LLlex.h"
|
||||||
#include "type.h"
|
#include "type.h"
|
||||||
|
@ -207,6 +208,10 @@ conditional_expression(struct expr **expp;)
|
||||||
#endif
|
#endif
|
||||||
ch7bin(&e1, ':', e2);
|
ch7bin(&e1, ':', e2);
|
||||||
opnd2test(expp, '?');
|
opnd2test(expp, '?');
|
||||||
|
#ifdef LINT
|
||||||
|
if (is_cp_cst(*expp))
|
||||||
|
hwarning("condition in ?: is constant");
|
||||||
|
#endif LINT
|
||||||
ch7bin(expp, '?', e1);
|
ch7bin(expp, '?', e1);
|
||||||
}
|
}
|
||||||
]?
|
]?
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* BITFIELD EXPRESSION EVALUATOR */
|
/* BITFIELD EXPRESSION EVALUATOR */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
#ifndef LINT
|
||||||
|
|
||||||
#include "nobitfield.h"
|
#include "nobitfield.h"
|
||||||
|
|
||||||
#ifndef NOBITFIELD
|
#ifndef NOBITFIELD
|
||||||
|
@ -174,3 +177,5 @@ eval_field(expr, code)
|
||||||
}
|
}
|
||||||
#endif NOBITFIELD
|
#endif NOBITFIELD
|
||||||
|
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* IDENTIFIER FIDDLING & SYMBOL TABLE HANDLING */
|
/* IDENTIFIER FIDDLING & SYMBOL TABLE HANDLING */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include <em_reg.h>
|
#include <em_reg.h>
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -266,6 +267,22 @@ declare_idf(ds, dc, lvl)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
if ( def && def->df_level < lvl
|
||||||
|
&& !(lvl == L_FORMAL2 || def->df_level == L_UNIVERSAL)
|
||||||
|
) {
|
||||||
|
/* there is already a definition for this name
|
||||||
|
on a more global level
|
||||||
|
*/
|
||||||
|
warning("%s is already defined as a %s",
|
||||||
|
idf->id_text,
|
||||||
|
def->df_level == L_GLOBAL ? "global" :
|
||||||
|
def->df_level == L_FORMAL2 ? "formal" :
|
||||||
|
"more global local"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
if (def &&
|
if (def &&
|
||||||
( def->df_level == lvl ||
|
( def->df_level == lvl ||
|
||||||
( lvl != L_GLOBAL && def->df_level > lvl )
|
( lvl != L_GLOBAL && def->df_level > lvl )
|
||||||
|
@ -326,6 +343,11 @@ declare_idf(ds, dc, lvl)
|
||||||
newdef->df_sc = sc;
|
newdef->df_sc = sc;
|
||||||
newdef->df_file = idf->id_file;
|
newdef->df_file = idf->id_file;
|
||||||
newdef->df_line = idf->id_line;
|
newdef->df_line = idf->id_line;
|
||||||
|
#ifdef LINT
|
||||||
|
newdef->df_set = (type->tp_fund == ARRAY);
|
||||||
|
newdef->df_firstbrace = 0;
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
/* link it into the name list in the proper place */
|
/* link it into the name list in the proper place */
|
||||||
idf->id_def = newdef;
|
idf->id_def = newdef;
|
||||||
update_ahead(idf);
|
update_ahead(idf);
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
/* CODE FOR THE INITIALISATION OF GLOBAL VARIABLES */
|
/* CODE FOR THE INITIALISATION OF GLOBAL VARIABLES */
|
||||||
|
|
||||||
{
|
{
|
||||||
|
#include "lint.h"
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -27,6 +28,10 @@
|
||||||
#include "noRoption.h"
|
#include "noRoption.h"
|
||||||
#include "estack.h"
|
#include "estack.h"
|
||||||
#include "code.h"
|
#include "code.h"
|
||||||
|
#ifdef LINT
|
||||||
|
#include "l_lint.h"
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
#define con_nullbyte() C_con_ucon("0", (arith)1)
|
#define con_nullbyte() C_con_ucon("0", (arith)1)
|
||||||
#define aggregate_type(tp) ((tp)->tp_fund == ARRAY || (tp)->tp_fund == STRUCT)
|
#define aggregate_type(tp) ((tp)->tp_fund == ARRAY || (tp)->tp_fund == STRUCT)
|
||||||
|
|
||||||
|
@ -48,6 +53,9 @@ initial_value(register struct type **tpp; register struct expr **expp;) :
|
||||||
[
|
[
|
||||||
assignment_expression(expp)
|
assignment_expression(expp)
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
pre_lint_expr(*expp, RVAL, USED);
|
||||||
|
#endif LINT
|
||||||
if ((*expp)->ex_type->tp_fund == ARRAY)
|
if ((*expp)->ex_type->tp_fund == ARRAY)
|
||||||
array2pointer(*expp);
|
array2pointer(*expp);
|
||||||
if (tpp) {
|
if (tpp) {
|
||||||
|
|
21
lang/cem/cemcom/l_class.h
Normal file
21
lang/cem/cemcom/l_class.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
/* Lint class constants */
|
||||||
|
|
||||||
|
#define LFDF 'a' /* Library Function Definition */
|
||||||
|
#define LVDF 'b' /* Library Variable Definition */
|
||||||
|
#define EFDF 'c' /* External Function Definition */
|
||||||
|
#define EVDF 'd' /* External Variable Definition */
|
||||||
|
#define EFDC 'e' /* External Function Declaration */
|
||||||
|
#define EVDC 'f' /* External Variable Declaration */
|
||||||
|
#define IFDC 'g' /* Implicit Function Declaration */
|
||||||
|
#define SFDF 'h' /* Static Function Definition */
|
||||||
|
#define SVDF 'i' /* Static Variable Definition */
|
||||||
|
#define FC 'j' /* Function Call */
|
||||||
|
#define VU 'k' /* Variable Usage */
|
||||||
|
#define XXDF 'l' /* Ignore Class */
|
||||||
|
|
129
lang/cem/cemcom/l_comment.c
Normal file
129
lang/cem/cemcom/l_comment.c
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* Lint-specific comment handling */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
|
||||||
|
#include "arith.h"
|
||||||
|
#include "l_state.h"
|
||||||
|
|
||||||
|
static int NOTREACHED;
|
||||||
|
static int VARARGSn = -1;
|
||||||
|
static int ARGSUSED;
|
||||||
|
int LINTLIB;
|
||||||
|
|
||||||
|
int s_NOTREACHED;
|
||||||
|
int f_VARARGSn;
|
||||||
|
int f_ARGSUSED;
|
||||||
|
|
||||||
|
set_not_reached()
|
||||||
|
{
|
||||||
|
NOTREACHED = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
move_NOT2s()
|
||||||
|
{
|
||||||
|
s_NOTREACHED = NOTREACHED;
|
||||||
|
NOTREACHED = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_varargs(n)
|
||||||
|
{
|
||||||
|
VARARGSn = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
move_VAR2f()
|
||||||
|
{
|
||||||
|
f_VARARGSn = VARARGSn;
|
||||||
|
VARARGSn = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_argsused(n)
|
||||||
|
{
|
||||||
|
ARGSUSED = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
move_ARG2f()
|
||||||
|
{
|
||||||
|
f_ARGSUSED = ARGSUSED;
|
||||||
|
ARGSUSED = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_lintlib()
|
||||||
|
{
|
||||||
|
LINTLIB = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define IN_SPACE 0
|
||||||
|
#define IN_WORD 1
|
||||||
|
#define IN_COMMENT 2
|
||||||
|
|
||||||
|
lint_comment(c)
|
||||||
|
int c;
|
||||||
|
{
|
||||||
|
/* This function is called with every character between /_* and *_/ (the
|
||||||
|
* _underscores are used because comment in C doesn't nest).
|
||||||
|
* It looks for pseudocomments.
|
||||||
|
* In this version it is allowed that 'keyword' is followed by rubbish.
|
||||||
|
* At the start of each comment the function should be initialized by
|
||||||
|
* calling it with c = -2.
|
||||||
|
* I am not sure if this way of information hiding is a good solution.
|
||||||
|
*/
|
||||||
|
static int position; /* IN_SPACE, IN_WORD, IN_COMMENT */
|
||||||
|
static char buf[12];
|
||||||
|
static int i; /* next free position in buf */
|
||||||
|
|
||||||
|
if (c == -2) {
|
||||||
|
position = IN_SPACE;
|
||||||
|
i = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (position == IN_COMMENT)
|
||||||
|
return;
|
||||||
|
if (position == IN_SPACE) {
|
||||||
|
if (c == ' ' || c == '\t')
|
||||||
|
return;
|
||||||
|
position = IN_WORD;
|
||||||
|
}
|
||||||
|
/* position == IN_WORD */
|
||||||
|
if (c == ' ' || c == '\t' || c == '*') {
|
||||||
|
position = IN_COMMENT;
|
||||||
|
check_pseudo(buf, i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (i < 12)
|
||||||
|
buf[i++] = (char)c;
|
||||||
|
else
|
||||||
|
position = IN_COMMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
check_pseudo(buf, i)
|
||||||
|
char *buf;
|
||||||
|
{
|
||||||
|
/* Look if the i characters in buf are aequivalent with one of the
|
||||||
|
* strings N_OTREACHED, V_ARARGS[n], A_RGSUSED, L_INTLIBRARY
|
||||||
|
* (the u_nderscores are there to not confuse (UNIX) lint)
|
||||||
|
*/
|
||||||
|
buf[i++] = '\0';
|
||||||
|
if (!strcmp(buf, "NOTREACHED"))
|
||||||
|
set_not_reached();
|
||||||
|
else if (!strcmp(buf, "ARGSUSED"))
|
||||||
|
set_argsused(1);
|
||||||
|
else if (!strcmp(buf, "LINTLIBRARY"))
|
||||||
|
set_lintlib();
|
||||||
|
else if (!strncmp(buf, "VARARGS", 7)) {
|
||||||
|
if (i == 8)
|
||||||
|
set_varargs(0);
|
||||||
|
else if (i == 9 && isdigit(buf[7]))
|
||||||
|
set_varargs(atoi(&buf[7]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
63
lang/cem/cemcom/l_dummy.c
Normal file
63
lang/cem/cemcom/l_dummy.c
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
*The following functions are hacked to null-functions (i.e. they
|
||||||
|
* do nothing). This needs another solution in the future.
|
||||||
|
*/
|
||||||
|
#include "arith.h"
|
||||||
|
#include "label.h"
|
||||||
|
|
||||||
|
C_close(){}
|
||||||
|
int C_busy(){return 0;}
|
||||||
|
|
||||||
|
|
||||||
|
/* More routines */
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_bhcst(ps_xxx,n,w,i) arith n,w; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crcst(ps_xxx,v) arith v; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crdlb(ps_xxx,v,s) label v; arith s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crdnam(ps_xxx,v,s) char *v; arith s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crfcon(ps_xxx,v,s) char *v; arith s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_cricon(ps_xxx,v,s) char *v; arith s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crilb(ps_xxx,v) label v; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crpnam(ps_xxx,v) char *v; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crscon(ps_xxx,v,s) char *v; arith s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_crucon(ps_xxx,v,s) char *v; arith s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_cst(l) {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_dfdlb(l) label l; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_dfdnam(s) char *s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_dfilb(l) label l; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_end(l) arith l; {}
|
||||||
|
CC_msend() {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_msstart(ms) {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_opcst(op_xxx,c) arith c; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_opdlb(op_xxx,g,o) label g; arith o; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_opilb(op_xxx,b) label b; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_oppnam(op_xxx,p) char *p; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_pronarg(s) char *s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_psdlb(ps_xxx,l) label l; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_psdnam(ps_xxx,s) char *s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_pspnam(ps_xxx,s) char *s; {}
|
||||||
|
/* ARGSUSED */
|
||||||
|
CC_scon(v,s) char *s; {}
|
118
lang/cem/cemcom/l_ev_ord.c
Normal file
118
lang/cem/cemcom/l_ev_ord.c
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* Lint evaluation order checking */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
|
||||||
|
#include <alloc.h> /* for st_free */
|
||||||
|
#include "arith.h" /* definition arith */
|
||||||
|
#include "label.h" /* definition label */
|
||||||
|
#include "expr.h"
|
||||||
|
#include "idf.h"
|
||||||
|
#include "def.h"
|
||||||
|
#include "code.h" /* RVAL etc */
|
||||||
|
#include "LLlex.h"
|
||||||
|
#include "Lpars.h"
|
||||||
|
#include "stack.h"
|
||||||
|
#include "type.h"
|
||||||
|
#include "level.h"
|
||||||
|
#include "nofloat.h"
|
||||||
|
#include "l_lint.h"
|
||||||
|
#include "l_state.h"
|
||||||
|
|
||||||
|
extern char *symbol2str();
|
||||||
|
|
||||||
|
check_and_merge(espp, esp, com_oper)
|
||||||
|
struct expr_state **espp, *esp;
|
||||||
|
{
|
||||||
|
/* Checks for undefined evaluation orders in case of a commutative operator.
|
||||||
|
* In addition the sets of used and set variables of both expressions are
|
||||||
|
* united.
|
||||||
|
* *espp will be pointing to this new list. esp is used for this list.
|
||||||
|
*/
|
||||||
|
register struct expr_state **pp, *p1, *p2;
|
||||||
|
|
||||||
|
for (p1 = *espp; p1; p1 = p1->next) {
|
||||||
|
p2 = esp;
|
||||||
|
pp = &esp;
|
||||||
|
while (p2) {
|
||||||
|
if ( /* p1 and p2 are the same */
|
||||||
|
p1->es_idf == p2->es_idf
|
||||||
|
&& p1->es_offset == p2->es_offset
|
||||||
|
) {
|
||||||
|
if (com_oper)
|
||||||
|
check_ev_order(p1, p2, com_oper);
|
||||||
|
p1->es_used |= p2->es_used;
|
||||||
|
p1->es_set |= p2->es_set;
|
||||||
|
*pp = p2->next;
|
||||||
|
free_expr_state(p2);
|
||||||
|
p2 = *pp;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pp = &p2->next;
|
||||||
|
p2 = p2->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* The rest of the list esp is pointing to, is put in front of the list
|
||||||
|
* *espp is now pointing to.
|
||||||
|
* *espp will be pointing to this new list.
|
||||||
|
*/
|
||||||
|
if (!esp)
|
||||||
|
return;
|
||||||
|
p1 = *espp;
|
||||||
|
*espp = esp;
|
||||||
|
while (esp->next)
|
||||||
|
esp = esp->next;
|
||||||
|
esp->next = p1;
|
||||||
|
}
|
||||||
|
|
||||||
|
check_ev_order(esp1, esp2, com_oper)
|
||||||
|
struct expr_state *esp1, *esp2;
|
||||||
|
{
|
||||||
|
if ( (esp1->es_used && esp2->es_set)
|
||||||
|
|| (esp1->es_set && esp2->es_used)
|
||||||
|
|| (esp1->es_set && esp2->es_set)
|
||||||
|
) {
|
||||||
|
warning("result of %s depends on evaluation order on %s",
|
||||||
|
symbol2str(com_oper),
|
||||||
|
esp1->es_idf->id_text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_expr_state(value, to_state, espp)
|
||||||
|
struct value value;
|
||||||
|
struct expr_state **espp;
|
||||||
|
{
|
||||||
|
register struct expr_state *esp = *espp;
|
||||||
|
|
||||||
|
if (value.vl_class != Name) {
|
||||||
|
crash("(add_expr_state) invalid vl_class");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
while ( esp
|
||||||
|
&& !( esp->es_idf == value.vl_data.vl_idf
|
||||||
|
&& esp->es_offset == value.vl_value
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
esp = esp->next;
|
||||||
|
}
|
||||||
|
if (!esp) { /* create new expr_state */
|
||||||
|
esp = new_expr_state();
|
||||||
|
esp->es_idf = value.vl_data.vl_idf;
|
||||||
|
esp->es_offset = value.vl_value;
|
||||||
|
esp->next = *espp;
|
||||||
|
*espp = esp;
|
||||||
|
}
|
||||||
|
if (to_state == SET)
|
||||||
|
esp->es_set = 1;
|
||||||
|
else /* USED */
|
||||||
|
esp->es_used = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
350
lang/cem/cemcom/l_lint.c
Normal file
350
lang/cem/cemcom/l_lint.c
Normal file
|
@ -0,0 +1,350 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* Lint main routines */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
|
||||||
|
#include <alloc.h> /* for st_free */
|
||||||
|
#include "arith.h" /* definition arith */
|
||||||
|
#include "label.h" /* definition label */
|
||||||
|
#include "expr.h"
|
||||||
|
#include "idf.h"
|
||||||
|
#include "def.h"
|
||||||
|
#include "code.h" /* RVAL etc */
|
||||||
|
#include "LLlex.h"
|
||||||
|
#include "Lpars.h"
|
||||||
|
#include "stack.h"
|
||||||
|
#include "type.h"
|
||||||
|
#include "level.h"
|
||||||
|
#include "nofloat.h"
|
||||||
|
#include "l_lint.h"
|
||||||
|
#include "l_state.h"
|
||||||
|
#include "l_outdef.h"
|
||||||
|
|
||||||
|
extern char options[128];
|
||||||
|
extern char *symbol2str();
|
||||||
|
|
||||||
|
struct expr_state *lint_expr();
|
||||||
|
|
||||||
|
lint_init()
|
||||||
|
{
|
||||||
|
/* Allocate some memory for the global stack_bottom
|
||||||
|
* and some other initializations
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern struct lint_stack_entry stack_bottom;
|
||||||
|
|
||||||
|
stack_bottom.ls_current = new_state();
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_lint_expr(expr, val, used)
|
||||||
|
struct expr *expr;
|
||||||
|
{
|
||||||
|
/* Introduced to dispose the returned expression states */
|
||||||
|
|
||||||
|
register struct expr_state *esp;
|
||||||
|
|
||||||
|
esp = lint_expr(expr, val, used);
|
||||||
|
free_expr_states(esp);
|
||||||
|
}
|
||||||
|
|
||||||
|
free_expr_states(esp)
|
||||||
|
register struct expr_state *esp;
|
||||||
|
{
|
||||||
|
register struct expr_state *esp2;
|
||||||
|
|
||||||
|
while (esp) {
|
||||||
|
esp2 = esp;
|
||||||
|
esp = esp->next;
|
||||||
|
free_expr_state(esp2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr_state *
|
||||||
|
lint_expr(expr, val, used)
|
||||||
|
register struct expr *expr;
|
||||||
|
{
|
||||||
|
/* Main function to process an expression tree.
|
||||||
|
* It returns a structure containing information about which variables
|
||||||
|
* are set and which are used in the expression.
|
||||||
|
* In addition it sets 'used' and 'set' fields of the corresponding
|
||||||
|
* variables in the current state.
|
||||||
|
* If the value of an operation without side-effects is not used,
|
||||||
|
* a warning is given.
|
||||||
|
*/
|
||||||
|
struct expr_state *esp1 = 0, *esp2 = 0;
|
||||||
|
|
||||||
|
if (used == IGNORED) {
|
||||||
|
expr_ignored(expr);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (expr->ex_class) {
|
||||||
|
case Value:
|
||||||
|
switch (expr->VL_CLASS) {
|
||||||
|
case Const:
|
||||||
|
case Label:
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
case Name:
|
||||||
|
{
|
||||||
|
register struct idf *idf = expr->VL_IDF;
|
||||||
|
|
||||||
|
if (!idf || !idf->id_def)
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
if ( val == LVAL
|
||||||
|
|| ( val == RVAL
|
||||||
|
&& expr->ex_type->tp_fund == POINTER
|
||||||
|
&& !expr->ex_lvalue
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
change_state(idf, SET);
|
||||||
|
idf->id_def->df_file =
|
||||||
|
Salloc(dot.tk_file,
|
||||||
|
strlen(dot.tk_file) + 1);
|
||||||
|
idf->id_def->df_line = dot.tk_line;
|
||||||
|
}
|
||||||
|
if (val == RVAL) {
|
||||||
|
change_state(idf, USED);
|
||||||
|
add_expr_state(expr->EX_VALUE, USED, &esp1);
|
||||||
|
}
|
||||||
|
return(esp1);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
crash("(lint_expr) bad value class\n");
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
case Oper:
|
||||||
|
{
|
||||||
|
register int oper = expr->OP_OPER;
|
||||||
|
register struct expr *left = expr->OP_LEFT;
|
||||||
|
register struct expr *right = expr->OP_RIGHT;
|
||||||
|
|
||||||
|
switch (oper) {
|
||||||
|
case '=':
|
||||||
|
case PLUSAB:
|
||||||
|
case MINAB:
|
||||||
|
case TIMESAB:
|
||||||
|
case DIVAB:
|
||||||
|
case MODAB:
|
||||||
|
case LEFTAB:
|
||||||
|
case RIGHTAB:
|
||||||
|
case ANDAB:
|
||||||
|
case XORAB:
|
||||||
|
case ORAB:
|
||||||
|
lint_conversion(oper, right->ex_type, left->ex_type);
|
||||||
|
/* for cases like i += l; */
|
||||||
|
esp1 = lint_expr(right, RVAL, USED);
|
||||||
|
if (oper != '=') {
|
||||||
|
/* i += 1; is interpreted as i = i + 1; */
|
||||||
|
esp2 = lint_expr(left, RVAL, USED);
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
}
|
||||||
|
esp2 = lint_expr(left, LVAL, USED);
|
||||||
|
/* for cases like i = i + 1; and i not set, this
|
||||||
|
** order is essential
|
||||||
|
*/
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
if ( left->ex_class == Value
|
||||||
|
&& left->VL_CLASS == Name
|
||||||
|
) {
|
||||||
|
add_expr_state(left->EX_VALUE, SET, &esp1);
|
||||||
|
}
|
||||||
|
return(esp1);
|
||||||
|
|
||||||
|
case POSTINCR:
|
||||||
|
case POSTDECR:
|
||||||
|
case PLUSPLUS:
|
||||||
|
case MINMIN:
|
||||||
|
/* i++; is parsed as i = i + 1;
|
||||||
|
* This isn't quite correct :
|
||||||
|
* The first statement doesn't USE i,
|
||||||
|
* the second does.
|
||||||
|
*/
|
||||||
|
esp1 = lint_expr(left, RVAL, USED);
|
||||||
|
esp2 = lint_expr(left, LVAL, USED);
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
if ( left->ex_class == Value
|
||||||
|
&& left->VL_CLASS == Name
|
||||||
|
) {
|
||||||
|
add_expr_state(left->EX_VALUE, SET, &esp1);
|
||||||
|
add_expr_state(left->EX_VALUE, USED, &esp1);
|
||||||
|
}
|
||||||
|
return(esp1);
|
||||||
|
|
||||||
|
case '-':
|
||||||
|
case '*':
|
||||||
|
if (left == 0) /* unary */
|
||||||
|
return(lint_expr(right, RVAL, USED));
|
||||||
|
esp1 = lint_expr(left, RVAL, USED);
|
||||||
|
esp2 = lint_expr(right, RVAL, USED);
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
return(esp1);
|
||||||
|
|
||||||
|
case '(':
|
||||||
|
if (right != 0) {
|
||||||
|
/* function call with parameters */
|
||||||
|
register struct expr *ex = right;
|
||||||
|
|
||||||
|
while ( ex->ex_class == Oper
|
||||||
|
&& ex->OP_OPER == PARCOMMA
|
||||||
|
) {
|
||||||
|
esp2 = lint_expr(ex->OP_RIGHT, RVAL,
|
||||||
|
USED);
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
ex = ex->OP_LEFT;
|
||||||
|
}
|
||||||
|
esp2 = lint_expr(ex, RVAL, USED);
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
}
|
||||||
|
if ( left->ex_class == Value
|
||||||
|
&& left->VL_CLASS == Name
|
||||||
|
) {
|
||||||
|
fill_outcall(expr,
|
||||||
|
expr->ex_type->tp_fund == VOID ?
|
||||||
|
VOIDED : used
|
||||||
|
);
|
||||||
|
outcall();
|
||||||
|
left->VL_IDF->id_def->df_used = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
esp2 = lint_expr(left, val, USED);
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
}
|
||||||
|
return(esp1);
|
||||||
|
|
||||||
|
case '.':
|
||||||
|
return(lint_expr(left, val, USED));
|
||||||
|
|
||||||
|
case ARROW:
|
||||||
|
return(lint_expr(left, RVAL, USED));
|
||||||
|
|
||||||
|
case '~':
|
||||||
|
case '!':
|
||||||
|
return(lint_expr(right, RVAL, USED));
|
||||||
|
|
||||||
|
case '?':
|
||||||
|
esp1 = lint_expr(left, RVAL, USED);
|
||||||
|
esp2 = lint_expr(right->OP_LEFT, RVAL, USED);
|
||||||
|
check_and_merge(&esp1, esp2, 0);
|
||||||
|
esp2 = lint_expr(right->OP_RIGHT, RVAL, USED);
|
||||||
|
check_and_merge(&esp1, esp2, 0);
|
||||||
|
return(esp1);
|
||||||
|
|
||||||
|
case INT2INT:
|
||||||
|
case INT2FLOAT:
|
||||||
|
case FLOAT2INT:
|
||||||
|
case FLOAT2FLOAT:
|
||||||
|
lint_conversion(oper, right->ex_type, left->ex_type);
|
||||||
|
return(lint_expr(right, RVAL, USED));
|
||||||
|
|
||||||
|
case '<':
|
||||||
|
case '>':
|
||||||
|
case LESSEQ:
|
||||||
|
case GREATEREQ:
|
||||||
|
case EQUAL:
|
||||||
|
case NOTEQUAL:
|
||||||
|
lint_relop(left, right, oper);
|
||||||
|
lint_relop(right, left,
|
||||||
|
oper == '<' ? '>' :
|
||||||
|
oper == '>' ? '<' :
|
||||||
|
oper == LESSEQ ? GREATEREQ :
|
||||||
|
oper == GREATEREQ ? LESSEQ :
|
||||||
|
oper
|
||||||
|
);
|
||||||
|
/*FALLTHROUGH*/
|
||||||
|
case '+':
|
||||||
|
case '/':
|
||||||
|
case '%':
|
||||||
|
case ',':
|
||||||
|
case LEFT:
|
||||||
|
case RIGHT:
|
||||||
|
case '&':
|
||||||
|
case '|':
|
||||||
|
case '^':
|
||||||
|
case OR:
|
||||||
|
case AND:
|
||||||
|
esp1 = lint_expr(left, RVAL,
|
||||||
|
oper == ',' ? IGNORED : USED);
|
||||||
|
esp2 = lint_expr(right, RVAL,
|
||||||
|
oper == ',' ? used : USED);
|
||||||
|
if (oper == OR || oper == AND || oper == ',')
|
||||||
|
check_and_merge(&esp1, esp2, 0);
|
||||||
|
else
|
||||||
|
check_and_merge(&esp1, esp2, oper);
|
||||||
|
return(esp1);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return(0); /* for initcomma */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expr_ignored(expr)
|
||||||
|
struct expr *expr;
|
||||||
|
{
|
||||||
|
switch (expr->ex_class) {
|
||||||
|
case Oper:
|
||||||
|
switch (expr->OP_OPER) {
|
||||||
|
case '=':
|
||||||
|
case TIMESAB:
|
||||||
|
case DIVAB:
|
||||||
|
case MODAB:
|
||||||
|
case LEFTAB:
|
||||||
|
case RIGHTAB:
|
||||||
|
case ANDAB:
|
||||||
|
case XORAB:
|
||||||
|
case ORAB:
|
||||||
|
case AND: /* doubtful but useful */
|
||||||
|
case OR: /* doubtful but useful */
|
||||||
|
case '(':
|
||||||
|
case '?':
|
||||||
|
case ',':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PLUSAB:
|
||||||
|
case MINAB:
|
||||||
|
case POSTINCR:
|
||||||
|
case POSTDECR:
|
||||||
|
case PLUSPLUS:
|
||||||
|
case MINMIN:
|
||||||
|
/* may hide the operator * */
|
||||||
|
if ( /* operation on a pointer */
|
||||||
|
expr->OP_TYPE->tp_fund == POINTER
|
||||||
|
&& /* the result is dereferenced, e.g. *p++; */
|
||||||
|
expr->ex_type == expr->OP_TYPE->tp_up
|
||||||
|
) {
|
||||||
|
hwarning("result of * ignored");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
hwarning("result of %s ignored",
|
||||||
|
symbol2str(expr->OP_OPER));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Value:
|
||||||
|
hwarning("identifier as statement");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case String:
|
||||||
|
case Float:
|
||||||
|
hwarning("constant as statement");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
17
lang/cem/cemcom/l_lint.h
Normal file
17
lang/cem/cemcom/l_lint.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* LINT FLAGS */
|
||||||
|
|
||||||
|
#define USED 0
|
||||||
|
#define IGNORED 1
|
||||||
|
#define SET 2
|
||||||
|
#define VOIDED 3
|
||||||
|
|
||||||
|
/* for od_valreturned */
|
||||||
|
#define NOVALRETURNED 0
|
||||||
|
#define VALRETURNED 1
|
||||||
|
#define NORETURN 2 /* end of function NOTREACHED */
|
||||||
|
|
155
lang/cem/cemcom/l_misc.c
Normal file
155
lang/cem/cemcom/l_misc.c
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* Lint miscellaneous routines */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
|
||||||
|
#include <alloc.h> /* for st_free */
|
||||||
|
#include "arith.h" /* definition arith */
|
||||||
|
#include "label.h" /* definition label */
|
||||||
|
#include "expr.h"
|
||||||
|
#include "idf.h"
|
||||||
|
#include "def.h"
|
||||||
|
#include "code.h" /* RVAL etc */
|
||||||
|
#include "LLlex.h"
|
||||||
|
#include "Lpars.h"
|
||||||
|
#include "stack.h"
|
||||||
|
#include "type.h"
|
||||||
|
#include "level.h"
|
||||||
|
#include "nofloat.h"
|
||||||
|
#include "l_state.h"
|
||||||
|
|
||||||
|
extern char *symbol2str();
|
||||||
|
extern struct type *func_type;
|
||||||
|
|
||||||
|
lint_conversion(oper, from_type, to_type)
|
||||||
|
struct type *from_type, *to_type;
|
||||||
|
{
|
||||||
|
register int from = from_type->tp_fund;
|
||||||
|
register int to = to_type->tp_fund;
|
||||||
|
|
||||||
|
switch (oper) {
|
||||||
|
case RETURN: /* not really an oper, but it works */
|
||||||
|
case INT2INT:
|
||||||
|
case '=':
|
||||||
|
case PLUSAB:
|
||||||
|
case MINAB:
|
||||||
|
case TIMESAB:
|
||||||
|
case DIVAB:
|
||||||
|
case MODAB:
|
||||||
|
case LEFTAB:
|
||||||
|
case RIGHTAB:
|
||||||
|
case ANDAB:
|
||||||
|
case XORAB:
|
||||||
|
case ORAB:
|
||||||
|
if ( (from == LONG && to != LONG)
|
||||||
|
|| (from == DOUBLE && to != DOUBLE)
|
||||||
|
) {
|
||||||
|
awarning("conversion from %s to %s may lose accuracy",
|
||||||
|
symbol2str(from), symbol2str(to));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lint_ret_conv(from_type)
|
||||||
|
struct type *from_type;
|
||||||
|
{
|
||||||
|
lint_conversion(RETURN, from_type, func_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
lint_ptr_conv(from, to)
|
||||||
|
short from, to;
|
||||||
|
{
|
||||||
|
/* X -> X ok -- this includes struct -> struct, of any size
|
||||||
|
* X -> CHAR ok
|
||||||
|
* DOUBLE -> X ok
|
||||||
|
* FLOAT -> LONG -> INT -> SHORT ok
|
||||||
|
*/
|
||||||
|
if (from == to)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (to == CHAR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (from == DOUBLE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (from) {
|
||||||
|
case FLOAT:
|
||||||
|
switch (to) {
|
||||||
|
case LONG:
|
||||||
|
case INT:
|
||||||
|
case SHORT:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LONG:
|
||||||
|
switch (to) {
|
||||||
|
case INT:
|
||||||
|
case SHORT:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case INT:
|
||||||
|
switch (to) {
|
||||||
|
case SHORT:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from == CHAR) {
|
||||||
|
hwarning("pointer to char may not align correctly for a %s",
|
||||||
|
symbol2str(to));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
warning("pointer to %s may not align correctly for a %s",
|
||||||
|
symbol2str(from), symbol2str(to));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lint_relop(left, right, oper)
|
||||||
|
struct expr *left, *right;
|
||||||
|
int oper; /* '<', '>', LESSEQ, GREATEREQ, EQUAL, NOTEQUAL */
|
||||||
|
{
|
||||||
|
/* <unsigned> <relop> <neg-const|0> is doubtful */
|
||||||
|
if ( left->ex_type->tp_unsigned
|
||||||
|
&& right->ex_class == Value
|
||||||
|
&& right->VL_CLASS == Const
|
||||||
|
) {
|
||||||
|
if (right->VL_VALUE < 0) {
|
||||||
|
warning("unsigned compared to negative constant");
|
||||||
|
}
|
||||||
|
if (right->VL_VALUE == 0) {
|
||||||
|
switch (oper) {
|
||||||
|
case '<':
|
||||||
|
warning("unsigned < 0 will always fail");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LESSEQ:
|
||||||
|
warning("unsigned <= 0 is probably wrong");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GREATEREQ:
|
||||||
|
warning("unsigned >= 0 will always succeed");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* <char> <relop> <neg-const> is undefined */
|
||||||
|
if ( left->ex_type->tp_fund == CHAR
|
||||||
|
&& right->ex_class == Value
|
||||||
|
&& right->VL_CLASS == Const
|
||||||
|
&& (right->VL_VALUE < 0 || right->VL_VALUE > 127)
|
||||||
|
) {
|
||||||
|
warning("character compared to negative constant");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
414
lang/cem/cemcom/l_outdef.c
Normal file
414
lang/cem/cemcom/l_outdef.c
Normal file
|
@ -0,0 +1,414 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* Lint outdef construction */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
|
||||||
|
#include <alloc.h>
|
||||||
|
#include "arith.h"
|
||||||
|
#include "type.h"
|
||||||
|
#include "LLlex.h"
|
||||||
|
#include "Lpars.h"
|
||||||
|
#include "stack.h"
|
||||||
|
#include "def.h"
|
||||||
|
#include "struct.h"
|
||||||
|
#include "field.h"
|
||||||
|
#include "idf.h"
|
||||||
|
#include "level.h"
|
||||||
|
#include "label.h"
|
||||||
|
#include "expr.h"
|
||||||
|
#include "l_lint.h"
|
||||||
|
#include "l_outdef.h"
|
||||||
|
#include "l_class.h"
|
||||||
|
|
||||||
|
extern char *symbol2str();
|
||||||
|
|
||||||
|
extern int f_VARARGSn, LINTLIB;
|
||||||
|
int stat_number = 9999; /* static scope number */
|
||||||
|
struct outdef OutDef, OutCall;
|
||||||
|
|
||||||
|
lint_declare_idf(idf, sc)
|
||||||
|
struct idf *idf;
|
||||||
|
int sc;
|
||||||
|
{
|
||||||
|
register struct def *def = idf->id_def;
|
||||||
|
register int is_function = def->df_type->tp_fund == FUNCTION;
|
||||||
|
|
||||||
|
if (level == L_GLOBAL) {
|
||||||
|
lint_ext_def(idf, sc);
|
||||||
|
if (is_function)
|
||||||
|
def2decl(sc);
|
||||||
|
if (sc != TYPEDEF)
|
||||||
|
outdef();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (level >= L_LOCAL && sc != STATIC && is_function) {
|
||||||
|
local_EFDC(idf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lint_ext_def(idf, sc)
|
||||||
|
struct idf *idf;
|
||||||
|
{
|
||||||
|
/* At this place the following fields of the outputdefinition can be
|
||||||
|
* filled:
|
||||||
|
* name, stat_number, class, file, line, type.
|
||||||
|
* For variable definitions and declarations this will be all.
|
||||||
|
* For functions the fields nrargs and argtps are filled after parsing
|
||||||
|
* the arguments.
|
||||||
|
* The returns-field is known at the end of the function definition.
|
||||||
|
* sc indicates the storage class defined by the declaration specifier.
|
||||||
|
*/
|
||||||
|
register struct def *def = idf->id_def;
|
||||||
|
register struct type *type = def->df_type;
|
||||||
|
|
||||||
|
OutDef.od_name = idf->id_text;
|
||||||
|
OutDef.od_statnr = (sc == STATIC ? stat_number : 0);
|
||||||
|
|
||||||
|
switch (type->tp_fund) {
|
||||||
|
case ERRONEOUS:
|
||||||
|
OutDef.od_class = XXDF;
|
||||||
|
break;
|
||||||
|
case FUNCTION:
|
||||||
|
/* For the moment assume it will be a definition.
|
||||||
|
* If no compound_statement follows, it is a declaration,
|
||||||
|
* in which case the class will be adjusted by def2decl().
|
||||||
|
*/
|
||||||
|
OutDef.od_class = (sc == STATIC ? SFDF : EFDF);
|
||||||
|
break;
|
||||||
|
default: /* a variable */
|
||||||
|
OutDef.od_class =
|
||||||
|
sc == EXTERN ? EVDC :
|
||||||
|
sc == STATIC ? SVDF : EVDF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
OutDef.od_file = def->df_file;
|
||||||
|
OutDef.od_line = def->df_line;
|
||||||
|
OutDef.od_type = (type->tp_fund == FUNCTION ? type->tp_up : type);
|
||||||
|
OutDef.od_valreturned = NORETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
def2decl(sc)
|
||||||
|
int sc;
|
||||||
|
{
|
||||||
|
/* It was assumed we were parsing a function definition.
|
||||||
|
* There was no compound statement following, so actually it was a
|
||||||
|
* declaration. This function updates the class.
|
||||||
|
*/
|
||||||
|
OutDef.od_class = (sc == STATIC ? XXDF : EFDC);
|
||||||
|
}
|
||||||
|
|
||||||
|
set_od_valreturned(n)
|
||||||
|
{
|
||||||
|
OutDef.od_valreturned = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
local_EFDC(idf)
|
||||||
|
struct idf *idf;
|
||||||
|
{
|
||||||
|
struct outdef od;
|
||||||
|
|
||||||
|
od.od_class = EFDC;
|
||||||
|
od.od_statnr = 0;
|
||||||
|
od.od_name = idf->id_text;
|
||||||
|
od.od_file = idf->id_def->df_file;
|
||||||
|
od.od_line = idf->id_def->df_line;
|
||||||
|
od.od_type = idf->id_def->df_type->tp_up;
|
||||||
|
output_def(&od);
|
||||||
|
/* The other fields are not used for this class. */
|
||||||
|
}
|
||||||
|
|
||||||
|
lint_formals()
|
||||||
|
{
|
||||||
|
/* Make a list of tp_entries containing the types of the formal
|
||||||
|
* parameters of the function definition currently parsed.
|
||||||
|
*/
|
||||||
|
register struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
|
||||||
|
register struct tp_entry **hook = &OutDef.od_entry;
|
||||||
|
|
||||||
|
OutDef.od_nrargs = 0;
|
||||||
|
while (se) {
|
||||||
|
register struct type *type = se->se_idf->id_def->df_type;
|
||||||
|
register struct tp_entry *te = new_tp_entry();
|
||||||
|
|
||||||
|
switch (type->tp_fund) {
|
||||||
|
/* Do the conversions on the formals that could not be
|
||||||
|
done in declare_idf().
|
||||||
|
It is, unfortunately, impossible not to do them,
|
||||||
|
since the corresponding actuals will have been
|
||||||
|
converted to generate proper code and we do not
|
||||||
|
want to duplicate the whole of expression handling
|
||||||
|
for lint.
|
||||||
|
*/
|
||||||
|
case CHAR:
|
||||||
|
case SHORT:
|
||||||
|
type = int_type;
|
||||||
|
break;
|
||||||
|
case FLOAT:
|
||||||
|
type = double_type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
te->te_type = type;
|
||||||
|
te->te_class = !Const;
|
||||||
|
*hook = te;
|
||||||
|
hook = &te->next;
|
||||||
|
|
||||||
|
OutDef.od_nrargs++;
|
||||||
|
se = se->next;
|
||||||
|
}
|
||||||
|
if (f_VARARGSn > OutDef.od_nrargs) {
|
||||||
|
warning("VARARGS%d function has only %d arguments",
|
||||||
|
f_VARARGSn, OutDef.od_nrargs);
|
||||||
|
f_VARARGSn = OutDef.od_nrargs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output_use(idf)
|
||||||
|
struct idf *idf;
|
||||||
|
{
|
||||||
|
/* Output the usage-definition of the variable described by idf.
|
||||||
|
*/
|
||||||
|
OutDef.od_name = idf->id_text;
|
||||||
|
OutDef.od_statnr = (idf->id_def->df_sc == STATIC ? stat_number : 0);
|
||||||
|
OutDef.od_class = VU;
|
||||||
|
OutDef.od_file = FileName;
|
||||||
|
OutDef.od_line = LineNumber;
|
||||||
|
OutDef.od_type = idf->id_def->df_type;
|
||||||
|
outdef();
|
||||||
|
}
|
||||||
|
|
||||||
|
outdef()
|
||||||
|
{
|
||||||
|
output_def(&OutDef);
|
||||||
|
}
|
||||||
|
|
||||||
|
outcall()
|
||||||
|
{
|
||||||
|
output_def(&OutCall);
|
||||||
|
}
|
||||||
|
|
||||||
|
output_def(od)
|
||||||
|
struct outdef *od;
|
||||||
|
{
|
||||||
|
/* As the types are output the tp_entries are removed, because they
|
||||||
|
* are then not needed anymore.
|
||||||
|
*/
|
||||||
|
if (od->od_class == XXDF)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (LINTLIB) {
|
||||||
|
switch (od->od_class) {
|
||||||
|
case EFDF:
|
||||||
|
od->od_class = LFDF;
|
||||||
|
break;
|
||||||
|
case EVDF:
|
||||||
|
od->od_class = LVDF;
|
||||||
|
break;
|
||||||
|
case SFDF:
|
||||||
|
/* remove tp_entries */
|
||||||
|
while (od->od_entry) {
|
||||||
|
register struct tp_entry *tmp = od->od_entry;
|
||||||
|
od->od_entry = od->od_entry->next;
|
||||||
|
free_tp_entry(tmp);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%s:%d:%c", od->od_name, od->od_statnr, od->od_class);
|
||||||
|
switch (od->od_class) {
|
||||||
|
case EFDF:
|
||||||
|
case SFDF:
|
||||||
|
case LFDF:
|
||||||
|
if (f_VARARGSn != -1) {
|
||||||
|
printf(":%d", -1 - f_VARARGSn);
|
||||||
|
outtypes(od->od_entry, f_VARARGSn);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf(":%d", od->od_nrargs);
|
||||||
|
outtypes(od->od_entry, od->od_nrargs);
|
||||||
|
}
|
||||||
|
od->od_entry = 0;
|
||||||
|
printf(":%d", od->od_valreturned);
|
||||||
|
break;
|
||||||
|
case FC:
|
||||||
|
printf(":%d", od->od_nrargs);
|
||||||
|
outtypes(od->od_entry, od->od_nrargs);
|
||||||
|
od->od_entry = 0;
|
||||||
|
printf(":%d", od->od_valused);
|
||||||
|
break;
|
||||||
|
case EVDF:
|
||||||
|
case SVDF:
|
||||||
|
case LVDF:
|
||||||
|
case EFDC:
|
||||||
|
case EVDC:
|
||||||
|
case IFDC:
|
||||||
|
case VU:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
crash("(output_def) illegal class");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
printf(":");
|
||||||
|
outtype(od->od_type);
|
||||||
|
printf(":%u:%s\n", od->od_line, od->od_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
outtypes(te, n)
|
||||||
|
struct tp_entry *te;
|
||||||
|
{
|
||||||
|
/* Output n types in the tp_entry-list and remove all the entries */
|
||||||
|
|
||||||
|
register struct tp_entry *tmp;
|
||||||
|
|
||||||
|
while (n--) {
|
||||||
|
if (!te) {
|
||||||
|
crash("(outtypes) not enough tp_entries");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
printf(":");
|
||||||
|
if (te->te_class == Const && te->te_value >= 0) {
|
||||||
|
/* constant non-negative actual parameter */
|
||||||
|
printf("+");
|
||||||
|
}
|
||||||
|
outtype(te->te_type);
|
||||||
|
if (te->te_type->tp_fund == FUNCTION) {
|
||||||
|
/* UGLY PATCH !!! ??? */
|
||||||
|
/* function names as operands are sometimes
|
||||||
|
FUNCTION and sometimes POINTER to FUNCTION,
|
||||||
|
depending on opaque circumstances. E.g., in
|
||||||
|
f(main, main);
|
||||||
|
the first main is PtF and the second is F.
|
||||||
|
*/
|
||||||
|
printf("*");
|
||||||
|
}
|
||||||
|
tmp = te;
|
||||||
|
te = te->next;
|
||||||
|
free_tp_entry(tmp);
|
||||||
|
}
|
||||||
|
/* remove the remaining entries */
|
||||||
|
while (te) {
|
||||||
|
tmp = te;
|
||||||
|
te = te->next;
|
||||||
|
free_tp_entry(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
outtype(tp)
|
||||||
|
struct type *tp;
|
||||||
|
{
|
||||||
|
switch (tp->tp_fund) {
|
||||||
|
case POINTER:
|
||||||
|
outtype(tp->tp_up);
|
||||||
|
printf("*");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARRAY:
|
||||||
|
outtype(tp->tp_up);
|
||||||
|
printf("*"); /* compatible with [] */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FUNCTION:
|
||||||
|
outtype(tp->tp_up);
|
||||||
|
printf("()");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRUCT:
|
||||||
|
case UNION:
|
||||||
|
case ENUM:
|
||||||
|
printf("%s %s", symbol2str(tp->tp_fund), tp->tp_idf->id_text);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CHAR:
|
||||||
|
case INT:
|
||||||
|
case SHORT:
|
||||||
|
case LONG:
|
||||||
|
case FLOAT:
|
||||||
|
case DOUBLE:
|
||||||
|
case VOID:
|
||||||
|
case ERRONEOUS:
|
||||||
|
if (tp->tp_unsigned)
|
||||||
|
printf("unsigned ");
|
||||||
|
printf("%s", symbol2str(tp->tp_fund));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
crash("(outtype) illegal tp_fund");
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
implicit_func_decl(idf, file, line)
|
||||||
|
struct idf *idf;
|
||||||
|
char *file;
|
||||||
|
unsigned int line;
|
||||||
|
{
|
||||||
|
struct outdef od;
|
||||||
|
|
||||||
|
od.od_class = IFDC;
|
||||||
|
od.od_statnr = 0;
|
||||||
|
od.od_name = idf->id_text;
|
||||||
|
od.od_file = file;
|
||||||
|
od.od_line = line;
|
||||||
|
od.od_type = idf->id_def->df_type->tp_up;
|
||||||
|
output_def(&od);
|
||||||
|
/* The other fields are not used for this class. */
|
||||||
|
}
|
||||||
|
|
||||||
|
fill_outcall(ex, used)
|
||||||
|
struct expr *ex;
|
||||||
|
int used;
|
||||||
|
{
|
||||||
|
register struct idf *idf = ex->OP_LEFT->VL_IDF;
|
||||||
|
register struct def *def = idf->id_def;
|
||||||
|
|
||||||
|
if (def->df_sc == IMPLICIT) {
|
||||||
|
implicit_func_decl(idf, ex->ex_file, ex->ex_line);
|
||||||
|
}
|
||||||
|
|
||||||
|
OutCall.od_type = def->df_type->tp_up;
|
||||||
|
OutCall.od_statnr = (def->df_sc == STATIC ? stat_number : 0);
|
||||||
|
OutCall.od_class = FC;
|
||||||
|
OutCall.od_name = idf->id_text;
|
||||||
|
OutCall.od_file = ex->ex_file;
|
||||||
|
OutCall.od_line = ex->ex_line;
|
||||||
|
OutCall.od_entry = (struct tp_entry *)0;
|
||||||
|
OutCall.od_nrargs = 0;
|
||||||
|
|
||||||
|
if ((ex = ex->OP_RIGHT) != 0) { /* function call with arguments */
|
||||||
|
/* store types of argument expressions in tp_entries */
|
||||||
|
while (ex->ex_class == Oper && ex->OP_OPER == PARCOMMA) {
|
||||||
|
fill_arg(ex->OP_RIGHT);
|
||||||
|
ex = ex->OP_LEFT;
|
||||||
|
}
|
||||||
|
fill_arg(ex);
|
||||||
|
}
|
||||||
|
OutCall.od_valused = used; /* USED, IGNORED or VOIDED */
|
||||||
|
}
|
||||||
|
|
||||||
|
fill_arg(e)
|
||||||
|
struct expr *e;
|
||||||
|
{
|
||||||
|
register struct tp_entry *te;
|
||||||
|
|
||||||
|
te = new_tp_entry();
|
||||||
|
te->te_type = e->ex_type;
|
||||||
|
if (is_cp_cst(e)) {
|
||||||
|
te->te_class = Const;
|
||||||
|
te->te_value = e->VL_VALUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
te->te_class = !Const;
|
||||||
|
te->te_value = (arith) 0;
|
||||||
|
}
|
||||||
|
te->next = OutCall.od_entry;
|
||||||
|
OutCall.od_entry = te;
|
||||||
|
OutCall.od_nrargs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif LINT
|
31
lang/cem/cemcom/l_outdef.str
Normal file
31
lang/cem/cemcom/l_outdef.str
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* Lint output definition */
|
||||||
|
|
||||||
|
struct tp_entry {
|
||||||
|
struct tp_entry *next;
|
||||||
|
struct type *te_type;
|
||||||
|
int te_class; /* for constant parameters */
|
||||||
|
arith te_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ALLOCDEF "tp_entry" 10 */
|
||||||
|
|
||||||
|
struct outdef {
|
||||||
|
char od_class;
|
||||||
|
int od_statnr;
|
||||||
|
char *od_name;
|
||||||
|
char *od_file;
|
||||||
|
unsigned int od_line;
|
||||||
|
int od_nrargs;
|
||||||
|
struct tp_entry *od_entry; /* a list of the types of the
|
||||||
|
* formal parameters */
|
||||||
|
int od_valreturned;
|
||||||
|
/* NOVALRETURNED, VALRETURNED, NORETURN; see l_lint.h */
|
||||||
|
int od_valused;
|
||||||
|
/* USED, IGNORED, SET, VOIDED; see l_lint.h */
|
||||||
|
struct type *od_type;
|
||||||
|
};
|
73
lang/cem/cemcom/l_state.str
Normal file
73
lang/cem/cemcom/l_state.str
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/* Lint state stack */
|
||||||
|
|
||||||
|
/* These datastructures are used to implement a stack on which the
|
||||||
|
* state of automatic variables (including register variables) is
|
||||||
|
* kept.
|
||||||
|
* In this way it is possible to account for the flow of
|
||||||
|
* control of the program.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
struct switch_states {
|
||||||
|
struct state *sws_case;
|
||||||
|
struct state *sws_break;
|
||||||
|
int sws_default_met;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct lint_stack_entry {
|
||||||
|
struct lint_stack_entry *next;
|
||||||
|
struct lint_stack_entry *ls_previous;
|
||||||
|
short ls_class; /* IF, WHILE, DO, FOR, SWITCH, CASE */
|
||||||
|
int ls_level;
|
||||||
|
struct state *ls_current; /* used by all classes */
|
||||||
|
union {
|
||||||
|
struct state *u_if_state; /* used for IF-class */
|
||||||
|
struct state *u_end; /* used for loop-classes */
|
||||||
|
struct switch_states u_switch;
|
||||||
|
} ls_states; /* not used for CASE-class */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* macros to access the union */
|
||||||
|
#define LS_IF_STATE ls_states.u_if_state
|
||||||
|
#define LS_END ls_states.u_end
|
||||||
|
#define LS_CASE ls_states.u_switch.sws_case
|
||||||
|
#define LS_BREAK ls_states.u_switch.sws_break
|
||||||
|
#define LS_DEFAULT_MET ls_states.u_switch.sws_default_met
|
||||||
|
|
||||||
|
/* ALLOCDEF "lint_stack_entry" 10 */
|
||||||
|
|
||||||
|
struct state {
|
||||||
|
struct state *next; /* only used by memory allocator */
|
||||||
|
struct auto_def *st_auto_list;
|
||||||
|
int st_notreached; /* set if not reached */
|
||||||
|
int st_warned; /* set if warning issued */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ALLOCDEF "state" 15 */
|
||||||
|
|
||||||
|
struct auto_def {
|
||||||
|
struct auto_def *next;
|
||||||
|
struct idf *ad_idf;
|
||||||
|
struct def *ad_def;
|
||||||
|
int ad_used;
|
||||||
|
int ad_set;
|
||||||
|
int ad_maybe_set;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ALLOCDEF "auto_def" 20 */
|
||||||
|
|
||||||
|
struct expr_state {
|
||||||
|
struct expr_state *next;
|
||||||
|
struct idf *es_idf;
|
||||||
|
arith es_offset;
|
||||||
|
int es_used;
|
||||||
|
int es_set;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ALLOCDEF "expr_state" 20 */
|
||||||
|
|
1102
lang/cem/cemcom/l_states.c
Normal file
1102
lang/cem/cemcom/l_states.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* MAIN PROGRAM */
|
/* MAIN PROGRAM */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include <system.h>
|
#include <system.h>
|
||||||
#include "nopp.h"
|
#include "nopp.h"
|
||||||
|
@ -95,6 +96,9 @@ main(argc, argv)
|
||||||
inc_max = 10;
|
inc_max = 10;
|
||||||
|
|
||||||
init_pp(); /* initialise the preprocessor macros */
|
init_pp(); /* initialise the preprocessor macros */
|
||||||
|
#ifdef LINT
|
||||||
|
lint_init();
|
||||||
|
#endif LINT
|
||||||
#endif NOPP
|
#endif NOPP
|
||||||
|
|
||||||
/* Note: source file "-" indicates that the source is supplied
|
/* Note: source file "-" indicates that the source is supplied
|
||||||
|
@ -130,7 +134,10 @@ compile(argc, argv)
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
char *result;
|
char *result;
|
||||||
|
#ifndef LINT
|
||||||
register char *destination = 0;
|
register char *destination = 0;
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#ifndef NOPP
|
#ifndef NOPP
|
||||||
int pp_only = options['E'] || options['P'] || options['C'];
|
int pp_only = options['E'] || options['P'] || options['C'];
|
||||||
|
@ -139,14 +146,17 @@ compile(argc, argv)
|
||||||
|
|
||||||
switch (argc) {
|
switch (argc) {
|
||||||
case 1:
|
case 1:
|
||||||
|
#ifndef LINT
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#ifndef NOPP
|
#ifndef NOPP
|
||||||
if (!pp_only)
|
if (!pp_only)
|
||||||
#endif NOPP
|
#endif NOPP
|
||||||
#endif
|
#endif
|
||||||
fatal("%s: destination file not specified", prog_name);
|
fatal("%s: destination file not specified", prog_name);
|
||||||
|
#endif LINT
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifndef LINT
|
||||||
case 2:
|
case 2:
|
||||||
destination = argv[1];
|
destination = argv[1];
|
||||||
break;
|
break;
|
||||||
|
@ -154,8 +164,14 @@ compile(argc, argv)
|
||||||
nmlist = argv[2];
|
nmlist = argv[2];
|
||||||
destination = argv[1];
|
destination = argv[1];
|
||||||
break;
|
break;
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
#ifndef LINT
|
||||||
fatal("use: %s source destination [namelist]", prog_name);
|
fatal("use: %s source destination [namelist]", prog_name);
|
||||||
|
#else LINT
|
||||||
|
fatal("use: %s source", prog_name);
|
||||||
|
#endif LINT
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,8 +201,11 @@ compile(argc, argv)
|
||||||
#endif NOPP
|
#endif NOPP
|
||||||
#endif DEBUG
|
#endif DEBUG
|
||||||
{
|
{
|
||||||
|
#ifndef LINT
|
||||||
init_code(destination && strcmp(destination, "-") != 0 ?
|
init_code(destination && strcmp(destination, "-") != 0 ?
|
||||||
destination : 0);
|
destination : 0);
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
/* compile the source text */
|
/* compile the source text */
|
||||||
C_program();
|
C_program();
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* U S E R O P T I O N - H A N D L I N G */
|
/* U S E R O P T I O N - H A N D L I N G */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "botch_free.h"
|
#include "botch_free.h"
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
|
@ -29,6 +30,10 @@ extern int inc_total;
|
||||||
#endif NOPP
|
#endif NOPP
|
||||||
|
|
||||||
char options[128]; /* one for every char */
|
char options[128]; /* one for every char */
|
||||||
|
#ifdef LINT
|
||||||
|
char loptions[128]; /* one for every char */
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
extern int idfsize;
|
extern int idfsize;
|
||||||
|
|
||||||
static int txt2int();
|
static int txt2int();
|
||||||
|
@ -45,13 +50,18 @@ next_option: /* to allow combined one-char options */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
#ifndef LINT
|
||||||
fatal("illegal option: %c", opt);
|
fatal("illegal option: %c", opt);
|
||||||
|
#else LINT
|
||||||
|
warning("illegal option: %c", opt);
|
||||||
|
#endif LINT
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '-':
|
case '-':
|
||||||
options[*text++] = 1; /* flags, debug options etc. */
|
options[*text++] = 1; /* flags, debug options etc. */
|
||||||
goto next_option;
|
goto next_option;
|
||||||
|
|
||||||
|
#ifndef LINT
|
||||||
#ifdef DATAFLOW
|
#ifdef DATAFLOW
|
||||||
case 'd':
|
case 'd':
|
||||||
#endif DATAFLOW
|
#endif DATAFLOW
|
||||||
|
@ -59,16 +69,28 @@ next_option: /* to allow combined one-char options */
|
||||||
case 'L' : /* no fil/lin */
|
case 'L' : /* no fil/lin */
|
||||||
case 'n': /* use no registers */
|
case 'n': /* use no registers */
|
||||||
case 'w': /* no warnings will be given */
|
case 'w': /* no warnings will be given */
|
||||||
#ifndef NOROPTION
|
|
||||||
case 'R': /* strict version */
|
|
||||||
#endif
|
|
||||||
options[opt] = 1;
|
options[opt] = 1;
|
||||||
goto next_option;
|
goto next_option;
|
||||||
#ifdef NOROPTION
|
#endif LINT
|
||||||
case 'R':
|
|
||||||
warning("-R option not implemented");
|
#ifdef LINT
|
||||||
|
case 'h': /* heuristic tests */
|
||||||
|
case 'v': /* no complaints about unused arguments */
|
||||||
|
case 'a': /* check long->int int->long conversions */
|
||||||
|
case 'b': /* don't report unreachable break-statements */
|
||||||
|
case 'x': /* complain about unused extern declared variables */
|
||||||
|
case 'u': /* no "used but not defined"; for pass 2 */
|
||||||
|
loptions[opt] = 1;
|
||||||
|
goto next_option;
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
|
case 'R': /* strict version */
|
||||||
|
#ifndef NOROPTION
|
||||||
|
options[opt] = 1;
|
||||||
|
#else NOROPTION
|
||||||
|
warning("-R option not implemented");
|
||||||
|
#endif NOROPTION
|
||||||
goto next_option;
|
goto next_option;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ___XXX___
|
#ifdef ___XXX___
|
||||||
deleted, is now a debug-flag
|
deleted, is now a debug-flag
|
||||||
|
@ -180,6 +202,14 @@ deleted, is now a debug-flag
|
||||||
break;
|
break;
|
||||||
#endif ___XXX___
|
#endif ___XXX___
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
case 'S' : { /* -Sint : static scope number for lint */
|
||||||
|
extern int stat_number;
|
||||||
|
stat_number = txt2int(&text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
case 'T' : {
|
case 'T' : {
|
||||||
#ifdef USE_TMP
|
#ifdef USE_TMP
|
||||||
extern char *C_tmpdir;
|
extern char *C_tmpdir;
|
||||||
|
@ -209,6 +239,7 @@ deleted, is now a debug-flag
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef LINT
|
||||||
case 'V' : /* set object sizes and alignment requirements */
|
case 'V' : /* set object sizes and alignment requirements */
|
||||||
#ifdef NOCROSS
|
#ifdef NOCROSS
|
||||||
warning("-V option ignored");
|
warning("-V option ignored");
|
||||||
|
@ -294,6 +325,7 @@ deleted, is now a debug-flag
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif NOCROSS
|
#endif NOCROSS
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
%start If_expr, control_if_expression;
|
%start If_expr, control_if_expression;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
#include "lint.h"
|
||||||
#include "nopp.h"
|
#include "nopp.h"
|
||||||
#include "arith.h"
|
#include "arith.h"
|
||||||
#include "LLlex.h"
|
#include "LLlex.h"
|
||||||
|
@ -56,6 +57,10 @@
|
||||||
#include "code.h"
|
#include "code.h"
|
||||||
#include "expr.h"
|
#include "expr.h"
|
||||||
#include "def.h"
|
#include "def.h"
|
||||||
|
#ifdef LINT
|
||||||
|
#include "l_state.h"
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
#ifndef NOPP
|
#ifndef NOPP
|
||||||
extern arith ifval;
|
extern arith ifval;
|
||||||
#endif NOPP
|
#endif NOPP
|
||||||
|
@ -121,6 +126,9 @@ external_definition
|
||||||
declarator(&Dc)
|
declarator(&Dc)
|
||||||
{
|
{
|
||||||
declare_idf(&Ds, &Dc, level);
|
declare_idf(&Ds, &Dc, level);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_ext_def(Dc.dc_idf, Ds.ds_sc);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
[%if (Dc.dc_idf->id_def->df_type->tp_fund == FUNCTION)
|
[%if (Dc.dc_idf->id_def->df_type->tp_fund == FUNCTION)
|
||||||
/* int i (1) {2, 3}
|
/* int i (1) {2, 3}
|
||||||
|
@ -156,6 +164,12 @@ non_function(register struct decspecs *ds; register struct declarator *dc;)
|
||||||
{ code_declaration(dc->dc_idf, (struct expr *) 0, level, ds->ds_sc); }
|
{ code_declaration(dc->dc_idf, (struct expr *) 0, level, ds->ds_sc); }
|
||||||
]
|
]
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
if (dc->dc_idf->id_def->df_type->tp_fund == FUNCTION)
|
||||||
|
def2decl(ds->ds_sc);
|
||||||
|
if (dc->dc_idf->id_def->df_sc != TYPEDEF)
|
||||||
|
outdef();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
[
|
[
|
||||||
','
|
','
|
||||||
|
@ -171,6 +185,9 @@ function(struct decspecs *ds; struct declarator *dc;)
|
||||||
}
|
}
|
||||||
:
|
:
|
||||||
{ register struct idf *idf = dc->dc_idf;
|
{ register struct idf *idf = dc->dc_idf;
|
||||||
|
#ifdef LINT
|
||||||
|
lint_start_function();
|
||||||
|
#endif LINT
|
||||||
init_idf(idf);
|
init_idf(idf);
|
||||||
stack_level(); /* L_FORMAL1 declarations */
|
stack_level(); /* L_FORMAL1 declarations */
|
||||||
declare_params(dc);
|
declare_params(dc);
|
||||||
|
@ -180,11 +197,23 @@ function(struct decspecs *ds; struct declarator *dc;)
|
||||||
declaration*
|
declaration*
|
||||||
{
|
{
|
||||||
declare_formals(&fbytes);
|
declare_formals(&fbytes);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_formals();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
compound_statement
|
compound_statement
|
||||||
{
|
{
|
||||||
end_proc(fbytes);
|
end_proc(fbytes);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_return_stmt(0); /* implicit return at end of function */
|
||||||
|
#endif LINT
|
||||||
unstack_level(); /* L_FORMAL2 declarations */
|
unstack_level(); /* L_FORMAL2 declarations */
|
||||||
|
#ifdef LINT
|
||||||
|
check_args_used();
|
||||||
|
#endif LINT
|
||||||
unstack_level(); /* L_FORMAL1 declarations */
|
unstack_level(); /* L_FORMAL1 declarations */
|
||||||
|
#ifdef LINT
|
||||||
|
lint_end_function();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* S T A C K / U N S T A C K R O U T I N E S */
|
/* S T A C K / U N S T A C K R O U T I N E S */
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "nofloat.h"
|
#include "nofloat.h"
|
||||||
#include <system.h>
|
#include <system.h>
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
|
@ -51,6 +52,9 @@ stack_level() {
|
||||||
stl->sl_level = ++level;
|
stl->sl_level = ++level;
|
||||||
stl->sl_max_block = loclev->sl_max_block;
|
stl->sl_max_block = loclev->sl_max_block;
|
||||||
local_level = stl;
|
local_level = stl;
|
||||||
|
#ifdef LINT
|
||||||
|
lint_start_local();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
|
|
||||||
stack_idf(idf, stl)
|
stack_idf(idf, stl)
|
||||||
|
@ -96,6 +100,10 @@ unstack_level()
|
||||||
dumpidftab("before unstackidfs", 0);
|
dumpidftab("before unstackidfs", 0);
|
||||||
#endif DEBUG
|
#endif DEBUG
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
lint_local_level(local_level);
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
/* The implementation below is more careful than strictly
|
/* The implementation below is more careful than strictly
|
||||||
necessary. Optimists may optimize it afterwards.
|
necessary. Optimists may optimize it afterwards.
|
||||||
*/
|
*/
|
||||||
|
@ -168,6 +176,10 @@ unstack_world()
|
||||||
*/
|
*/
|
||||||
register struct stack_entry *se = local_level->sl_entry;
|
register struct stack_entry *se = local_level->sl_entry;
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
lint_global_level(local_level);
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
open_name_list();
|
open_name_list();
|
||||||
|
|
||||||
while (se) {
|
while (se) {
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
{
|
{
|
||||||
#include <em.h>
|
#include <em.h>
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "botch_free.h"
|
#include "botch_free.h"
|
||||||
|
|
||||||
|
@ -20,6 +21,11 @@
|
||||||
#include "code.h"
|
#include "code.h"
|
||||||
#include "stack.h"
|
#include "stack.h"
|
||||||
#include "def.h"
|
#include "def.h"
|
||||||
|
#ifdef LINT
|
||||||
|
#include "l_lint.h"
|
||||||
|
#include "l_state.h"
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
extern int level;
|
extern int level;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +37,9 @@ extern int level;
|
||||||
/* 9 */
|
/* 9 */
|
||||||
statement
|
statement
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
lint_statement();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
:
|
:
|
||||||
%if (AHEAD != ':')
|
%if (AHEAD != ':')
|
||||||
|
@ -57,12 +66,18 @@ statement
|
||||||
BREAK
|
BREAK
|
||||||
{
|
{
|
||||||
code_break();
|
code_break();
|
||||||
|
#ifdef LINT
|
||||||
|
lint_break_stmt();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
';'
|
';'
|
||||||
|
|
|
|
||||||
CONTINUE
|
CONTINUE
|
||||||
{
|
{
|
||||||
code_continue();
|
code_continue();
|
||||||
|
#ifdef LINT
|
||||||
|
lint_continue_stmt();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
';'
|
';'
|
||||||
|
|
|
|
||||||
|
@ -104,6 +119,9 @@ label
|
||||||
grz: printf("A labelled statement\n");
|
grz: printf("A labelled statement\n");
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
#ifdef LINT
|
||||||
|
lint_label();
|
||||||
|
#endif LINT
|
||||||
define_label(idf);
|
define_label(idf);
|
||||||
C_df_ilb((label)idf->id_def->df_address);
|
C_df_ilb((label)idf->id_def->df_address);
|
||||||
}
|
}
|
||||||
|
@ -126,6 +144,9 @@ if_statement
|
||||||
/* The comparison has been optimized
|
/* The comparison has been optimized
|
||||||
to a 0 or 1.
|
to a 0 or 1.
|
||||||
*/
|
*/
|
||||||
|
#ifdef LINT
|
||||||
|
hwarning("condition in if is constant");
|
||||||
|
#endif LINT
|
||||||
if (expr->VL_VALUE == (arith)0) {
|
if (expr->VL_VALUE == (arith)0) {
|
||||||
C_bra(l_false);
|
C_bra(l_false);
|
||||||
}
|
}
|
||||||
|
@ -136,21 +157,33 @@ if_statement
|
||||||
C_df_ilb(l_true);
|
C_df_ilb(l_true);
|
||||||
}
|
}
|
||||||
free_expression(expr);
|
free_expression(expr);
|
||||||
|
#ifdef LINT
|
||||||
|
start_if_part();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
')'
|
')'
|
||||||
statement
|
statement
|
||||||
[%prefer
|
[%prefer
|
||||||
ELSE
|
ELSE
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
start_else_part();
|
||||||
|
#endif LINT
|
||||||
C_bra(l_end);
|
C_bra(l_end);
|
||||||
C_df_ilb(l_false);
|
C_df_ilb(l_false);
|
||||||
}
|
}
|
||||||
statement
|
statement
|
||||||
{ C_df_ilb(l_end);
|
{ C_df_ilb(l_end);
|
||||||
|
#ifdef LINT
|
||||||
|
end_if_else_stmt();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
|
|
|
|
||||||
empty
|
empty
|
||||||
{ C_df_ilb(l_false);
|
{ C_df_ilb(l_false);
|
||||||
|
#ifdef LINT
|
||||||
|
end_if_stmt();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
;
|
;
|
||||||
|
@ -176,10 +209,17 @@ while_statement
|
||||||
if (expr->VL_VALUE == (arith)0) {
|
if (expr->VL_VALUE == (arith)0) {
|
||||||
C_bra(l_break);
|
C_bra(l_break);
|
||||||
}
|
}
|
||||||
|
#ifdef LINT
|
||||||
|
start_loop_stmt(WHILE, 1,
|
||||||
|
expr->VL_VALUE != (arith)0);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
code_expr(expr, RVAL, TRUE, l_body, l_break);
|
code_expr(expr, RVAL, TRUE, l_body, l_break);
|
||||||
C_df_ilb(l_body);
|
C_df_ilb(l_body);
|
||||||
|
#ifdef LINT
|
||||||
|
start_loop_stmt(WHILE, 0, 0);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
')'
|
')'
|
||||||
|
@ -189,6 +229,9 @@ while_statement
|
||||||
C_df_ilb(l_break);
|
C_df_ilb(l_break);
|
||||||
unstack_stmt();
|
unstack_stmt();
|
||||||
free_expression(expr);
|
free_expression(expr);
|
||||||
|
#ifdef LINT
|
||||||
|
end_loop_stmt();
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -202,6 +245,9 @@ do_statement
|
||||||
DO
|
DO
|
||||||
{ C_df_ilb(l_body);
|
{ C_df_ilb(l_body);
|
||||||
stack_stmt(l_break, l_continue);
|
stack_stmt(l_break, l_continue);
|
||||||
|
#ifdef LINT
|
||||||
|
start_loop_stmt(DO, 1, 1);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
statement
|
statement
|
||||||
WHILE
|
WHILE
|
||||||
|
@ -215,9 +261,15 @@ do_statement
|
||||||
if (expr->VL_VALUE == (arith)1) {
|
if (expr->VL_VALUE == (arith)1) {
|
||||||
C_bra(l_body);
|
C_bra(l_body);
|
||||||
}
|
}
|
||||||
|
#ifdef LINT
|
||||||
|
end_do_stmt(1, expr->VL_VALUE != (arith)0);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
code_expr(expr, RVAL, TRUE, l_body, l_break);
|
code_expr(expr, RVAL, TRUE, l_body, l_break);
|
||||||
|
#ifdef LINT
|
||||||
|
end_do_stmt(0, 0);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
C_df_ilb(l_break);
|
C_df_ilb(l_break);
|
||||||
}
|
}
|
||||||
|
@ -235,6 +287,9 @@ for_statement
|
||||||
label l_continue = text_label();
|
label l_continue = text_label();
|
||||||
label l_body = text_label();
|
label l_body = text_label();
|
||||||
label l_test = text_label();
|
label l_test = text_label();
|
||||||
|
#ifdef LINT
|
||||||
|
int const = 1, cond = 1; /* the default case */
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
:
|
:
|
||||||
FOR
|
FOR
|
||||||
|
@ -257,10 +312,17 @@ for_statement
|
||||||
if (e_test->VL_VALUE == (arith)0) {
|
if (e_test->VL_VALUE == (arith)0) {
|
||||||
C_bra(l_break);
|
C_bra(l_break);
|
||||||
}
|
}
|
||||||
|
#ifdef LINT
|
||||||
|
const = 1,
|
||||||
|
cond = e_test->VL_VALUE != (arith)0;
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
code_expr(e_test, RVAL, TRUE, l_body, l_break);
|
code_expr(e_test, RVAL, TRUE, l_body, l_break);
|
||||||
C_df_ilb(l_body);
|
C_df_ilb(l_body);
|
||||||
|
#ifdef LINT
|
||||||
|
const = 0, cond = 0;
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]?
|
]?
|
||||||
|
@ -268,9 +330,15 @@ for_statement
|
||||||
expression(&e_incr)?
|
expression(&e_incr)?
|
||||||
')'
|
')'
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
start_loop_stmt(FOR, const, cond);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
statement
|
statement
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
end_loop_stmt();
|
||||||
|
#endif LINT
|
||||||
C_df_ilb(l_continue);
|
C_df_ilb(l_continue);
|
||||||
if (e_incr)
|
if (e_incr)
|
||||||
code_expr(e_incr, RVAL, FALSE,
|
code_expr(e_incr, RVAL, FALSE,
|
||||||
|
@ -294,10 +362,22 @@ switch_statement
|
||||||
expression(&expr)
|
expression(&expr)
|
||||||
{
|
{
|
||||||
code_startswitch(&expr);
|
code_startswitch(&expr);
|
||||||
|
#ifdef LINT
|
||||||
|
start_switch_part();
|
||||||
|
/* the following is a trick to detect a constant
|
||||||
|
* expression in a switch
|
||||||
|
*/
|
||||||
|
opnd2test(&expr, SWITCH);
|
||||||
|
if (is_cp_cst(expr))
|
||||||
|
hwarning("switch value is constant");
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
')'
|
')'
|
||||||
statement
|
statement
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
end_switch_stmt();
|
||||||
|
#endif LINT
|
||||||
code_endswitch();
|
code_endswitch();
|
||||||
free_expression(expr);
|
free_expression(expr);
|
||||||
}
|
}
|
||||||
|
@ -311,6 +391,9 @@ case_statement
|
||||||
CASE
|
CASE
|
||||||
constant_expression(&expr)
|
constant_expression(&expr)
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
lint_case_stmt(0);
|
||||||
|
#endif LINT
|
||||||
code_case(expr);
|
code_case(expr);
|
||||||
free_expression(expr);
|
free_expression(expr);
|
||||||
}
|
}
|
||||||
|
@ -322,6 +405,9 @@ default_statement
|
||||||
:
|
:
|
||||||
DEFAULT
|
DEFAULT
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
lint_case_stmt(1);
|
||||||
|
#endif LINT
|
||||||
code_default();
|
code_default();
|
||||||
}
|
}
|
||||||
':'
|
':'
|
||||||
|
@ -336,13 +422,23 @@ return_statement
|
||||||
[
|
[
|
||||||
expression(&expr)
|
expression(&expr)
|
||||||
{
|
{
|
||||||
|
#ifdef LINT
|
||||||
|
lint_ret_conv(expr->ex_type);
|
||||||
|
#endif LINT
|
||||||
|
|
||||||
do_return_expr(expr);
|
do_return_expr(expr);
|
||||||
free_expression(expr);
|
free_expression(expr);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_return_stmt(1);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
|
|
|
|
||||||
empty
|
empty
|
||||||
{
|
{
|
||||||
do_return();
|
do_return();
|
||||||
|
#ifdef LINT
|
||||||
|
lint_return_stmt(0);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
';'
|
';'
|
||||||
|
@ -358,6 +454,9 @@ jump
|
||||||
{
|
{
|
||||||
apply_label(idf);
|
apply_label(idf);
|
||||||
C_bra((label)idf->id_def->df_address);
|
C_bra((label)idf->id_def->df_address);
|
||||||
|
#ifdef LINT
|
||||||
|
lint_jump_stmt(idf);
|
||||||
|
#endif LINT
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#include <em_mes.h>
|
#include <em_mes.h>
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "use_tmp.h"
|
#include "use_tmp.h"
|
||||||
#include "regcount.h"
|
#include "regcount.h"
|
||||||
|
@ -224,6 +225,7 @@ StoreLocal(off, sz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef LINT
|
||||||
AddrLocal(off)
|
AddrLocal(off)
|
||||||
arith off;
|
arith off;
|
||||||
{
|
{
|
||||||
|
@ -232,3 +234,4 @@ AddrLocal(off)
|
||||||
if (p) p->t_regtype = -1;
|
if (p) p->t_regtype = -1;
|
||||||
C_lal(off);
|
C_lal(off);
|
||||||
}
|
}
|
||||||
|
#endif LINT
|
||||||
|
|
Loading…
Reference in a new issue