X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftrace.c;h=cbc3b3b2b4ce49ddee7b78298841e7f97c009f5b;hb=7e6965d3989c362afcbc712daf160ec657c2d18c;hp=d9a5b50e41fd2b1c4e44bfdf0daa605c99588e93;hpb=01ea58cbd474d4a9230acbba5571738896539d42;p=mono.git diff --git a/mono/mini/trace.c b/mono/mini/trace.c index d9a5b50e41f..cbc3b3b2b4c 100644 --- a/mono/mini/trace.c +++ b/mono/mini/trace.c @@ -31,6 +31,25 @@ # define fprintf(__ignore, ...) g_log ("mono-gc", G_LOG_LEVEL_MESSAGE, __VA_ARGS__) #endif +#ifdef __GNUC__ + +#define RETURN_ADDRESS_N(N) (__builtin_extract_return_addr (__builtin_return_address (N))) +#define RETURN_ADDRESS() RETURN_ADDRESS_N(0) + +#elif defined(_MSC_VER) + +#include +#pragma intrinsic(_ReturnAddress) + +#define RETURN_ADDRESS() _ReturnAddress() +#define RETURN_ADDRESS_N(N) NULL + +#else + +#error "Missing return address intrinsics implementation" + +#endif + static MonoTraceSpec trace_spec; gboolean @@ -390,6 +409,7 @@ mono_trace_enter_method (MonoMethod *method, char *ebp) MonoJitArgumentInfo *arg_info; MonoMethodSignature *sig; char *fname; + MonoGenericSharingContext *gsctx = NULL; if (!trace_spec.enabled) return; @@ -400,7 +420,7 @@ mono_trace_enter_method (MonoMethod *method, char *ebp) g_free (fname); if (!ebp) { - printf (") ip: %p\n", __builtin_return_address (1)); + printf (") ip: %p\n", RETURN_ADDRESS_N (1)); return; } @@ -408,7 +428,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 (), RETURN_ADDRESS (), 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); @@ -541,6 +574,7 @@ mono_trace_leave_method (MonoMethod *method, ...) MonoType *type; char *fname; va_list ap; + MonoGenericSharingContext *gsctx; if (!trace_spec.enabled) return; @@ -552,6 +586,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 (), RETURN_ADDRESS (), 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: @@ -633,7 +680,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: @@ -654,7 +701,7 @@ handle_enum: printf ("(unknown return type %x)", mono_method_signature (method)->ret->type); } - //printf (" ip: %p\n", __builtin_return_address (1)); + //printf (" ip: %p\n", RETURN_ADDRESS_N (1)); printf ("\n"); fflush (stdout); }