newer version

This commit is contained in:
ceriel 1986-05-14 09:03:51 +00:00
parent 0bf57a9c64
commit 15896e422c
6 changed files with 72 additions and 33 deletions

View file

@ -44,8 +44,8 @@ main: $(OBJ) Makefile
clean: clean:
rm -f $(OBJ) $(GENFILES) LLfiles rm -f $(OBJ) $(GENFILES) LLfiles
lint: LLfiles lintlist lint: LLfiles hfiles
lint $(INCLUDES) `cat lintlist` lint $(INCLUDES) -DNORCSID `sources $(OBJ)`
tokenfile.g: tokenname.c make.tokfile tokenfile.g: tokenname.c make.tokfile
make.tokfile <tokenname.c >tokenfile.g make.tokfile <tokenname.c >tokenfile.g
@ -79,11 +79,11 @@ depend:
make.allocd < $< > $@ make.allocd < $< > $@
#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO #AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
LLlex.o: LLlex.h Lpars.h class.h const.h f_info.h idf.h idfsize.h input.h inputtype.h numsize.h strsize.h type.h LLlex.o: LLlex.h Lpars.h class.h const.h debug.h f_info.h idf.h idfsize.h input.h inputtype.h numsize.h strsize.h type.h
LLmessage.o: LLlex.h Lpars.h idf.h LLmessage.o: LLlex.h Lpars.h idf.h
char.o: class.h char.o: class.h
error.o: LLlex.h debug.h errout.h f_info.h input.h inputtype.h main.h node.h error.o: LLlex.h debug.h errout.h f_info.h input.h inputtype.h main.h node.h
main.o: LLlex.h Lpars.h debug.h def.h f_info.h idf.h input.h inputtype.h ndirs.h node.h scope.h standards.h tokenname.h type.h main.o: LLlex.h Lpars.h debug.h def.h f_info.h idf.h input.h inputtype.h ndir.h node.h scope.h standards.h tokenname.h type.h
symbol2str.o: Lpars.h symbol2str.o: Lpars.h
tokenname.o: Lpars.h idf.h tokenname.h tokenname.o: Lpars.h idf.h tokenname.h
idf.o: idf.h idf.o: idf.h
@ -92,17 +92,18 @@ type.o: LLlex.h const.h debug.h def.h idf.h maxset.h node.h target_sizes.h type.
def.o: LLlex.h debug.h def.h idf.h main.h node.h scope.h type.h def.o: LLlex.h debug.h def.h idf.h main.h node.h scope.h type.h
scope.o: LLlex.h debug.h def.h idf.h node.h scope.h type.h scope.o: LLlex.h debug.h def.h idf.h node.h scope.h type.h
misc.o: LLlex.h f_info.h idf.h misc.h node.h misc.o: LLlex.h f_info.h idf.h misc.h node.h
enter.o: LLlex.h def.h idf.h main.h node.h scope.h type.h enter.o: LLlex.h debug.h def.h idf.h main.h node.h scope.h type.h
defmodule.o: LLlex.h debug.h def.h f_info.h idf.h input.h inputtype.h main.h scope.h defmodule.o: LLlex.h debug.h def.h f_info.h idf.h input.h inputtype.h main.h scope.h
typequiv.o: def.h type.h typequiv.o: def.h type.h
node.o: LLlex.h debug.h def.h node.h type.h node.o: LLlex.h debug.h def.h node.h type.h
cstoper.o: LLlex.h Lpars.h idf.h node.h standards.h target_sizes.h type.h cstoper.o: LLlex.h Lpars.h debug.h idf.h node.h standards.h target_sizes.h type.h
chk_expr.o: LLlex.h Lpars.h const.h debug.h def.h idf.h node.h scope.h standards.h type.h chk_expr.o: LLlex.h Lpars.h const.h debug.h def.h idf.h node.h scope.h standards.h type.h
options.o: idfsize.h main.h ndir.h type.h options.o: idfsize.h main.h ndir.h type.h
walk.o: LLlex.h Lpars.h debug.h def.h main.h node.h scope.h type.h walk.o: LLlex.h Lpars.h debug.h def.h main.h node.h scope.h type.h
casestat.o: LLlex.h Lpars.h debug.h density.h node.h type.h
tokenfile.o: Lpars.h tokenfile.o: Lpars.h
program.o: LLlex.h Lpars.h debug.h def.h idf.h main.h node.h scope.h type.h program.o: LLlex.h Lpars.h debug.h def.h idf.h main.h node.h scope.h type.h
declar.o: LLlex.h Lpars.h def.h idf.h main.h misc.h node.h scope.h type.h declar.o: LLlex.h Lpars.h debug.h def.h idf.h main.h misc.h node.h scope.h type.h
expression.o: LLlex.h Lpars.h const.h debug.h def.h idf.h node.h scope.h type.h expression.o: LLlex.h Lpars.h const.h debug.h def.h idf.h node.h type.h
statement.o: LLlex.h Lpars.h def.h idf.h node.h scope.h type.h statement.o: LLlex.h Lpars.h def.h idf.h node.h scope.h type.h
Lpars.o: Lpars.h Lpars.o: Lpars.h

