[Mono-dev] ppc64 port [was: Interpreter?]
Andreas Färber
andreas.faerber at web.de
Tue Jul 3 14:05:56 EDT 2007
Hey,
>> First, it includes changes to eglib/configure.in to make it compile
>> on OS X and adds VPATH support to facilitate compiling for ppc and
>> ppc64.
>
> I suggest sending the eglib changes separately (note that the vararg
> changes need to be inside a #ifdef conditional).
This is not a patch that anyone was supposed to apply. Also, I don't
see an easy way of separating changes within one file that can go in
from those that are not yet ready?
I *did* file eglib issues separately (#81456), unfortunately Jonathan
soon after started to commit his own duplicating/conflicting Windows
eglib patches that made this more difficult (see list).
The vararg stuff is an uncommited patch supplied by Jonathan
available from my #81520; it made eglib compile again at all. You
opposed his patch and demanded that *I* add tests first to have it
reverted, in a scenario where exactly those tests were not running
for me due to the ppc-ppc64 cross-compilation - I made that clear but
to date nobody has stepped up with a solution (you will see that in
my ppc64 patch eglib currently tests itself against itself so the
tests probably are effectively useless).
Although not yet having used varargs in C myself, to me it looks
wrong that the mandatory format argument is being dropped... So maybe
there is a better way to patch where we don't need further ifdefs?
>> Next, it reorganizes the ppc-codegen.h (header still needs some
>> changes Miguel requested) - instructions are now listed
>
> I'm sorry you have been led to do this kind of change: it is not
> acceptable to do extensive cleanups together with code changes:
> please send us only the code changes so we can actually review them
> (this will also remove one third from the patch length).
I don't see the point in reverting those changes. Mine are trivial:
64-bit instructions were added and are distinguishable by
corresponding #ifdefs, for existing instructions only #ifndefs were
added. Nothing was changed on the old instructions, and few of them
are actually used anywhere at all! The new ordering is the only way
the instructions can be checked sensibly because that's the order
they are in the various manuals. I specifically asked Miguel about
that file and he had only minor objections regarding the use of (c)
vs. Copyright. So, might it be acceptable for you to try to split
this up into one reordering patch and an addition/change patch?
>> Then, the mini and arch ppc files were updated with #ifdefs for ppc64
>> doing all kinds of necessary changes. I have some FIXMEs/CHECKMEs in
>> there, especially some numeric offsets and alignments are unclear to
>> me. This is where I suspect the most issues.
>> Finally, all occurrences of ppc in the sources were checked and
>> adapted.
>
> I gave a very quick read of the changes, here are a few suggestions:
> *) you shold minimize the number of inserted #ifdefs. A patch that
> does:
Again this was not submitted for application. Were it clear in all
places that this were actually intended I could have done so, yes.
Unfortunately I am not sure everywhere that four equals sizeof
(gpointer). Having it in one file during development simplifies
comparison of before/after for me, avoiding the use of non-graphical
svn diff (svnX's use of Apple's FileMerge tool rarely works for me).
> +#ifdef __ppc64__
> + offset += 8;
> +#else
> offset += 4;
> +#endif
>
> is not acceptable, while if it did:
>
> - offset += 4;
> + offset += sizeof (gpointer);
>
> it would be applied right away.
> Similar issues are with changes like:
> +#ifdef __ppc64__
> + __asm__ volatile("ld %0,0(r1)" : "=r" (sframe));
> +#else
> __asm__ volatile("lwz %0,0(r1)" : "=r" (sframe));
> +#endif
>
> Just add to the header something like:
> #ifdef __ppc64__
> #define PPC_LOAD_REG_INS "ld"
> #else
> #define PPC_LOAD_REG_INS "lwz"
> #endif
>
> and replace the asm statements with:
> __asm__ volatile (PPC_LOAD_REG_INS " %0,0(r1)" :
> "=r" (sframe));
>
> Something similar should be done also for the native code emitting
> macros. Instead of:
>
> +#ifdef __ppc64__
> + ppc_ld (buf, ppc_r0, (guint16)G_STRUCT_OFFSET
> (MonoLMF, previous_lmf) >> 2, ppc_r3);
> + ppc_std (buf, ppc_r0, (guint16)G_STRUCT_OFFSET
> (MonoLMF, previous_lmf) >> 2, ppc_r11);
> +#else
> ppc_lwz (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF,
> previous_lmf), ppc_r3);
> ppc_stw (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF,
> previous_lmf), ppc_r11);
> +#endif
>
> define in ppc_codegen:
>
> #ifdef __ppc64__
> #define ppc_load_reg(a,b,c,d) ppc_ld(a,b,(((c) >> 2) & 0xffff),d)
> #define ppc_store_reg(a,b,c,d) ppc_std(a,b,(((c) >> 2) & 0xffff),d)
> #else
> #define ppc_load_reg(a,b,c,d) ppc_lwz(a,b,c,d)
> #define ppc_store_reg(a,b,c,d) ppc_stw(a,b,c,d)
> #endif
>
> This will make the changes so much cleaner that it will be possible to
> more easily review them and find the issues (and it will also allow
> us to commit them incrementally to svn).
These requested changes make sense but will take some more weeks and
months which I can unlikely spend at this time...
> *) cpu-g5.md should become cpu-ppc64.md
In that case cpu-g4.md should also become cpu-ppc.md and the variable
name in mini(?) should be changed, too.
> *) the ppc_load changes are not acceptable: add a ppc_load_sequence
> or something like that that will emit lis/ori on 32 and the full
> sequence on 64 bit and use that where it is required.
That I don't understand, please explain.
ppc_load is one logical operation and is ifdef'ed as the lis/ori for
32, isn't it? All occurrences of manual lis/ori for trampolines were
checked and updated and appear to work on ppc as is. So why would I
need a ppc_load_sequence when there's no difference to ppc_load? The
trampolines need 64-bit support in some places so we cannot say
trampolines use 32-bit ppc_load and the rest 64-bit ppc_load_sequence.
> *) mono/io-layer/atomic.h: the changes here can't be skipped, they are
> used in many parts of the runtime and without the 64 bit support there
> can be memory corruption.
I will probably need more info than just "can't be skipped" to
actually do that. :-)
> *) the emit_tls_access optimizations should likely be removed unless
> they have been tested explicitly (they look a bit bogus).
Not sure what optimizations you mean? Obviously I have to update the
code for ppc64 and can't just remove that part of the patch. The only
"optimization" I'm aware of is removing the G4 case as the G4 to my
knowledge is 32-bit by nature.
>> compilation of System.dll using the new mono (or on execution of a
>> hello world assembly) it aborts with empty stacktrace:
>>
>> MONO_PATH="../../class/lib/basic:$MONO_PATH" /Users/andreas/Mono/
>> mono-
>> ppc64/mono/runtime/mono-wrapper ../../class/lib/basic/mcs.exe /
>> codepage:65001 -d:NET_1_1 -d:ONLY_1_1 -d:BOOTSTRAP_WITH_OLDLIB -
>> debug /noconfig -define:XML_DEP -r:System.Xml.dll -target:library -
>> out:System.dll @System.dll.sources
>> Stacktrace:
> [...]
>> (gdb) run ../../../testassembly.exe
>> Starting program: /Users/andreas/Mono/mono-ppc64/mono/mono/mini/
>> mono ../../../testassembly.exe
>> Reading symbols for shared libraries .++ done
>>
>> Program received signal SIGBUS, Bus error.
>> 0x0000000000000000 in ?? ()
>
> This looks like the result of a jump to NULL.
> What are the results of running make rcheck in mini/? That is the
> first
> thing that needs checking. If it fails in the same way before starting
> the tests it is likely related to something earlier on in the
> initialization.
I was not aware of a make rcheck, I only knew the standard make
check, which fails with a similar error at the first compilation.
> The first thing that comes to mind is: doesn't ppc64 on OSX
> use function descriptors like all the other ppc64 platforms? If it
> does
> use them this would be the first thing to fix as any indirect call
> would
> pretty much fail.
I had found no information on this. An IBM page described those for
the Linux ABI, but the OS X ABI as we know differs in some points and
did not talk about functions/descriptors. I don't have a ppc64 Linux
running so couldn't check. My port was only targetted at OS X, for
Linux some additional changes will need to be made and tested
(different processor defines, offsets, the usual suspects).
> Well, I've been here and I don't remember seeing any jit-related
> request
> for help:) Follow the above suggestions for now and we can both try to
> get the changes in svn and get the bugs fixed.
I'd be happy to share this with other users through SVN but as stated
before the changes requested above are non-trivial and will take some
time; I started the port for an AI competition of our university but
didn't finish in time. ;-) I wasn't able to work on it much lately,
just merged some eglib conflicts and checked that no conflicting JIT
changes were introduced and played with some of the unclear offset/
etc. values.
I did not ask earlier about atomic changes because I am in most cases
a fan of test-driven development and did not dare submitting untested
JIT changes for inclusion in SVN, the only successful tests so far
being those of the ppc-codegen.h instruction macros.
Andreas
More information about the Mono-devel-list
mailing list