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);