[Mono-devel-list] JIT, MonoCompile

Paolo Molaro lupus at ximian.com
Tue Jan 25 08:58:33 EST 2005


On 01/24/05 Kaushik Srenevasan wrote:
> I've been trying to insert some code into every JITted method by modifying
> the mono_codegen function in mini.c.
> 
> I've added the following function in mini.c
> 
> Void foo( void )
> {
> printf( "." );
> }
> 
> And then the following lines 
> 
> Mono_add_patch_info( cfg, code - cfg->native_code, MONO_PATCH_INFO_ABS,
> foo); X86_call_code( code, 0 );

As I told you on both IRC and on private email, this is not the way to
implement this.

> But earlier I tried inserting only
> 
> X86_call_code( code, foo )
> 
> And I got a segfault.

No surprise, since you didn't use the mono_emit_jit_icall() function I
told you to use.

> I thought this would work because all that x86_call_code does ( as far as I
> understood ) is to emit a call <offset> instruction into the code stream.
> And since I am calling a function that neither takes any parameters nor
> returns any, I wouldn't be corrupting the stack either. But I fail to
> understand why it segfaulted.

You likely inserted the code before it got relocated in memory and since
the x86 call uses a relative offset, you made it call a random location 
in memory.

As an example of how to implement it, see the attached patch:
it will insert the call only for methods that have the init_locals
basic block created (trivial to make it add the call for any method).

> How does the runtime make use of MonoCompile?

MonoCompile represents the compilation unit the jit operates on
(usually a method and the methods that are possibly inlined in it).

lupus

-- 
-----------------------------------------------------------------
lupus at debian.org                                     debian/rules
lupus at ximian.com                             Monkeys do it better
-------------- next part --------------
Index: mini/mini.c
===================================================================
--- mini/mini.c	(revision 39494)
+++ mini/mini.c	(working copy)
@@ -161,6 +161,12 @@
 #endif
 }
 
+static void
+dummy_enter (void)
+{
+	printf (".");
+}
+
 /* debug function */
 G_GNUC_UNUSED static char*
 get_method_from_ip (void *ip)
@@ -3226,6 +3232,7 @@
 		link_bblock (cfg, start_bblock, init_localsbb);
 		link_bblock (cfg, init_localsbb, bblock);
 		init_localsbb->block_num = cfg->num_bblocks++;
+		mono_emit_jit_icall (cfg, init_localsbb, dummy_enter, NULL, NULL);
 	} else {
 		start_bblock->next_bb = bblock;
 		link_bblock (cfg, start_bblock, bblock);
@@ -9745,6 +9752,7 @@
 	mono_register_jit_icall (mono_ldftn_nosync, "mono_ldftn_nosync", helper_sig_compile, FALSE);
 	mono_register_jit_icall (mono_ldvirtfn, "mono_ldvirtfn", helper_sig_compile_virt, FALSE);
 	mono_register_jit_icall (helper_compile_generic_method, "compile_generic_method", helper_sig_compile_generic_method, FALSE);
+	mono_register_jit_icall (dummy_enter, "dummy_enter", helper_sig_void_void, TRUE);
 #endif
 
 #define JIT_RUNTIME_WORKS


More information about the Mono-devel-list mailing list