*/
#include <config.h>
-#include <signal.h>
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
# 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 <intrin.h>
+#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
return TRUE;
if (p >= '0' && p <= '9')
return TRUE;
- if (p == '.' || p == ':' || p == '_' || p == '-')
+ if (p == '.' || p == ':' || p == '_' || p == '-' || p == '`')
return TRUE;
return FALSE;
}
mono_trace_enter_method (MonoMethod *method, char *ebp)
{
int i, j;
- MonoClass *class;
+ MonoClass *klass;
MonoObject *o;
MonoJitArgumentInfo *arg_info;
MonoMethodSignature *sig;
char *fname;
+ MonoGenericSharingContext *gsctx = NULL;
if (!trace_spec.enabled)
return;
g_free (fname);
if (!ebp) {
- printf (") ip: %p\n", __builtin_return_address (1));
+ printf (") ip: %p\n", RETURN_ADDRESS_N (1));
return;
}
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->is_gsharedvt) {
+ /* Needs a ctx to get precise method */
+ printf (") <gsharedvt>\n");
+ return;
+ }
+ }
+ }
+
+ mono_arch_get_argument_info (sig, sig->param_count, arg_info);
if (MONO_TYPE_ISSTRUCT (mono_method_signature (method)->ret)) {
g_assert (!mono_method_signature (method)->ret->byref);
o = *arg_in_stack_slot(this, MonoObject *);
if (o) {
- class = o->vtable->klass;
+ klass = o->vtable->klass;
- if (class == mono_defaults.string_class) {
+ if (klass == mono_defaults.string_class) {
MonoString *s = (MonoString*)o;
char *as = string_to_utf8 (s);
printf ("this:[STRING:%p:%s], ", o, as);
g_free (as);
} else {
- printf ("this:%p[%s.%s %s], ", o, class->name_space, class->name, o->vtable->domain->friendly_name);
+ printf ("this:%p[%s.%s %s], ", o, klass->name_space, klass->name, o->vtable->domain->friendly_name);
}
} else
printf ("this:NULL, ");
case MONO_TYPE_OBJECT: {
o = *arg_in_stack_slot(cpos, MonoObject *);
if (o) {
- class = o->vtable->klass;
+ klass = o->vtable->klass;
- if (class == mono_defaults.string_class) {
+ if (klass == mono_defaults.string_class) {
char *as = string_to_utf8 ((MonoString*)o);
printf ("[STRING:%p:%s], ", o, as);
g_free (as);
- } else if (class == mono_defaults.int32_class) {
+ } else if (klass == mono_defaults.int32_class) {
printf ("[INT32:%p:%d], ", o, *(gint32 *)((char *)o + sizeof (MonoObject)));
- } else if (class == mono_defaults.monotype_class) {
+ } else if (klass == mono_defaults.monotype_class) {
printf ("[TYPE:%s], ", mono_type_full_name (((MonoReflectionType*)o)->type));
} else
- printf ("[%s.%s:%p], ", class->name_space, class->name, o);
+ printf ("[%s.%s:%p], ", klass->name_space, klass->name, o);
} else {
printf ("%p, ", *arg_in_stack_slot(cpos, gpointer));
}
MonoType *type;
char *fname;
va_list ap;
+ MonoGenericSharingContext *gsctx;
if (!trace_spec.enabled)
return;
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->is_gsharedvt) {
+ /* Needs a ctx to get precise method */
+ printf (") <gsharedvt>\n");
+ return;
+ }
+ }
+ }
+
type = mono_method_signature (method)->ret;
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:
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);
}