put heavily used pointer variables in registers
This commit is contained in:
parent
bfad7d30f0
commit
c967d1ab3a
29 changed files with 275 additions and 280 deletions
|
@ -1,12 +1,12 @@
|
|||
/* $Header$ */
|
||||
/* L E X I C A L A N A L Y Z E R */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "idfsize.h"
|
||||
#include "numsize.h"
|
||||
#include "debug.h"
|
||||
#include "strsize.h"
|
||||
#include "nopp.h"
|
||||
|
||||
#include "input.h"
|
||||
#include "alloc.h"
|
||||
#include "arith.h"
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
to it.
|
||||
*/
|
||||
|
||||
#include "nofloat.h"
|
||||
|
||||
/* the structure of a token: */
|
||||
struct token {
|
||||
int tok_symb; /* the token itself */
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* PARSER ERROR ADMINISTRATION */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "idf.h"
|
||||
#include "alloc.h"
|
||||
#include "arith.h"
|
||||
|
|
|
@ -75,7 +75,7 @@ GSRC = char.c symbol2str.c next.c \
|
|||
# .h files generated by `make hfiles'; PLEASE KEEP THIS UP-TO-DATE!
|
||||
GHSRC = botch_free.h dataflow.h debug.h density.h errout.h \
|
||||
idepth.h idfsize.h ifdepth.h inputtype.h inumlength.h lapbuf.h \
|
||||
maxincl.h myalloc.h nobitfield.h nopp.h \
|
||||
maxincl.h myalloc.h nobitfield.h nofloat.h nopp.h \
|
||||
nparams.h numsize.h parbufsize.h pathlength.h predefine.h \
|
||||
strsize.h target_sizes.h textsize.h use_tmp.h spec_arith.h static.h
|
||||
|
||||
|
@ -205,47 +205,47 @@ sim: cfiles
|
|||
$(SIM) $(SIMFLAGS) `sources $(COBJ)` $(GSRC) $(LSRC)
|
||||
|
||||
#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
|
||||
main.o: LLlex.h Lpars.h alloc.h arith.h debug.h declar.h idf.h input.h inputtype.h level.h maxincl.h myalloc.h nobitfield.h nopp.h spec_arith.h specials.h target_sizes.h tokenname.h type.h use_tmp.h
|
||||
idf.o: LLlex.h Lpars.h align.h alloc.h arith.h assert.h botch_free.h debug.h declar.h decspecs.h def.h idf.h idfsize.h label.h level.h nobitfield.h nopp.h sizes.h spec_arith.h specials.h stack.h storage.h struct.h type.h
|
||||
declarator.o: Lpars.h alloc.h arith.h botch_free.h declar.h expr.h idf.h label.h nobitfield.h nopp.h sizes.h spec_arith.h storage.h type.h
|
||||
decspecs.o: Lpars.h arith.h decspecs.h def.h level.h nobitfield.h spec_arith.h type.h
|
||||
struct.o: LLlex.h Lpars.h align.h arith.h assert.h botch_free.h debug.h def.h field.h idf.h level.h nobitfield.h nopp.h sizes.h spec_arith.h stack.h storage.h struct.h type.h
|
||||
expr.o: LLlex.h Lpars.h alloc.h arith.h botch_free.h declar.h decspecs.h def.h expr.h idf.h label.h level.h nobitfield.h nopp.h sizes.h spec_arith.h storage.h type.h
|
||||
ch7.o: Lpars.h arith.h assert.h debug.h def.h expr.h idf.h label.h nobitfield.h nopp.h spec_arith.h struct.h type.h
|
||||
ch7bin.o: Lpars.h arith.h botch_free.h expr.h idf.h label.h nobitfield.h nopp.h spec_arith.h storage.h struct.h type.h
|
||||
cstoper.o: Lpars.h arith.h assert.h debug.h expr.h idf.h label.h nobitfield.h nopp.h sizes.h spec_arith.h target_sizes.h type.h
|
||||
arith.o: Lpars.h alloc.h arith.h botch_free.h expr.h field.h idf.h label.h mes.h nobitfield.h nopp.h spec_arith.h storage.h type.h
|
||||
alloc.o: alloc.h assert.h debug.h myalloc.h
|
||||
code.o: LLlex.h Lpars.h alloc.h arith.h assert.h atw.h botch_free.h code.h dataflow.h debug.h declar.h decspecs.h def.h expr.h idf.h label.h level.h mes.h nobitfield.h nopp.h sizes.h spec_arith.h specials.h stack.h stmt.h storage.h type.h use_tmp.h
|
||||
dumpidf.o: Lpars.h arith.h debug.h def.h expr.h field.h idf.h label.h nobitfield.h nopp.h spec_arith.h stack.h static.h struct.h type.h
|
||||
error.o: LLlex.h arith.h debug.h errout.h expr.h label.h nopp.h spec_arith.h tokenname.h use_tmp.h
|
||||
field.o: Lpars.h arith.h assert.h code.h debug.h expr.h field.h idf.h label.h nobitfield.h nopp.h sizes.h spec_arith.h type.h
|
||||
tokenname.o: LLlex.h Lpars.h arith.h idf.h nopp.h spec_arith.h tokenname.h
|
||||
LLlex.o: LLlex.h Lpars.h alloc.h arith.h assert.h class.h debug.h def.h idf.h idfsize.h input.h nopp.h numsize.h sizes.h spec_arith.h strsize.h
|
||||
LLmessage.o: LLlex.h Lpars.h alloc.h arith.h idf.h nopp.h spec_arith.h
|
||||
input.o: LLlex.h alloc.h arith.h assert.h debug.h idepth.h input.h inputtype.h interface.h nopp.h pathlength.h spec_arith.h static.h
|
||||
domacro.o: LLlex.h Lpars.h alloc.h arith.h assert.h botch_free.h class.h debug.h idf.h idfsize.h ifdepth.h input.h interface.h macro.h nopp.h nparams.h parbufsize.h spec_arith.h storage.h textsize.h
|
||||
replace.o: LLlex.h alloc.h arith.h assert.h class.h debug.h idf.h input.h interface.h macro.h nopp.h pathlength.h spec_arith.h static.h strsize.h
|
||||
init.o: alloc.h class.h idf.h interface.h macro.h nopp.h predefine.h
|
||||
options.o: align.h arith.h class.h idf.h idfsize.h macro.h maxincl.h nobitfield.h nopp.h sizes.h spec_arith.h storage.h use_tmp.h
|
||||
scan.o: class.h idf.h input.h interface.h lapbuf.h macro.h nopp.h nparams.h
|
||||
skip.o: LLlex.h arith.h class.h input.h interface.h nopp.h spec_arith.h
|
||||
stack.o: Lpars.h alloc.h arith.h botch_free.h debug.h def.h idf.h level.h mes.h nobitfield.h nopp.h spec_arith.h stack.h storage.h struct.h type.h use_tmp.h
|
||||
type.o: Lpars.h align.h alloc.h arith.h def.h idf.h nobitfield.h nopp.h sizes.h spec_arith.h storage.h type.h
|
||||
ch7mon.o: Lpars.h arith.h botch_free.h def.h expr.h idf.h label.h nobitfield.h nopp.h spec_arith.h storage.h type.h
|
||||
label.o: Lpars.h arith.h def.h idf.h label.h level.h nobitfield.h nopp.h spec_arith.h type.h
|
||||
eval.o: Lpars.h align.h arith.h assert.h atw.h code.h dataflow.h debug.h def.h expr.h idf.h label.h level.h mes.h nobitfield.h nopp.h sizes.h spec_arith.h stack.h type.h
|
||||
switch.o: Lpars.h arith.h assert.h botch_free.h code.h debug.h density.h expr.h idf.h label.h nobitfield.h nopp.h spec_arith.h storage.h switch.h type.h
|
||||
storage.o: alloc.h assert.h botch_free.h debug.h storage.h
|
||||
ival.o: Lpars.h align.h arith.h assert.h class.h debug.h def.h expr.h field.h idf.h label.h level.h nobitfield.h nopp.h sizes.h spec_arith.h struct.h type.h
|
||||
conversion.o: Lpars.h arith.h nobitfield.h sizes.h spec_arith.h type.h
|
||||
blocks.o: arith.h atw.h sizes.h spec_arith.h
|
||||
dataflow.o: dataflow.h
|
||||
tokenfile.o: Lpars.h
|
||||
declar.o: LLlex.h Lpars.h arith.h debug.h declar.h decspecs.h def.h expr.h field.h idf.h label.h nobitfield.h nopp.h sizes.h spec_arith.h storage.h struct.h type.h
|
||||
statement.o: LLlex.h Lpars.h arith.h botch_free.h code.h debug.h def.h expr.h idf.h label.h nobitfield.h nopp.h spec_arith.h stack.h storage.h type.h
|
||||
expression.o: LLlex.h Lpars.h arith.h expr.h idf.h label.h nobitfield.h nopp.h spec_arith.h type.h
|
||||
program.o: LLlex.h Lpars.h alloc.h arith.h code.h declar.h decspecs.h def.h expr.h idf.h label.h nobitfield.h nopp.h spec_arith.h type.h
|
||||
LLlex.o: LLlex.h Lpars.h alloc.h arith.h assert.h class.h debug.h def.h idf.h idfsize.h input.h nofloat.h nopp.h numsize.h sizes.h spec_arith.h strsize.h
|
||||
LLmessage.o: LLlex.h Lpars.h alloc.h arith.h idf.h nofloat.h nopp.h spec_arith.h
|
||||
Lpars.o: Lpars.h
|
||||
alloc.o: alloc.h assert.h debug.h myalloc.h
|
||||
arith.o: Lpars.h alloc.h arith.h botch_free.h expr.h field.h idf.h label.h mes.h nobitfield.h nofloat.h nopp.h spec_arith.h storage.h type.h
|
||||
blocks.o: arith.h atw.h nofloat.h sizes.h spec_arith.h
|
||||
ch7.o: Lpars.h arith.h assert.h debug.h def.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h struct.h type.h
|
||||
ch7bin.o: Lpars.h arith.h botch_free.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h storage.h struct.h type.h
|
||||
ch7mon.o: Lpars.h arith.h botch_free.h def.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h storage.h type.h
|
||||
char.o: class.h
|
||||
code.o: LLlex.h Lpars.h alloc.h arith.h assert.h atw.h botch_free.h code.h dataflow.h debug.h declar.h decspecs.h def.h expr.h idf.h label.h level.h mes.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h specials.h stack.h stmt.h storage.h type.h use_tmp.h
|
||||
conversion.o: Lpars.h arith.h nobitfield.h nofloat.h sizes.h spec_arith.h type.h
|
||||
cstoper.o: Lpars.h arith.h assert.h debug.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h target_sizes.h type.h
|
||||
dataflow.o: dataflow.h
|
||||
declar.o: LLlex.h Lpars.h arith.h debug.h declar.h decspecs.h def.h expr.h field.h idf.h label.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h storage.h struct.h type.h
|
||||
declarator.o: Lpars.h alloc.h arith.h botch_free.h declar.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h storage.h type.h
|
||||
decspecs.o: Lpars.h arith.h decspecs.h def.h level.h nobitfield.h nofloat.h spec_arith.h type.h
|
||||
domacro.o: LLlex.h Lpars.h alloc.h arith.h assert.h botch_free.h class.h debug.h idf.h idfsize.h ifdepth.h input.h interface.h macro.h nofloat.h nopp.h nparams.h parbufsize.h spec_arith.h storage.h textsize.h
|
||||
dumpidf.o: Lpars.h arith.h debug.h def.h expr.h field.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h stack.h static.h struct.h type.h
|
||||
error.o: LLlex.h arith.h debug.h errout.h expr.h label.h nofloat.h nopp.h spec_arith.h tokenname.h use_tmp.h
|
||||
eval.o: Lpars.h align.h arith.h assert.h atw.h code.h dataflow.h debug.h def.h expr.h idf.h label.h level.h mes.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h stack.h type.h
|
||||
expr.o: LLlex.h Lpars.h alloc.h arith.h botch_free.h declar.h decspecs.h def.h expr.h idf.h label.h level.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h storage.h type.h
|
||||
expression.o: LLlex.h Lpars.h arith.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h type.h
|
||||
field.o: Lpars.h arith.h assert.h code.h debug.h expr.h field.h idf.h label.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h type.h
|
||||
idf.o: LLlex.h Lpars.h align.h alloc.h arith.h assert.h botch_free.h debug.h declar.h decspecs.h def.h idf.h idfsize.h label.h level.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h specials.h stack.h storage.h struct.h type.h
|
||||
init.o: alloc.h class.h idf.h interface.h macro.h nopp.h predefine.h
|
||||
input.o: LLlex.h alloc.h arith.h assert.h debug.h idepth.h input.h inputtype.h interface.h nofloat.h nopp.h pathlength.h spec_arith.h static.h
|
||||
ival.o: Lpars.h align.h arith.h assert.h class.h debug.h def.h expr.h field.h idf.h label.h level.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h struct.h type.h
|
||||
label.o: Lpars.h arith.h def.h idf.h label.h level.h nobitfield.h nofloat.h nopp.h spec_arith.h type.h
|
||||
main.o: LLlex.h Lpars.h alloc.h arith.h debug.h declar.h idf.h input.h inputtype.h level.h maxincl.h myalloc.h nobitfield.h nofloat.h nopp.h spec_arith.h specials.h target_sizes.h tokenname.h type.h use_tmp.h
|
||||
options.o: align.h arith.h class.h idf.h idfsize.h macro.h maxincl.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h storage.h use_tmp.h
|
||||
program.o: LLlex.h Lpars.h alloc.h arith.h code.h declar.h decspecs.h def.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h type.h
|
||||
replace.o: LLlex.h alloc.h arith.h assert.h class.h debug.h idf.h input.h interface.h macro.h nofloat.h nopp.h pathlength.h spec_arith.h static.h strsize.h
|
||||
scan.o: class.h idf.h input.h interface.h lapbuf.h macro.h nopp.h nparams.h
|
||||
skip.o: LLlex.h arith.h class.h input.h interface.h nofloat.h nopp.h spec_arith.h
|
||||
stack.o: Lpars.h alloc.h arith.h botch_free.h debug.h def.h idf.h level.h mes.h nobitfield.h nofloat.h nopp.h spec_arith.h stack.h storage.h struct.h type.h use_tmp.h
|
||||
statement.o: LLlex.h Lpars.h arith.h botch_free.h code.h debug.h def.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h stack.h storage.h type.h
|
||||
storage.o: alloc.h assert.h botch_free.h debug.h storage.h
|
||||
struct.o: LLlex.h Lpars.h align.h arith.h assert.h botch_free.h debug.h def.h field.h idf.h level.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h stack.h storage.h struct.h type.h
|
||||
switch.o: Lpars.h arith.h assert.h botch_free.h code.h debug.h density.h expr.h idf.h label.h nobitfield.h nofloat.h nopp.h spec_arith.h storage.h switch.h type.h
|
||||
symbol2str.o: Lpars.h
|
||||
tokenfile.o: Lpars.h
|
||||
tokenname.o: LLlex.h Lpars.h arith.h idf.h nofloat.h nopp.h spec_arith.h tokenname.h
|
||||
type.o: Lpars.h align.h alloc.h arith.h def.h idf.h nobitfield.h nofloat.h nopp.h sizes.h spec_arith.h storage.h type.h
|
||||
|
|
|
@ -133,3 +133,8 @@
|
|||
|
||||
!File: static.h
|
||||
#define GSTATIC /* for large global "static" arrays */
|
||||
|
||||
|
||||
!File: nofloat.h
|
||||
#undef NOFLOAT /* floats implemented by default */
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
/* $Header$ */
|
||||
/* A L I G N M E N T D E F I N I T I O N S */
|
||||
|
||||
#include "nofloat.h"
|
||||
|
||||
extern int
|
||||
short_align, word_align, int_align, long_align,
|
||||
#ifndef NOFLOAT
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
semantics of C is a mess.
|
||||
*/
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "botch_free.h"
|
||||
#include "nobitfield.h"
|
||||
#include "alloc.h"
|
||||
|
@ -25,7 +26,8 @@ extern char options[];
|
|||
|
||||
int
|
||||
arithbalance(e1p, oper, e2p) /* RM 6.6 */
|
||||
struct expr **e1p, **e2p;
|
||||
register struct expr **e1p, **e2p;
|
||||
int oper;
|
||||
{
|
||||
/* The expressions *e1p and *e2p are balanced to be operands
|
||||
of the arithmetic operator oper.
|
||||
|
@ -127,9 +129,9 @@ any2arith(expp, oper)
|
|||
/* Turns any expression into int_type, long_type or
|
||||
double_type.
|
||||
*/
|
||||
int fund = (*expp)->ex_type->tp_fund;
|
||||
int fund;
|
||||
|
||||
switch (fund) {
|
||||
switch (fund = (*expp)->ex_type->tp_fund) {
|
||||
case CHAR:
|
||||
case SHORT:
|
||||
int2int(expp,
|
||||
|
@ -174,7 +176,7 @@ any2arith(expp, oper)
|
|||
}
|
||||
|
||||
erroneous2int(expp)
|
||||
struct expr **expp;
|
||||
register struct expr **expp;
|
||||
{
|
||||
/* the (erroneous) expression *expp is replaced by an
|
||||
int expression
|
||||
|
@ -190,7 +192,7 @@ struct expr *
|
|||
arith2arith(tp, oper, expr)
|
||||
struct type *tp;
|
||||
int oper;
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
/* arith2arith constructs a new expression containing a
|
||||
run-time conversion between some arithmetic types.
|
||||
|
@ -280,7 +282,7 @@ array2pointer(expp)
|
|||
}
|
||||
|
||||
function2pointer(expp)
|
||||
struct expr **expp;
|
||||
register struct expr **expp;
|
||||
{
|
||||
/* The expression, which must be a function, is converted
|
||||
to a pointer to the function.
|
||||
|
@ -295,7 +297,7 @@ string2pointer(expp)
|
|||
/* The expression, which must be a string constant, is converted
|
||||
to a pointer to the string-containing area.
|
||||
*/
|
||||
struct expr *ex = *expp;
|
||||
register struct expr *ex = *expp;
|
||||
label lbl = data_label();
|
||||
|
||||
code_string(ex->SG_VALUE, ex->SG_LEN, lbl);
|
||||
|
@ -306,7 +308,7 @@ string2pointer(expp)
|
|||
}
|
||||
|
||||
opnd2integral(expp, oper)
|
||||
struct expr **expp;
|
||||
register struct expr **expp;
|
||||
int oper;
|
||||
{
|
||||
register int fund = (*expp)->ex_type->tp_fund;
|
||||
|
@ -320,7 +322,7 @@ opnd2integral(expp, oper)
|
|||
}
|
||||
|
||||
opnd2logical(expp, oper)
|
||||
struct expr **expp;
|
||||
register struct expr **expp;
|
||||
int oper;
|
||||
{
|
||||
register int fund;
|
||||
|
@ -332,11 +334,7 @@ opnd2logical(expp, oper)
|
|||
if ((*expp)->ex_type->tp_fund == FIELD)
|
||||
field2arith(expp);
|
||||
#endif NOBITFIELD
|
||||
|
||||
fund = (*expp)->ex_type->tp_fund;
|
||||
|
||||
switch (fund) {
|
||||
|
||||
switch (fund = (*expp)->ex_type->tp_fund) {
|
||||
case CHAR:
|
||||
case SHORT:
|
||||
case INT:
|
||||
|
@ -358,7 +356,7 @@ opnd2logical(expp, oper)
|
|||
}
|
||||
|
||||
opnd2test(expp, oper)
|
||||
struct expr **expp;
|
||||
register struct expr **expp;
|
||||
{
|
||||
opnd2logical(expp, oper);
|
||||
if ((*expp)->ex_class == Oper && is_test_op((*expp)->OP_OPER))
|
||||
|
@ -429,7 +427,7 @@ is_asgn_op(oper)
|
|||
}
|
||||
|
||||
any2opnd(expp, oper)
|
||||
struct expr **expp;
|
||||
register struct expr **expp;
|
||||
{
|
||||
if (!*expp)
|
||||
return;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $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 */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "debug.h"
|
||||
#include "nobitfield.h"
|
||||
#include "idf.h"
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/* $Header$ */
|
||||
/* SEMANTIC ANALYSIS (CHAPTER 7RM) -- BINARY OPERATORS */
|
||||
|
||||
#include "botch_free.h" /* UF */
|
||||
#include "nofloat.h"
|
||||
#include "botch_free.h"
|
||||
#include "idf.h"
|
||||
#include "arith.h"
|
||||
#include "type.h"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* SEMANTIC ANALYSIS (CHAPTER 7RM) -- MONADIC OPERATORS */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "nobitfield.h"
|
||||
#include "botch_free.h"
|
||||
#include "Lpars.h"
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
/* $Header$ */
|
||||
/* C O D E - G E N E R A T I N G R O U T I N E S */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include <em.h>
|
||||
|
||||
#include "dataflow.h"
|
||||
#include "use_tmp.h"
|
||||
#include "botch_free.h"
|
||||
|
||||
#include "arith.h"
|
||||
#include "type.h"
|
||||
#include "idf.h"
|
||||
|
@ -67,7 +66,7 @@ code_string(val, len, dlb)
|
|||
int len;
|
||||
label dlb;
|
||||
{
|
||||
struct string_cst *sc = new_string_cst();
|
||||
register struct string_cst *sc = new_string_cst();
|
||||
|
||||
C_ina_dlb(dlb);
|
||||
sc->next = str_list;
|
||||
|
@ -107,14 +106,14 @@ prepend_scopes(dst_file)
|
|||
and generates those exa's, exp's, ina's and inp's
|
||||
that superior hindsight has provided, on the file dst_file.
|
||||
*/
|
||||
struct stack_entry *se = local_level->sl_entry;
|
||||
register struct stack_entry *se = local_level->sl_entry;
|
||||
|
||||
if (C_open(dst_file) == 0)
|
||||
fatal("cannot create %s", dst_file ? dst_file : "stdout");
|
||||
famous_first_words();
|
||||
while (se != 0) {
|
||||
struct idf *idf = se->se_idf;
|
||||
struct def *def = idf->id_def;
|
||||
register struct idf *idf = se->se_idf;
|
||||
register struct def *def = idf->id_def;
|
||||
|
||||
if (def &&
|
||||
( def->df_initialized ||
|
||||
|
@ -131,7 +130,7 @@ prepend_scopes(dst_file)
|
|||
|
||||
code_scope(text, def)
|
||||
char *text;
|
||||
struct def *def;
|
||||
register struct def *def;
|
||||
{
|
||||
/* generates code for one name, text, of the storage class
|
||||
as given by def, if meaningful.
|
||||
|
@ -165,7 +164,7 @@ static label file_name_label;
|
|||
|
||||
begin_proc(name, def) /* to be called when entering a procedure */
|
||||
char *name;
|
||||
struct def *def;
|
||||
register struct def *def;
|
||||
{
|
||||
/* begin_proc() is called at the entrance of a new function
|
||||
and performs the necessary code generation:
|
||||
|
@ -291,7 +290,7 @@ do_return_expr(expr)
|
|||
}
|
||||
|
||||
code_declaration(idf, expr, lvl, sc)
|
||||
struct idf *idf; /* idf to be declared */
|
||||
register struct idf *idf; /* idf to be declared */
|
||||
struct expr *expr; /* initialisation; NULL if absent */
|
||||
int lvl; /* declaration level */
|
||||
int sc; /* storage class, as in the declaration */
|
||||
|
@ -319,7 +318,7 @@ code_declaration(idf, expr, lvl, sc)
|
|||
extern int a = 5;
|
||||
*/
|
||||
char *text = idf->id_text;
|
||||
struct def *def = idf->id_def;
|
||||
register struct def *def = idf->id_def;
|
||||
arith size = def->df_type->tp_size;
|
||||
int def_sc = def->df_sc;
|
||||
|
||||
|
@ -437,7 +436,7 @@ loc_init(expr, id)
|
|||
}
|
||||
|
||||
bss(idf)
|
||||
struct idf *idf;
|
||||
register struct idf *idf;
|
||||
{
|
||||
/* bss() allocates bss space for the global idf.
|
||||
*/
|
||||
|
@ -456,21 +455,21 @@ bss(idf)
|
|||
C_bss_cst(align(size, word_align), (arith)0, 1);
|
||||
}
|
||||
|
||||
formal_cvt(def)
|
||||
struct def *def;
|
||||
formal_cvt(df)
|
||||
register struct def *df;
|
||||
{
|
||||
/* formal_cvt() converts a formal parameter of type char or
|
||||
short from int to that type.
|
||||
*/
|
||||
register struct type* tp = def->df_type;
|
||||
register struct type *tp = df->df_type;
|
||||
|
||||
if (tp->tp_size != int_size)
|
||||
if (tp->tp_fund == CHAR || tp->tp_fund == SHORT) {
|
||||
C_lol(def->df_address);
|
||||
conversion(int_type, def->df_type);
|
||||
C_lal(def->df_address);
|
||||
C_lol(df->df_address);
|
||||
conversion(int_type, df->df_type);
|
||||
C_lal(df->df_address);
|
||||
C_sti(tp->tp_size);
|
||||
def->df_register = REG_NONE;
|
||||
df->df_register = REG_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* C O N V E R S I O N - C O D E G E N E R A T O R */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include <em.h>
|
||||
#include "arith.h"
|
||||
#include "type.h"
|
||||
|
@ -29,30 +30,23 @@ conversion(from_type, to_type)
|
|||
arith from_size;
|
||||
arith to_size;
|
||||
|
||||
if (from_type == to_type) { /* a little optimisation */
|
||||
if (from_type == to_type) /* a little optimisation */
|
||||
return;
|
||||
}
|
||||
|
||||
from_size = from_type->tp_size;
|
||||
to_size = to_type->tp_size;
|
||||
|
||||
switch (fundamental(from_type)) {
|
||||
|
||||
case T_SIGNED:
|
||||
switch (fundamental(to_type)) {
|
||||
|
||||
case T_SIGNED:
|
||||
C_loc(from_size);
|
||||
C_loc(to_size < word_size ? word_size : to_size);
|
||||
C_cii();
|
||||
break;
|
||||
|
||||
case T_UNSIGNED:
|
||||
C_loc(from_size < word_size ? word_size : from_size);
|
||||
C_loc(to_size < word_size ? word_size : to_size);
|
||||
C_ciu();
|
||||
break;
|
||||
|
||||
#ifndef NOFLOAT
|
||||
case T_FLOATING:
|
||||
C_loc(from_size < word_size ? word_size : from_size);
|
||||
|
@ -62,21 +56,16 @@ conversion(from_type, to_type)
|
|||
#endif NOFLOAT
|
||||
}
|
||||
break;
|
||||
|
||||
case T_UNSIGNED:
|
||||
C_loc(from_size < word_size ? word_size : from_size);
|
||||
C_loc(to_size < word_size ? word_size : to_size);
|
||||
|
||||
switch (fundamental(to_type)) {
|
||||
|
||||
case T_SIGNED:
|
||||
C_cui();
|
||||
break;
|
||||
|
||||
case T_UNSIGNED:
|
||||
C_cuu();
|
||||
break;
|
||||
|
||||
#ifndef NOFLOAT
|
||||
case T_FLOATING:
|
||||
C_cuf();
|
||||
|
@ -84,22 +73,17 @@ conversion(from_type, to_type)
|
|||
#endif NOFLOAT
|
||||
}
|
||||
break;
|
||||
|
||||
#ifndef NOFLOAT
|
||||
case T_FLOATING:
|
||||
C_loc(from_size < word_size ? word_size : from_size);
|
||||
C_loc(to_size < word_size ? word_size : to_size);
|
||||
|
||||
switch (fundamental(to_type)) {
|
||||
|
||||
case T_SIGNED:
|
||||
C_cfi();
|
||||
break;
|
||||
|
||||
case T_UNSIGNED:
|
||||
C_cfu();
|
||||
break;
|
||||
|
||||
case T_FLOATING:
|
||||
C_cff();
|
||||
break;
|
||||
|
@ -116,10 +100,9 @@ conversion(from_type, to_type)
|
|||
*/
|
||||
int
|
||||
fundamental(tp)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
switch (tp->tp_fund) {
|
||||
|
||||
case CHAR:
|
||||
case SHORT:
|
||||
case INT:
|
||||
|
@ -127,13 +110,11 @@ fundamental(tp)
|
|||
case LONG:
|
||||
case ENUM:
|
||||
return tp->tp_unsigned ? T_UNSIGNED : T_SIGNED;
|
||||
|
||||
#ifndef NOFLOAT
|
||||
case FLOAT:
|
||||
case DOUBLE:
|
||||
return T_FLOATING;
|
||||
#endif NOFLOAT
|
||||
|
||||
case POINTER: /* pointer : signed / unsigned ??? */
|
||||
return T_SIGNED;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* C O N S T A N T E X P R E S S I O N H A N D L I N G */
|
||||
|
||||
#include "target_sizes.h" /* UF */
|
||||
|
||||
#include "target_sizes.h"
|
||||
#include "idf.h"
|
||||
#include "arith.h"
|
||||
#include "type.h"
|
||||
|
@ -19,14 +18,14 @@ arith max_int; /* maximum integer on target machine */
|
|||
arith max_unsigned; /* maximum unsigned on target machine */
|
||||
|
||||
cstbin(expp, oper, expr)
|
||||
struct expr **expp, *expr;
|
||||
register struct expr **expp, *expr;
|
||||
{
|
||||
/* The operation oper is performed on the constant
|
||||
expressions *expp(ld) and expr(ct), and the result restored in
|
||||
*expp.
|
||||
*/
|
||||
arith o1 = (*expp)->VL_VALUE;
|
||||
arith o2 = expr->VL_VALUE;
|
||||
register arith o1 = (*expp)->VL_VALUE;
|
||||
register arith o2 = expr->VL_VALUE;
|
||||
int uns = (*expp)->ex_type->tp_unsigned;
|
||||
|
||||
ASSERT(is_ld_cst(*expp) && is_cp_cst(expr));
|
||||
|
@ -184,7 +183,7 @@ cstbin(expp, oper, expr)
|
|||
}
|
||||
|
||||
cut_size(expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
/* The constant value of the expression expr is made to
|
||||
conform to the size of the type of the expression.
|
||||
|
@ -214,8 +213,8 @@ cut_size(expr)
|
|||
|
||||
init_cst()
|
||||
{
|
||||
int i = 0;
|
||||
arith bt = (arith)0;
|
||||
register int i = 0;
|
||||
register arith bt = (arith)0;
|
||||
|
||||
while (!(bt < 0)) {
|
||||
bt = (bt << 8) + 0377, i++;
|
||||
|
@ -227,8 +226,6 @@ init_cst()
|
|||
mach_long_sign = 1 << (mach_long_size * 8 - 1);
|
||||
if (long_size < mach_long_size)
|
||||
fatal("sizeof (long) insufficient on this machine");
|
||||
|
||||
|
||||
max_int = full_mask[int_size] & ~(1 << (int_size * 8 - 1));
|
||||
max_unsigned = full_mask[int_size];
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ declare_type(tp, dc)
|
|||
}
|
||||
|
||||
add_decl_unary(dc, fund, count, fm)
|
||||
struct declarator *dc;
|
||||
register struct declarator *dc;
|
||||
arith count;
|
||||
struct formal *fm;
|
||||
{
|
||||
|
@ -77,7 +77,7 @@ remove_declarator(dc)
|
|||
}
|
||||
|
||||
reject_params(dc)
|
||||
struct declarator *dc;
|
||||
register struct declarator *dc;
|
||||
{
|
||||
/* The declarator is checked to have no parameters, if it
|
||||
is a function.
|
||||
|
@ -90,7 +90,7 @@ reject_params(dc)
|
|||
}
|
||||
|
||||
array_subscript(expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
arith size = expr->VL_VALUE;
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* D E C L A R A T I O N S P E C I F I E R C H E C K I N G */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "Lpars.h"
|
||||
#include "decspecs.h"
|
||||
#include "arith.h"
|
||||
|
@ -15,12 +16,12 @@ extern char *symbol2str();
|
|||
struct decspecs null_decspecs;
|
||||
|
||||
do_decspecs(ds)
|
||||
struct decspecs *ds;
|
||||
register struct decspecs *ds;
|
||||
{
|
||||
/* The provisional decspecs ds as obtained from the program
|
||||
is turned into a legal consistent decspecs.
|
||||
*/
|
||||
struct type *tp = ds->ds_type;
|
||||
register struct type *tp = ds->ds_type;
|
||||
|
||||
if (level == L_FORMAL1)
|
||||
crash("do_decspecs");
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "debug.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#include "nofloat.h"
|
||||
#include "nopp.h"
|
||||
#include "nobitfield.h"
|
||||
#include "arith.h"
|
||||
|
@ -41,7 +42,7 @@ static int dumplevel;
|
|||
|
||||
static
|
||||
newline() {
|
||||
int dl = dumplevel;
|
||||
register int dl = dumplevel;
|
||||
|
||||
print("\n");
|
||||
while (dl >= 2) {
|
||||
|
@ -66,7 +67,7 @@ dumpidftab(msg, opt)
|
|||
print(">>> DUMPIDF, %s (start)", msg);
|
||||
dumpstack();
|
||||
for (i = 0; i < HASHSIZE; i++) {
|
||||
struct idf *notch = idf_hashtable[i];
|
||||
register struct idf *notch = idf_hashtable[i];
|
||||
|
||||
while (notch) {
|
||||
dumpidf(notch, opt);
|
||||
|
@ -77,13 +78,14 @@ dumpidftab(msg, opt)
|
|||
print(">>> DUMPIDF, %s (end)\n", msg);
|
||||
}
|
||||
|
||||
dumpstack() {
|
||||
dumpstack()
|
||||
{
|
||||
/* Dumps the identifier stack, starting at the top.
|
||||
*/
|
||||
struct stack_level *stl = local_level;
|
||||
register struct stack_level *stl = local_level;
|
||||
|
||||
while (stl) {
|
||||
struct stack_entry *se = stl->sl_entry;
|
||||
register struct stack_entry *se = stl->sl_entry;
|
||||
|
||||
newline();
|
||||
print("%3d: ", stl->sl_level);
|
||||
|
@ -97,7 +99,7 @@ dumpstack() {
|
|||
}
|
||||
|
||||
dumpidf(idf, opt)
|
||||
struct idf *idf;
|
||||
register struct idf *idf;
|
||||
{
|
||||
/* All information about the identifier idf is divulged in a
|
||||
hopefully readable format.
|
||||
|
@ -174,7 +176,7 @@ dumpdefs(def, opt)
|
|||
}
|
||||
|
||||
dumptags(tag)
|
||||
struct tag *tag;
|
||||
register struct tag *tag;
|
||||
{
|
||||
dumplevel++;
|
||||
while (tag) {
|
||||
|
@ -202,7 +204,7 @@ dumptags(tag)
|
|||
}
|
||||
|
||||
dumpsdefs(sdef, sdk)
|
||||
struct sdef *sdef;
|
||||
register struct sdef *sdef;
|
||||
enum sdef_kind sdk;
|
||||
{
|
||||
/* Since sdef's are members of two chains, there are actually
|
||||
|
@ -235,7 +237,7 @@ dumpsdefs(sdef, sdk)
|
|||
|
||||
char *
|
||||
type2str(tp)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
/* Yields a pointer to a one-line description of the type tp.
|
||||
*/
|
||||
|
@ -312,7 +314,7 @@ print_expr(msg, expr)
|
|||
}
|
||||
|
||||
p1_expr(lvl, expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
extern char *type2str(), *symbol2str();
|
||||
|
||||
|
@ -389,7 +391,9 @@ p1_expr(lvl, expr)
|
|||
}
|
||||
}
|
||||
|
||||
p1_indent(lvl) {
|
||||
p1_indent(lvl)
|
||||
register int lvl;
|
||||
{
|
||||
while (lvl--)
|
||||
print(" ");
|
||||
}
|
||||
|
|
|
@ -12,11 +12,10 @@
|
|||
compare()
|
||||
*/
|
||||
|
||||
#include "nofloat.h"
|
||||
#include <em.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "nobitfield.h"
|
||||
|
||||
#include "dataflow.h"
|
||||
#include "arith.h"
|
||||
#include "type.h"
|
||||
|
@ -71,13 +70,13 @@ arith tmp_pointer_var();
|
|||
*/
|
||||
|
||||
EVAL(expr, val, code, true_label, false_label)
|
||||
struct expr *expr; /* the expression tree itself */
|
||||
register struct expr *expr; /* the expression tree itself */
|
||||
int val; /* either RVAL or LVAL */
|
||||
int code; /* generate explicit code or not */
|
||||
label true_label;
|
||||
label false_label; /* labels to jump to in logical expr's */
|
||||
{
|
||||
register gencode = (code == TRUE);
|
||||
register int gencode = (code == TRUE);
|
||||
|
||||
switch (expr->ex_class) {
|
||||
case Value: /* just a simple value */
|
||||
|
@ -87,7 +86,9 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
case String: /* a string constant */
|
||||
expr_warning(expr, "(DEBUG) value-class 'String' seen");
|
||||
if (gencode) {
|
||||
string2pointer(&expr);
|
||||
struct expr *ex = expr;
|
||||
string2pointer(&ex);
|
||||
expr = ex;
|
||||
C_lae_dlb(expr->VL_LBL, expr->VL_VALUE);
|
||||
}
|
||||
break;
|
||||
|
@ -105,7 +106,7 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
#endif NOFLOAT
|
||||
case Oper: /* compound expression */
|
||||
{
|
||||
register int oper = expr->OP_OPER;
|
||||
int oper = expr->OP_OPER;
|
||||
register struct expr *leftop = expr->OP_LEFT;
|
||||
register struct expr *rightop = expr->OP_RIGHT;
|
||||
register struct type *tp = expr->OP_TYPE;
|
||||
|
@ -250,12 +251,11 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
EVAL(leftop, RVAL, code, NO_LABEL, NO_LABEL);
|
||||
EVAL(rightop, RVAL, code, NO_LABEL, NO_LABEL);
|
||||
ASSERT(tp->tp_fund==INT || tp->tp_fund==LONG);
|
||||
if (gencode) {
|
||||
if (gencode)
|
||||
if (tp->tp_unsigned)
|
||||
C_rmu(tp->tp_size);
|
||||
else
|
||||
C_rmi(tp->tp_size);
|
||||
}
|
||||
break;
|
||||
case LEFT:
|
||||
EVAL(leftop, RVAL, code, NO_LABEL, NO_LABEL);
|
||||
|
@ -429,22 +429,21 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
}
|
||||
case '(':
|
||||
{
|
||||
register struct expr *expr;
|
||||
register struct expr *ex;
|
||||
arith ParSize = (arith)0;
|
||||
|
||||
if (expr = rightop) {
|
||||
if ((ex = rightop) != NILEXPR) {
|
||||
/* function call with parameters*/
|
||||
while ( expr->ex_class == Oper &&
|
||||
expr->OP_OPER == PARCOMMA
|
||||
) {
|
||||
EVAL(expr->OP_RIGHT, RVAL, TRUE,
|
||||
while ( ex->ex_class == Oper &&
|
||||
ex->OP_OPER == PARCOMMA
|
||||
) {
|
||||
EVAL(ex->OP_RIGHT, RVAL, TRUE,
|
||||
NO_LABEL, NO_LABEL);
|
||||
ParSize +=
|
||||
ATW(expr->ex_type->tp_size);
|
||||
expr = expr->OP_LEFT;
|
||||
ParSize += ATW(ex->ex_type->tp_size);
|
||||
ex = ex->OP_LEFT;
|
||||
}
|
||||
EVAL(expr, RVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||
ParSize += ATW(expr->ex_type->tp_size);
|
||||
EVAL(ex, RVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||
ParSize += ATW(ex->ex_type->tp_size);
|
||||
}
|
||||
if ( leftop->ex_class == Value
|
||||
&& leftop->VL_CLASS == Name
|
||||
|
@ -469,14 +468,14 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
/* remove parameters from stack */
|
||||
if (ParSize > (arith)0)
|
||||
C_asp(ParSize);
|
||||
if (!gencode)
|
||||
break;
|
||||
if (is_struct_or_union(tp->tp_fund)) {
|
||||
C_lfr(pointer_size);
|
||||
load_block(tp->tp_size, tp->tp_align);
|
||||
if (gencode) {
|
||||
if (is_struct_or_union(tp->tp_fund)) {
|
||||
C_lfr(pointer_size);
|
||||
load_block(tp->tp_size, tp->tp_align);
|
||||
}
|
||||
else
|
||||
C_lfr(ATW(tp->tp_size));
|
||||
}
|
||||
else
|
||||
C_lfr(ATW(tp->tp_size));
|
||||
break;
|
||||
}
|
||||
case '.':
|
||||
|
@ -507,22 +506,32 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
{
|
||||
arith old_offset, tmp;
|
||||
arith esize = tp->tp_size;
|
||||
int compl; /* Complexity of left operand */
|
||||
#ifndef NOBITFIELD
|
||||
if (leftop->ex_type->tp_fund == FIELD) {
|
||||
eval_field(expr, code);
|
||||
break;
|
||||
}
|
||||
#endif NOBITFIELD
|
||||
if (leftop->ex_class != Value) {
|
||||
if (leftop->ex_class == Value) {
|
||||
compl = 0; /* Value */
|
||||
load_val(leftop, RVAL);
|
||||
}
|
||||
else
|
||||
if (leftop->ex_depth == 1 && leftop->OP_OPER == ARROW) {
|
||||
compl = 1; /* Value->sel */
|
||||
ASSERT(leftop->OP_LEFT->ex_class == Value);
|
||||
EVAL(leftop, RVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||
}
|
||||
else {
|
||||
compl = 2; /* otherwise */
|
||||
tmp = tmp_pointer_var(&old_offset);
|
||||
EVAL(leftop, LVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||
C_dup(pointer_size);
|
||||
C_lal(tmp);
|
||||
C_sti(pointer_size);
|
||||
C_loi(tp->tp_size);
|
||||
C_loi(esize);
|
||||
}
|
||||
else
|
||||
load_val(leftop, RVAL);
|
||||
|
||||
/* We made the choice to put this stuff here
|
||||
and not to put the conversion in the expression
|
||||
|
@ -542,17 +551,23 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
C_dup(esize);
|
||||
if (tp->tp_size < word_size)
|
||||
conversion(word_type, tp);
|
||||
if (leftop->ex_class != Value) {
|
||||
if (compl == 0) {
|
||||
store_val(
|
||||
&(leftop->ex_object.ex_value),
|
||||
leftop->ex_type
|
||||
);
|
||||
}
|
||||
else
|
||||
if (compl == 1) {
|
||||
EVAL(leftop, LVAL, TRUE, NO_LABEL, NO_LABEL);
|
||||
C_sti(tp->tp_size);
|
||||
}
|
||||
else {
|
||||
C_lal(tmp); /* always init'd */
|
||||
C_loi(pointer_size);
|
||||
C_sti(tp->tp_size);
|
||||
free_tmp_var(old_offset);
|
||||
}
|
||||
else
|
||||
store_val(
|
||||
&(leftop->ex_object.ex_value),
|
||||
leftop->ex_type
|
||||
);
|
||||
break;
|
||||
}
|
||||
case '?': /* must be followed by ':' */
|
||||
|
@ -685,7 +700,6 @@ EVAL(expr, val, code, true_label, false_label)
|
|||
expr->ex_type->tp_align);
|
||||
break;
|
||||
}
|
||||
case Type:
|
||||
default:
|
||||
crash("(EVAL) bad expression class");
|
||||
}
|
||||
|
@ -722,13 +736,13 @@ compare(relop, lbl)
|
|||
|
||||
/* assop() generates the opcode of an assignment operators op= */
|
||||
assop(type, oper)
|
||||
struct type *type;
|
||||
register struct type *type;
|
||||
int oper;
|
||||
{
|
||||
register arith size = type->tp_size;
|
||||
register arith size;
|
||||
register uns = type->tp_unsigned;
|
||||
|
||||
if (size < word_size)
|
||||
if ((size = type->tp_size) < word_size)
|
||||
size = word_size;
|
||||
switch (type->tp_fund) {
|
||||
case CHAR:
|
||||
|
@ -837,7 +851,7 @@ arith
|
|||
tmp_pointer_var(oldoffset)
|
||||
arith *oldoffset; /* previous allocated address */
|
||||
{
|
||||
struct stack_level *stl = local_level;
|
||||
register struct stack_level *stl = local_level;
|
||||
|
||||
*oldoffset = stl->sl_local_offset;
|
||||
stl->sl_local_offset =
|
||||
|
@ -940,16 +954,16 @@ store_val(vl, tp)
|
|||
- local variable
|
||||
*/
|
||||
load_val(expr, val)
|
||||
struct expr *expr; /* expression containing the value */
|
||||
register struct expr *expr; /* expression containing the value */
|
||||
int val; /* generate either LVAL or RVAL */
|
||||
{
|
||||
register struct type *tp = expr->ex_type;
|
||||
register int rvalue = (val == RVAL && expr->ex_lvalue != 0);
|
||||
register arith size = tp->tp_size;
|
||||
register int tpalign = tp->tp_align;
|
||||
register int al_on_word;
|
||||
int rvalue = (val == RVAL && expr->ex_lvalue != 0);
|
||||
arith size = tp->tp_size;
|
||||
int tpalign = tp->tp_align;
|
||||
int al_on_word;
|
||||
register int inword, indword;
|
||||
register arith val = expr->VL_VALUE;
|
||||
arith val = expr->VL_VALUE;
|
||||
|
||||
if (expr->VL_CLASS == Const) {
|
||||
if (rvalue) { /* absolute addressing */
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/* $Header$ */
|
||||
/* EXPRESSION TREE HANDLING */
|
||||
|
||||
#include "botch_free.h" /* UF */
|
||||
#include "nofloat.h"
|
||||
#include "botch_free.h"
|
||||
#include "alloc.h"
|
||||
#include "idf.h"
|
||||
#include "arith.h"
|
||||
|
@ -92,7 +93,7 @@ rank_of(oper)
|
|||
|
||||
int
|
||||
rank_of_expression(expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
/* Returns the rank of the top node in the expression.
|
||||
*/
|
||||
|
@ -115,7 +116,7 @@ check_conditional(expr, oper, pos_descr)
|
|||
}
|
||||
|
||||
dot2expr(expp)
|
||||
struct expr **expp;
|
||||
register struct expr **expp;
|
||||
{
|
||||
/* The token in dot is converted into an expression, a
|
||||
pointer to which is stored in *expp.
|
||||
|
@ -146,7 +147,7 @@ dot2expr(expp)
|
|||
}
|
||||
|
||||
idf2expr(expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
/* Dot contains an identifier which is turned into an
|
||||
expression.
|
||||
|
@ -205,7 +206,7 @@ idf2expr(expr)
|
|||
}
|
||||
|
||||
string2expr(expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
/* Dot contains a string which is turned into an expression.
|
||||
*/
|
||||
|
@ -228,7 +229,7 @@ int2expr(expr)
|
|||
|
||||
#ifndef NOFLOAT
|
||||
float2expr(expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
/* Dot contains a floating point constant which is turned
|
||||
into an expression.
|
||||
|
@ -243,11 +244,12 @@ float2expr(expr)
|
|||
struct expr*
|
||||
intexpr(ivalue, fund)
|
||||
arith ivalue;
|
||||
int fund;
|
||||
{
|
||||
/* The value ivalue is turned into an integer expression of
|
||||
the size indicated by fund.
|
||||
*/
|
||||
struct expr *expr = new_expr();
|
||||
register struct expr *expr = new_expr();
|
||||
|
||||
clear((char *)expr, sizeof(struct expr));
|
||||
expr->ex_file = dot.tk_file;
|
||||
|
@ -258,8 +260,9 @@ intexpr(ivalue, fund)
|
|||
}
|
||||
|
||||
fill_int_expr(expr, ivalue, fund)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
arith ivalue;
|
||||
int fund;
|
||||
{
|
||||
/* Details derived from ivalue and fund are put into the
|
||||
constant integer expression expr.
|
||||
|
@ -308,12 +311,12 @@ new_oper(tp, e1, oper, e2)
|
|||
During the construction of the right recursive initialisation
|
||||
tree it is possible for e2 to be NILEXPR.
|
||||
*/
|
||||
struct expr *expr = new_expr();
|
||||
struct oper *op;
|
||||
register struct expr *expr = new_expr();
|
||||
register struct oper *op;
|
||||
|
||||
clear((char *)expr, sizeof(struct expr));
|
||||
if (e2) {
|
||||
struct expr *e = e2;
|
||||
register struct expr *e = e2;
|
||||
|
||||
while (e->ex_class == Oper && e->OP_LEFT)
|
||||
e = e->OP_LEFT;
|
||||
|
@ -322,7 +325,7 @@ new_oper(tp, e1, oper, e2)
|
|||
}
|
||||
else
|
||||
if (e1) {
|
||||
struct expr *e = e1;
|
||||
register struct expr *e = e1;
|
||||
|
||||
while (e->ex_class == Oper && e->OP_RIGHT)
|
||||
e = e->OP_RIGHT;
|
||||
|
@ -387,7 +390,7 @@ chk_cst_expr(expp)
|
|||
register struct expr *expr = *expp;
|
||||
register int fund = expr->ex_type->tp_fund;
|
||||
register int flags = expr->ex_flags;
|
||||
register int err = 0;
|
||||
int err = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
print_expr("constant_expression", expr);
|
||||
|
@ -417,7 +420,7 @@ chk_cst_expr(expp)
|
|||
}
|
||||
|
||||
init_expression(eppp, expr)
|
||||
struct expr ***eppp, *expr;
|
||||
register struct expr ***eppp, *expr;
|
||||
{
|
||||
/* The expression expr is added to the tree designated
|
||||
indirectly by **eppp.
|
||||
|
@ -468,7 +471,7 @@ is_fp_cst(expr)
|
|||
#endif NOFLOAT
|
||||
|
||||
free_expression(expr)
|
||||
struct expr *expr;
|
||||
register struct expr *expr;
|
||||
{
|
||||
/* The expression expr is freed recursively.
|
||||
*/
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
a union of various goodies, we define them first; so be patient.
|
||||
*/
|
||||
|
||||
#include "nofloat.h"
|
||||
|
||||
/* classes of value */
|
||||
#define Const 1
|
||||
#define Name 2
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* IDENTIFIER FIDDLING & SYMBOL TABLE HANDLING */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "debug.h"
|
||||
#include "idfsize.h"
|
||||
#include "botch_free.h"
|
||||
|
@ -86,11 +87,11 @@ idf_hashed(tg, size, hc)
|
|||
hash_stat()
|
||||
{
|
||||
if (options['h']) {
|
||||
int i;
|
||||
register int i;
|
||||
|
||||
print("Hash table tally:\n");
|
||||
for (i = 0; i < HASHSIZE; i++) {
|
||||
struct idf *notch = idf_hashtable[i];
|
||||
register struct idf *notch = idf_hashtable[i];
|
||||
int cnt = 0;
|
||||
|
||||
while (notch) {
|
||||
|
@ -374,8 +375,8 @@ actual_declaration(sc, tp)
|
|||
}
|
||||
|
||||
global_redecl(idf, new_sc, tp)
|
||||
struct idf *idf;
|
||||
struct type *tp;
|
||||
register struct idf *idf;
|
||||
register struct type *tp;
|
||||
{
|
||||
/* A global identifier may be declared several times,
|
||||
provided the declarations do not conflict; they might
|
||||
|
@ -386,7 +387,7 @@ global_redecl(idf, new_sc, tp)
|
|||
register struct def *def = idf->id_def;
|
||||
|
||||
if (tp != def->df_type) {
|
||||
struct type *otp = def->df_type;
|
||||
register struct type *otp = def->df_type;
|
||||
|
||||
if ( tp->tp_fund != ARRAY || otp->tp_fund != ARRAY ||
|
||||
tp->tp_up != otp->tp_up
|
||||
|
@ -425,10 +426,8 @@ global_redecl(idf, new_sc, tp)
|
|||
return; /* no new information */
|
||||
|
||||
switch (def->df_sc) { /* the old storage class */
|
||||
|
||||
case EXTERN:
|
||||
switch (new_sc) { /* the new storage class */
|
||||
|
||||
case EXTERN:
|
||||
case GLOBAL:
|
||||
break;
|
||||
|
@ -449,10 +448,8 @@ global_redecl(idf, new_sc, tp)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case GLOBAL:
|
||||
switch (new_sc) { /* the new storage class */
|
||||
|
||||
case EXTERN:
|
||||
def->df_sc = EXTERN;
|
||||
break;
|
||||
|
@ -475,10 +472,8 @@ global_redecl(idf, new_sc, tp)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case STATIC:
|
||||
switch (new_sc) { /* the new storage class */
|
||||
|
||||
case EXTERN:
|
||||
if (def->df_initialized) {
|
||||
error("cannot redeclare %s to extern",
|
||||
|
@ -501,10 +496,8 @@ global_redecl(idf, new_sc, tp)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case IMPLICIT:
|
||||
switch (new_sc) { /* the new storage class */
|
||||
|
||||
case EXTERN:
|
||||
case GLOBAL:
|
||||
def->df_sc = new_sc;
|
||||
|
@ -520,7 +513,6 @@ global_redecl(idf, new_sc, tp)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ENUM:
|
||||
case TYPEDEF:
|
||||
error("illegal redeclaration of %s", idf->id_text);
|
||||
|
@ -550,7 +542,7 @@ good_formal(def, idf)
|
|||
}
|
||||
|
||||
declare_params(dc)
|
||||
struct declarator *dc;
|
||||
register struct declarator *dc;
|
||||
{
|
||||
/* Declares the formal parameters if they exist.
|
||||
*/
|
||||
|
@ -607,7 +599,7 @@ declare_formals(fp)
|
|||
An address is assigned to each formal parameter.
|
||||
The total size of the formals is returned in *fp;
|
||||
*/
|
||||
struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
|
||||
register struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
|
||||
arith f_offset = (arith)0;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -615,8 +607,7 @@ declare_formals(fp)
|
|||
dumpidftab("start declare_formals", 0);
|
||||
#endif DEBUG
|
||||
while (se) {
|
||||
struct idf *idf = se->se_idf;
|
||||
struct def *def = idf->id_def;
|
||||
register struct def *def = se->se_idf->id_def;
|
||||
|
||||
def->df_address = f_offset;
|
||||
|
||||
|
@ -624,8 +615,7 @@ declare_formals(fp)
|
|||
word boundaries, i.e. take care that the following
|
||||
parameter starts on a new word boundary.
|
||||
*/
|
||||
f_offset = align(f_offset + def->df_type->tp_size,
|
||||
word_align);
|
||||
f_offset = align(f_offset + def->df_type->tp_size, word_align);
|
||||
|
||||
/* the following is absurd: any char or short formal
|
||||
must be converted from integer to that type
|
||||
|
@ -673,7 +663,7 @@ update_ahead(idf)
|
|||
}
|
||||
|
||||
free_formals(fm)
|
||||
struct formal *fm;
|
||||
register struct formal *fm;
|
||||
{
|
||||
while (fm) {
|
||||
register struct formal *tmp = fm->next;
|
||||
|
@ -684,11 +674,12 @@ free_formals(fm)
|
|||
|
||||
char hmask[IDFSIZE];
|
||||
|
||||
init_hmask() {
|
||||
init_hmask()
|
||||
{
|
||||
/* A simple congruence random number generator, as
|
||||
described in Knuth, vol 2.
|
||||
*/
|
||||
int h, rnd = HASH_X;
|
||||
register int h, rnd = HASH_X;
|
||||
|
||||
for (h = 0; h < IDFSIZE; h++) {
|
||||
hmask[h] = rnd;
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
/* $Header$ */
|
||||
/* CODE FOR THE INITIALISATION OF GLOBAL VARIABLES */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include <em.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "nobitfield.h"
|
||||
|
||||
#include "arith.h"
|
||||
#include "align.h"
|
||||
#include "label.h"
|
||||
|
@ -54,7 +53,7 @@ do_ival(tpp, ex)
|
|||
struct expr *
|
||||
IVAL(tpp, ex)
|
||||
struct type **tpp; /* type of global variable */
|
||||
struct expr *ex; /* initialiser expression */
|
||||
register struct expr *ex; /* initialiser expression */
|
||||
{
|
||||
register struct type *tp = *tpp;
|
||||
|
||||
|
@ -116,7 +115,7 @@ IVAL(tpp, ex)
|
|||
*/
|
||||
struct expr *
|
||||
do_array(ex, tpp)
|
||||
struct expr *ex;
|
||||
register struct expr *ex;
|
||||
struct type **tpp;
|
||||
{
|
||||
register struct type *tp = *tpp;
|
||||
|
@ -215,10 +214,10 @@ do_array(ex, tpp)
|
|||
*/
|
||||
struct expr *
|
||||
do_struct(ex, tp)
|
||||
struct expr *ex;
|
||||
struct type *tp;
|
||||
register struct expr *ex;
|
||||
register struct type *tp;
|
||||
{
|
||||
struct sdef *sd = tp->tp_sdef;
|
||||
register struct sdef *sd = tp->tp_sdef;
|
||||
arith bytes_upto_here = (arith)0;
|
||||
arith last_offset = (arith)-1;
|
||||
|
||||
|
@ -248,8 +247,7 @@ do_struct(ex, tp)
|
|||
put_bf(sd->sd_type, (arith)0);
|
||||
else {
|
||||
/* fundamental type, not embraced */
|
||||
check_ival(ex->OP_LEFT,
|
||||
sd->sd_type);
|
||||
check_ival(ex->OP_LEFT, sd->sd_type);
|
||||
ex = ex->OP_RIGHT;
|
||||
}
|
||||
#endif NOBITFIELD
|
||||
|
@ -293,11 +291,11 @@ do_struct(ex, tp)
|
|||
the rest is zeroed.
|
||||
*/
|
||||
check_and_pad(ex, tpp)
|
||||
struct expr *ex;
|
||||
register struct expr *ex;
|
||||
struct type **tpp;
|
||||
{
|
||||
/* ex is of a fundamental type */
|
||||
struct type *tp = *tpp;
|
||||
register struct type *tp = *tpp;
|
||||
|
||||
if (tp->tp_fund == ARRAY) {
|
||||
if (valid_type(tp->tp_up, "array element") == 0)
|
||||
|
@ -339,7 +337,7 @@ check_and_pad(ex, tpp)
|
|||
If the element is an aggregate, pad() is called recursively.
|
||||
*/
|
||||
pad(tp)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
switch (tp->tp_fund) {
|
||||
case ARRAY:
|
||||
|
@ -408,7 +406,7 @@ pad(tp)
|
|||
*/
|
||||
check_ival(ex, tp)
|
||||
struct expr *ex;
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
/* The philosophy here is that ch7cast puts an explicit
|
||||
conversion node in front of the expression if the types
|
||||
|
@ -506,8 +504,8 @@ ch_array(tpp, ex)
|
|||
{
|
||||
register struct type *tp = *tpp;
|
||||
register arith length;
|
||||
char *s = ex->SG_VALUE;
|
||||
arith ntopad;
|
||||
register char *s = ex->SG_VALUE;
|
||||
register arith ntopad;
|
||||
|
||||
ASSERT(ex->ex_class == String);
|
||||
length = ex->SG_LEN;
|
||||
|
@ -588,7 +586,7 @@ put_bf(tp, val)
|
|||
|
||||
int
|
||||
zero_bytes(sd)
|
||||
struct sdef *sd;
|
||||
register struct sdef *sd;
|
||||
{
|
||||
/* fills the space between a selector of a struct
|
||||
and the next selector of that struct with zero-bytes.
|
||||
|
@ -640,7 +638,7 @@ too_many_initialisers(ex)
|
|||
}
|
||||
|
||||
aggregate_type(tp)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
return tp->tp_fund == ARRAY || tp->tp_fund == STRUCT;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* MAIN PROGRAM */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include <system.h>
|
||||
#include "nopp.h"
|
||||
#include "target_sizes.h"
|
||||
|
@ -9,7 +10,6 @@
|
|||
#include "use_tmp.h"
|
||||
#include "maxincl.h"
|
||||
#include "inputtype.h"
|
||||
|
||||
#include "input.h"
|
||||
#include "level.h"
|
||||
#include "idf.h"
|
||||
|
@ -84,6 +84,7 @@ main(argc, argv)
|
|||
#endif OWNALLOC
|
||||
|
||||
init_hmask();
|
||||
|
||||
#ifndef NOPP
|
||||
init_pp(); /* initialise the preprocessor macros */
|
||||
#endif NOPP
|
||||
|
@ -289,7 +290,7 @@ init()
|
|||
}
|
||||
|
||||
init_specials(si)
|
||||
struct sp_id *si;
|
||||
register struct sp_id *si;
|
||||
{
|
||||
while (si->si_identifier) {
|
||||
struct idf *idf = str2idf(si->si_identifier);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* U S E R O P T I O N - H A N D L I N G */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "nopp.h"
|
||||
#include "idfsize.h"
|
||||
#include "maxincl.h"
|
||||
|
@ -174,7 +175,6 @@ do_option(text)
|
|||
align = txt2int(&text);
|
||||
}
|
||||
switch (c) {
|
||||
|
||||
case 's': /* short */
|
||||
if (size != (arith)0)
|
||||
short_size = size;
|
||||
|
@ -242,11 +242,9 @@ do_option(text)
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'n':
|
||||
options['n'] = 1; /* use no registers */
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
options['w'] = 1; /* no warnings will be given */
|
||||
break;
|
||||
|
@ -260,8 +258,7 @@ txt2int(tp)
|
|||
/* the integer pointed to by *tp is read, while increasing
|
||||
*tp; the resulting value is yielded.
|
||||
*/
|
||||
register int val = 0;
|
||||
register int ch;
|
||||
register int val = 0, ch;
|
||||
|
||||
while (ch = **tp, ch >= '0' && ch <= '9') {
|
||||
val = val * 10 + ch - '0';
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
/* $Header$ */
|
||||
/* VARIOUS TARGET MACHINE SIZE DESCRIPTORS */
|
||||
|
||||
#include "nofloat.h"
|
||||
|
||||
extern arith
|
||||
short_size, word_size, dword_size, int_size, long_size,
|
||||
#ifndef NOFLOAT
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
/* $Header$ */
|
||||
/* S T A C K / U N S T A C K R O U T I N E S */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include <system.h>
|
||||
#include <em.h>
|
||||
#include <em_reg.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "use_tmp.h"
|
||||
#include "botch_free.h"
|
||||
|
||||
#include "alloc.h"
|
||||
#include "Lpars.h"
|
||||
#include "arith.h"
|
||||
|
@ -42,7 +41,7 @@ int level; /* Always equal to local_level->sl_level. */
|
|||
stack_level() {
|
||||
/* A new level is added on top of the identifier stack.
|
||||
*/
|
||||
struct stack_level *stl = new_stack_level();
|
||||
register struct stack_level *stl = new_stack_level();
|
||||
|
||||
clear((char *)stl, sizeof(struct stack_level));
|
||||
local_level->sl_next = stl;
|
||||
|
@ -55,7 +54,7 @@ stack_level() {
|
|||
|
||||
stack_idf(idf, stl)
|
||||
struct idf *idf;
|
||||
struct stack_level *stl;
|
||||
register struct stack_level *stl;
|
||||
{
|
||||
/* The identifier idf is inserted in the stack on level stl.
|
||||
*/
|
||||
|
|
|
@ -49,9 +49,9 @@ int lcm();
|
|||
*/
|
||||
|
||||
add_sel(stp, tp, idf, sdefpp, szp, fd) /* this is horrible */
|
||||
struct type *stp; /* type of the structure */
|
||||
struct type *tp; /* type of the selector */
|
||||
struct idf *idf; /* idf of the selector */
|
||||
register struct type *stp; /* type of the structure */
|
||||
struct type *tp; /* type of the selector */
|
||||
register struct idf *idf; /* idf of the selector */
|
||||
struct sdef ***sdefpp; /* address of hook to selector definition */
|
||||
arith *szp; /* pointer to struct size upto here */
|
||||
struct field *fd;
|
||||
|
@ -67,8 +67,8 @@ add_sel(stp, tp, idf, sdefpp, szp, fd) /* this is horrible */
|
|||
extern arith add_field();
|
||||
#endif NOBITFIELD
|
||||
|
||||
register struct tag *tg = stp->tp_idf->id_struct; /* or union */
|
||||
register struct sdef *sdef = idf->id_sdef;
|
||||
struct tag *tg = stp->tp_idf->id_struct; /* or union */
|
||||
struct sdef *sdef = idf->id_sdef;
|
||||
register struct sdef *newsdef;
|
||||
int lvl = tg->tg_level;
|
||||
|
||||
|
@ -164,7 +164,7 @@ check_selector(idf, stp)
|
|||
/* checks if idf occurs already as a selector in
|
||||
struct or union *stp.
|
||||
*/
|
||||
struct sdef *sdef = stp->tp_sdef;
|
||||
register struct sdef *sdef = stp->tp_sdef;
|
||||
|
||||
while (sdef) {
|
||||
if (sdef->sd_idf == idf)
|
||||
|
@ -174,7 +174,7 @@ check_selector(idf, stp)
|
|||
}
|
||||
|
||||
declare_struct(fund, idf, tpp)
|
||||
struct idf *idf;
|
||||
register struct idf *idf;
|
||||
struct type **tpp;
|
||||
{
|
||||
/* A struct, union or enum (depending on fund) with tag (!)
|
||||
|
@ -251,7 +251,7 @@ declare_struct(fund, idf, tpp)
|
|||
}
|
||||
|
||||
apply_struct(fund, idf, tpp)
|
||||
struct idf *idf;
|
||||
register struct idf *idf;
|
||||
struct type **tpp;
|
||||
{
|
||||
/* The occurrence of a struct, union or enum (depending on
|
||||
|
@ -271,7 +271,7 @@ apply_struct(fund, idf, tpp)
|
|||
|
||||
struct sdef *
|
||||
idf2sdef(idf, tp)
|
||||
struct idf *idf;
|
||||
register struct idf *idf;
|
||||
struct type *tp;
|
||||
{
|
||||
/* The identifier idf is identified as a selector, preferably
|
||||
|
@ -280,7 +280,7 @@ idf2sdef(idf, tp)
|
|||
If the attempt fails, a selector of type error_type is
|
||||
created.
|
||||
*/
|
||||
struct sdef **sdefp = &idf->id_sdef, *sdef;
|
||||
register struct sdef **sdefp = &idf->id_sdef, *sdef;
|
||||
|
||||
/* Follow chain from idf, to meet tp. */
|
||||
while ((sdef = *sdefp)) {
|
||||
|
@ -316,7 +316,7 @@ idf2sdef(idf, tp)
|
|||
|
||||
int
|
||||
uniq_selector(idf_sdef)
|
||||
struct sdef *idf_sdef;
|
||||
register struct sdef *idf_sdef;
|
||||
{
|
||||
/* Returns true if idf_sdef (which is guaranteed to exist)
|
||||
is unique for this level, i.e there is no other selector
|
||||
|
@ -326,7 +326,7 @@ uniq_selector(idf_sdef)
|
|||
case!
|
||||
*/
|
||||
|
||||
struct sdef *sdef = idf_sdef->next;
|
||||
register struct sdef *sdef = idf_sdef->next;
|
||||
|
||||
while (sdef && sdef->sd_level == idf_sdef->sd_level) {
|
||||
if ( sdef->sd_type != idf_sdef->sd_type
|
||||
|
@ -342,11 +342,11 @@ uniq_selector(idf_sdef)
|
|||
#ifndef NOBITFIELD
|
||||
arith
|
||||
add_field(szp, fd, fdtpp, idf, stp)
|
||||
arith *szp; /* size of struct upto here */
|
||||
struct field *fd; /* bitfield, containing width */
|
||||
struct type **fdtpp; /* type of selector */
|
||||
struct idf *idf; /* name of selector */
|
||||
struct type *stp; /* current struct descriptor */
|
||||
arith *szp; /* size of struct upto here */
|
||||
register struct field *fd; /* bitfield, containing width */
|
||||
register struct type **fdtpp; /* type of selector */
|
||||
struct idf *idf; /* name of selector */
|
||||
register struct type *stp; /* current struct descriptor */
|
||||
{
|
||||
/* The address where this selector is put is returned. If the
|
||||
selector with specified width does not fit in the word, or
|
||||
|
@ -376,7 +376,6 @@ add_field(szp, fd, fdtpp, idf, stp)
|
|||
}
|
||||
|
||||
switch ((*fdtpp)->tp_fund) {
|
||||
|
||||
case CHAR:
|
||||
case SHORT:
|
||||
case INT:
|
||||
|
@ -419,22 +418,19 @@ add_field(szp, fd, fdtpp, idf, stp)
|
|||
bits_declared = fd->fd_width;
|
||||
}
|
||||
else
|
||||
if (fd->fd_width == 0) {
|
||||
if (fd->fd_width == 0)
|
||||
/* next field should be aligned on the next boundary.
|
||||
This will take care that no field will fit in the
|
||||
space allocated upto here.
|
||||
*/
|
||||
bits_declared = bits_in_type + 1;
|
||||
}
|
||||
else { /* the bitfield fits in the current field */
|
||||
else /* the bitfield fits in the current field */
|
||||
bits_declared += fd->fd_width;
|
||||
}
|
||||
|
||||
/* Arrived here, the place where the selector is stored in the
|
||||
struct is computed.
|
||||
Now we need a mask to use its value in expressions.
|
||||
*/
|
||||
|
||||
*fdtpp = construct_type(FIELD, *fdtpp, (arith)0);
|
||||
(*fdtpp)->tp_field = fd;
|
||||
|
||||
|
@ -446,12 +442,10 @@ add_field(szp, fd, fdtpp, idf, stp)
|
|||
*/
|
||||
fd->fd_mask = (1 << fd->fd_width) - 1;
|
||||
|
||||
if (options['r']) { /* adjust the field at the right */
|
||||
if (options['r']) /* adjust the field at the right */
|
||||
fd->fd_shift = bits_declared - fd->fd_width;
|
||||
}
|
||||
else { /* adjust the field at the left */
|
||||
else /* adjust the field at the left */
|
||||
fd->fd_shift = bits_in_type - bits_declared;
|
||||
}
|
||||
|
||||
return field_offset;
|
||||
}
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
/* $Header$ */
|
||||
/* S W I T C H - S T A T E M E N T A D M I N I S T R A T I O N */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include <em.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "botch_free.h"
|
||||
#include "density.h"
|
||||
|
||||
#include "Lpars.h"
|
||||
#include "idf.h"
|
||||
#include "label.h"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $Header$ */
|
||||
/* T Y P E D E F I N I T I O N M E C H A N I S M */
|
||||
|
||||
#include "nofloat.h"
|
||||
#include "nobitfield.h"
|
||||
#include "alloc.h"
|
||||
#include "Lpars.h"
|
||||
|
@ -52,13 +53,13 @@ create_type(fund)
|
|||
|
||||
struct type *
|
||||
construct_type(fund, tp, count)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
arith count; /* for fund == ARRAY only */
|
||||
{
|
||||
/* fund must be a type constructor: FIELD, FUNCTION, POINTER or
|
||||
ARRAY. The pointer to the constructed type is returned.
|
||||
*/
|
||||
struct type *dtp;
|
||||
register struct type *dtp;
|
||||
|
||||
switch (fund) {
|
||||
#ifndef NOBITFIELD
|
||||
|
@ -97,9 +98,9 @@ construct_type(fund, tp, count)
|
|||
|
||||
struct type *
|
||||
function_of(tp)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
struct type *dtp = tp->tp_function;
|
||||
register struct type *dtp = tp->tp_function;
|
||||
|
||||
if (!dtp) {
|
||||
tp->tp_function = dtp = create_type(FUNCTION);
|
||||
|
@ -112,9 +113,9 @@ function_of(tp)
|
|||
|
||||
struct type *
|
||||
pointer_to(tp)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
struct type *dtp = tp->tp_pointer;
|
||||
register struct type *dtp = tp->tp_pointer;
|
||||
|
||||
if (!dtp) {
|
||||
tp->tp_pointer = dtp = create_type(POINTER);
|
||||
|
@ -128,10 +129,10 @@ pointer_to(tp)
|
|||
|
||||
struct type *
|
||||
array_of(tp, count)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
arith count;
|
||||
{
|
||||
struct type *dtp = tp->tp_array;
|
||||
register struct type *dtp = tp->tp_array;
|
||||
|
||||
/* look for a type with the right size */
|
||||
while (dtp && dtp->tp_size != count)
|
||||
|
@ -151,9 +152,9 @@ array_of(tp, count)
|
|||
#ifndef NOBITFIELD
|
||||
struct type *
|
||||
field_of(tp)
|
||||
struct type *tp;
|
||||
register struct type *tp;
|
||||
{
|
||||
struct type *dtp = create_type(FIELD);
|
||||
register struct type *dtp = create_type(FIELD);
|
||||
|
||||
dtp->tp_up = tp;
|
||||
dtp->tp_align = tp->tp_align;
|
||||
|
@ -177,7 +178,7 @@ size_of_type(tp, nm)
|
|||
}
|
||||
|
||||
idf2type(idf, tpp)
|
||||
struct idf *idf;
|
||||
register struct idf *idf;
|
||||
struct type **tpp;
|
||||
{
|
||||
/* Decoding a typedef-ed identifier: if the size is yet
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/* $Header$ */
|
||||
/* TYPE DESCRIPTOR */
|
||||
|
||||
#include "nobitfield.h"
|
||||
#include "nofloat.h"
|
||||
#include "nobitfield.h"
|
||||
|
||||
struct type {
|
||||
struct type *next; /* used only with ARRAY */
|
||||
|
|
Loading…
Reference in a new issue