View file

@ -18,8 +18,6 @@ static char *RcsId = "$Header$";
#include "density.h" #include "density.h"
/* STATICALLOCDEF "caselist" */
struct switch_hdr { struct switch_hdr {
struct switch_hdr *next; struct switch_hdr *next;
label sh_break; label sh_break;
@ -102,7 +100,7 @@ CaseCode(nd, exitlabel)
tablabel = data_label(); /* the rom must have a label */ tablabel = data_label(); /* the rom must have a label */
C_df_dlb(tablabel); C_df_dlb(tablabel);
if (sh->sh_default) C_rom_ilb(sh->sh_default); if (sh->sh_default) C_rom_ilb(sh->sh_default);
else C_rom_ucon((arith) 0, pointer_size); else C_rom_ucon("0", pointer_size);
if (compact(sh->sh_nrofentries, sh->sh_lowerbd, sh->sh_upperbd)) { if (compact(sh->sh_nrofentries, sh->sh_lowerbd, sh->sh_upperbd)) {
/* CSA */ /* CSA */
@ -253,8 +251,7 @@ AddOneCase(sh, node, lbl)
*/ */
if (c1) { if (c1) {
if (c1->ce_value == ce->ce_value) { if (c1->ce_value == ce->ce_value) {
node_error("multiple case entry for value %ld", node_error(node, "multiple case entry for value %ld", ce->ce_value);
ce->ce_value);
free_case_entry(ce); free_case_entry(ce);
return 0; return 0;
} }

View file

@ -448,7 +448,7 @@ chk_designator(expp, flag)
assert(expp->nd_right->nd_class == Name); assert(expp->nd_right->nd_class == Name);
if (! chk_designator(expp->nd_left, if (! chk_designator(expp->nd_left,
(flag|HASSELECTORS)&DESIGNATOR)) return 0; (flag|HASSELECTORS))) return 0;
tp = expp->nd_left->nd_type; tp = expp->nd_left->nd_type;
@ -633,7 +633,7 @@ node_error(expp, "IN operator: type of LHS not compatible with element type of R
case '*': case '*':
switch(tpl->tp_fund) { switch(tpl->tp_fund) {
case T_POINTER: case T_POINTER:
if (tpl != address_type) break; if (! chk_address(tpl, tpr)) break;
/* Fall through */ /* Fall through */
case T_INTEGER: case T_INTEGER:
case T_CARDINAL: case T_CARDINAL:
@ -669,7 +669,13 @@ node_error(expp, "IN operator: type of LHS not compatible with element type of R
case DIV: case DIV:
case MOD: case MOD:
if ((tpl->tp_fund & T_INTORCARD) || tpl == address_type) { switch(tpl->tp_fund) {
case T_POINTER:
if (! chk_address(tpl, tpr)) break;
/* Fall through */
case T_INTEGER:
case T_CARDINAL:
case T_INTORCARD:
if (left->nd_class==Value && right->nd_class==Value) { if (left->nd_class==Value && right->nd_class==Value) {
cstbin(expp); cstbin(expp);
} }
@ -718,7 +724,8 @@ node_error(expp, "IN operator: type of LHS not compatible with element type of R
return 1; return 1;
case T_POINTER: case T_POINTER:
if (expp->nd_symb == '=' || if (chk_address(tpl, tpr) ||
expp->nd_symb == '=' ||
expp->nd_symb == UNEQUAL || expp->nd_symb == UNEQUAL ||
expp->nd_symb == '#') return 1; expp->nd_symb == '#') return 1;
break; break;
@ -745,6 +752,22 @@ node_error(expp, "IN operator: type of LHS not compatible with element type of R
return 0; return 0;
} }
int
chk_address(tpl, tpr)
register struct type *tpl, *tpr;
{
if (tpl == address_type) {
return tpr == address_type || tpr->tp_fund != T_POINTER;
}
if (tpr == address_type) {
return tpl->tp_fund != T_POINTER;
}
return 0;
}
int int
chk_uoper(expp) chk_uoper(expp)
register struct node *expp; register struct node *expp;
@ -769,6 +792,9 @@ chk_uoper(expp)
case '-': case '-':
if (tpr->tp_fund & T_INTORCARD) { if (tpr->tp_fund & T_INTORCARD) {
if (tpr == intorcard_type) {
expp->nd_type = int_type;
}
if (right->nd_class == Value) { if (right->nd_class == Value) {
cstunary(expp); cstunary(expp);
} }

View file

@ -56,6 +56,12 @@ ProcedureHeading(struct def **pdf; int type;)
PROCEDURE IDENT PROCEDURE IDENT
{ {
df = DeclProc(type); df = DeclProc(type);
if (proclevel) {
/* Room for static link
*/
df->prc_nbpar = pointer_size;
}
else df->prc_nbpar = 0;
} }
FormalParameters(type == D_PROCEDURE, &params, &tp, &(df->prc_nbpar))? FormalParameters(type == D_PROCEDURE, &params, &tp, &(df->prc_nbpar))?
{ {

View file

@ -477,7 +477,6 @@ DeclProc(type)
strcpy(CurrentScope->sc_name, buf); strcpy(CurrentScope->sc_name, buf);
C_inp(buf); C_inp(buf);
} }
df->prc_nbpar = 0;
} }
return df; return df;

View file

@ -25,8 +25,6 @@ static char *RcsId = "$Header$";
extern arith align(); extern arith align();
static int prclev = 0; static int prclev = 0;
static label instructionlabel; static label instructionlabel;
static label datalabel = 1;
static label return_label;
static char return_expr_occurred; static char return_expr_occurred;
static struct type *func_type; static struct type *func_type;
@ -39,7 +37,9 @@ text_label()
label label
data_label() data_label()
{ {
return datalabel++; static label datalabel = 0;
return ++datalabel;
} }
WalkModule(module) WalkModule(module)
@ -89,14 +89,13 @@ WalkModule(module)
this module. this module.
*/ */
CurrentScope->sc_off = 0; CurrentScope->sc_off = 0;
instructionlabel = 1; instructionlabel = 2;
return_label = instructionlabel++;
func_type = 0; func_type = 0;
C_pro_narg(CurrentScope->sc_name); C_pro_narg(CurrentScope->sc_name);
MkCalls(CurrentScope->sc_def); MkCalls(CurrentScope->sc_def);
WalkNode(module->mod_body, (label) 0); WalkNode(module->mod_body, (label) 0);
C_df_ilb(return_label); C_df_ilb((label) 1);
C_ret((label) 0); C_ret(0);
C_end(align(-CurrentScope->sc_off, word_align)); C_end(align(-CurrentScope->sc_off, word_align));
CurrVis = vis; CurrVis = vis;
@ -121,15 +120,20 @@ WalkProcedure(procedure)
/* generate calls to initialization routines of modules defined within /* generate calls to initialization routines of modules defined within
this procedure this procedure
*/ */
return_label = 1; MkCalls(CurrentScope->sc_def);
return_expr_occurred = 0;
instructionlabel = 2; instructionlabel = 2;
func_type = procedure->df_type->next; func_type = procedure->df_type->next;
MkCalls(CurrentScope->sc_def);
WalkNode(procedure->prc_body, (label) 0); WalkNode(procedure->prc_body, (label) 0);
C_df_ilb(return_label); C_df_ilb((label) 1);
if (func_type) C_ret((arith) align(func_type->tp_size, word_align)); if (func_type) {
else C_ret((arith) 0); if (! return_expr_occurred) {
C_end(align(-CurrentScope->sc_off, word_size)); node_error(procedure->prc_body,"function procedure does not return a value");
}
C_ret((int) align(func_type->tp_size, word_align));
}
else C_ret(0);
C_end((int) align(-CurrentScope->sc_off, word_align));
CurrVis = vis; CurrVis = vis;
prclev--; prclev--;
} }
@ -195,6 +199,12 @@ WalkStat(nd, lab)
register struct node *left = nd->nd_left; register struct node *left = nd->nd_left;
register struct node *right = nd->nd_right; register struct node *right = nd->nd_right;
if (!nd) {
/* Empty statement
*/
return;
}
if (nd->nd_class == Call) { if (nd->nd_class == Call) {
if (chk_call(nd)) CodeCall(nd); if (chk_call(nd)) CodeCall(nd);
return; return;
@ -204,8 +214,8 @@ WalkStat(nd, lab)
switch(nd->nd_symb) { switch(nd->nd_symb) {
case BECOMES: case BECOMES:
WalkDesignator(left);
WalkExpr(right); WalkExpr(right);
WalkDesignator(left); /* May we do it in this order??? */
if (! TstAssCompat(left->nd_type, right->nd_type)) { if (! TstAssCompat(left->nd_type, right->nd_type)) {
node_error(nd, "type incompatibility in assignment"); node_error(nd, "type incompatibility in assignment");
@ -318,7 +328,7 @@ node_error(right, "type incompatibility in RETURN statement");
} }
return_expr_occurred = 1; return_expr_occurred = 1;
} }
C_bra(return_label); C_bra((label) 1);
break; break;
default: default: