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