Open NattyNarwhal opened 6 years ago
I'm not saying you can't or shouldn't do it, but it seems odd to add 32-bit PPC support when a lot of others are dropping it: Java, Node.js, Linux Distros, IBM i rpms, ...
Updated diff; this time the ctor is jumping off in no man's land, but somewhere around JIT emitted code...
diff --git a/configure.ac b/configure.ac
index 13c5fb3..a2234d4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -377,15 +377,32 @@ case "$host" in
use_sigposix=yes
;;
*-*-aix*|*-*-os400*)
- dnl Set up a 64-bit build
- CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
- LDFLAGS="-maix64"
libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
- dnl Would you believe GNU nm doesn't know how to process AIX libraries?
- dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
- dnl specifiy 64-bit mode for tools.
- AR="/usr/bin/ar -X64"
- NM="/usr/bin/nm -X64"
+ dnl This environment variable controls if our build is 32 or 64-bit.
+ AC_ARG_VAR(OBJECT_MODE, [Specifies the bitness type output of IBM binutils])
+ dnl Specify the IBM binutils in case GNU ones end up on our path.
+ dnl OBJECT_MODE sets the bitness of IBM binutils; but this is a pain to
+ dnl propagate to makefiles; so specify a tool's 64-bit mode manually for now.
+ if test "$OBJECT_MODE" = "64"; then
+ AR="/usr/bin/ar -X64"
+ NM="/usr/bin/nm -X64"
+ else
+ AR="/usr/bin/ar"
+ NM="/usr/bin/nm"
+ fi
+ dnl Check for GCC vs. XL C; GCC doesn't respect OBJECT_MODE, FWIW
+ if test "$GCC" != "yes"; then
+ if test "$OBJECT_MODE" = "64"; then
+ CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
+ LDFLAGS="-maix64"
+ else
+ echo " ** No OBJECT_MODE ** "
+ CPPFLAGS="$CPPFLAGS -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
+ fi
+ else
+ dnl TODO: XL C support
+ CPPFLAGS="$CPPFLAGS -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
+ fi
dnl SGen is the future (changes to Boehm support code would be
dnl required if you wish to re-enable Boehm)
support_boehm=no
@@ -3979,8 +3996,11 @@ case "$host" in
BTLS_PLATFORM=powerpc
dnl on AIX/PASE, shared libraries can be inside archives
dnl if they are, we specify them by lib.a(lib.so)
- dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
- LIBC="libc.a(shr_64.o)"
+ if test "$OBJECT_MODE" = "64"; then
+ LIBC="libc.a(shr_64.o)"
+ else
+ LIBC="libc.a(shr.o)"
+ fi
INTL="libintl.a(libintl.so.8)"
;;
linux*)
@@ -5135,8 +5155,25 @@ if test "x$enable_btls" = "xyes"; then
btls_arch=powerpc
case $host_os in
aix*|os400*)
- btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
- BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
+ dnl Test for GCC vs. XL C
+ if test "$GCC" != "yes"; then
+ if test "$OBJECT_MODE" = "64"; then
+ btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
+ BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
+ else
+ btls_cflags="$btls_cflags -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
+ BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
+ fi
+ else
+ dnl TODO: Verify this for XL C support
+ if test "$OBJECT_MODE" = "64"; then
+ btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
+ BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
+ else
+ btls_cflags="$btls_cflags -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
+ BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
+ fi
+ fi
esac
;;
android-armv5)
diff --git a/external/boringssl b/external/boringssl
--- a/external/boringssl
+++ b/external/boringssl
@@ -1 +1 @@
-Subproject commit 4e95a6c97494a0c5e9d1f7b6f49c0ff4102908e8
+Subproject commit 4e95a6c97494a0c5e9d1f7b6f49c0ff4102908e8-dirty
diff --git a/external/corefx b/external/corefx
--- a/external/corefx
+++ b/external/corefx
@@ -1 +1 @@
-Subproject commit d2aaa5450b5481c2392a3a5656d353f28e5e3bbd
+Subproject commit d2aaa5450b5481c2392a3a5656d353f28e5e3bbd-dirty
diff --git a/mono/arch/ppc/ppc-codegen.h b/mono/arch/ppc/ppc-codegen.h
index 98fed75..f77549c 100644
--- a/mono/arch/ppc/ppc-codegen.h
+++ b/mono/arch/ppc/ppc-codegen.h
@@ -205,7 +205,15 @@ enum {
} \
} G_STMT_END
+#if defined(_AIX)
+#define ppc_load_func(c,D,v) G_STMT_START { \
+ ppc_load_sequence ((c), ppc_r12, (guint)(gsize)(v)); \
+ ppc_ldptr ((c), ppc_r2, sizeof (gpointer), ppc_r12); \
+ ppc_ldptr ((c), (D), 0, ppc_r12); \
+ } G_STMT_END
+#else
#define ppc_load_func(c,D,V) ppc_load_sequence ((c), (D), (V))
+#endif
#define ppc_load_multiple_regs(c,D,d,A) ppc_lmw ((c), (D), (d), (A))
diff --git a/mono/mini/cpu-ppc.md b/mono/mini/cpu-ppc.md
index 5eea6e3..26e4540 100644
--- a/mono/mini/cpu-ppc.md
+++ b/mono/mini/cpu-ppc.md
@@ -56,9 +56,9 @@ tailcall: len:120 clob:c
# PowerPC outputs a nice fixed size memcpy loop for larger stack_usage, so 0.
tailcall_parameter: len:0
-call: dest:a clob:c len:16
+call: dest:a clob:c len:24
br: len:4
-throw: src1:i len:20
+throw: src1:i len:28
rethrow: src1:i len:20
ckfinite: dest:f src1:f
ppc_check_finite: src1:i len:16
@@ -80,7 +80,7 @@ fcompare: src1:f src2:f len:12
oparglist: src1:i len:12
setlret: src1:i src2:i len:12
checkthis: src1:b len:4
-voidcall: len:16 clob:c
+voidcall: len:24 clob:c
voidcall_reg: src1:i len:16 clob:c
voidcall_membase: src1:b len:16 clob:c
fcall: dest:g len:16 clob:c
diff --git a/mono/mini/exceptions-ppc.c b/mono/mini/exceptions-ppc.c
index 3483ba8..43113b6 100644
--- a/mono/mini/exceptions-ppc.c
+++ b/mono/mini/exceptions-ppc.c
@@ -463,7 +463,7 @@ mono_arch_get_throw_exception_generic (int size, MonoTrampInfo **info, int corli
gpointer
mono_arch_get_rethrow_exception (MonoTrampInfo **info, gboolean aot)
{
- int size = MONO_PPC_32_64_CASE (132, 224) + PPC_FTNPTR_SIZE;
+ int size = MONO_PPC_32_64_CASE (140, 224) + PPC_FTNPTR_SIZE;
if (aot)
size += 64;
@@ -485,7 +485,7 @@ mono_arch_get_rethrow_exception (MonoTrampInfo **info, gboolean aot)
gpointer
mono_arch_get_throw_exception (MonoTrampInfo **info, gboolean aot)
{
- int size = MONO_PPC_32_64_CASE (132, 224) + PPC_FTNPTR_SIZE;
+ int size = MONO_PPC_32_64_CASE (140, 224) + PPC_FTNPTR_SIZE;
if (aot)
size += 64;
@@ -502,7 +502,7 @@ mono_arch_get_throw_exception (MonoTrampInfo **info, gboolean aot)
gpointer
mono_arch_get_throw_corlib_exception (MonoTrampInfo **info, gboolean aot)
{
- int size = MONO_PPC_32_64_CASE (168, 304) + PPC_FTNPTR_SIZE;
+ int size = MONO_PPC_32_64_CASE (176, 304) + PPC_FTNPTR_SIZE;
if (aot)
size += 64;
@@ -679,8 +679,8 @@ mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *s
{
MonoPPCFunctionDescriptor *handler_ftnptr = (MonoPPCFunctionDescriptor*)altstack_handle_and_restore;
- UCONTEXT_REG_NIP(uc) = (gulong)handler_ftnptr->code;
- UCONTEXT_REG_Rn(uc, 2) = (gulong)handler_ftnptr->toc;
+ UCONTEXT_REG_NIP(uc) = (gpointer)handler_ftnptr->code;
+ UCONTEXT_REG_Rn(uc, 2) = (gpointer)handler_ftnptr->toc;
}
#else
UCONTEXT_REG_NIP(uc) = (unsigned long)altstack_handle_and_restore;
@@ -726,8 +726,8 @@ setup_ucontext_return (void *uc, gpointer func)
{
MonoPPCFunctionDescriptor *handler_ftnptr = (MonoPPCFunctionDescriptor*)func;
- UCONTEXT_REG_NIP(uc) = (gulong)handler_ftnptr->code;
- UCONTEXT_REG_Rn(uc, 2) = (gulong)handler_ftnptr->toc;
+ UCONTEXT_REG_NIP(uc) = (gpointer)handler_ftnptr->code;
+ UCONTEXT_REG_Rn(uc, 2) = (gpointer)handler_ftnptr->toc;
}
#else
UCONTEXT_REG_NIP(uc) = (unsigned long)func;
@@ -794,9 +794,9 @@ mono_arch_setup_async_callback (MonoContext *ctx, void (*async_cb)(void *fun), g
uintptr_t sp = (uintptr_t) MONO_CONTEXT_GET_SP(ctx);
ctx->regs [PPC_FIRST_ARG_REG] = user_data;
sp -= PPC_MINIMAL_STACK_SIZE;
- *(unsigned long *)sp = MONO_CONTEXT_GET_SP(ctx);
+ *(gpointer *)sp = MONO_CONTEXT_GET_SP(ctx);
MONO_CONTEXT_SET_BP(ctx, sp);
- mono_arch_setup_resume_sighandler_ctx(ctx, (unsigned long) async_cb);
+ mono_arch_setup_resume_sighandler_ctx(ctx, (gpointer) async_cb);
}
void
@@ -804,9 +804,9 @@ mono_arch_setup_resume_sighandler_ctx (MonoContext *ctx, gpointer func)
{
#ifdef PPC_USES_FUNCTION_DESCRIPTOR
MonoPPCFunctionDescriptor *handler_ftnptr = (MonoPPCFunctionDescriptor*)func;
- MONO_CONTEXT_SET_IP(ctx, (gulong)handler_ftnptr->code);
- ctx->regs[2] = (gulong)handler_ftnptr->toc;
+ MONO_CONTEXT_SET_IP(ctx, (gpointer)handler_ftnptr->code);
+ ctx->regs[2] = (gpointer)handler_ftnptr->toc;
#else
- MONO_CONTEXT_SET_IP(ctx, (unsigned long) func);
+ MONO_CONTEXT_SET_IP(ctx, (gpointer) func);
#endif
}
diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c
index 282868e..5978240 100644
--- a/mono/mini/mini-ppc.c
+++ b/mono/mini/mini-ppc.c
@@ -2951,7 +2951,7 @@ ppc_patch_full (MonoCompile *cfg, MonoDomain *domain, guchar *code, const guchar
guint32 prim = ins >> 26;
guint32 ovf;
- //g_print ("patching 0x%08x (0x%08x) to point to 0x%08x\n", code, ins, target);
+// g_print ("patching 0x%08x (0x%08x) to point to 0x%08x\n", code, ins, target);
if (prim == 18) {
// prefer relative branches, they are more position independent (e.g. for AOT compilation).
gint diff = target - code;
@@ -3077,8 +3077,10 @@ ppc_patch_full (MonoCompile *cfg, MonoDomain *domain, guchar *code, const guchar
seq = (guint32*)code;
g_assert ((seq [0] >> 26) == 15);
g_assert ((seq [1] >> 26) == 24);
+#if !defined(PPC_USES_FUNCTION_DESCRIPTOR)
g_assert ((seq [2] >> 26) == 31);
g_assert (seq [3] == 0x4e800021 || seq [3] == 0x4e800020 || seq [3] == 0x4e800420);
+#endif
/* FIXME: make this thread safe */
ppc_lis (code, PPC_CALL_REG, (guint32)(target) >> 16);
ppc_ori (code, PPC_CALL_REG, PPC_CALL_REG, (guint32)(target) & 0xffff);
diff --git a/mono/mini/mini-runtime.c b/mono/mini/mini-runtime.c
index 2f16279..bc406b9 100644
--- a/mono/mini/mini-runtime.c
+++ b/mono/mini/mini-runtime.c
@@ -3812,7 +3812,7 @@ mini_create_ftnptr (MonoDomain *domain, gpointer addr)
if ((desc = g_hash_table_lookup (domain->ftnptrs_hash, addr)))
return desc;
-#if defined(__mono_ppc64__)
+#if defined(PPC_USES_FUNCTION_DESCRIPTOR)
desc = mono_domain_alloc0 (domain, 3 * sizeof (gpointer));
desc [0] = addr;
Debug output:
Starting program: /home/calvin/mono-build/mono/mono/mini/.libs/lt-mono-sgen -v -v --config /home/calvin/mono-build/mono/runtime/etc/mono/config .//class/lib/monolite-unix/1051700015/mcs.exe /warn:0 /noconfig /langversion:latest /r:System.dll /r:mscorlib.dll /out:build/deps/basic-profile-check.exe build/common/basic-profile-check.cs
[New Thread 1]
[New Thread 258]
converting method void System.OutOfMemoryException:.ctor (string)
inline failed: call
remove_block_if_useless, removed BB3
BB0 IN:
BB2 IN: 0
BB1 IN: 2
DTREE System.OutOfMemoryException:.ctor (string) 0
BB0(dfn=0) (IDOM=BB-1): BB0
BB2(dfn=1) (IDOM=BB0): BB0 BB2
BB1(dfn=2) (IDOM=BB2): BB0 BB2 BB1
LIVENESS:
BLOCK BB0 (BB2, ):
GEN BB0: {}
KILL BB0: {}
BLOCK BB2 (BB1, ):
1 il_seq_point il: 0x0
1 move R40 <- R32
GEN: R32(0)
1 move R41 <- R33
GEN: R33(1)
1 voidcall [System.SystemException:.ctor (string)] [r3 <- R40] [r4 <- R41] clobbers: c
1 il_seq_point il: 0x7, nonempty-stack
1 il_seq_point il: 0x7
1 move R44 <- R32
GEN: R32(0)
1 iconst R45 <- [-2147024882]
1 voidcall [System.Exception:SetErrorCode (int)] [r3 <- R44] [r4 <- R45] clobbers: c
1 il_seq_point il: 0x12, nonempty-stack
1 il_seq_point il: 0x12
GEN BB2: {0, 1}
KILL BB2: {}
BLOCK BB1 ():
GEN BB1: {}
KILL BB1: {}
ITERATION:
P: BB1(2): IN: BB2 OUT:
P: BB2(1): IN: BB0 OUT:BB1
LIVE IN BB2: {0, 1}
P: BB0(0): IN: OUT:BB2
LIVE IN BB0: {0, 1}
IT: 3 2.
LIVE IN BB1: {}
LIVE OUT BB1: {}
LIVE IN BB2: {0, 1}
LIVE OUT BB2: {}
LIVE IN BB0: {0, 1}
LIVE OUT BB0: {0, 1}
V0: [0x0 - 0x4000e]
V1: [0x0 - 0x40006]
CFA: [0] def_cfa: sp+0x0
CFA: [8] offset: unknown at cfa-0xfffffff0
CFA: [c] def_cfa_offset: 0x90
Method void System.OutOfMemoryException:.ctor (string) emitted at 30209d80 to 30209de8 (code length 104) [mcs.exe]
/tmp/.-V87ab: file format aixcoff-rs6000
Disassembly of section .text:
00000000 <.text>:
0: 7c 08 02 a6 mflr r0
4: 90 01 00 10 stw r0,16(r1)
8: 94 21 ff 70 stwu r1,-144(r1)
c: 90 61 00 80 stw r3,128(r1)
10: 90 81 00 84 stw r4,132(r1)
14: 80 61 00 80 lwz r3,128(r1)
18: 80 81 00 84 lwz r4,132(r1)
1c: 3d 80 30 20 lis r12,12320
20: 61 8c 9d f4 ori r12,r12,40436
24: 80 4c 00 04 lwz r2,4(r12)
28: 81 8c 00 00 lwz r12,0(r12)
2c: 7d 88 03 a6 mtlr r12
30: 4e 80 00 21 blrl
34: 80 61 00 80 lwz r3,128(r1)
38: 3c 80 80 07 lis r4,-32761
3c: 60 84 00 0e ori r4,r4,14
40: 3d 80 30 20 lis r12,12320
44: 61 8c 9d e8 ori r12,r12,40424
48: 80 4c 00 04 lwz r2,4(r12)
4c: 81 8c 00 00 lwz r12,0(r12)
50: 7d 88 03 a6 mtlr r12
54: 4e 80 00 21 blrl
58: 80 01 00 a0 lwz r0,160(r1)
5c: 7c 08 03 a6 mtlr r0
60: 38 21 00 90 addi r1,r1,144
64: 4e 80 00 20 blr
converting method (wrapper runtime-invoke) object <Module>:runtime_invoke_void__this___object (object,intptr,intptr,intptr)
FIRST BB for 44 is BB_3
FIRST BB for 6 is BB_2
BB0 IN:
BB5 IN: 0
BB6 IN: 5
BB12 IN: 6 14
BB1 IN: 10 11 15 12
BB13 IN: 6
BB14 IN: 13
BB15 IN: 13
BB2 IN: 5
BB7 IN: 2 9
BB11 IN: 7 3
BB8 IN: 2
BB9 IN: 8
BB10 IN: 8
DTREE (wrapper runtime-invoke) <Module>:runtime_invoke_void__this___object (object,intptr,intptr,intptr) 1
BB0(dfn=0) (IDOM=BB-1): BB0
BB5(dfn=1) (IDOM=BB0): BB0 BB5
BB6(dfn=2) (IDOM=BB5): BB0 BB5 BB6
BB12(dfn=3) (IDOM=BB6): BB0 BB5 BB6 BB12
BB1(dfn=4) (IDOM=BB5): BB0 BB5 BB1
BB13(dfn=5) (IDOM=BB6): BB0 BB5 BB6 BB13
BB14(dfn=6) (IDOM=BB13): BB0 BB5 BB6 BB13 BB14
BB15(dfn=7) (IDOM=BB13): BB0 BB5 BB6 BB13 BB15
BB2(dfn=8) (IDOM=BB5): BB0 BB5 BB2
BB7(dfn=9) (IDOM=BB2): BB0 BB5 BB2 BB7
BB11(dfn=10) (IDOM=BB7): BB0 BB5 BB2 BB7 BB11
BB8(dfn=11) (IDOM=BB2): BB0 BB5 BB2 BB8
BB9(dfn=12) (IDOM=BB8): BB0 BB5 BB2 BB8 BB9
BB10(dfn=13) (IDOM=BB8): BB0 BB5 BB2 BB8 BB10
LIVENESS:
BLOCK BB0 (BB5, ):
GEN BB0: {}
KILL BB0: {}
BLOCK BB5 (BB6, BB2, ):
1 iconst R37 <- [0]
KILL: R37(5)
1 iconst R38 <- [0]
KILL: R38(6)
1 il_seq_point il: 0x0
1 move R40 <- R35
GEN: R35(3)
1 icompare_imm R40 [0]
1 int_beq [B6B2]
GEN BB5: {3}
KILL BB5: {5, 6}
BLOCK BB6 (BB12, BB13, ):
1 il_seq_point il: 0x37
1 iconst R62 <- [-241887476]
1 loadu4_membase R63 <- [R62 + 0x0]
1 icompare_imm R63 [0]
1 int_bne_un [B13B12]
GEN BB6: {}
KILL BB6: {}
BLOCK BB12 (BB1, ):
1 il_seq_point il: 0x4f
1 load_membase R72 <- [R34 + 0x0]
GEN: R34(2)
1 move R74 <- R33
GEN: R33(1)
1 move R75 <- R72
1 voidcall_reg R36 clobbers: c
GEN: R36(4)
1 il_seq_point il: 0x58
1 move R32 <- R37
GEN: R37(5)
KILL: R32(0)
1 il_seq_point il: 0x59
GEN BB12: {1, 2, 4, 5}
KILL BB12: {0}
BLOCK BB1 ():
GEN BB1: {}
KILL BB1: {}
BLOCK BB13 (BB14, BB15, ):
1 il_seq_point il: 0x3f
1 il_seq_point il: 0x41
1 call R65 <- [mono_thread_force_interruption_checkpoint_noraise] clobbers: c
1 move R66 <- R65
1 move R47 <- R66
KILL: R47(8)
1 icompare_imm R65 [0]
1 int_bne_un [B15B14]
GEN BB13: {}
KILL BB13: {8}
BLOCK BB14 (BB12, ):
GEN BB14: {}
KILL BB14: {}
BLOCK BB15 (BB1, ):
1 throw R47
GEN: R47(8)
1 not_reached
GEN BB15: {8}
KILL BB15: {}
BLOCK BB2 (BB7, BB8, ):
1 il_seq_point il: 0x6
1 iconst R41 <- [-241887476]
1 loadu4_membase R42 <- [R41 + 0x0]
1 icompare_imm R42 [0]
1 int_beq [B7B8]
GEN BB2: {}
KILL BB2: {}
BLOCK BB7 (BB11, ):
1 il_seq_point il: 0x1e
1 load_membase R52 <- [R34 + 0x0]
GEN: R34(2)
1 move R54 <- R33
GEN: R33(1)
1 move R55 <- R52
1 voidcall_reg R36 clobbers: c
GEN: R36(4)
1 il_seq_point il: 0x27
1 br [B11]
GEN BB7: {1, 2, 4}
KILL BB7: {}
BLOCK BB11 (BB1, ):
1 il_seq_point il: 0x35
1 move R32 <- R37
GEN: R37(5)
KILL: R32(0)
1 il_seq_point il: 0x36
1 br [B1]
GEN BB11: {5}
KILL BB11: {0}
BLOCK BB8 (BB9, BB10, ):
1 il_seq_point il: 0xe
1 il_seq_point il: 0x10
1 call R44 <- [mono_thread_force_interruption_checkpoint_noraise] clobbers: c
1 move R45 <- R44
1 move R47 <- R45
KILL: R47(8)
1 icompare_imm R44 [0]
1 int_beq [B9B10]
GEN BB8: {}
KILL BB8: {8}
BLOCK BB9 (BB7, ):
GEN BB9: {}
KILL BB9: {}
BLOCK BB10 (BB1, ):
1 throw R47
GEN: R47(8)
1 not_reached
GEN BB10: {8}
KILL BB10: {}
ITERATION:
P: BB10(13): IN: BB8 OUT:BB1
LIVE IN BB10: {8}
P: BB9(12): IN: BB8 OUT:BB7
LIVE IN BB9: {1, 2, 4}
P: BB8(11): IN: BB2 OUT:BB9 BB10
LIVE IN BB8: {1, 2, 4}
P: BB11(10): IN: BB7 BB3 OUT:BB1
LIVE IN BB11: {5}
P: BB7(9): IN: BB2 BB9 OUT:BB11
ADD: 9
LIVE IN BB7: {1, 2, 4, 5}
P: BB9(12): IN: BB8 OUT:BB7
ADD: 8
LIVE IN BB9: {1, 2, 4, 5}
P: BB8(11): IN: BB2 OUT:BB9 BB10
LIVE IN BB8: {1, 2, 4, 5}
P: BB2(8): IN: BB5 OUT:BB7 BB8
LIVE IN BB2: {1, 2, 4, 5}
P: BB15(7): IN: BB13 OUT:BB1
LIVE IN BB15: {8}
P: BB14(6): IN: BB13 OUT:BB12
LIVE IN BB14: {1, 2, 4, 5}
P: BB13(5): IN: BB6 OUT:BB14 BB15
LIVE IN BB13: {1, 2, 4, 5}
P: BB1(4): IN: BB10 BB11 BB15 BB12 OUT:
P: BB12(3): IN: BB6 BB14 OUT:BB1
LIVE IN BB12: {1, 2, 4, 5}
P: BB6(2): IN: BB5 OUT:BB12 BB13
LIVE IN BB6: {1, 2, 4, 5}
P: BB5(1): IN: BB0 OUT:BB6 BB2
LIVE IN BB5: {1, 2, 3, 4}
P: BB0(0): IN: OUT:BB5
LIVE IN BB0: {1, 2, 3, 4}
IT: 14 15.
LIVE IN BB10: {8}
LIVE OUT BB10: {}
LIVE IN BB9: {1, 2, 4, 5}
LIVE OUT BB9: {1, 2, 4, 5}
LIVE IN BB8: {1, 2, 4, 5}
LIVE OUT BB8: {1, 2, 4, 5, 8}
LIVE IN BB11: {5}
LIVE OUT BB11: {}
LIVE IN BB7: {1, 2, 4, 5}
LIVE OUT BB7: {5}
LIVE IN BB2: {1, 2, 4, 5}
LIVE OUT BB2: {1, 2, 4, 5}
LIVE IN BB15: {8}
LIVE OUT BB15: {}
LIVE IN BB14: {1, 2, 4, 5}
LIVE OUT BB14: {1, 2, 4, 5}
LIVE IN BB13: {1, 2, 4, 5}
LIVE OUT BB13: {1, 2, 4, 5, 8}
LIVE IN BB1: {}
LIVE OUT BB1: {}
LIVE IN BB12: {1, 2, 4, 5}
LIVE OUT BB12: {}
LIVE IN BB6: {1, 2, 4, 5}
LIVE OUT BB6: {1, 2, 4, 5}
LIVE IN BB5: {1, 2, 3, 4}
LIVE OUT BB5: {1, 2, 4, 5}
LIVE IN BB0: {1, 2, 3, 4}
LIVE OUT BB0: {1, 2, 3, 4}
V0: [0x0 - 0x280005]
V1: [0x0 - 0x33ffff]
V2: [0x0 - 0x33ffff]
V3: [0x0 - 0x40008]
V4: [0x0 - 0x33ffff]
V5: [0x40003 - 0x33ffff]
V6: [0x40005 - 0x40005]
V7: [0xffffffff - 0x0]
V8: [0x14000b - 0x340002]
V9: [0xffffffff - 0x0]
V10: [0xffffffff - 0x0]
CFA: [0] def_cfa: sp+0x0
CFA: [8] offset: unknown at cfa-0xfffffff0
CFA: [c] def_cfa_offset: 0xc0
CFA: [10] offset: r27 at cfa-0x8
CFA: [14] offset: r31 at cfa-0x4
CFA: [18] def_cfa_reg: r31
Method (wrapper runtime-invoke) object <Module>:runtime_invoke_void__this___object (object,intptr,intptr,intptr) emitted at 30209e10 to 30209fa8 (code length 408) [mcs.exe]
/tmp/.az87ad: file format aixcoff-rs6000
Disassembly of section .text:
00000000 <.text>:
0: 7c 08 02 a6 mflr r0
4: 90 01 00 10 stw r0,16(r1)
8: 94 21 ff 40 stwu r1,-192(r1)
c: 93 61 00 b8 stw r27,184(r1)
10: 93 e1 00 bc stw r31,188(r1)
14: 7c 3f 0b 78 mr r31,r1
18: 90 7f 00 94 stw r3,148(r31)
1c: 90 9f 00 98 stw r4,152(r31)
20: 90 bf 00 9c stw r5,156(r31)
24: 90 df 00 a0 stw r6,160(r31)
28: 38 60 00 00 li r3,0
2c: 90 7f 00 8c stw r3,140(r31)
30: 38 60 00 00 li r3,0
34: 90 7f 00 90 stw r3,144(r31)
38: 80 7f 00 9c lwz r3,156(r31)
3c: 2c 03 00 00 cmpwi r3,0
40: 41 82 00 bc beq 0xfc
44: 3c 60 f1 95 lis r3,-3691
48: 60 63 17 0c ori r3,r3,5900
4c: 80 63 00 00 lwz r3,0(r3)
50: 2c 03 00 00 cmpwi r3,0
54: 41 82 00 48 beq 0x9c
58: 3d 80 20 03 lis r12,8195
5c: 61 8c ad 68 ori r12,r12,44392
60: 80 4c 00 04 lwz r2,4(r12)
64: 81 8c 00 00 lwz r12,0(r12)
68: 7d 88 03 a6 mtlr r12
6c: 4e 80 00 21 blrl
70: 7c 64 1b 78 mr r4,r3
74: 7c 9b 23 78 mr r27,r4
78: 2c 03 00 00 cmpwi r3,0
7c: 41 82 00 20 beq 0x9c
80: 7f 63 db 78 mr r3,r27
84: 3d 80 30 00 lis r12,12288
88: 61 8c 77 e0 ori r12,r12,30688
8c: 80 4c 00 04 lwz r2,4(r12)
90: 81 8c 00 00 lwz r12,0(r12)
94: 7d 88 03 a6 mtlr r12
98: 4e 80 00 21 blrl
9c: 80 7f 00 98 lwz r3,152(r31)
a0: 80 83 00 00 lwz r4,0(r3)
a4: 80 7f 00 94 lwz r3,148(r31)
a8: 80 bf 00 a0 lwz r5,160(r31)
ac: 80 05 00 00 lwz r0,0(r5)
b0: 80 45 00 08 lwz r2,8(r5)
b4: 7c 08 03 a6 mtlr r0
b8: 4e 80 00 21 blrl
bc: 48 00 00 38 b 0xf4
c0: 80 7f 00 88 lwz r3,136(r31)
c4: 80 7f 00 88 lwz r3,136(r31)
c8: 90 7f 00 90 stw r3,144(r31)
cc: 80 9f 00 9c lwz r4,156(r31)
d0: 80 7f 00 90 lwz r3,144(r31)
d4: 90 64 00 00 stw r3,0(r4)
d8: 54 84 ba 7e rlwinm r4,r4,23,9,31
dc: 3c a0 30 80 lis r5,12416
e0: 60 a5 00 00 ori r5,r5,0
e4: 7c 84 2a 14 add r4,r4,r5
e8: 38 a0 00 01 li r5,1
ec: 98 a4 00 00 stb r5,0(r4)
f0: 48 00 00 04 b 0xf4
f4: 80 7f 00 8c lwz r3,140(r31)
f8: 48 00 00 40 b 0x138
fc: 3c 60 f1 95 lis r3,-3691
100: 60 63 17 0c ori r3,r3,5900
104: 80 63 00 00 lwz r3,0(r3)
108: 28 03 00 00 cmplwi r3,0
10c: 40 82 00 48 bne 0x154
110: 48 00 00 04 b 0x114
114: 80 7f 00 98 lwz r3,152(r31)
118: 80 83 00 00 lwz r4,0(r3)
11c: 80 7f 00 94 lwz r3,148(r31)
120: 80 bf 00 a0 lwz r5,160(r31)
124: 80 05 00 00 lwz r0,0(r5)
128: 80 45 00 08 lwz r2,8(r5)
12c: 7c 08 03 a6 mtlr r0
130: 4e 80 00 21 blrl
134: 80 7f 00 8c lwz r3,140(r31)
138: 80 1f 00 d0 lwz r0,208(r31)
13c: 7c 08 03 a6 mtlr r0
140: 7f ec fb 78 mr r12,r31
144: 83 7f 00 b8 lwz r27,184(r31)
148: 83 ff 00 bc lwz r31,188(r31)
14c: 38 2c 00 c0 addi r1,r12,192
150: 4e 80 00 20 blr
154: 3d 80 20 03 lis r12,8195
158: 61 8c ad 68 ori r12,r12,44392
15c: 80 4c 00 04 lwz r2,4(r12)
160: 81 8c 00 00 lwz r12,0(r12)
164: 7d 88 03 a6 mtlr r12
168: 4e 80 00 21 blrl
16c: 7c 64 1b 78 mr r4,r3
170: 7c 9b 23 78 mr r27,r4
174: 2c 03 00 00 cmpwi r3,0
178: 41 82 ff 9c beq 0x114
17c: 7f 63 db 78 mr r3,r27
180: 3d 80 30 00 lis r12,12288
184: 61 8c 77 e0 ori r12,r12,30688
188: 80 4c 00 04 lwz r2,4(r12)
18c: 81 8c 00 00 lwz r12,0(r12)
190: 7d 88 03 a6 mtlr r12
194: 4e 80 00 21 blrl
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1]
0x3c002004 in ?? ()
(gdb) bt
#0 0x3c002004 in ?? ()
#1 0x30209db4 in ?? ()
#2 0x2ff21d98 in ?? ()
#3 0xdb1e4e14 in mono_jit_runtime_invoke () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#4 0xdaf90bf4 in do_runtime_invoke () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#5 0xdaf94b40 in mono_runtime_invoke_handle () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#6 0xdafc2094 in create_exception_two_strings () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#7 0xdafc29a0 in mono_exception_from_name_two_strings_checked () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#8 0xdb029b08 in create_domain_objects () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#9 0xdb02d128 in mono_runtime_init_checked () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#10 0xdb1e81dc in mini_init () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#11 0xdb2da908 in mono_main () from /home/calvin/mono-build/mono/mono/mini/.libs/libmonosgen-2.0.a(libmonosgen-2.0.so.1)
#12 0x10000534 in main (argc=13, argv=0x2ff22550) at main-sgen.c:445
warning: (Internal error: pc 0x100001bb in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x100001bc in read in psymtab, but not in symtab.)
@kadler even if ppc32 is a failed experiment/put on the back burner, I'll still probably use/adapt the configure script changes for a possible XL C build, if I can get my hands on that.
Would provide a possibly faster, memory lighter at runtime, use PPC32 libraries in P/Invoke, and a good way for upstream to ensure their PPC32 support works. However, AIX uses function descriptors and its strange calling convention on 32 bit, which violates many of Mono's assumptions about PPC32. (This is why right now, the runtime is 64-bit only.)
Requires
[X] Allow configurability for 32/64-bit build (we don't need to propagate an env var; maybe we would if we compiled with xlc) with a cleanup in
configure.ac
[X] Find all function descriptor handling code and ensure it works on PPC32
[ ] Find code size assumptions (function descriptor loading code bumps up code size by eight bytes (two ppc32 opcodes) per use of
ppc_load_func
) and resolve patching issues[ ] Other issues like calling conventions
Patch:
Currently bombs out at
mini-ppc.c:3080
- PPC32 patching logic I assume has no clue how to deal with function descriptors. Won't send upstream until I can get a program executing.