1 #include <mono/metadata/profiler.h>
2 #include <mono/metadata/tokentype.h>
3 #include <mono/metadata/tabledefs.h>
4 #include <mono/metadata/debug-helpers.h>
5 #include <mono/metadata/assembly.h>
12 * This profiler collects profiling information usable by the Mono AOT compiler
13 * to generate better code. It saves the information into files under ~/.mono.
14 * The AOT compiler can load these files during compilation.
15 * Currently, only the order in which methods were compiled is saved,
16 * allowing more efficient function ordering in the AOT files.
19 struct _MonoProfiler {
27 typedef struct ForeachData {
35 foreach_method (gpointer data, gpointer user_data)
37 ForeachData *udata = (ForeachData*)user_data;
38 MonoMethod *method = (MonoMethod*)data;
40 if (!mono_method_get_token (method) || mono_class_get_image (mono_method_get_class (method)) != udata->image)
43 fprintf (udata->outfile, "%d\n", mono_method_get_token (method));
47 output_image (gpointer key, gpointer value, gpointer user_data)
49 MonoImage *image = (MonoImage*)key;
50 PerImageData *image_data = (PerImageData*)value;
51 MonoProfiler *prof = (MonoProfiler*)user_data;
52 char *tmp, *outfile_name;
57 tmp = g_strdup_printf ("%s/.mono/aot-profile-data", g_get_home_dir ());
59 if (!g_file_test (tmp, G_FILE_TEST_IS_DIR)) {
63 err = mkdir (tmp, 0777);
66 fprintf (stderr, "mono-profiler-aot: Unable to create output directory '%s': %s\n", tmp, g_strerror (errno));
73 outfile_name = g_strdup_printf ("%s/%s-%s-%d", tmp, mono_image_get_name (image), mono_image_get_guid (image), i);
75 if (!g_file_test (outfile_name, G_FILE_TEST_IS_REGULAR))
81 printf ("Creating output file: %s\n", outfile_name);
83 outfile = fopen (outfile_name, "w+");
86 fprintf (outfile, "#VER:%d\n", 1);
89 data.outfile = outfile;
92 g_list_foreach (image_data->methods, foreach_method, &data);
95 /* called at the end of the program */
97 prof_shutdown (MonoProfiler *prof)
99 g_hash_table_foreach (prof->images, output_image, prof);
103 prof_jit_enter (MonoProfiler *prof, MonoMethod *method)
108 prof_jit_leave (MonoProfiler *prof, MonoMethod *method, int result)
110 MonoImage *image = mono_class_get_image (mono_method_get_class (method));
113 data = g_hash_table_lookup (prof->images, image);
115 data = g_new0 (PerImageData, 1);
116 g_hash_table_insert (prof->images, image, data);
119 data->methods = g_list_append (data->methods, method);
122 /* the entry point */
124 mono_profiler_startup (const char *desc)
128 prof = g_new0 (MonoProfiler, 1);
129 prof->images = g_hash_table_new (NULL, NULL);
131 mono_profiler_install (prof, prof_shutdown);
133 mono_profiler_install_jit_compile (prof_jit_enter, prof_jit_leave);
135 mono_profiler_set_events (MONO_PROFILE_JIT_COMPILATION);