This is what you'll need.  It uses dlopen(), and is likely Bad in a number
of other ways, but if you're on a fairly normal UNIX, it should allow imcc
to grok what P6C produces for regexes.

/s
? languages/imcc/a.out
? languages/imcc/anyop.c
? languages/imcc/anyop.h
? languages/imcc/a.pasm
? languages/imcc/a.pbc
? languages/imcc/foo.imc
? languages/imcc/mine
? languages/imcc/imc.patch
? languages/imcc/imc-hack.tgz
Index: languages/imcc/Makefile
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/Makefile,v
retrieving revision 1.3
diff -p -u -w -r1.3 Makefile
--- languages/imcc/Makefile     5 Aug 2002 21:56:30 -0000       1.3
+++ languages/imcc/Makefile     20 Aug 2002 07:34:58 -0000
@@ -5,17 +5,20 @@
 DEBUG = -g
 # GCC
 #CC = gcc -efence -Wall -pedantic
-CC = gcc -Wall -pedantic
+CC = gcc -Wall -pedantic -I../../include
 YACC = bison -v -y
 LEX = flex
-LIBS =
+LIBS = -lm -ldl
 #LIBS = -lefence
 #LIBS = -ll -ly
 
-HEADERS = imc.h imcparser.h stacks.h cfg.h instructions.h cfg.h debug.h sets.h
+HEADERS = imc.h imcparser.h stacks.h cfg.h instructions.h cfg.h debug.h \
+       sets.h anyop.h
 
 default :
        $(MAKE) imcc
+       cd ../..; $(MAKE) shared
+       cd ../..; $(MAKE) rx_ops.c
 
 clean :
        rm -f core
@@ -70,6 +73,11 @@ sets.o: sets.c $(HEADERS)
 debug.o: debug.c $(HEADERS)
        $(CC) $(DEBUG) -c debug.c
 
-imcc : imcparser.o imclexer.o imc.o stacks.o symreg.o instructions.o cfg.o sets.o 
debug.o
-       $(CC) $(DEBUG) -o imcc imc.o imcparser.o imclexer.o stacks.o symreg.o 
instructions.o cfg.o sets.o debug.o $(LIBS)
+anyop.o: anyop.c $(HEADERS)
+       $(CC) $(DEBUG) -c anyop.c
+
+imcc : imcparser.o imclexer.o imc.o stacks.o symreg.o instructions.o cfg.o \
+       sets.o debug.o anyop.o
+       $(CC) $(DEBUG) -o imcc imc.o imcparser.o imclexer.o stacks.o symreg.o \
+               instructions.o cfg.o sets.o debug.o anyop.o $(LIBS)
 
Index: languages/imcc/imc.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imc.c,v
retrieving revision 1.17
diff -p -u -w -r1.17 imc.c
--- languages/imcc/imc.c        7 Aug 2002 03:23:42 -0000       1.17
+++ languages/imcc/imc.c        20 Aug 2002 07:34:58 -0000
@@ -18,7 +18,7 @@
 
 /* Globals: */
 
-IntStack nodeStack;
+IMCStack nodeStack;
 int n_spilled;
 int lastbranch;
 
