cvsuser 03/01/31 02:54:09
Modified: languages/imcc ChangeLog imc.c imc.h imcc.l imcc.y
instructions.c instructions.h main.c optimizer.c
optimizer.h parser.h parser_util.c pbc.c pbc.h
Log:
imcc
Revision Changes Path
1.7 +10 -0 parrot/languages/imcc/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/ChangeLog,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -r1.6 -r1.7
--- ChangeLog 21 Jan 2003 10:11:30 -0000 1.6
+++ ChangeLog 31 Jan 2003 10:54:08 -0000 1.7
@@ -1,3 +1,13 @@
+- 2003-01-31 leo
+ * version 0.0.9.11
+ * changed the until now global Parrot_Interp * to
+ a local one
+ This implies:
+ *****************************************************
+ CHANGES in many function prototypes, which now take a
+ interpreter param
+ *****************************************************
+
- 2003-01-20 leo
* version 0.0.9.10
* the -r command line option is now optional, default mode now
1.29 +7 -7 parrot/languages/imcc/imc.c
Index: imc.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imc.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -w -r1.28 -r1.29
--- imc.c 21 Jan 2003 10:11:31 -0000 1.28
+++ imc.c 31 Jan 2003 10:54:08 -0000 1.29
@@ -24,7 +24,7 @@
static IMCStack nodeStack;
/* allocate is the main loop of the allocation algorithm */
-void allocate() {
+void allocate(struct Parrot_Interp *interpreter) {
int to_spill;
int todo;
@@ -38,7 +38,7 @@
imc_stat_init();
/* consecutive labels, if_branch, unused_labels ... */
- pre_optimize();
+ pre_optimize(interpreter);
nodeStack = imcstack_new();
dont_optimize = n_spilled = 0;
@@ -61,7 +61,7 @@
if (dont_optimize)
todo = 0;
else
- todo = optimize();
+ todo = optimize(interpreter);
}
todo = 1;
while (todo) {
@@ -74,7 +74,7 @@
to_spill = try_allocate();
if ( to_spill >= 0 ) {
- spill(to_spill);
+ spill(interpreter, to_spill);
build_reglist();
life_analysis();
}
@@ -577,7 +577,7 @@
*/
-void spill(int spilled) {
+void spill(struct Parrot_Interp *interpreter, int spilled) {
Instruction * tmp, *ins;
int i, n;
@@ -616,7 +616,7 @@
sprintf(buf, "%d", n_spilled);
regs[2] = mk_const(str_dup(buf), 'I');
sprintf(buf, "%%s, %%s[%%s] #FETCH %s", new_symbol->name);
- tmp = INS("set", buf, regs, 3, 4, 0);
+ tmp = INS(interpreter, "set", buf, regs, 3, 4, 0);
tmp->bbindex = ins->bbindex;
tmp->flags |= ITSPILL;
/* insert tmp before actual ins */
@@ -633,7 +633,7 @@
regs[1] = mk_const(str_dup(buf), 'I');
regs[2] = new_symbol;
sprintf(buf, "%%s[%%s], %%s #STORE %s", old_symbol->name);
- tmp = INS("set", buf, regs, 3, 2, 0);
+ tmp = INS(interpreter, "set", buf, regs, 3, 2, 0);
tmp->bbindex = ins->bbindex;
tmp->flags |= ITSPILL;
/* insert tmp after ins */
1.23 +5 -6 parrot/languages/imcc/imc.h
Index: imc.h
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imc.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -w -r1.22 -r1.23
--- imc.h 21 Jan 2003 10:11:31 -0000 1.22
+++ imc.h 31 Jan 2003 10:54:08 -0000 1.23
@@ -1,7 +1,7 @@
#ifndef __IMC_H
#define __IMC_H
-#define IMCC_VERSION "0.0.9.9"
+#define IMCC_VERSION "0.0.9.11"
#include <stdio.h>
#include <stdlib.h>
@@ -48,18 +48,18 @@
int interferes(SymReg * r0, SymReg * r1);
int map_colors(int x, SymReg ** graph, int colors[], int typ);
void build_interference_graph(void);
-void allocate(void);
+void allocate(struct Parrot_Interp *);
int simplify (void);
void order_spilling (void);
-void spill (int);
+void spill (struct Parrot_Interp *, int);
int try_allocate(void);
void restore_interference_graph(void);
void free_reglist(void);
int neighbours(int node);
-int check_op(char * fullname, char *op, SymReg *r[]);
-int is_op(char *);
+int check_op(struct Parrot_Interp *, char * fullname, char *op, SymReg *r[]);
+int is_op(struct Parrot_Interp *, char *);
/* This should be common with Cola */
@@ -68,7 +68,6 @@
/* globals */
-EXTERN struct Parrot_Interp *interpreter;
EXTERN int IMCC_DEBUG;
EXTERN int IMCC_VERBOSE;
1.25 +17 -17 parrot/languages/imcc/imcc.l
Index: imcc.l
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.l,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -w -r1.24 -r1.25
--- imcc.l 21 Jan 2003 10:11:31 -0000 1.24
+++ imcc.l 31 Jan 2003 10:54:08 -0000 1.25
@@ -14,10 +14,10 @@
#include <stdlib.h>
#include <string.h>
#include "imc.h"
-#include "imcparser.h"
#include "parser.h"
#define YY_NO_UNPUT
+#define YY_DECL int yylex(YYSTYPE *valp, struct Parrot_Interp *interp)
int state;
%}
@@ -80,7 +80,7 @@
}
<emit,INITIAL>[ISNP]{DIGIT}{DIGIT}? {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return REG;
}
@@ -133,12 +133,12 @@
<emit,INITIAL>{LETTER}{LETTERDIGIT}*":" {
yytext[yyleng-1] = 0; /* trim last ':' */
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(LABEL);
}
<emit>{DOT}{LETTER}{LETTERDIGIT}* {
- yylval.s = str_dup(yytext+1);
+ valp->s = str_dup(yytext+1);
return(MACRO);
}
@@ -146,57 +146,57 @@
if (!is_def) {
SymReg *r = find_sym(yytext);
if (r && (r->type & (VTIDENTIFIER|VT_CONSTP))) {
- yylval.sr = r;
+ valp->sr = r;
return VAR;
}
}
- yylval.s = str_dup(yytext);
- return(is_op(yylval.s) ? PARROT_OP : IDENTIFIER);
+ valp->s = str_dup(yytext);
+ return(is_op(interp, valp->s) ? PARROT_OP : IDENTIFIER);
}
<emit,INITIAL>{FLOATNUM} {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(FLOATC);
}
<emit,INITIAL>{SIGN}?{DIGIT}+ {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(INTC);
}
<emit,INITIAL>{HEX} {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(INTC);
}
<emit,INITIAL>{BIN} {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(INTC);
}
<emit,INITIAL>{STRINGCONSTANT} {
- yylval.s = str_dup(yytext); /* XXX delete quotes, -> emit, pbc */
+ valp->s = str_dup(yytext); /* XXX delete quotes, -> emit, pbc */
return(STRINGC);
}
<emit,INITIAL>{CHARCONSTANT} {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(STRINGC);
}
<emit,INITIAL>\$I[0-9]+ {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(IREG);
}
<emit,INITIAL>\$N[0-9]+ {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(NREG);
}
<emit,INITIAL>\$S[0-9]+ {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(SREG);
}
<emit,INITIAL>\$P[0-9]+ {
- yylval.s = str_dup(yytext);
+ valp->s = str_dup(yytext);
return(PREG);
}
1.40 +106 -81 parrot/languages/imcc/imcc.y
Index: imcc.y
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.y,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -w -r1.39 -r1.40
--- imcc.y 22 Jan 2003 15:57:11 -0000 1.39
+++ imcc.y 31 Jan 2003 10:54:08 -0000 1.40
@@ -21,8 +21,18 @@
#include "parser.h"
#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+/*
+ * we use a pure parser wtih the interpreter as a parameter
+ * this still doesn't make the parser reentrant, there are too
+ * many globals around.
+ * These globals should go into one structure, which could be
+ * attached to the interpreter
+ */
+#define YYPARSE_PARAM interp
+#define YYLEX_PARAM interp
/*
* Choosing instructions for Parrot is pretty easy since
* many are polymorphic.
@@ -64,7 +74,10 @@
* op
*
*/
-static Instruction * MK_I(const char * fmt, SymReg ** r) {
+static
+Instruction *
+MK_I(struct Parrot_Interp *interpreter, const char * fmt, SymReg ** r)
+{
char opname[64];
char *p;
const char *q;
@@ -78,7 +91,7 @@
#if OPDEBUG
fprintf(stderr, "op '%s' format '%s' (%d)\n", opname, fmt?:"",nargs);
#endif
- return iANY(opname, fmt, r, 1);
+ return iANY(interpreter, opname, fmt, r, 1);
}
/*
@@ -122,27 +135,32 @@
/*
* substr or X = P[key]
*/
-static Instruction * iINDEXFETCH(SymReg * r0, SymReg * r1, SymReg * r2) {
+static Instruction *
+iINDEXFETCH(struct Parrot_Interp *interp, SymReg * r0, SymReg * r1,
+ SymReg * r2)
+{
if(r0->set == 'S' && r1->set == 'S' && r2->set == 'I') {
SymReg * r3 = mk_const("1", 'I');
- return MK_I("substr %s, %s, %s, 1", R4(r0, r1, r2, r3));
+ return MK_I(interp, "substr %s, %s, %s, 1", R4(r0, r1, r2, r3));
}
keyvec |= KEY_BIT(2);
- return MK_I("set %s, %s[%s]", R3(r0,r1,r2));
+ return MK_I(interp, "set %s, %s[%s]", R3(r0,r1,r2));
}
/*
* substr or P[key] = X
*/
-static Instruction * iINDEXSET(SymReg * r0, SymReg * r1, SymReg * r2) {
+static Instruction *
+iINDEXSET(struct Parrot_Interp *interp, SymReg * r0, SymReg * r1, SymReg * r2)
+{
if(r0->set == 'S' && r1->set == 'I' && r2->set == 'S') {
SymReg * r3 = mk_const("1", 'I');
- MK_I("substr %s, %s, %s, %s", R4(r0, r1,r3, r2));
+ MK_I(interp, "substr %s, %s, %s, %s", R4(r0, r1,r3, r2));
}
else if (r0->set == 'P') {
keyvec |= KEY_BIT(1);
- MK_I("set %s[%s], %s", R3(r0,r1,r2));
+ MK_I(interp, "set %s[%s], %s", R3(r0,r1,r2));
}
else {
fataly(EX_SOFTWARE, "iINDEXSET", line,"unsupported indexed set op\n");
@@ -151,7 +169,8 @@
}
/* return the index of a PMC class */
-static int get_pmc_num(char *pmc_type)
+static int
+get_pmc_num(struct Parrot_Interp *interpreter, char *pmc_type)
{
STRING * s = string_make(interpreter, pmc_type,
(UINTVAL) strlen(pmc_type), NULL, 0, NULL);
@@ -161,18 +180,20 @@
}
/* only .PmcType */
-SymReg * macro(char *name)
+SymReg *
+macro(struct Parrot_Interp *interp, char *name)
{
SymReg * r;
char buf[16];
- int type = get_pmc_num(name);
+ int type = get_pmc_num(interp, name);
sprintf(buf, "%d", type);
r = mk_const(str_dup(buf), 'I');
return r;
}
static Instruction *
-multi_keyed(char *name, SymReg ** r, int nr, int emit)
+multi_keyed(struct Parrot_Interp *interpreter,char *name,
+SymReg ** r, int nr, int emit)
{
int i, keyf, kv, n;
char buf[16];
@@ -224,7 +245,7 @@
nreg[1] = r[i+1];
nreg[2] = preg[n];
/* set p_k px */
- ins = iANY(str_dup("set"), 0, nreg, 0);
+ ins = iANY(interpreter, str_dup("set"), 0, nreg, 0);
}
else {
keyvec = 1 << 2;
@@ -232,7 +253,7 @@
nreg[1] = r[i];
nreg[2] = r[i+1];
/* set py|z p_k */
- iANY(str_dup("set"), 0, nreg, 1);
+ iANY(interpreter, str_dup("set"), 0, nreg, 1);
}
i++;
}
@@ -244,28 +265,31 @@
nreg[0] = r[i];
nreg[1] = preg[n];
/* set n, px */
- ins = iANY(str_dup("set"), 0, nreg, 0);
+ ins = iANY(interpreter, str_dup("set"), 0, nreg, 0);
}
else {
nreg[0] = preg[n];
nreg[1] = r[i];
/* set px, n */
- iANY(str_dup("set"), 0, nreg, 1);
+ iANY(interpreter, str_dup("set"), 0, nreg, 1);
}
}
}
/* make a new undef */
- iNEW(preg[0], str_dup("PerlUndef"), 1);
+ iNEW(interpreter, preg[0], str_dup("PerlUndef"), 1);
/* emit the operand */
nargs = 3;
keyvec = 0;
- iANY(name, 0, preg, 1);
+ iANY(interpreter, name, 0, preg, 1);
/* emit the LHS op */
emitb(ins);
return ins;
}
-Instruction * iANY(char * name, const char *fmt, SymReg **r, int emit) {
+Instruction *
+iANY(struct Parrot_Interp *interpreter, char * name,
+ const char *fmt, SymReg **r, int emit)
+{
char fullname[64];
int i;
int dirs = 0;
@@ -273,7 +297,7 @@
Instruction * ins;
#if 1
- ins = multi_keyed(name, r, nargs, emit);
+ ins = multi_keyed(interpreter, name, r, nargs, emit);
if (ins)
return ins;
#endif
@@ -399,6 +423,7 @@
%type <sr> pasm_args lhs
%token <sr> VAR
+%pure_parser
%start program
@@ -406,8 +431,8 @@
program: { open_comp_unit(); }
statements { $$ = 0;
- allocate();
- emit_flush();
+ allocate(interp);
+ emit_flush(interp);
}
;
@@ -419,7 +444,7 @@
pasmline: labels pasm_inst '\n' { $$ = 0; }
;
pasm_inst: {clear_state();}
- PARROT_OP pasm_args { $$ = iANY($2,0,regs,1); free($2); }
+ PARROT_OP pasm_args { $$ = iANY(interp, $2,0,regs,1); free($2); }
| /* none */ { $$ = 0;}
;
@@ -430,7 +455,7 @@
emit:
EMIT { open_comp_unit(); }
pasmcode
- EOM { emit_flush(); $$=0;}
+ EOM { emit_flush(interp); $$=0;}
;
@@ -439,8 +464,8 @@
statements ESUB
{
$$ = 0;
- allocate();
- emit_flush();
+ allocate(interp);
+ emit_flush(interp);
}
| emit { $$=0; }
;
@@ -483,23 +508,23 @@
| LOCAL { is_def=1; } type IDENTIFIER { mk_ident($4, $3);is_def=0; }
| CONST { is_def=1; } type IDENTIFIER '=' const
{ mk_const_ident($4, $3, $6);is_def=0; }
- | PARAM { is_def=1; } type IDENTIFIER { $$ = MK_I("restore",
+ | PARAM { is_def=1; } type IDENTIFIER { $$ = MK_I(interp, "restore",
R1(mk_ident($4, $3)));is_def=0; }
- | PARAM reg { $$ = MK_I("restore", R1($2)); }
- | RESULT var { $$ = MK_I("restore", R1($2)); }
- | ARG var { $$ = MK_I("save", R1($2)); }
- | RETURN var { $$ = MK_I("save", R1($2)); }
- | CALL IDENTIFIER { $$ = MK_I("bsr",
+ | PARAM reg { $$ = MK_I(interp, "restore", R1($2)); }
+ | RESULT var { $$ = MK_I(interp, "restore", R1($2)); }
+ | ARG var { $$ = MK_I(interp, "save", R1($2)); }
+ | RETURN var { $$ = MK_I(interp, "save", R1($2)); }
+ | CALL IDENTIFIER { $$ = MK_I(interp, "bsr",
R1(mk_address($2, U_add_once)));}
- | GOTO IDENTIFIER { $$ = MK_I("branch",
+ | GOTO IDENTIFIER { $$ = MK_I(interp, "branch",
R1(mk_address($2, U_add_once)));}
- | INC var { $$ = MK_I("inc",R1($2)); }
- | DEC var { $$ = MK_I("dec",R1($2)); }
- | PRINT var { $$ = MK_I("print",R1($2)); }
- | SAVEALL { $$ = MK_I("saveall" ,R0()); }
- | RESTOREALL { $$ = MK_I("restoreall" ,R0()); }
- | END { $$ = MK_I("end" ,R0()); }
- | PARROT_OP vars { $$ = iANY($1,0,regs, 1); free($1); }
+ | INC var { $$ = MK_I(interp, "inc",R1($2)); }
+ | DEC var { $$ = MK_I(interp, "dec",R1($2)); }
+ | PRINT var { $$ = MK_I(interp, "print",R1($2)); }
+ | SAVEALL { $$ = MK_I(interp, "saveall" ,R0()); }
+ | RESTOREALL { $$ = MK_I(interp, "restoreall" ,R0()); }
+ | END { $$ = MK_I(interp, "end" ,R0()); }
+ | PARROT_OP vars { $$ = iANY(interp, $1,0,regs, 1);
free($1); }
| /* none */ { $$ = 0;}
;
@@ -515,61 +540,61 @@
;
assignment:
- target '=' var { $$ = MK_I("set", R2($1, $3)); }
- | target '=' '!' var { $$ = MK_I("not", R2($1, $4));}
- | target '=' '-' var { $$ = MK_I("neg", R2($1, $4));}
- | target '=' '~' var { $$ = MK_I("bnot", R2($1, $4));}
- | target '=' var '+' var { $$ = MK_I("add", R3($1, $3, $5)); }
- | target '=' var '-' var { $$ = MK_I("sub", R3($1, $3, $5)); }
- | target '=' var '*' var { $$ = MK_I("mul", R3($1, $3, $5)); }
- | target '=' var POW var { $$ = MK_I("pow", R3($1, $3, $5)); }
- | target '=' var '/' var { $$ = MK_I("div", R3($1, $3, $5)); }
- | target '=' var '%' var { $$ = MK_I("mod", R3($1, $3, $5)); }
- | target '=' var '.' var { $$ = MK_I("concat", R3($1,$3,$5)); }
- | target '=' var SHIFT_LEFT var { $$ = MK_I("shl", R3($1, $3, $5)); }
- | target '=' var SHIFT_RIGHT var { $$ = MK_I("shr", R3($1, $3, $5)); }
- | target '=' var SHIFT_RIGHT_U var { $$ = MK_I("lsr", R3($1, $3, $5)); }
- | target '=' var LOG_AND var { $$ = MK_I("and", R3($1, $3, $5)); }
- | target '=' var LOG_OR var { $$ = MK_I("or", R3($1, $3, $5)); }
- | target '=' var LOG_XOR var { $$ = MK_I("xor", R3($1, $3, $5)); }
- | target '=' var '&' var { $$ = MK_I("band", R3($1, $3, $5)); }
- | target '=' var '|' var { $$ = MK_I("bor", R3($1, $3, $5)); }
- | target '=' var '~' var { $$ = MK_I("bxor", R3($1, $3, $5)); }
- | target '=' var '[' keylist ']' { $$ = iINDEXFETCH($1, $3, $5); }
- | var '[' keylist ']' '=' var { $$ = iINDEXSET($1, $3, $6); }
- | target '=' NEW classname { $$ = iNEW($1, $4, 1); }
- | target '=' DEFINED var { $$ = MK_I("defined",R2($1,$4)); }
+ target '=' var { $$ = MK_I(interp, "set", R2($1,
$3)); }
+ | target '=' '!' var { $$ = MK_I(interp, "not", R2($1, $4));}
+ | target '=' '-' var { $$ = MK_I(interp, "neg", R2($1, $4));}
+ | target '=' '~' var { $$ = MK_I(interp, "bnot", R2($1, $4));}
+ | target '=' var '+' var { $$ = MK_I(interp, "add", R3($1, $3,
$5)); }
+ | target '=' var '-' var { $$ = MK_I(interp, "sub", R3($1, $3,
$5)); }
+ | target '=' var '*' var { $$ = MK_I(interp, "mul", R3($1, $3,
$5)); }
+ | target '=' var POW var { $$ = MK_I(interp, "pow", R3($1, $3,
$5)); }
+ | target '=' var '/' var { $$ = MK_I(interp, "div", R3($1, $3,
$5)); }
+ | target '=' var '%' var { $$ = MK_I(interp, "mod", R3($1, $3,
$5)); }
+ | target '=' var '.' var { $$ = MK_I(interp, "concat",
R3($1,$3,$5)); }
+ | target '=' var SHIFT_LEFT var { $$ = MK_I(interp, "shl", R3($1, $3, $5)); }
+ | target '=' var SHIFT_RIGHT var { $$ = MK_I(interp, "shr", R3($1, $3,
$5)); }
+ | target '=' var SHIFT_RIGHT_U var { $$ = MK_I(interp, "lsr", R3($1, $3,
$5)); }
+ | target '=' var LOG_AND var { $$ = MK_I(interp, "and", R3($1, $3, $5)); }
+ | target '=' var LOG_OR var { $$ = MK_I(interp, "or", R3($1, $3, $5)); }
+ | target '=' var LOG_XOR var { $$ = MK_I(interp, "xor", R3($1, $3, $5)); }
+ | target '=' var '&' var { $$ = MK_I(interp, "band", R3($1, $3,
$5)); }
+ | target '=' var '|' var { $$ = MK_I(interp, "bor", R3($1, $3,
$5)); }
+ | target '=' var '~' var { $$ = MK_I(interp, "bxor", R3($1, $3,
$5)); }
+ | target '=' var '[' keylist ']' { $$ = iINDEXFETCH(interp, $1, $3, $5); }
+ | var '[' keylist ']' '=' var { $$ = iINDEXSET(interp, $1, $3, $6); }
+ | target '=' NEW classname { $$ = iNEW(interp, $1, $4, 1); }
+ | target '=' DEFINED var { $$ = MK_I(interp,
"defined",R2($1,$4)); }
| target '=' DEFINED var '[' keylist ']' { keyvec=KEY_BIT(2);
- $$ = MK_I("defined", R3($1, $4, $6));}
- | target '=' CLONE var { $$ = MK_I("clone",R2($1, $4));
+ $$ = MK_I(interp, "defined", R3($1, $4, $6));}
+ | target '=' CLONE var { $$ = MK_I(interp, "clone",R2($1, $4));
}
- | target '=' ADDR IDENTIFIER { $$ = MK_I("set_addr",
+ | target '=' ADDR IDENTIFIER { $$ = MK_I(interp, "set_addr",
R2($1, mk_address($4,U_add_once))); }
- | target '=' GLOBAL string { $$ = MK_I("find_global",R2($1,$4)); }
- | GLOBAL string '=' var { $$ = MK_I("store_global",R2($2,$4)); }
+ | target '=' GLOBAL string { $$ = MK_I(interp, "find_global",R2($1,$4)); }
+ | GLOBAL string '=' var { $$ = MK_I(interp, "store_global",R2($2,$4)); }
| NEW { expect_pasm = 1; }
- target COMMA newtype { $$ = MK_I("new", R2($3, $5)); }
- | DEFINED target COMMA var { $$ = MK_I("defined", R2($2, $4)); }
+ target COMMA newtype { $$ = MK_I(interp, "new", R2($3, $5)); }
+ | DEFINED target COMMA var { $$ = MK_I(interp, "defined", R2($2, $4));
}
| DEFINED target COMMA var '[' keylist ']' { keyvec=KEY_BIT(2);
- $$ = MK_I("defined", R3($2, $4, $6));}
- | CLONE target COMMA var { $$ = MK_I("clone", R2($2, $4)); }
+ $$ = MK_I(interp, "defined", R3($2, $4,
$6));}
+ | CLONE target COMMA var { $$ = MK_I(interp, "clone", R2($2, $4)); }
;
newtype:
- MACRO { $$ = macro($1); free($1); }
+ MACRO { $$ = macro(interp, $1); free($1); }
| const
;
if_statement:
- IF var relop var GOTO IDENTIFIER { $$=MK_I($3,R3($2,$4,
+ IF var relop var GOTO IDENTIFIER { $$=MK_I(interp, $3,R3($2,$4,
mk_address($6,U_add_once))); }
- | IF var GOTO IDENTIFIER {$$= MK_I("if", R2($2,
+ | IF var GOTO IDENTIFIER {$$= MK_I(interp, "if", R2($2,
mk_address($4, U_add_once))); }
- | UNLESS var GOTO IDENTIFIER {$$= MK_I("unless",R2($2,
+ | UNLESS var GOTO IDENTIFIER {$$= MK_I(interp, "unless",R2($2,
mk_address($4, U_add_once))); }
- | IF var COMMA IDENTIFIER { $$= MK_I("if", R2($2,
+ | IF var COMMA IDENTIFIER { $$= MK_I(interp, "if", R2($2,
mk_address($4, U_add_once))); }
- | UNLESS var COMMA IDENTIFIER { $$= MK_I("unless", R2($2,
+ | UNLESS var COMMA IDENTIFIER { $$= MK_I(interp, "unless", R2($2,
mk_address($4, U_add_once))); }
;
@@ -608,7 +633,7 @@
IDENTIFIER { $$ = mk_address($1, U_add_once); }
| PARROT_OP { $$ = mk_address($1, U_add_once); }
| var
- | MACRO { $$ = macro($1); free($1); }
+ | MACRO { $$ = macro(interp, $1); free($1); }
;
var: VAR
@@ -650,7 +675,7 @@
int yyerror(char * s)
{
- fprintf(stderr, "last token = [%s]\n", yylval.s);
+ /* fprintf(stderr, "last token = [%s]\n", yylval.s); */
fprintf(stderr, "(error) line %d: %s\n", line, s );
fprintf(stderr, "Didn't create output asm.\n" );
exit(EX_UNAVAILABLE);
1.20 +15 -10 parrot/languages/imcc/instructions.c
Index: instructions.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/instructions.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -w -r1.19 -r1.20
--- instructions.c 22 Jan 2003 15:57:11 -0000 1.19
+++ instructions.c 31 Jan 2003 10:54:08 -0000 1.20
@@ -341,15 +341,18 @@
}
static char *output;
-static int e_file_open(char *file)
+static int e_file_open(void *param)
{
+ char *file = (char *) param;
+
if (strcmp(file, "-"))
freopen(file, "w", stdout);
output = file;
return 1;
}
-static int e_file_close(void) {
+static int e_file_close(void *param) {
+ UNUSED(param);
printf("\n\n");
fclose(stdout);
info(1, "assembly module %s written.\n", output);
@@ -357,7 +360,8 @@
}
-static int e_file_emit(Instruction * ins) {
+static int e_file_emit(void *param, Instruction * ins) {
+ UNUSED(param);
if ((ins->type & ITLABEL) || ! *ins->op)
printf(ins_fmt(ins));
else
@@ -373,16 +377,17 @@
static int emitter;
-int emit_open(int type, char *file)
+int emit_open(int type, void *param)
{
emitter = type;
- return (emitters[emitter]).open(file);
+ return (emitters[emitter]).open(param);
return 0;
}
-int emit_flush() {
+int emit_flush(void *param) {
Instruction * ins, *next;
+ struct Parrot_Interp *interpreter = (struct Parrot_Interp *)param;
/* first instruction should be ".sub" -- make sure we allocate P31
* _after_ subroutine entry. And after the "saveall", or any
* other assortment of pushes. */
@@ -397,11 +402,11 @@
|| strcmp(ins->fmt, "saveall") == 0)) {
ins = ins->next;
}
- spill_ins = iNEW(p31, str_dup("PerlArray"), 0);
+ spill_ins = iNEW(interpreter, p31, str_dup("PerlArray"), 0);
insert_ins(ins, spill_ins);
}
for (ins = instructions; ins; ins = ins->next) {
- (emitters[emitter]).emit(ins);
+ (emitters[emitter]).emit(param, ins);
}
for (ins = instructions; ins; ) {
next = ins->next;
@@ -411,9 +416,9 @@
close_comp_unit();
return 0;
}
-int emit_close()
+int emit_close(void *param)
{
- return (emitters[emitter]).close();
+ return (emitters[emitter]).close(param);
}
/*
* Local variables:
1.16 +11 -11 parrot/languages/imcc/instructions.h
Index: instructions.h
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/instructions.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -w -r1.15 -r1.16
--- instructions.h 22 Jan 2003 15:57:11 -0000 1.15
+++ instructions.h 31 Jan 2003 10:54:08 -0000 1.16
@@ -66,16 +66,16 @@
*/
#ifdef _PARSER
Instruction * _mk_instruction(const char *,const char *, SymReg **, int);
-Instruction * iANY(char * name, const char *fmt, SymReg **r, int emit);
+Instruction * iANY(struct Parrot_Interp *, char * name, const char *fmt, SymReg
**r, int emit);
#else
#define _mk_instruction(a,b,c,d) dont_use(a,b)
-#define iANY(a,b,c,d) dont_use(a,b)
+#define iANY(i,a,b,c,d) dont_use(a,b)
#endif
-Instruction * INS(char * name, char *fmt, SymReg **regs, int nargs, int keyv,
- int emit);
+Instruction * INS(struct Parrot_Interp *, char * name,
+ char *fmt, SymReg **regs, int nargs, int keyv, int emit);
Instruction * INS_LABEL(SymReg * r0, int emit);
-Instruction * iNEW(SymReg * r0, char * type, int emit);
+Instruction * iNEW(struct Parrot_Interp *,SymReg * r0, char * type, int emit);
Instruction * emitb(Instruction *);
int instruction_reads(Instruction *, SymReg *);
int instruction_writes(Instruction *, SymReg *);
@@ -95,16 +95,16 @@
EXTERN Instruction* instructions;
typedef struct _emittert {
- int (*open)(char *file);
- int (*emit)(Instruction *ins);
- int (*close)(void);
+ int (*open)(void *param);
+ int (*emit)(void *param, Instruction *ins);
+ int (*close)(void *param);
} Emitter;
enum Emitter_type { EMIT_FILE, EMIT_PBC };
-int emit_open(int type, char *file);
-int emit_flush(void);
-int emit_close(void);
+int emit_open(int type, void *param);
+int emit_flush(void *param);
+int emit_close(void *param);
void open_comp_unit(void);
void close_comp_unit(void);
1.11 +8 -6 parrot/languages/imcc/main.c
Index: main.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/main.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -w -r1.10 -r1.11
--- main.c 27 Jan 2003 17:06:45 -0000 1.10
+++ main.c 31 Jan 2003 10:54:08 -0000 1.11
@@ -46,8 +46,8 @@
exit(0);
}
-#define setopt(flag) Parrot_setflag(interpreter, flag, (*argv)[0]+2)
-#define unsetopt(flag) Parrot_setflag(interpreter, flag, 0)
+#define setopt(flag) Parrot_setflag(interp, flag, (*argv)[0]+2)
+#define unsetopt(flag) Parrot_setflag(interp, flag, 0)
/* most stolen from test_main.c */
static char *
@@ -181,7 +181,8 @@
int stacktop;
struct PackFile *pf;
- interpreter = Parrot_new();
+ struct Parrot_Interp *interpreter = Parrot_new();
+
Parrot_init(interpreter, (void*)&stacktop);
pf = PackFile_new(0);
interpreter->code = pf;
@@ -245,15 +246,16 @@
fclose(yyin);
}
else {
+ int per_pbc = write_pbc | run_pbc;
info(1, "using optimization '%s'\n", optimizer_opt);
line = 1;
- emit_open(write_pbc | run_pbc, output);
+ emit_open(per_pbc, per_pbc ? (void*)interpreter : (void*)output);
debug(1, "Starting parse...\n");
- yyparse();
- emit_close();
+ yyparse((void *) interpreter);
+ emit_close(interpreter);
fclose(yyin);
info(1, "%ld lines compiled.\n", line);
1.9 +14 -14 parrot/languages/imcc/optimizer.c
Index: optimizer.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/optimizer.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -w -r1.8 -r1.9
--- optimizer.c 21 Jan 2003 10:11:31 -0000 1.8
+++ optimizer.c 31 Jan 2003 10:54:08 -0000 1.9
@@ -49,23 +49,23 @@
* because Px where different before
*
*/
-static void if_branch(void);
+static void if_branch(struct Parrot_Interp *);
static void branch_branch(void);
static void unused_label(void);
static int used_once(void);
-static int loop_optimization(void);
+static int loop_optimization(struct Parrot_Interp *);
static int clone_remove(void);
-void pre_optimize() {
+void pre_optimize(struct Parrot_Interp *interp) {
if (*optimizer_opt != '0') { /* XXX */
- if_branch();
+ if_branch(interp);
branch_branch();
/* XXX cfg / loop detection breaks e.g. in t/compiler/5_3 */
unused_label();
}
}
-int optimize() {
+int optimize(struct Parrot_Interp *interp) {
if (*optimizer_opt > '1') { /* XXX */
/* constant_propagation(); N/Y */
@@ -73,7 +73,7 @@
return 1;
if (used_once())
return 1;
- if (loop_optimization())
+ if (loop_optimization(interp))
return 1;
}
return 0;
@@ -108,7 +108,7 @@
* branch L2 ---
* L1: L2:
*/
-static void if_branch()
+static void if_branch(struct Parrot_Interp *interp)
{
Instruction *ins, *last;
int reg;
@@ -136,7 +136,7 @@
if ((neg_op = get_neg_op(last->op, &args)) != 0) {
Instruction * tmp;
last->r[reg] = go;
- tmp = INS((char*)neg_op, "", last->r, args, 0, 0);
+ tmp = INS(interp, (char*)neg_op, "", last->r, args, 0, 0);
last->opnum = tmp->opnum;
last->opsize = tmp->opsize;
free(last->op);
@@ -388,7 +388,7 @@
/* move the instruction ins before loop in bb */
static int
-move_ins_out(Instruction **ins, Basic_block *bb)
+move_ins_out(struct Parrot_Interp *interp, Instruction **ins, Basic_block *bb)
{
Basic_block *pred;
Instruction * next, *out;
@@ -418,7 +418,7 @@
regs[0] = 0;
sprintf(buf, "# Invar moved: %s",ins_string(out->next));
- tmp = INS("", buf, regs, 0, 0, 0);
+ tmp = INS(interp, "", buf, regs, 0, 0, 0);
insert_ins((*ins)->prev, tmp);
}
ostat.invariants_moved++;
@@ -429,7 +429,7 @@
}
static int
-loop_one(int bnr)
+loop_one(struct Parrot_Interp *interp, int bnr)
{
Basic_block *bb = bb_list[bnr];
Instruction *ins;
@@ -444,7 +444,7 @@
reason = 0;
if (is_invariant(ins)) {
debug(2, "found invariant %s\n", ins_string(ins));
- if (move_ins_out(&ins, bb)) {
+ if (move_ins_out(interp, &ins, bb)) {
changed++;
ins = ins->prev;
}
@@ -457,7 +457,7 @@
}
int
-loop_optimization()
+loop_optimization(struct Parrot_Interp *interp)
{
int l, bb, loop_depth;
int changed = 0;
@@ -470,7 +470,7 @@
debug(2, "loop_depth %d\n", l);
for (bb = 0; bb < n_basic_blocks; bb++)
if (bb_list[bb]->loop_depth == l) {
- changed |= loop_one(bb);
+ changed |= loop_one(interp, bb);
}
/* currently e.g. mandel.p6 breaks, if not only the most
* inner loop is changed, but outer loops to */
1.4 +3 -3 parrot/languages/imcc/optimizer.h
Index: optimizer.h
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/optimizer.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -w -r1.3 -r1.4
--- optimizer.h 21 Jan 2003 10:11:31 -0000 1.3
+++ optimizer.h 31 Jan 2003 10:54:08 -0000 1.4
@@ -1,7 +1,7 @@
#ifndef __OPTIMIZER_H
#define __OPTIMIZER_H
-void pre_optimize(void);
-int optimize(void);
-void post_optimize(void);
+void pre_optimize(struct Parrot_Interp *);
+int optimize(struct Parrot_Interp *);
+void post_optimize(struct Parrot_Interp *);
#endif
1.6 +5 -3 parrot/languages/imcc/parser.h
Index: parser.h
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/parser.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -w -r1.5 -r1.6
--- parser.h 21 Jan 2003 10:11:31 -0000 1.5
+++ parser.h 31 Jan 2003 10:54:08 -0000 1.6
@@ -7,6 +7,8 @@
#define EXTERN extern
#endif
+#include "imcparser.h"
+
EXTERN SymReg *regs[IMCC_MAX_REGS];
EXTERN int keyvec;
EXTERN int nargs;
@@ -22,10 +24,10 @@
#define KEY_BIT(argnum) (1 << (argnum))
-SymReg * macro(char *name);
+SymReg * macro(struct Parrot_Interp *, char *name);
int yyerror(char *);
-int yyparse(void);
-int yylex(void);
+int yyparse(void *param);
+int yylex(YYSTYPE *valp, struct Parrot_Interp *);
void op_fullname(char * dest, const char * name, SymReg * args[], int);
void open_comp_unit(void);
void register_compilers(Parrot_Interp);
1.8 +16 -11 parrot/languages/imcc/parser_util.c
Index: parser_util.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/parser_util.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -w -r1.7 -r1.8
--- parser_util.c 21 Jan 2003 10:11:31 -0000 1.7
+++ parser_util.c 31 Jan 2003 10:54:08 -0000 1.8
@@ -25,9 +25,11 @@
/*
* new P, .SomeThing
*/
-Instruction * iNEW(SymReg * r0, char * type, int emit) {
+Instruction *
+iNEW(struct Parrot_Interp *interpreter, SymReg * r0, char * type, int emit)
+{
char fmt[256];
- SymReg *pmc = macro(type);
+ SymReg *pmc = macro(interpreter, type);
/* XXX check, if type exists, but aove keyed search
* gives 0 for non existing PMCs */
sprintf(fmt, "%%s, %d\t # .%s", atoi(pmc->name), type);
@@ -38,7 +40,7 @@
regs[0] = r0;
regs[1] = pmc;
nargs = 2;
- return iANY("new", fmt, regs, emit);
+ return iANY(interpreter, "new", fmt, regs, emit);
}
/* TODO get rid of nargs */
@@ -71,7 +73,9 @@
*dest = '\0';
}
-int check_op(char *fullname, char *name, SymReg *r[])
+int
+check_op(struct Parrot_Interp *interpreter, char *fullname,
+ char *name, SymReg *r[])
{
int op, narg;
for (narg = 0; regs[narg]; narg++) ;
@@ -81,7 +85,7 @@
}
-int is_op(char *name)
+int is_op(struct Parrot_Interp *interpreter, char *name)
{
return interpreter->op_lib->op_code(name, 0) >= 0
|| interpreter->op_lib->op_code(name, 1) >= 0;
@@ -97,12 +101,13 @@
*
* s. e.g. imc.c for usage
*/
-Instruction * INS(char * name, char *fmt, SymReg **r, int n,
- int keys, int emit)
+Instruction *
+INS(struct Parrot_Interp *interpreter, char *name, char *fmt, SymReg **r,
+ int n, int keys, int emit)
{
nargs = n;
keyvec = keys;
- return iANY(name, fmt, r, emit);
+ return iANY(interpreter, name, fmt, r, emit);
}
/* imcc_compile(interp*, const char*)
@@ -137,10 +142,10 @@
line = 1;
yy_scan_string(s);
/* s. also e_pbc_open for reusing code/consts ... */
- emit_open(1, NULL);
+ emit_open(1, interp);
/* XXX where to put constants */
- yyparse();
- emit_close();
+ yyparse((void *) interp);
+ emit_close(interp);
#ifdef EVAL_TEST
pc = (opcode_t *) interp->code->byte_code;
1.18 +31 -24 parrot/languages/imcc/pbc.c
Index: pbc.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/pbc.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -w -r1.17 -r1.18
--- pbc.c 28 Jan 2003 09:20:40 -0000 1.17
+++ pbc.c 31 Jan 2003 10:54:08 -0000 1.18
@@ -99,11 +99,12 @@
globals.cs = NULL;
}
-int e_pbc_open(char *dummy) {
+int e_pbc_open(void *param) {
struct cs_t *cs;
+ struct Parrot_Interp *interpreter = (struct Parrot_Interp *)param;
+
/* make a new code segment
*/
- UNUSED(dummy);
if (!globals.cs) {
/* register cleanup code */
Parrot_on_exit(imcc_globals_destroy, NULL);
@@ -139,7 +140,8 @@
/* get size/line of bytecode in ops till now */
-static int get_old_size(int *ins_line)
+static int
+get_old_size(struct Parrot_Interp *interpreter, int *ins_line)
{
size_t size;
struct subs *s;
@@ -223,7 +225,8 @@
/* store global labels and bsr for later fixup
* return size in ops
*/
-static int store_labels(int *src_lines)
+static int
+store_labels(struct Parrot_Interp *interpreter, int *src_lines)
{
Instruction * ins;
int code_size;
@@ -314,7 +317,7 @@
/* add inter_cs jump */
sprintf(buf, "%d", globals.inter_seg_n);
r[0] = mk_const(str_dup(buf), 'I');
- INS("branch_cs", "", r, 1, 0, 1);
+ INS(interpreter, "branch_cs", "", r, 1, 0, 1);
/* finally generate fixup table entry */
PackFile_FixupTable_new_entry_t0(interpreter, code_seg, offset);
}
@@ -341,7 +344,7 @@
}
/* fix global branches */
-void fixup_bsrs()
+void fixup_bsrs(struct Parrot_Interp *interpreter)
{
int i, pc, addr;
SymReg * bsr, *lab;
@@ -427,7 +430,7 @@
/* add constant string to constants */
static int
-add_const_str(char *str) {
+add_const_str(struct Parrot_Interp *interpreter, char *str) {
int k, l;
SymReg * r;
char *o;
@@ -463,7 +466,7 @@
}
static int
-add_const_num(char *buf) {
+add_const_num(struct Parrot_Interp *interpreter, char *buf) {
int k;
SymReg * r;
@@ -481,7 +484,8 @@
/* add constant key to constants */
static int
-add_const_key(opcode_t key[], int size, char *s_key) {
+add_const_key(struct Parrot_Interp *interpreter, opcode_t key[],
+ int size, char *s_key) {
int k;
SymReg *r;
struct PackFile_Constant *pfc;
@@ -515,7 +519,7 @@
*/
static opcode_t
-build_key(SymReg *reg)
+build_key(struct Parrot_Interp *interpreter, SymReg *reg)
{
#define KEYLEN 21
opcode_t key[KEYLEN], *pc, size;
@@ -579,11 +583,11 @@
/* now we have a packed key, which packfile can work on */
/* XXX endianess? probably no, we pack/unpack on the very
* same computer */
- k = add_const_key(key, size, s_key);
+ k = add_const_key(interpreter, key, size, s_key);
return k;
}
-static void add_1_const(SymReg *r)
+static void add_1_const(struct Parrot_Interp *interpreter, SymReg *r)
{
if (r->color >= 0)
return;
@@ -597,15 +601,15 @@
r->color = atoi(r->name);
break;
case 'S':
- r->color = add_const_str(r->name);
+ r->color = add_const_str(interpreter, r->name);
break;
case 'N':
- r->color = add_const_num(r->name);
+ r->color = add_const_num(interpreter, r->name);
break;
case 'K':
for (r = r->nextkey; r; r = r->nextkey)
if (r->type & VTCONST)
- add_1_const(r);
+ add_1_const(interpreter, r);
default:
break;
}
@@ -614,7 +618,8 @@
}
/* store a constants idx for later reuse */
-static void constant_folding(void)
+static void
+constant_folding(struct Parrot_Interp *interpreter)
{
SymReg * r;
int i;
@@ -623,7 +628,7 @@
for(i = 0; i < HASH_SIZE; i++)
for(r = ghash[i]; r; r = r->next) {
if (r->type & VTCONST) {
- add_1_const(r);
+ add_1_const(interpreter, r);
}
}
@@ -634,7 +639,8 @@
* now let the fun begin, actually emit code for one ins
*/
-int e_pbc_emit(Instruction * ins) {
+int e_pbc_emit(void *param, Instruction * ins) {
+ struct Parrot_Interp *interpreter = (struct Parrot_Interp *)param;
int ok = 0;
static opcode_t * pc, npc;
op_info_t *op_info;
@@ -649,10 +655,10 @@
int bytes;
make_new_sub(); /* we start a new compilation unit */
- code_size = store_labels(&ins_size);
- oldsize = get_old_size(&ins_line);
+ code_size = store_labels(interpreter, &ins_size);
+ oldsize = get_old_size(interpreter, &ins_line);
debug(1, "code_size(ops) %d oldsize %d\n", code_size, oldsize);
- constant_folding();
+ constant_folding(interpreter);
store_sub_size(code_size, ins_size);
bytes = (oldsize + code_size) * sizeof(opcode_t);
interpreter->code->byte_code =
@@ -716,7 +722,7 @@
debug(1," %d", r->color);
break;
case PARROT_ARG_KC:
- *pc++ = build_key(ins->r[i]);
+ *pc++ = build_key(interpreter, ins->r[i]);
debug(1," %d", pc[-1]);
break;
default:
@@ -730,9 +736,10 @@
return ok;
}
-int e_pbc_close(){
+int e_pbc_close(void *param){
+ struct Parrot_Interp *interpreter = (struct Parrot_Interp *)param;
- fixup_bsrs();
+ fixup_bsrs(interpreter);
return 0;
}
1.3 +4 -4 parrot/languages/imcc/pbc.h
Index: pbc.h
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/pbc.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- pbc.h 22 Dec 2002 17:23:04 -0000 1.2
+++ pbc.h 31 Jan 2003 10:54:08 -0000 1.3
@@ -1,9 +1,9 @@
#ifndef __PBC_H
#define __PBC_H
-int e_pbc_open(char *);
-int e_pbc_emit(Instruction * ins);
-int e_pbc_close(void);
-void fixup_bsrs(void);
+int e_pbc_open(void *);
+int e_pbc_emit(void *, Instruction * ins);
+int e_pbc_close(void *);
+void fixup_bsrs(struct Parrot_Interp *interpreter);
#endif