# New Ticket Created by Leopold Toetsch # Please include the string: [perl #17537] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=17537 >
Attached patch fixes all currently known problems WRT imcc/perl6. imcc 0.0.9 is rather fresh, so there are problems coming from different platforms which I can't test, but I'm sure, we will solve these. Short checklist for testing: - be sure, Perl6Grammar is up to date (=> perl6 --force-grammar -vw some.p6 ) - check running through assembler/parrot: $ perl6 --test - check running through imcc $ perl6 --test -r - check running througc imcc/PBC/parrot $ perl6 --test -r -Rc The latter additionally needs: #17193 (packout.c patch) in case of troubles: please add the -v (verbose switch, to see run commands, add -w (warnings, to see output from stderr), try individual files or tests $ perl6 --test t/compiler/1.t -vwk ...... $ perl6 --help Please apply, thanks, leo -- attachment 1 ------------------------------------------------------ url: http://rt.perl.org/rt2/attach/38419/31225/58f98c/imcc-0_0_9_2.patch
--- parrot/config/gen/makefiles/imcc.in Sun Sep 22 21:21:25 2002 +++ parrot-leo/config/gen/makefiles/imcc.in Mon Sep 23 21:22:27 2002 @@ -23,7 +23,7 @@ #DO NOT ADD C COMPILER FLAGS HERE #Add them in Configure.pl--look for the #comment 'ADD C COMPILER FLAGS HERE' -CFLAGS = ${ccflags} -I../../include -Wall -Wno-unused +CFLAGS = ${ccflags} -I../../include C_LIBS = ${libs} --- parrot/languages/imcc/instructions.c Sun Sep 22 21:21:29 2002 +++ parrot-leo/languages/imcc/instructions.c Mon Sep 23 21:21:18 2002 @@ -49,7 +49,10 @@ /* next 2 functions are called very often, says gprof * theys should be fast */ -inline int instruction_reads(Instruction* ins, SymReg* r) { +#ifdef HAS_INLINE +inline +#endif +int instruction_reads(Instruction* ins, SymReg* r) { int f, i; SymReg *key; @@ -66,7 +69,10 @@ return 0; } -inline int instruction_writes(Instruction* ins, SymReg* r) { +#ifdef HAS_INLINE +inline +#endif +int instruction_writes(Instruction* ins, SymReg* r) { int f, i; SymReg *key; @@ -202,7 +208,33 @@ else regstr[i] = ins->r[i]->name; - vsprintf(s, ins->fmt, regstr); /* XXX */ + switch (ins->opsize-1) { + case -1: /* labels */ + case 1: + sprintf(s, ins->fmt, regstr[0]); + break; + case 2: + sprintf(s, ins->fmt, regstr[0], regstr[1]); + break; + case 3: + sprintf(s, ins->fmt, regstr[0], regstr[1], regstr[2]); + break; + case 4: + sprintf(s, ins->fmt, regstr[0], regstr[1], regstr[2], regstr[3]); + break; + case 5: + sprintf(s, ins->fmt, regstr[0], regstr[1], regstr[2], regstr[3], + regstr[4]); + break; + case 6: + sprintf(s, ins->fmt, regstr[0], regstr[1], regstr[2], regstr[3], + regstr[4], regstr[5]); + break; + default: + fatal(1, "ins_fmt", "unhandled: opsize (%d), op %s, fmt %s\n", + ins->opsize, ins->op, ins->fmt); + break; + } return s; } --- parrot/languages/imcc/pbc.c Sun Sep 22 19:41:25 2002 +++ parrot-leo/languages/imcc/pbc.c Sat Sep 21 17:15:12 2002 @@ -437,6 +437,9 @@ { switch (r->set) { case 'I': + if (r->name[0] == '0' && r->name[1] == 'x') + r->color = strtoul(r->name+2, 0, 16); + else r->color = atoi(r->name); break; case 'S': --- parrot/languages/imcc/imcc.y Sun Sep 22 21:21:28 2002 +++ parrot-leo/languages/imcc/imcc.y Mon Sep 23 21:20:18 2002 @@ -113,7 +113,9 @@ */ static Instruction * iINDEXFETCH(SymReg * r0, SymReg * r1, SymReg * r2) { if(r0->set == 'S' && r1->set == 'S' && r2->set == 'I') { - return MK_I("substr %s, %s, %s, 1", R3(r0, r1, r2)); + SymReg * r3 = mk_const("1", 'I'); + r2->type &= ~VTKEY; + return MK_I("substr %s, %s, %s, 1", R4(r0, r1, r2, r3)); } return MK_I("set %s, %s[%s]", R3(r0,r1,r2)); } @@ -124,7 +126,9 @@ static Instruction * iINDEXSET(SymReg * r0, SymReg * r1, SymReg * r2) { if(r0->set == 'S' && r1->set == 'I' && r2->set == 'S') { - MK_I("substr %s, %s, 1, %s", R3(r0, r1, r2)); + SymReg * r3 = mk_const("1", 'I'); + r1->type &= ~VTKEY; + MK_I("substr %s, %s, 1, %s", R4(r0, r1,r3, r2)); } else if (r0->set == 'P') { MK_I("set %s[%s], %s", R3(r0,r1,r2)); @@ -428,8 +432,8 @@ ; emit: - EMIT pasmcode { $$ = 0 } - EOM '\n' { emit_flush(); clear_tables();$$=0 } + EMIT pasmcode { $$ = 0;} + EOM '\n' { emit_flush(); clear_tables();$$=0;} ; nls: @@ -447,8 +451,8 @@ emit_flush(); clear_tables(); } - | emit{ $$=0 } - | nls { $$=0 } + | emit{ $$=0; } + | nls { $$=0; } ; sub_start: SUB IDENTIFIER '\n' @@ -586,26 +590,26 @@ | _var_or_i ; -_var_or_i: var_or_i { regs[nargs++] = $1 } +_var_or_i: var_or_i { regs[nargs++] = $1; } | lhs '[' keylist ']' { regs[nargs++] = $1; regs[nargs++] = $3; $$= $1; } ; var_or_i: IDENTIFIER { $$ = mk_address($1, U_add_once); } | var - | MACRO { $$ = macro($1+1); free($1)} + | MACRO { $$ = macro($1+1); free($1); } ; var: VAR | rc ; -keylist: { nkeys=0 } +keylist: { nkeys=0; } _keylist { $$ = link_keys(nkeys, keys); } ; _keylist: key { keys[nkeys++] = $1; } - | _keylist ';' key { keys[nkeys++] = $3; $$ = keys[0] } + | _keylist ';' key { keys[nkeys++] = $3; $$ = keys[0]; } ; key: var @@ -656,7 +660,7 @@ exit(0); } -#define setopt(flag) Parrot_setflag(interpreter, flag, (*argv)[0]+2); +#define setopt(flag) Parrot_setflag(interpreter, flag, (*argv)[0]+2) #define unsetopt(flag) Parrot_setflag(interpreter, flag, 0) /* most stolen from test_main.c */ @@ -696,7 +700,9 @@ setopt(PARROT_TRACE_FLAG); break; case 'd': + if (!Interp_flags_TEST(interpreter, PARROT_DEBUG_FLAG)) setopt(PARROT_DEBUG_FLAG); + else IMCC_DEBUG++; break; case 'w': @@ -847,11 +853,11 @@ int main(int argc, char * argv[]) { - void * stacktop; + int stacktop; struct PackFile *pf; interpreter = Parrot_new(); - Parrot_init(interpreter, stacktop); + Parrot_init(interpreter, (void*)&stacktop); pf = PackFile_new(); interpreter->code = pf; #ifdef OPTEST --- parrot/languages/imcc/imcc.l Sun Sep 22 21:21:27 2002 +++ parrot-leo/languages/imcc/imcc.l Sat Sep 21 16:56:06 2002 @@ -27,6 +27,7 @@ LETTER [a-zA-Z_] DIGIT [0-9] +HEX 0x[0-9A-Fa-f]+ DOT [.] LETTERDIGIT [a-zA-Z0-9_] SIGN [-+] @@ -158,7 +159,10 @@ yylval.s = str_dup(yytext); return(INTC); } - +<emit,INITIAL>{HEX} { + yylval.s = str_dup(yytext); + return(INTC); + } <emit,INITIAL>{STRINGCONSTANT} { yylval.s = str_dup(yytext); /* XXX delete quotes, -> emit, pbc */ return(STRINGC); --- parrot/languages/imcc/imc.h Sun Sep 22 21:21:27 2002 +++ parrot-leo/languages/imcc/imc.h Mon Sep 23 21:25:32 2002 @@ -1,7 +1,7 @@ #ifndef __IMC_H #define __IMC_H -#define IMCC_VERSION "0.0.9.0" +#define IMCC_VERSION "0.0.9.2" #include <stdio.h> #include <stdlib.h> --- parrot/languages/perl6/perl6 Sun Sep 22 21:21:30 2002 +++ parrot-leo/languages/perl6/perl6 Mon Sep 23 08:52:31 2002 @@ -20,8 +20,8 @@ use P6C::Parser; use vars qw($IMCC $ASM $PARROT $PBC2C $HERE $CD $VERSION $PERL $slash $exe); -use vars qw($PARROT_ROOT @temp_files $LIB $TEST_IMPORT); -$VERSION = '0.0.8.1'; +use vars qw($PARROT_ROOT @temp_files $LIB $TEST_IMPORT $LIBPA); +$VERSION = '0.0.8.2'; do 'perl6-config' or # read pconfig, which was generated by Makefile die "'perl6-config' not found: $!"; @@ -36,6 +36,8 @@ $PARROT = "$PARROT_ROOT${slash}parrot$exe"; $CD = "cd $PARROT_ROOT; "; $PBC2C = "$CD $PERL pbc2c.pl"; +$LIBPA = "$PARROT_ROOT${slash}" .$PConfig{blib_lib_libparrot_a}; +$LIBPA =~ s/\$\(A\)/$LIB/; # # imported meth's for Test::More $TEST_IMPORT = 'skip is'; @@ -712,7 +714,7 @@ # # in advance # - my $lib = !$OPT{shared} ? "libparrot$LIB" : '-L blib/lib -lparrot'; + my $lib = !$OPT{shared} ? $LIBPA : '-L blib/lib -lparrot'; $cmd = "$CD $PConfig{link} $PConfig{linkflags} ". "$PConfig{ld_out} $HERE/$filebase $HERE/$filebase$PConfig{'o'} ". "$lib ". @@ -721,7 +723,7 @@ if (system($cmd)) { mydie($?,"Linking"); } - $filebase = "./$filebase" if($filebase !~ m!/!); # XXX and unix + $filebase = ".$slash$filebase" if($filebase !~ m!/!); verbose(1, "running $filebase @ARGV"); if (system("$filebase @ARGV") && !$OPT{'ignore-exitcode'}) { mydie($?, $filebase);