[aot] Add a 'log-instances=filename' aot option to dump a list of method instances...
authorZoltan Varga <vargaz@gmail.com>
Thu, 27 Mar 2014 20:02:07 +0000 (16:02 -0400)
committerZoltan Varga <vargaz@gmail.com>
Thu, 27 Mar 2014 20:02:07 +0000 (16:02 -0400)
mono/mini/aot-compiler.c

index e137319665b671f8efda94990e2720608b2fa91c..54b0ae735bb91d15f6d925f8273242c55a6e9961 100644 (file)
@@ -128,6 +128,7 @@ typedef struct MonoAotOptions {
        gboolean dwarf_debug;
        gboolean soft_debug;
        gboolean log_generics;
+       gboolean log_instances;
        gboolean direct_pinvoke;
        gboolean direct_icalls;
        gboolean no_direct_calls;
@@ -146,6 +147,7 @@ typedef struct MonoAotOptions {
        gboolean autoreg;
        char *mtriple;
        char *llvm_path;
+       char *instances_logfile_path;
 } MonoAotOptions;
 
 typedef struct MonoAotStats {
@@ -240,6 +242,7 @@ typedef struct MonoAotCompile {
        int objc_selector_index, objc_selector_index_2;
        GPtrArray *objc_selectors;
        GHashTable *objc_selector_to_index;
+       FILE *instances_logfile;
 } MonoAotCompile;
 
 typedef struct {
@@ -6284,6 +6287,11 @@ mono_aot_parse_options (const char *aot_options, MonoAotOptions *opts)
                        opts->no_instances = TRUE;
                } else if (str_begins_with (arg, "log-generics")) {
                        opts->log_generics = TRUE;
+               } else if (str_begins_with (arg, "log-instances=")) {
+                       opts->log_instances = TRUE;
+                       opts->instances_logfile_path = g_strdup (arg + strlen ("log-instances="));
+               } else if (str_begins_with (arg, "log-instances")) {
+                       opts->log_instances = TRUE;
                } else if (str_begins_with (arg, "mtriple=")) {
                        opts->mtriple = g_strdup (arg + strlen ("mtriple="));
                } else if (str_begins_with (arg, "llvm-path=")) {
@@ -6605,6 +6613,13 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method)
                return;
        }
 
+       if (method->is_inflated && acfg->aot_opts.log_instances) {
+               if (acfg->instances_logfile)
+                       fprintf (acfg->instances_logfile, "%s ### %d\n", mono_method_full_name (method, TRUE), cfg->code_size);
+               else
+                       printf ("%s ### %d\n", mono_method_full_name (method, TRUE), cfg->code_size);
+       }
+
        /* Adds generic instances referenced by this method */
        /* 
         * The depth is used to avoid infinite loops when generic virtual recursion is 
@@ -8757,6 +8772,14 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options)
        if (acfg->aot_opts.full_aot)
                acfg->flags |= MONO_AOT_FILE_FLAG_FULL_AOT;
 
+       if (acfg->aot_opts.instances_logfile_path) {
+               acfg->instances_logfile = fopen (acfg->aot_opts.instances_logfile_path, "w");
+               if (!acfg->instances_logfile) {
+                       fprintf (stderr, "Unable to create logfile: '%s'.\n", acfg->aot_opts.instances_logfile_path);
+                       exit (1);
+               }
+       }
+
        load_profile_files (acfg);
 
        acfg->num_trampolines [MONO_AOT_TRAMP_SPECIFIC] = acfg->aot_opts.full_aot ? acfg->aot_opts.ntrampolines : 0;