[aot] Fix support for direct icalls in llvm mode.
authorZoltan Varga <vargaz@gmail.com>
Fri, 20 Mar 2015 03:25:45 +0000 (23:25 -0400)
committerZoltan Varga <vargaz@gmail.com>
Fri, 20 Mar 2015 03:25:45 +0000 (23:25 -0400)
mono/mini/aot-compiler.c

index 492ae3b12b0515313ed24808538fdaf19989e9a8..a7729014b7919c5e2c07986f0235a524bf9297c8 100644 (file)
@@ -7119,6 +7119,7 @@ mono_aot_get_plt_symbol (MonoJumpInfoType type, gconstpointer data)
 {
        MonoJumpInfo *ji = mono_mempool_alloc (llvm_acfg->mempool, sizeof (MonoJumpInfo));
        MonoPltEntry *plt_entry;
+       const char *sym = NULL;
 
        ji->type = type;
        ji->data.target = data;
@@ -7126,6 +7127,19 @@ mono_aot_get_plt_symbol (MonoJumpInfoType type, gconstpointer data)
        if (!can_encode_patch (llvm_acfg, ji))
                return NULL;
 
+       if (llvm_acfg->aot_opts.direct_icalls) {
+               if (type == MONO_PATCH_INFO_JIT_ICALL_ADDR) {
+                       /* Call to a C function implementing a jit icall */
+                       sym = mono_lookup_jit_icall_symbol (data);
+               } else if (type == MONO_PATCH_INFO_ICALL_ADDR) {
+                       MonoMethod *method = (gpointer)data;
+                       if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
+                               sym = mono_lookup_icall_symbol (method);
+               }
+               if (sym)
+                       return g_strdup (sym);
+       }
+
        plt_entry = get_plt_entry (llvm_acfg, ji);
        plt_entry->llvm_used = TRUE;