On Fri, 29 Oct 2004 15:03:40 -0700, Adam Thomason <[EMAIL PROTECTED]> wrote:
> 
> Worry not, it's already broken.  I've been unable to test the AIX/PPC
> JIT since ICU went in.  The configuration for ICU (at least as of 2.6)
> supports only a 64-bit build, while aix/asm.s is 32-bit only (the
> linker claims the .o is corrupt if assembled with OBJECT_MODE=64).
> 
> To get it working again, one of three things needs to happen:
> 
> 1. ICU becomes optional again (please!).
> 2. PPC64 JIT code is written which can be morphed into POWER code.
> Transforming PPC32->POWER was mostly straightforward, so hopefully
> 64-bit will be as well.
> 3. ICU's configure starts to support 32-bit compiles.  This might
> happen with 3.0/CVS already, but I haven't checked.
> 
> 1 is necessary anyway, but it doesn't seem like a high priority.  2 is
> best in the long run, but requires somebody who knows more about PPC64
> ASM than I do to get started.  I don't know if 3 has any chance of
> happening upstream, but I doubt there's anybody working on Parrot who
> wants to deal with it.
> 
> If somebody can help with one or more of these, I can try to get it
> going on AIX 4.3.3 once again.
> 
> Adam
> 

It appears that (3) may work after all.  ICU 3.0 will build static
32-bit libraries which seem to work with parrot.  As Jeff suspected,
the missing Parrot_ppc_jit_restore_nonvolatile_registers caused
trouble, but adding it to aix/asm.s was simple.  Patch below fixes
that and another pedantic build issue with xlc.

Now to figure out why the JIT code segfaults...

Index: config/gen/platform/aix/asm.s
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/aix/asm.s,v
retrieving revision 1.2
diff -u -r1.2 asm.s
--- config/gen/platform/aix/asm.s       21 Feb 2004 10:58:53 -0000      1.2
+++ config/gen/platform/aix/asm.s       3 Nov 2004 23:57:33 -0000
@@ -10,6 +10,7 @@
 .globl .aix_get_toc
 .globl .ppc_sync
 .globl .ppc_flush_line
+.globl .Parrot_ppc_jit_restore_nonvolatile_registers

 # Flushes the cache line whose address is passed in
 .ppc_flush_line:
@@ -38,3 +39,25 @@
     st 3,68(SP)
     cal SP,80(SP)
     bcr BO_ALWAYS,CR0_LT
+
+.Parrot_ppc_jit_restore_nonvolatile_registers:
+    .function 
.Parrot_ppc_jit_restore_nonvolatile_registers,.Parrot_ppc_jit_restore_nonvolatile_registers,2,0
+    lfd 14,-84(SP)
+    lfd 15,-92(SP)
+    lfd 16,-100(SP)
+    lfd 17,-108(SP)
+    lfd 18,-116(SP)
+    lfd 19,-124(SP)
+    lfd 20,-132(SP)
+    lfd 21,-140(SP)
+    lfd 22,-148(SP)
+    lfd 23,-156(SP)
+    lfd 24,-164(SP)
+    lfd 25,-172(SP)
+    lfd 26,-180(SP)
+    lfd 27,-188(SP)
+    lfd 28,-196(SP)
+    lfd 29,-204(SP)
+    lfd 30,-212(SP)
+    lfd 31,-220(SP)
+    bcr BO_ALWAYS,CR0_LT
Index: src/sub.c
===================================================================
RCS file: /cvs/public/parrot/src/sub.c,v
retrieving revision 1.76
diff -u -r1.76 sub.c
--- src/sub.c   3 Nov 2004 14:29:58 -0000       1.76
+++ src/sub.c   3 Nov 2004 23:57:33 -0000
@@ -338,8 +338,10 @@
  */
 #if PMC_DATA_IN_EXT
 #  define PREV_RETC(p) (PMC*)((p)->pmc_ext)
+#  define PREV_RETC_LVALUE(p) ((p)->pmc_ext)
 #else
 #  define PREV_RETC(p) PMC_data(p)
+#  define PREV_RETC_LVALUE(p) PMC_data(p)
 #endif

 /*
@@ -374,7 +376,7 @@
     Caches *mc = interpreter->caches;

     if (mc->retc_cache)
-        PREV_RETC(mc->retc_cache) = mc->retc_cache;
+        PREV_RETC_LVALUE(mc->retc_cache) = (PMC_EXT*) mc->retc_cache;
     mc->retc_cache = pmc;
     /* XXX expensive w. ARENA_DOD_FLAGS */
     PObj_custom_mark_CLEAR(pmc);

Reply via email to