newer version
This commit is contained in:
parent
0bf57a9c64
commit
15896e422c
6 changed files with 72 additions and 33 deletions
lang/m2/comp
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, ¶ms, &tp, &(df->prc_nbpar))?
|
FormalParameters(type == D_PROCEDURE, ¶ms, &tp, &(df->prc_nbpar))?
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Reference in a new issue