X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Faot-compiler.c;h=bc9c01f401fc9f688c25190250d77ad4a934f8cd;hb=173eaf1dfaf29d0a7170b4d467e24e38f52c589e;hp=44812084153173ded322f433b649682b9cae6fe0;hpb=59d2397abc90def0d843c124e3a5c81c40b6cbd2;p=mono.git diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 44812084153..bc9c01f401f 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -70,18 +70,6 @@ #define TV_GETTIME(tv) tv = mono_100ns_ticks () #define TV_ELAPSED(start,end) (((end) - (start)) / 10) -#ifdef TARGET_WIN32 -#define SHARED_EXT ".dll" -#elif defined(__ppc__) && defined(TARGET_MACH) -#define SHARED_EXT ".dylib" -#elif defined(TARGET_MACH) && defined(TARGET_X86) && !defined(__native_client_codegen__) -#define SHARED_EXT ".dylib" -#elif defined(TARGET_MACH) && defined(TARGET_AMD64) && !defined(__native_client_codegen__) -#define SHARED_EXT ".dylib" -#else -#define SHARED_EXT ".so" -#endif - #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1)) #define ALIGN_PTR_TO(ptr,align) (gpointer)((((gssize)(ptr)) + (align - 1)) & (~(align - 1))) #define ROUND_DOWN(VALUE,SIZE) ((VALUE) & ~((SIZE) - 1)) @@ -1934,14 +1922,14 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) code = buf; /* Load the mscorlib got address */ - ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r30); + ppc_ldptr (code, ppc_r12, sizeof (gpointer), ppc_r30); /* Load the parameter from the GOT */ ppc_load (code, ppc_r0, offset * sizeof (gpointer)); - ppc_ldptr_indexed (code, ppc_r11, ppc_r11, ppc_r0); + ppc_ldptr_indexed (code, ppc_r12, ppc_r12, ppc_r0); /* Load and check key */ labels [1] = code; - ppc_ldptr (code, ppc_r0, 0, ppc_r11); + ppc_ldptr (code, ppc_r0, 0, ppc_r12); ppc_cmp (code, 0, sizeof (gpointer) == 8 ? 1 : 0, ppc_r0, MONO_ARCH_IMT_REG); labels [2] = code; ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); @@ -1952,18 +1940,18 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); /* Loop footer */ - ppc_addi (code, ppc_r11, ppc_r11, 2 * sizeof (gpointer)); + ppc_addi (code, ppc_r12, ppc_r12, 2 * sizeof (gpointer)); labels [4] = code; ppc_b (code, 0); mono_ppc_patch (labels [4], labels [1]); /* Match */ mono_ppc_patch (labels [2], code); - ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r11); - /* r11 now contains the value of the vtable slot */ + ppc_ldptr (code, ppc_r12, sizeof (gpointer), ppc_r12); + /* r12 now contains the value of the vtable slot */ /* this is not a function descriptor on ppc64 */ - ppc_ldptr (code, ppc_r11, 0, ppc_r11); - ppc_mtctr (code, ppc_r11); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); + ppc_mtctr (code, ppc_r12); ppc_bcctr (code, PPC_BR_ALWAYS, 0); /* Fail */ @@ -5386,6 +5374,15 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg) encode_value (table->num_holes, p, &p); } + if (jinfo->has_arch_eh_info) { + /* + * In AOT mode, the code length is calculated from the address of the previous method, + * which could include alignment padding, so calculating the start of the epilog as + * code_len - epilog_size is correct any more. Save the real code len as a workaround. + */ + encode_value (jinfo->code_size, p, &p); + } + /* Exception table */ if (cfg->compile_llvm) { /* @@ -8641,7 +8638,7 @@ compile_asm (MonoAotCompile *acfg) if (acfg->aot_opts.outfile) outfile_name = g_strdup_printf ("%s", acfg->aot_opts.outfile); else - outfile_name = g_strdup_printf ("%s%s", acfg->image->name, SHARED_EXT); + outfile_name = g_strdup_printf ("%s%s", acfg->image->name, MONO_SOLIB_EXT); tmp_outfile_name = g_strdup_printf ("%s.tmp", outfile_name); @@ -8661,7 +8658,7 @@ compile_asm (MonoAotCompile *acfg) g_free (command); - /*com = g_strdup_printf ("strip --strip-unneeded %s%s", acfg->image->name, SHARED_EXT); + /*com = g_strdup_printf ("strip --strip-unneeded %s%s", acfg->image->name, MONO_SOLIB_EXT); printf ("Stripping the binary: %s\n", com); system (com); g_free (com);*/ @@ -9012,7 +9009,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) if (acfg->aot_opts.outfile) outfile_name = g_strdup_printf ("%s", acfg->aot_opts.outfile); else - outfile_name = g_strdup_printf ("%s%s", acfg->image->name, SHARED_EXT); + outfile_name = g_strdup_printf ("%s%s", acfg->image->name, MONO_SOLIB_EXT); /* * Can't use g_file_open_tmp () as it will be deleted at exit, and