[mono/mono] 93c6b94b: [aot] Small AOT changes. Save some constants into the AOT image instead of duplicating them in aot-runtime.c. Emit some padding so multiple symbols do not point to the same address.

"Zoltan Varga ([email protected])" <[email protected]>
Newsgroups gmane.comp.gnome.mono.patches
Message-ID <000001420508f74d-1e27f8cc-3e11-4bbb-a900-0a844cef22b4-000000@email.amazonses.com>
   Branch: refs/heads/master
     Home: https://github.com/mono/mono
  Compare: https://github.com/mono/mono/compare/4c1198f3b8ef...93c6b94bb004

   Commit: 93c6b94bb00464e574bcc39368addbb2179889d1
   Author: Zoltan Varga <[email protected]> (vargaz)
     Date: 2013-10-29 16:23:33 GMT
      URL: https://github.com/mono/mono/commit/93c6b94bb00464e574bcc39368addbb2179889d1

[aot] Small AOT changes. Save some constants into the AOT image instead of duplicating them in aot-runtime.c. Emit some padding so multiple symbols do not point to the same address.

Changed paths:
  M mono/mini/aot-compiler.c
  M mono/mini/aot-runtime.c
  M mono/mini/mini.h

Modified: mono/mini/aot-compiler.c
===================================================================
@@ -188,10 +188,12 @@ struct _ReadOnlyValue {
 	guint32 final_got_size;
 	/* Number of GOT entries reserved for trampolines */
 	guint32 num_trampoline_got_entries;
+	guint32 tramp_page_size;
 
 	guint32 num_trampolines [MONO_AOT_TRAMP_NUM];
 	guint32 trampoline_got_offset_base [MONO_AOT_TRAMP_NUM];
 	guint32 trampoline_size [MONO_AOT_TRAMP_NUM];
+	guint32 tramp_page_code_offsets [MONO_AOT_TRAMP_NUM];
 
 	MonoAotOptions aot_opts;
 	guint32 nmethods;
@@ -686,7 +688,7 @@ struct _ReadOnlyValue {
  * calling code.
  */
 static void
-arch_emit_direct_call (MonoAotCompile *acfg, const char *target, gboolean external, int *call_size)
+arch_emit_direct_call (MonoAotCompile *acfg, const char *target, gboolean external, MonoJumpInfo *ji, int *call_size)
 {
 #if defined(TARGET_X86) || defined(TARGET_AMD64)
 	/* Need to make sure this is exactly 5 bytes long */
@@ -1034,6 +1036,8 @@ struct _ReadOnlyValue {
 	if (!acfg->aot_opts.use_trampolines_page)
 		return;
 
+	acfg->tramp_page_size = mono_pagesize ();
+
 	sprintf (symbol, "%sspecific_trampolines_page", acfg->user_symbol_prefix);
 	emit_alignment (acfg, mono_pagesize ());
 	emit_global (acfg, symbol, TRUE);
@@ -4646,7 +4650,7 @@ struct _ReadOnlyValue {
 				if (direct_call) {
 					int call_size;
 
-					arch_emit_direct_call (acfg, direct_call_target, external_call, &call_size);
+					arch_emit_direct_call (acfg, direct_call_target, external_call, patch_info, &call_size);
 					i += call_size - 1;
 				} else {
 					int code_size;
@@ -5734,6 +5738,8 @@ struct _ReadOnlyValue {
 	MonoJumpInfo *ji;
 	GSList *unwind_ops;
 
+	g_assert (info);
+
 	name = info->name;
 	code = info->code;
 	code_size = info->code_size;
@@ -6048,6 +6054,7 @@ struct _ReadOnlyValue {
 			}
 
 			emit_label (acfg, end_symbol);
+			emit_int32 (acfg, 0);
 		}
 
 		arch_emit_specific_trampoline_pages (acfg);
@@ -7200,6 +7207,7 @@ struct _ReadOnlyValue {
 	}
 	sprintf (symbol, "unbox_trampolines_end");
 	emit_label (acfg, symbol);
+	emit_int32 (acfg, 0);
 }
 
 static void
@@ -8122,6 +8130,9 @@ struct _ReadOnlyValue {
 	emit_int32 (acfg, __alignof__ (gint64));
 #endif
 	emit_int32 (acfg, MONO_TRAMPOLINE_NUM);
+	emit_int32 (acfg, acfg->tramp_page_size);
+	for (i = 0; i < MONO_AOT_TRAMP_NUM; ++i)
+		emit_int32 (acfg, acfg->tramp_page_code_offsets [i]);
 
 	if (acfg->aot_opts.static_link) {
 		char *p;
@@ -8624,7 +8635,7 @@ struct _ReadOnlyValue {
 	acfg->aot_opts.nrgctx_fetch_trampolines = 128;
 	acfg->aot_opts.ngsharedvt_arg_trampolines = 128;
 	acfg->aot_opts.llvm_path = g_strdup ("");
-#if MONOTOUCH
+#ifdef MONOTOUCH
 	acfg->aot_opts.use_trampolines_page = TRUE;
 #endif
 

Modified: mono/mini/aot-runtime.c
===================================================================
@@ -104,9 +104,7 @@
 	guint8 *plt_end;
 	guint8 *blob;
 	gint32 *code_offsets;
-#ifdef MONOTOUCH
 	gpointer *method_addresses;
-#endif
 	/* This contains <offset, index> pairs sorted by offset */
 	/* This is needed because LLVM emitted methods can be in any order */
 	gint32 *sorted_code_offsets;
@@ -1730,9 +1728,7 @@
 	}
 
 	amodule->code_offsets = info->code_offsets;
-#ifdef MONOTOUCH
 	amodule->method_addresses = info->method_addresses;
-#endif
 	amodule->code = info->methods;
 #ifdef TARGET_ARM
 	/* Mask out thumb interop bit */
@@ -1766,7 +1762,7 @@
 		amodule->code_offsets = g_malloc0 (amodule->info.nmethods * sizeof (gint32));
 		for (i = 0; i < amodule->info.nmethods; ++i) {
 			/* method_addresses () contains a table of branches, since the ios linker can update those correctly */
-			void *addr = get_arm_bl_target ((guint32*)(amodule->method_addresses + i));
+			void *addr = get_arm_bl_target ((guint32*)amodule->method_addresses + i);
 
 			if (addr == amodule->method_addresses)
 				amodule->code_offsets [i] = 0xffffffff;
@@ -4279,14 +4275,16 @@
 	vm_address_t addr, taddr;
 	kern_return_t ret;
 	vm_prot_t prot, max_prot;
-	int psize;
+	int psize, specific_trampoline_size;
 	unsigned char *code;
 
+	specific_trampoline_size = 2 * sizeof (gpointer);
+
 	mono_aot_page_lock ();
 	page = trampoline_pages [tramp_type];
 	if (page && page->trampolines < page->trampolines_end) {
 		code = page->trampolines;
-		page->trampolines += 8;
+		page->trampolines += specific_trampoline_size;
 		mono_aot_page_unlock ();
 		return code;
 	}
@@ -4299,6 +4297,8 @@
 	amodule = image->aot_module;
 	g_assert (amodule);
 
+	g_assert (amodule->info.tramp_page_size == psize);
+
 	if (tramp_type == MONO_AOT_TRAMP_SPECIFIC)
 		tpage = load_function (amodule, "specific_trampolines_page");
 	else if (tramp_type == MONO_AOT_TRAMP_STATIC_RGCTX)
@@ -4342,7 +4342,7 @@
 		/* some other thread already allocated, so use that to avoid wasting memory */
 		if (page && page->trampolines < page->trampolines_end) {
 			code = page->trampolines;
-			page->trampolines += 8;
+			page->trampolines += specific_trampoline_size;
 			mono_aot_page_unlock ();
 			vm_deallocate (mach_task_self (), addr, psize);
 			vm_deallocate (mach_task_self (), taddr, psize);
@@ -4454,7 +4454,7 @@
 	*out_amodule = amodule;
 
 #ifdef MONOTOUCH
-#define	MONOTOUCH_TRAMPOLINES_ERROR ". See http://docs.xamarin.com/ios/troubleshooting for instruction on how to fix this condition"
+#define	MONOTOUCH_TRAMPOLINES_ERROR ". See http://docs.xamarin.com/ios/troubleshooting for instructions on how to fix this condition."
 #else
 #define	MONOTOUCH_TRAMPOLINES_ERROR ""
 #endif

Modified: mono/mini/mini.h
===================================================================
@@ -133,7 +133,7 @@
 #endif
 
 /* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 95
+#define MONO_AOT_FILE_VERSION 96
 
 //TODO: This is x86/amd64 specific.
 #define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6))


_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.