@@ -30,7 +30,7 @@ int lastbranch;
 void allocate() {
     int to_spill;
     
-    nodeStack = intstack_new(); 
+    nodeStack = imcstack_new(); 
     n_spilled = 0;
 
     while (1) {
@@ -238,7 +238,7 @@ int simplify (){
             if (IMCC_DEBUG) 
                fprintf(stderr, "#simplifying [%s]\n", g[x]->name);
            
-           intstack_push(nodeStack, x);
+           imcstack_push(nodeStack, x);
            
            g[x]->simplified = 1;
            changes = 1;
@@ -292,7 +292,7 @@ void order_spilling () {
 
        if (min_node == -1) return; /* We are finished */
                
-       intstack_push(nodeStack, min_node);
+       imcstack_push(nodeStack, min_node);
        interference_graph[min_node]->simplified = 1;
     }
 }
@@ -326,8 +326,8 @@ int try_allocate() {
     char buf[256];
     SymReg ** graph = interference_graph;
 
-    while ((intstack_depth(nodeStack) > 0) ) {
-       x=intstack_pop(nodeStack);
+    while ((imcstack_depth(nodeStack) > 0) ) {
+       x=imcstack_pop(nodeStack);
 
         memset(colors, 0, sizeof(colors));
         free_colors = map_colors(x, graph, colors);
Index: languages/imcc/imcc.l
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.l,v
retrieving revision 1.6
diff -p -u -w -r1.6 imcc.l
--- languages/imcc/imcc.l       9 Aug 2002 20:11:18 -0000       1.6
+++ languages/imcc/imcc.l       20 Aug 2002 07:34:58 -0000
@@ -80,7 +80,7 @@ RANKSPEC        \[[,]*\]
 "addr"          return(ADDR);
 "global"        return(GLOBAL);
 "clone"         return(CLONE);
-"string"        return(STRING);
+"string"        return(STRINGV);
 "call"          return(CALL);
 "print"         return(PRINT);
 "push"          return(PUSH);
@@ -98,6 +98,7 @@ RANKSPEC        \[[,]*\]
 "=="            return(RELOP_EQ);
 "!="            return(RELOP_NE);
 "**"            return(POW);
+","             return(COMMA);
 
 {LETTER}{LETTERDIGIT}*":" {
        yytext[yyleng-1] = 0;  /* trim last ':' */
Index: languages/imcc/imcc.y
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.y,v
retrieving revision 1.13
diff -p -u -w -r1.13 imcc.y
--- languages/imcc/imcc.y       9 Aug 2002 20:11:18 -0000       1.13
+++ languages/imcc/imcc.y       20 Aug 2002 07:34:58 -0000
@@ -13,11 +13,12 @@
 #include <stdio.h>
 #include <stdlib.h> 
 #include <sysexits.h>
+#include <assert.h>
 #include "imc.h"
+#include "anyop.h"
 
 #define YYDEBUG 1
 
-
 int         yyerror(char *);
 int         yylex();
 extern char yytext[];
@@ -348,6 +349,75 @@ SymReg * iEND() {
     return 0;
 }
 
+int nargs = 0;
+SymReg * args[16] = { NULL };
+
+SymReg * iANY(char * name) {
+    char type[16];
+    short dir[16];
+    int i;
+    int dirs = 0;
+    op_t op;
+    memset(dir, 0, sizeof(dir)); /* don't know argdirs */
+    for (i = 0; i < nargs; i++) {
+       type[i] = args[i]->set;
+    }
+    for ( ; i < 4; i++) {
+       args[i] = NULL;
+    }
+    op = op_findv(name, nargs, type, dir);
+    if (!same_op(op, NULLOP)) {
+       op_info_t * info = op_info(op);
+       char format[128];
+       int len;
+       if (IMCC_DEBUG) {
+           fprintf(stderr, "Op %s (%d, %d)\n", name, op.lib, op.op);
+           print_op_info(stderr, info);
+       }
+
+       sprintf(format, "%s  ", name);
+       for (i = 1; i < info->arg_count; i++) {
+           switch (info->dirs[i]) {
+           case PARROT_ARGDIR_IN:
+               dirs |= 1 << (i - 1);
+               break;
+
+           case PARROT_ARGDIR_OUT:
+               dirs |= 1 << (4 + i - 1);
+               break;
+
+           case PARROT_ARGDIR_INOUT:
+               dirs |= 1 << (i - 1) | 1 << (4 + i - 1);
+               break;
+
+           default:
+               assert(0);
+           };
+           strcat(format, "%s, ");
+       }
+       if (info->jump) {
+           /* XXX: assume the jump is relative to the last arg.
+            * usually true. */
+           dirs |= 1 << (8 + nargs - 2);
+       }
+       len = strlen(format);
+       len -= 2;
+       format[len] = '\0';
+       emitb(mk_instruction(format, args[0], args[1], args[2], args[3],
+                            dirs));
+    } else {
+       char c = '(';
+       fprintf(stderr, "NO Op %s<%d>", name, nargs);
+       for (i = 0; i < nargs; i++) {
+           fprintf(stderr, "%c%c", c, args[i]->set);
+           c = ',';
+       }
+       fputs(")\n", stderr);
+       exit(EX_SOFTWARE);
+    }
+    return NULL;
+}
+
 void relop_to_op(int relop, char * op) {
     switch(relop) {
         case RELOP_EQ:    strcpy(op, "eq"); return;
@@ -372,16 +442,18 @@ void relop_to_op(int relop, char * op) {
 
 %token <i> CALL GOTO BRANCH ARG RET PRINT IF UNLESS NEW END SAVEALL RESTOREALL
 %token <i> SUB NAMESPACE CLASS ENDCLASS SYM LOCAL PARAM PUSH POP INC DEC
-%token <i> SHIFT_LEFT SHIFT_RIGHT INT FLOAT STRING DEFINED LOG_XOR
+%token <i> SHIFT_LEFT SHIFT_RIGHT INT FLOAT STRINGV DEFINED LOG_XOR
 %token <i> RELOP_EQ RELOP_NE RELOP_GT RELOP_GTE RELOP_LT RELOP_LTE
 %token <i> GLOBAL ADDR CLONE RESULT RETURN POW
+%token <i> COMMA
 %token <s> EMIT LABEL
 %token <s> IREG NREG SREG PREG IDENTIFIER STRINGC INTC FLOATC
 %type <i> type program subs sub sub_start relop
-%type <s> classname
+%type <s> classname opname
 %type <sr> labels label statements statement
 %type <sr> instruction assignment if_statement
 %type <sr> target reg const var rc string
+%type <sr> vars _vars var_or_i
 
 %start program 
 
@@ -463,7 +535,7 @@ instruction:
 type:
         INT { $$ = 'I'; }
     |   FLOAT { $$ = 'N'; }
-    |   STRING { $$ = 'S'; }
+    |   STRINGV { $$ = 'S'; }
     |   classname { $$ = 'P'; }
     ;
 
@@ -496,6 +568,8 @@ assignment:
     |  labels target '=' ADDR IDENTIFIER        { $$ = iSET_ADDR($2, mk_address($5)); 
}
     |  labels target '=' GLOBAL string          { $$ = iGET_GLOBAL($2, $5); }
     |  labels GLOBAL string '=' var             { $$ = iSET_GLOBAL($3, $5); }
+    |  labels opname { nargs = 0; memset(args, 0, sizeof(args)); }
+                                    vars        { $$ = iANY($2); }
     ;
 
 if_statement:
@@ -516,12 +590,28 @@ relop:
     |  RELOP_LTE { $$ = RELOP_LTE; }
     ;
 
+opname:
+    IDENTIFIER { $$ = $1; }
+
 target:
        IDENTIFIER
        { $$ = get_sym($1); }
     |  reg 
     ;
 
+vars:  { $$ = NULL; }
+    |  _vars { $$ = $1; }
+    ;
+
+_vars: _vars COMMA var_or_i { args[nargs++] = $3; $$ = args[0]; }
+    |  var_or_i { args[nargs++] = $1; $$ = $1; }
+    ;
+
+var_or_i:
+       IDENTIFIER { $$ = mk_address($1); }
+    |  rc
+    ;
+
 var:
        IDENTIFIER
        { $$ = get_sym($1); }
@@ -584,6 +674,13 @@ int main(int argc, char * argv[])
         exit(EX_IOERR);
     }
    
+    if (IMCC_DEBUG)
+       fprintf(stderr, "loading libs...");
+    op_load_file("../../blib/lib/libparrot.so");
+    op_load_lib("core", 0, 0, 7);
+    if (IMCC_DEBUG)
+       fprintf(stderr, "done\n");
+   
     line = 1;
 
     if (IMCC_DEBUG)
@@ -619,6 +716,3 @@ int yyerror(char * s)
     fprintf(stderr, "Didn't create output asm.\n" );
     exit(EX_UNAVAILABLE);
 }
-
-
-
Index: languages/imcc/stacks.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/stacks.c,v
retrieving revision 1.1
diff -p -u -w -r1.1 stacks.c
--- languages/imcc/stacks.c     4 Jul 2002 02:58:30 -0000       1.1
+++ languages/imcc/stacks.c     20 Aug 2002 07:34:58 -0000
@@ -4,10 +4,10 @@
 
 /* Stack functions. Stolen from rxstacks.c */
 
-IntStack
-intstack_new()
+IMCStack
+imcstack_new()
 {
-    IntStack stack = malloc(sizeof(struct IntStack_chunk_t));
+    IMCStack stack = malloc(sizeof(struct IMCStack_chunk_t));
     stack->used = 0;
     stack->next = stack;
     stack->prev = stack;
@@ -15,9 +15,9 @@ intstack_new()
 }
 
 int
-intstack_depth(IntStack stack)
+imcstack_depth(IMCStack stack)
 {
-    IntStack_Chunk chunk;
+    IMCStack_Chunk chunk;
     int depth = stack->used;
 
     for (chunk = stack->next; chunk != stack; chunk = chunk->next)
@@ -27,17 +27,17 @@ intstack_depth(IntStack stack)
 }
 
 void
-intstack_push(IntStack stack, int data)
+imcstack_push(IMCStack stack, int data)
 {
-    IntStack_Chunk chunk = stack->prev;
-    IntStack_Entry entry = &chunk->entry[chunk->used];
+    IMCStack_Chunk chunk = stack->prev;
+    IMCStack_Entry entry = &chunk->entry[chunk->used];
 
     entry->value = data;
 
     /* Register the new entry */
     if (++chunk->used == STACK_CHUNK_DEPTH) {
         /* Need to add a new chunk */
-        IntStack_Chunk new_chunk = malloc(sizeof(*new_chunk));
+        IMCStack_Chunk new_chunk = malloc(sizeof(*new_chunk));
         new_chunk->used = 0;
         new_chunk->next = stack;
         new_chunk->prev = chunk;
@@ -48,10 +48,10 @@ intstack_push(IntStack stack, int data)
 }
 
 int
-intstack_pop(IntStack stack)
+imcstack_pop(IMCStack stack)
 {
-    IntStack_Chunk chunk = stack->prev;
-    IntStack_Entry entry;
+    IMCStack_Chunk chunk = stack->prev;
+    IMCStack_Entry entry;
 
     /* We may have an empty chunk at the end of the list */
     if (chunk->used == 0 && chunk != stack) {
Index: languages/imcc/stacks.h
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/stacks.h,v
retrieving revision 1.1
diff -p -u -w -r1.1 stacks.h
--- languages/imcc/stacks.h     4 Jul 2002 02:58:30 -0000       1.1
+++ languages/imcc/stacks.h     20 Aug 2002 07:34:58 -0000
@@ -3,20 +3,20 @@
 
 #define STACK_CHUNK_DEPTH 256
 
-typedef struct IntStack_entry_t {
+typedef struct IMCStack_entry_t {
    int value;
-} *IntStack_Entry;
+} *IMCStack_Entry;
 
-typedef struct IntStack_chunk_t {
+typedef struct IMCStack_chunk_t {
     int used;
-    struct IntStack_chunk_t *next;
-    struct IntStack_chunk_t *prev;
-    struct IntStack_entry_t entry[STACK_CHUNK_DEPTH];
-} *IntStack_Chunk;
+    struct IMCStack_chunk_t *next;
+    struct IMCStack_chunk_t *prev;
+    struct IMCStack_entry_t entry[STACK_CHUNK_DEPTH];
+} *IMCStack_Chunk;
 
-typedef IntStack_Chunk IntStack;
-IntStack intstack_new();
-int intstack_depth(IntStack);
-void intstack_push(IntStack, int);
-int intstack_pop(IntStack);
+typedef IMCStack_Chunk IMCStack;
+IMCStack imcstack_new();
+int imcstack_depth(IMCStack);
+void imcstack_push(IMCStack, int);
+int imcstack_pop(IMCStack);
 
Index: languages/imcc/examples/test_spilling.imc
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/examples/test_spilling.imc,v
retrieving revision 1.2
diff -p -u -w -r1.2 test_spilling.imc
--- languages/imcc/examples/test_spilling.imc   4 Jul 2002 03:04:40 -0000       1.2
+++ languages/imcc/examples/test_spilling.imc   20 Aug 2002 07:34:58 -0000
@@ -47,45 +47,45 @@
        .local int al
        .local int am
 
-        a = 1
-       b = 2
-       c = 3
-       d = 4
-       e = 5
-       f = 6
-       g = 7
-       h = 8
-       i = 9
-       j = 10
-       k = 11
-       l = 12
-       m = 13
-       n = 14
-       o = 15
-       p = 16
-       q = 17
-       r = 18
-       s = 19
-       t = 20
-       u = 21
-       v = 22
-       w = 23
-       x = 24
-       y = 25
-       z = 26
-       aa = 27
-       ab = 28
-       ac = 29
-       ad = 30
-       ae = 31
-       af = 32
-       ag = 33 
-       ah = 34
-       ai = 35
-       aj = 36
-       ak = 37
-       al = 38
-       am = 39
+        set a,  1
+       set b,  2
+       set c,  3
+       set d,  4
+       set e,  5
+       set f,  6
+       set g,  7
+       set h,  8
+       set i,  9
+       set j,  10
+       set k,  11
+       set l,  12
+       set m,  13
+       set n,  14
+       set o,  15
+       set p,  16
+       set q,  17
+       set r,  18
+       set s,  19
+       set t,  20
+       set u,  21
+       set v,  22
+       set w,  23
+       set x,  24
+       set y,  25
+       set z,  26
+       set aa,  27
+       set ab,  28
+       set ac,  29
+       set ad,  30
+       set ae,  31
+       set af,  32
+       set ag,  33 
+       set ah,  34
+       set ai,  35
+       set aj,  36
+       set ak,  37
+       set al,  38
+       set am,  39
        
        print a
        print "\n"

Reply via email to