2005-07-21 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mono / mini / driver.c
index 34b7d4ea398d51a6b535ec443e77377f15db82f3..08dbd2f6c61338870b55a21e00db35f7e5b3abec 100644 (file)
@@ -51,6 +51,11 @@ static FILE *mini_stats_fd = NULL;
 
 static void mini_usage (void);
 
+/* This turns off command line globbing under win32 */
+#ifdef PLATFORM_WIN32
+int _CRT_glob = 0;
+#endif
+
 typedef void (*OptFunc) (const char *p);
 
 /* keep in sync with enum in mini.h */
@@ -305,6 +310,8 @@ mini_regression (MonoImage *image, int verbose, int *total_run) {
                /* fixme: ugly hack - delete all previously compiled methods */
                g_hash_table_destroy (mono_domain_get ()->jit_trampoline_hash);
                mono_domain_get ()->jit_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
+               g_hash_table_destroy (mono_domain_get ()->jit_code_hash);
+               mono_domain_get ()->jit_code_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
 
                g_timer_start (timer);
                if (mini_stats_fd)
@@ -330,8 +337,7 @@ mini_regression (MonoImage *image, int verbose, int *total_run) {
                                        result = func ();
                                        if (result != expected) {
                                                failed++;
-                                               if (verbose)
-                                                       g_print ("Test '%s' failed result (got %d, expected %d).\n", method->name, result, expected);
+                                               g_print ("Test '%s' failed result (got %d, expected %d).\n", method->name, result, expected);
                                        }
                                        code_size += cfg->code_len;
                                        mono_destroy_compile (cfg);
@@ -596,7 +602,8 @@ mini_trace_usage (void)
                 "    N:Namespace          Specifies a namespace\n"
                 "    T:Type               Specifies a type\n"
                 "    +EXPR                Includes expression\n"
-                "    -EXPR                Excludes expression\n");
+                "    -EXPR                Excludes expression\n"
+                "    disabled             Don't print any output until toggled via SIGUSR2\n");
 }
 
 static const char *info = ""
@@ -624,9 +631,9 @@ static const char *info = ""
     "\tSIGSEGV      : normal\n"
 #endif
 #ifdef HAVE_ICU
-       "\tGlobalization: ICU\n"
+       "\tGlobalization: ICU (unsupported, don't use)\n"
 #else
-       "\tGlobalization: none\n"
+       "\tGlobalization: normal\n"
 #endif /* HAVE_ICU */
        "";
 
@@ -682,11 +689,11 @@ mono_main (int argc, char* argv[])
                } else if (strcmp (argv [i], "--verbose") == 0 || strcmp (argv [i], "-v") == 0) {
                        mini_verbose++;
                } else if (strcmp (argv [i], "--version") == 0 || strcmp (argv [i], "-V") == 0) {
-                       g_print ("Mono JIT compiler version %s, (C) 2002-2004 Novell, Inc and Contributors. www.go-mono.com\n", VERSION);
+                       g_print ("Mono JIT compiler version %s, (C) 2002-2005 Novell, Inc and Contributors. www.mono-project.com\n", VERSION);
                        g_print (info);
                        if (mini_verbose) {
-                               const guchar *cerror;
-                               const guchar *clibpath;
+                               const char *cerror;
+                               const char *clibpath;
                                mono_init ("mono");
                                cerror = mono_check_corlib_version ();
                                clibpath = mono_defaults.corlib? mono_image_get_filename (mono_defaults.corlib): "unknown";
@@ -711,14 +718,26 @@ mono_main (int argc, char* argv[])
                        mini_usage_list_opt ();
                        return 0;
                } else if (strncmp (argv [i], "--statfile", 10) == 0) {
+                       if (i + 1 >= argc){
+                               fprintf (stderr, "error: --statfile requires a filename argument\n");
+                               return 1;
+                       }
                        mini_stats_fd = fopen (argv [++i], "w+");
                } else if (strncmp (argv [i], "--optimize=", 11) == 0) {
                        opt = parse_optimizations (argv [i] + 11);
                } else if (strncmp (argv [i], "-O=", 3) == 0) {
                        opt = parse_optimizations (argv [i] + 3);
                } else if (strcmp (argv [i], "--config") == 0) {
+                       if (i +1 >= argc){
+                               fprintf (stderr, "error: --config requires a filename argument\n");
+                               return 1;
+                       }
                        config_file = argv [++i];
                } else if (strcmp (argv [i], "--ncompile") == 0) {
+                       if (i + 1 >= argc){
+                               fprintf (stderr, "error: --ncompile requires an argument\n");
+                               return 1;
+                       }
                        count = atoi (argv [++i]);
                        action = DO_BENCH;
                } else if (strcmp (argv [i], "--trace") == 0) {
@@ -728,8 +747,13 @@ mono_main (int argc, char* argv[])
                } else if (strcmp (argv [i], "--breakonex") == 0) {
                        mono_break_on_exc = TRUE;
                } else if (strcmp (argv [i], "--break") == 0) {
+                       if (i+1 >= argc){
+                               fprintf (stderr, "Missing method name in --break command line option\n");
+                               return 1;
+                       }
+                       
                        if (!mono_debugger_insert_breakpoint (argv [++i], FALSE))
-                               g_error ("Invalid method name '%s'", argv [i]);
+                               fprintf (stderr, "Error: invalid method name '%s'\n", argv [i]);
                } else if (strcmp (argv [i], "--print-vtable") == 0) {
                        mono_print_vtable = TRUE;
                } else if (strcmp (argv [i], "--stats") == 0) {
@@ -751,13 +775,28 @@ mono_main (int argc, char* argv[])
                        enable_profile = TRUE;
                        profile_options = argv [i] + 10;
                } else if (strcmp (argv [i], "--compile") == 0) {
+                       if (i + 1 >= argc){
+                               fprintf (stderr, "error: --compile option requires a method name argument\n");
+                               return 1;
+                       }
+                       
                        mname = argv [++i];
                        action = DO_BENCH;
                } else if (strncmp (argv [i], "--graph=", 8) == 0) {
+                       if (i + 1 >= argc){
+                               fprintf (stderr, "error: --graph option requires a method name argument\n");
+                               return 1;
+                       }
+                       
                        mono_graph_options = mono_parse_graph_options (argv [i] + 8);
                        mname = argv [++i];
                        action = DO_DRAW;
                } else if (strcmp (argv [i], "--graph") == 0) {
+                       if (i + 1 >= argc){
+                               fprintf (stderr, "error: --graph option requires a method name argument\n");
+                               return 1;
+                       }
+                       
                        mname = argv [++i];
                        mono_graph_options = MONO_GRAPH_CFG;
                        action = DO_DRAW;
@@ -867,7 +906,7 @@ mono_main (int argc, char* argv[])
                mono_debug_init_2 (assembly);
 
        if (mono_compile_aot || action == DO_EXEC) {
-               const guchar *error;
+               const char *error;
 
                //mono_set_rootdir ();
 
@@ -878,6 +917,12 @@ mono_main (int argc, char* argv[])
                        exit (1);
                }
 
+#ifdef PLATFORM_WIN32
+               /* Detach console when executing IMAGE_SUBSYSTEM_WINDOWS_GUI on win32 */
+               if (!mono_compile_aot && ((MonoCLIImageInfo*)(mono_assembly_get_image (assembly)->image_info))->cli_header.nt.pe_subsys_required == IMAGE_SUBSYSTEM_WINDOWS_GUI)
+                       FreeConsole ();
+#endif
+
                main_args.domain = domain;
                main_args.file = aname;         
                main_args.argc = argc - i;