X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftrace.c;h=f67b704c362727b2e9f80e000e3fda8b85849779;hb=0927129c35f5a2d6df891857b2155ad5fb6ba3d2;hp=43516d87a7a0ca7a0c9270c1f662b01b9b97c9ea;hpb=bb77576e711b4728093913e46285dada03e0a3f7;p=mono.git diff --git a/mono/mini/trace.c b/mono/mini/trace.c index 43516d87a7a..f67b704c362 100644 --- a/mono/mini/trace.c +++ b/mono/mini/trace.c @@ -24,6 +24,13 @@ #include #include "trace.h" +#if defined (PLATFORM_ANDROID) || (defined (TARGET_IOS) && defined (TARGET_IOS)) +# undef printf +# define printf(...) g_log("mono", G_LOG_LEVEL_MESSAGE, __VA_ARGS__) +# undef fprintf +# define fprintf(__ignore, ...) g_log ("mono-gc", G_LOG_LEVEL_MESSAGE, __VA_ARGS__) +#endif + static MonoTraceSpec trace_spec; gboolean @@ -76,6 +83,10 @@ mono_trace_eval (MonoMethod *method) case MONO_TRACEOP_PROGRAM: if (trace_spec.assembly && (method->klass->image == mono_assembly_get_image (trace_spec.assembly))) inc = 1; break; + case MONO_TRACEOP_WRAPPER: + if ((method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) || + (method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE)) + inc = 1; break; case MONO_TRACEOP_METHOD: if (mono_method_desc_full_match ((MonoMethodDesc *) op->data, method)) inc = 1; break; @@ -138,6 +149,7 @@ enum Token { TOKEN_PROGRAM, TOKEN_EXCEPTION, TOKEN_NAMESPACE, + TOKEN_WRAPPER, TOKEN_STRING, TOKEN_EXCLUDE, TOKEN_DISABLED, @@ -185,6 +197,8 @@ get_token (void) return TOKEN_ALL; if (strcmp (value, "program") == 0) return TOKEN_PROGRAM; + if (strcmp (value, "wrapper") == 0) + return TOKEN_WRAPPER; if (strcmp (value, "disabled") == 0) return TOKEN_DISABLED; return TOKEN_STRING; @@ -235,6 +249,8 @@ get_spec (int *last) trace_spec.ops [*last].op = MONO_TRACEOP_ALL; else if (token == TOKEN_PROGRAM) trace_spec.ops [*last].op = MONO_TRACEOP_PROGRAM; + else if (token == TOKEN_WRAPPER) + trace_spec.ops [*last].op = MONO_TRACEOP_WRAPPER; else if (token == TOKEN_NAMESPACE){ trace_spec.ops [*last].op = MONO_TRACEOP_NAMESPACE; trace_spec.ops [*last].data = g_strdup (value); @@ -374,6 +390,7 @@ mono_trace_enter_method (MonoMethod *method, char *ebp) MonoJitArgumentInfo *arg_info; MonoMethodSignature *sig; char *fname; + MonoGenericSharingContext *gsctx = NULL; if (!trace_spec.enabled) return; @@ -392,7 +409,20 @@ mono_trace_enter_method (MonoMethod *method, char *ebp) arg_info = alloca (sizeof (MonoJitArgumentInfo) * (sig->param_count + 1)); - mono_arch_get_argument_info (NULL, sig, sig->param_count, arg_info); + if (method->is_inflated) { + /* FIXME: Might be better to pass the ji itself */ + MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), __builtin_return_address (0), NULL); + if (ji) { + gsctx = mono_jit_info_get_generic_sharing_context (ji); + if (gsctx && (gsctx->var_is_vt || gsctx->mvar_is_vt)) { + /* Needs a ctx to get precise method */ + printf (") \n"); + return; + } + } + } + + mono_arch_get_argument_info (gsctx, sig, sig->param_count, arg_info); if (MONO_TYPE_ISSTRUCT (mono_method_signature (method)->ret)) { g_assert (!mono_method_signature (method)->ret->byref); @@ -525,6 +555,7 @@ mono_trace_leave_method (MonoMethod *method, ...) MonoType *type; char *fname; va_list ap; + MonoGenericSharingContext *gsctx; if (!trace_spec.enabled) return; @@ -536,6 +567,19 @@ mono_trace_leave_method (MonoMethod *method, ...) printf ("LEAVE: %s", fname); g_free (fname); + if (method->is_inflated) { + /* FIXME: Might be better to pass the ji itself */ + MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), __builtin_return_address (0), NULL); + if (ji) { + gsctx = mono_jit_info_get_generic_sharing_context (ji); + if (gsctx && (gsctx->var_is_vt || gsctx->mvar_is_vt)) { + /* Needs a ctx to get precise method */ + printf (") \n"); + return; + } + } + } + type = mono_method_signature (method)->ret; handle_enum: @@ -617,7 +661,7 @@ handle_enum: case MONO_TYPE_R4: case MONO_TYPE_R8: { double f = va_arg (ap, double); - printf ("FP=%f\n", f); + printf ("FP=%f", f); break; } case MONO_TYPE_VALUETYPE: