[aot] Remove some obsolete TODOs.
[mono.git] / mono / mini / aot-runtime.c
index 213d5b56ab26711df37e99cd5300756dab8097ed..97d22706db0440ac1d2d695d1bdcd26a93a57f43 100644 (file)
@@ -1452,8 +1452,10 @@ aot_cache_load_module (MonoAssembly *assembly, char **aot_name)
        mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_AOT, "AOT: loading from cache: '%s'.", fname);
        module = mono_dl_open (fname, MONO_DL_LAZY, NULL);
 
-       if (module)
+       if (module) {
+               mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_AOT, "AOT: found in cache: '%s'.", fname);
                return module;
+       }
 
        if (!strcmp (assembly->aname.name, "mscorlib") && !mscorlib_aot_loaded)
                /*
@@ -1481,7 +1483,7 @@ aot_cache_load_module (MonoAssembly *assembly, char **aot_name)
                fclose (failure_file);
        }
 
-       mono_trace (G_LOG_LEVEL_MESSAGE, MONO_TRACE_AOT, "AOT: compiling assembly '%s'... ", assembly->image->name);
+       mono_trace (G_LOG_LEVEL_MESSAGE, MONO_TRACE_AOT, "AOT: compiling assembly '%s', logfile: '%s.log'... ", assembly->image->name, fname);
 
        /*
         * We need to invoke the AOT compiler here. There are multiple approaches:
@@ -1492,14 +1494,17 @@ aot_cache_load_module (MonoAssembly *assembly, char **aot_name)
         * - fork a new process and do the work there.
         */
        if (in_process) {
-               aot_options = g_strdup_printf ("outfile=%s,internal-logfile=%s.log", fname, fname);
+               aot_options = g_strdup_printf ("outfile=%s,internal-logfile=%s.log%s%s", fname, fname, config->aot_options ? "," : "", config->aot_options ? config->aot_options : "");
                /* Maybe due this in another thread ? */
                res = mono_compile_assembly (assembly, mono_parse_default_optimizations (NULL), aot_options);
-               if (!res) {
+               if (res) {
+                       mono_trace (G_LOG_LEVEL_MESSAGE, MONO_TRACE_AOT, "AOT: compilation failed.");
                        failure_fname = g_strdup_printf ("%s.failure", fname);
                        failure_file = fopen (failure_fname, "a+");
                        fclose (failure_file);
                        g_free (failure_fname);
+               } else {
+                       mono_trace (G_LOG_LEVEL_MESSAGE, MONO_TRACE_AOT, "AOT: compilation succeeded.");
                }
        } else {
                /*
@@ -2339,7 +2344,8 @@ static MonoJitInfo*
 decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain, 
                                                   MonoMethod *method, guint8 *code, 
                                                   MonoJitExceptionInfo *clauses, int num_clauses,
-                                                  int extra_size, GSList **nesting,
+                                                  MonoJitInfoFlags flags,
+                                                  GSList **nesting,
                                                   int *this_reg, int *this_offset)
 {
        guint8 *p;
@@ -2450,20 +2456,17 @@ decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain,
         * allocate a new JI.
         */
        jinfo = 
-               mono_domain_alloc0_lock_free (domain, MONO_SIZEOF_JIT_INFO + (sizeof (MonoJitExceptionInfo) * (ei_len + nested_len)) + extra_size);
+               mono_domain_alloc0_lock_free (domain, mono_jit_info_size (flags, ei_len + nested_len, 0));
+       mono_jit_info_init (jinfo, method, code, code_len, flags, ei_len + nested_len, 0);
 
-       jinfo->code_size = code_len;
        jinfo->unwind_info = mono_cache_unwind_info (info.unw_info, info.unw_info_len);
-       jinfo->d.method = method;
-       jinfo->code_start = code;
-       jinfo->domain_neutral = 0;
        /* This signals that unwind_info points to a normal cached unwind info */
        jinfo->from_aot = 0;
-       jinfo->num_clauses = ei_len + nested_len;
+       jinfo->from_llvm = 1;
 
        for (i = 0; i < ei_len; ++i) {
                /*
-                * orig_jinfo contains the original IL exception info saved by the AOT
+                * clauses contains the original IL exception info saved by the AOT
                 * compiler, we have to combine that with the information produced by LLVM
                 */
                /* The type_info entries contain IL clause indexes */
@@ -2539,7 +2542,8 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
 {
        int i, buf_len, num_clauses, len;
        MonoJitInfo *jinfo;
-       guint unwind_info, flags;
+       MonoJitInfoFlags flags = JIT_INFO_NONE;
+       guint unwind_info, eflags;
        gboolean has_generic_jit_info, has_dwarf_unwind_info, has_clauses, has_seq_points, has_try_block_holes, has_arch_eh_jit_info;
        gboolean from_llvm, has_gc_map;
        guint8 *p;
@@ -2551,15 +2555,15 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
        async = mono_thread_info_is_async_context ();
 
        p = ex_info;
-       flags = decode_value (p, &p);
-       has_generic_jit_info = (flags & 1) != 0;
-       has_dwarf_unwind_info = (flags & 2) != 0;
-       has_clauses = (flags & 4) != 0;
-       has_seq_points = (flags & 8) != 0;
-       from_llvm = (flags & 16) != 0;
-       has_try_block_holes = (flags & 32) != 0;
-       has_gc_map = (flags & 64) != 0;
-       has_arch_eh_jit_info = (flags & 128) != 0;
+       eflags = decode_value (p, &p);
+       has_generic_jit_info = (eflags & 1) != 0;
+       has_dwarf_unwind_info = (eflags & 2) != 0;
+       has_clauses = (eflags & 4) != 0;
+       has_seq_points = (eflags & 8) != 0;
+       from_llvm = (eflags & 16) != 0;
+       has_try_block_holes = (eflags & 32) != 0;
+       has_gc_map = (eflags & 64) != 0;
+       has_arch_eh_jit_info = (eflags & 128) != 0;
 
        if (has_dwarf_unwind_info) {
                unwind_info = decode_value (p, &p);
@@ -2567,13 +2571,16 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
        } else {
                unwind_info = decode_value (p, &p);
        }
-       if (has_generic_jit_info)
+       if (has_generic_jit_info) {
+               flags |= JIT_INFO_HAS_GENERIC_JIT_INFO;
                generic_info_size = sizeof (MonoGenericJitInfo);
-       else
+       } else {
                generic_info_size = 0;
+       }
 
        if (has_try_block_holes) {
                num_holes = decode_value (p, &p);
+               flags |= JIT_INFO_HAS_TRY_BLOCK_HOLES;
                try_holes_info_size = sizeof (MonoTryBlockHoleTableJitInfo) + num_holes * sizeof (MonoTryBlockHoleJitInfo);
        } else {
                num_holes = try_holes_info_size = 0;
@@ -2583,10 +2590,12 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
                num_clauses = decode_value (p, &p);
        else
                num_clauses = 0;
-       if (has_arch_eh_jit_info)
+       if (has_arch_eh_jit_info) {
+               flags |= JIT_INFO_HAS_ARCH_EH_INFO;
                arch_eh_jit_info_size = sizeof (MonoArchEHJitInfo);
-       else
+       } else {
                arch_eh_jit_info_size = 0;
+       }
 
        if (from_llvm) {
                MonoJitExceptionInfo *clauses;
@@ -2619,17 +2628,16 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
                        }
                }
 
-               jinfo = decode_llvm_mono_eh_frame (amodule, domain, method, code, clauses, num_clauses, generic_info_size + try_holes_info_size + arch_eh_jit_info_size, nesting, &this_reg, &this_offset);
-               jinfo->from_llvm = 1;
+               jinfo = decode_llvm_mono_eh_frame (amodule, domain, method, code, clauses, num_clauses, flags, nesting, &this_reg, &this_offset);
 
                g_free (clauses);
                for (i = 0; i < num_clauses; ++i)
                        g_slist_free (nesting [i]);
                g_free (nesting);
        } else {
-               len = MONO_SIZEOF_JIT_INFO + (sizeof (MonoJitExceptionInfo) * num_clauses) + generic_info_size + try_holes_info_size + arch_eh_jit_info_size;
+               len = mono_jit_info_size (flags, num_clauses, num_holes);
                jinfo = alloc0_jit_info_data (domain, len, async);
-               jinfo->num_clauses = num_clauses;
+               mono_jit_info_init (jinfo, method, code, code_len, flags, num_clauses, num_holes);
 
                for (i = 0; i < jinfo->num_clauses; ++i) {
                        MonoJitExceptionInfo *ei = &jinfo->clauses [i];
@@ -2656,25 +2664,11 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
                        ei->handler_start = code + decode_value (p, &p);
                }
 
-               jinfo->code_size = code_len;
                jinfo->unwind_info = unwind_info;
-               jinfo->d.method = method;
-               jinfo->code_start = code;
                jinfo->domain_neutral = 0;
                jinfo->from_aot = 1;
        }
 
-       /*
-        * Set all the 'has' flags, the mono_jit_info_get () functions depends on this to
-        * compute the addresses of data blocks.
-        */
-       if (has_generic_jit_info)
-               jinfo->has_generic_jit_info = 1;
-       if (has_arch_eh_jit_info)
-               jinfo->has_arch_eh_info = 1;
-       if (has_try_block_holes)
-               jinfo->has_try_block_holes = 1;
-
        if (has_try_block_holes) {
                MonoTryBlockHoleTableJitInfo *table;
 
@@ -3280,9 +3274,11 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin
        case MONO_PATCH_INFO_MONITOR_ENTER:
        case MONO_PATCH_INFO_MONITOR_EXIT:
        case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR:
-       case MONO_PATCH_INFO_CASTCLASS_CACHE:
        case MONO_PATCH_INFO_JIT_TLS_ID:
                break;
+       case MONO_PATCH_INFO_CASTCLASS_CACHE:
+               ji->data.index = decode_value (p, &p);
+               break;
        case MONO_PATCH_INFO_RGCTX_FETCH: {
                gboolean res;
                MonoJumpInfoRgctxEntry *entry;
@@ -4480,13 +4476,6 @@ mono_aot_get_trampoline (const char *name)
 #include <mach/mach.h>
 
 static TrampolinePage* trampoline_pages [MONO_AOT_TRAMP_NUM];
-/* these sizes are for ARM code, parametrize if porting to other architectures (see arch_emit_specific_trampoline_pages)
- * trampoline size is assumed to be 8 bytes below as well (8 is the minimum for 32 bit archs, since we need to store
- * two pointers for trampoline in the data page).
- * the minimum for the common code must be at least sizeof(TrampolinePage), since we store the page info at the
- * beginning of the data page.
- */
-static const int trampolines_pages_code_offsets [MONO_AOT_TRAMP_NUM] = {16, 16, 72, 16};
 
 static unsigned char*
 get_new_trampoline_from_page (int tramp_type)
@@ -4575,11 +4564,7 @@ get_new_trampoline_from_page (int tramp_type)
                page = (TrampolinePage*)addr;
                page->next = trampoline_pages [tramp_type];
                trampoline_pages [tramp_type] = page;
-#ifdef TARGET_ARM64
                page->trampolines = (void*)(taddr + amodule->info.tramp_page_code_offsets [tramp_type]);
-#else
-               page->trampolines = (void*)(taddr + trampolines_pages_code_offsets [tramp_type]);
-#endif
                page->trampolines_end = (void*)(taddr + psize - 64);
                code = page->trampolines;
                page->trampolines += specific_trampoline_size;