X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fdriver.c;h=627603588facd2ed05bdab735d02a081239256b4;hb=6d6af6193391f7f8e2f8d9e2ae5635f51e6ead34;hp=fbb8396f4c63d8cd4651eacabe781dfa161e365f;hpb=e60cdf235de8f7a3b7c67fbf10037824ace649ed;p=mono.git diff --git a/mono/mini/driver.c b/mono/mini/driver.c index fbb8396f4c6..627603588fa 100644 --- a/mono/mini/driver.c +++ b/mono/mini/driver.c @@ -47,7 +47,7 @@ #include #include #include "mono/utils/mono-counters.h" -#include +#include #include "mini.h" #include "jit.h" @@ -55,12 +55,13 @@ #include #include #include "version.h" +#include "debugger-agent.h" static FILE *mini_stats_fd = NULL; static void mini_usage (void); -#ifdef PLATFORM_WIN32 +#ifdef HOST_WIN32 /* Need this to determine whether to detach console */ #include /* This turns off command line globbing under win32 */ @@ -121,7 +122,6 @@ opt_funcs [sizeof (int) * 8] = { MONO_OPT_INLINE | \ MONO_OPT_CONSPROP | \ MONO_OPT_COPYPROP | \ - MONO_OPT_TREEPROP | \ MONO_OPT_DEADCE | \ MONO_OPT_BRANCH | \ MONO_OPT_LINEARS | \ @@ -215,6 +215,9 @@ parse_debug_options (const char* p) } else if (!strncmp (p, "mdb-optimizations", 17)) { opt->mdb_optimizations = TRUE; p += 17; + } else if (!strncmp (p, "gdb", 3)) { + opt->gdb = TRUE; + p += 3; } else { fprintf (stderr, "Invalid debug option `%s', use --help-debug for details\n", p); return FALSE; @@ -314,7 +317,6 @@ opt_sets [] = { MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_EXCEPTION | MONO_OPT_ABCREM, MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_EXCEPTION | MONO_OPT_ABCREM | MONO_OPT_SSAPRE, MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_ABCREM, - MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_TREEPROP, MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_SSAPRE, MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_ABCREM | MONO_OPT_SHARED, DEFAULT_OPTIMIZATIONS, @@ -341,6 +343,9 @@ mini_regression (MonoImage *image, int verbose, int *total_run) TestMethod func; GTimer *timer = g_timer_new (); MonoDomain *domain = mono_domain_get (); + guint32 exclude = 0; + + mono_arch_cpu_optimizazions (&exclude); if (mini_stats_fd) { fprintf (mini_stats_fd, "$stattitle = \'Mono Benchmark Results (various optimizations)\';\n"); @@ -365,7 +370,9 @@ mini_regression (MonoImage *image, int verbose, int *total_run) /* load the metadata */ for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) { - method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + if (!method) + continue; mono_class_init (method->klass); if (!strncmp (method->name, "test_", 5) && mini_stats_fd) { @@ -381,7 +388,7 @@ mini_regression (MonoImage *image, int verbose, int *total_run) for (opt = 0; opt < G_N_ELEMENTS (opt_sets); ++opt) { double elapsed, comp_time, start_time; - opt_flags = opt_sets [opt]; + opt_flags = opt_sets [opt] & ~exclude; mono_set_defaults (verbose, opt_flags); n = opt_descr (opt_flags); g_print ("Test run: image=%s, opts=%s\n", mono_image_get_filename (image), n); @@ -399,7 +406,9 @@ mini_regression (MonoImage *image, int verbose, int *total_run) if (mini_stats_fd) fprintf (mini_stats_fd, "["); for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) { - method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + if (!method) + continue; if (strncmp (method->name, "test_", 5) == 0) { expected = atoi (method->name + 5); run++; @@ -946,6 +955,17 @@ static void main_thread_handler (gpointer user_data) fprintf (stderr, "Can not open image %s\n", main_args->argv [i]); exit (1); } + /* Check that the assembly loaded matches the filename */ + { + MonoImageOpenStatus status; + MonoImage *img; + + img = mono_image_open (main_args->argv [i], &status); + if (img && strcmp (img->name, assembly->image->name)) { + fprintf (stderr, "Error: Loaded assembly '%s' doesn't match original file name '%s'. Set MONO_PATH to the assembly's location.\n", assembly->image->name, img->name); + exit (1); + } + } res = mono_compile_assembly (assembly, main_args->opts, main_args->aot_options); if (res != 0) { fprintf (stderr, "AOT of image %s failed.\n", main_args->argv [i]); @@ -1086,6 +1106,7 @@ mini_usage (void) "Development:\n" " --aot Compiles the assembly to native code\n" " --debug[=] Enable debugging support, use --help-debug for details\n" + " --debugger-agent=options Enable the debugger agent\n" " --profile[=profiler] Runs in profiling mode with the specified profiler module\n" " --trace[=EXPR] Enable tracing, use --help-trace for details\n" " --help-devel Shows more options available to developers\n" @@ -1102,6 +1123,7 @@ mini_usage (void) " mode is one of cas, core-clr, verifiable or validil\n" " --attach=OPTIONS Pass OPTIONS to the attach agent in the runtime.\n" " Currently the only supported option is 'disable'.\n" + " --llvm Controls whenever the runtime uses LLVM compiled code.\n" ); } @@ -1120,7 +1142,7 @@ mini_trace_usage (void) " M:Type:Method Specifies a method\n" " N:Namespace Specifies a namespace\n" " T:Type Specifies a type\n" - " +EXPR Includes expression\n" + " EXPR Includes expression\n" " -EXPR Excludes expression\n" " EXPR,EXPR Multiple expressions\n" " disabled Don't print any output until toggled via SIGUSR2\n"); @@ -1175,7 +1197,7 @@ static const char info[] = #define error_if_aot_unsupported() #endif -#ifdef PLATFORM_WIN32 +#ifdef HOST_WIN32 BOOL APIENTRY DllMain (HMODULE module_handle, DWORD reason, LPVOID reserved) { if (!GC_DllMain (module_handle, reason, reserved)) @@ -1195,6 +1217,41 @@ BOOL APIENTRY DllMain (HMODULE module_handle, DWORD reason, LPVOID reserved) } #endif +static gboolean enable_debugging; + +/* + * mono_jit_parse_options: + * + * Process the command line options in ARGV as done by the runtime executable. + * This should be called before mono_jit_init (). + */ +void +mono_jit_parse_options (int argc, char * argv[]) +{ + int i; + + /* + * Some options have no effect here, since they influence the behavior of + * mono_main (). + */ + + /* FIXME: Avoid code duplication */ + for (i = 0; i < argc; ++i) { + if (argv [i] [0] != '-') + break; + if (strncmp (argv [i], "--debugger-agent=", 17) == 0) { + MonoDebugOptions *opt = mini_get_debug_options (); + + mono_debugger_agent_parse_options (argv [i] + 17); + opt->mdb_optimizations = TRUE; + enable_debugging = TRUE; + } else { + fprintf (stderr, "Unsupported command line option: '%s'\n", argv [i]); + exit (1); + } + } +} + int mono_main (int argc, char* argv[]) { @@ -1208,7 +1265,6 @@ mono_main (int argc, char* argv[]) const char* aname, *mname = NULL; char *config_file = NULL; int i, count = 1; - int enable_debugging = FALSE; guint32 opt, action = DO_EXEC; MonoGraphOptions mono_graph_options = 0; int mini_verbose = 0; @@ -1264,7 +1320,7 @@ mono_main (int argc, char* argv[]) mini_verbose++; } else if (strcmp (argv [i], "--version") == 0 || strcmp (argv [i], "-V") == 0) { char *build = mono_get_runtime_build_info (); - g_print ("Mono JIT compiler version %s (%s)\nCopyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com\n", VERSION, build); + g_print ("Mono JIT compiler version %s (%s)\nCopyright (C) 2002-2009 Novell, Inc and Contributors. www.mono-project.com\n", VERSION, build); g_free (build); g_print (info); if (mini_verbose) { @@ -1422,6 +1478,12 @@ mono_main (int argc, char* argv[]) enable_debugging = TRUE; if (!parse_debug_options (argv [i] + 8)) return 1; + } else if (strncmp (argv [i], "--debugger-agent=", 17) == 0) { + MonoDebugOptions *opt = mini_get_debug_options (); + + mono_debugger_agent_parse_options (argv [i] + 17); + opt->mdb_optimizations = TRUE; + enable_debugging = TRUE; } else if (strcmp (argv [i], "--security") == 0) { mono_verifier_set_mode (MONO_VERIFIER_MODE_VERIFIABLE); mono_security_set_mode (MONO_SECURITY_MODE_CAS); @@ -1473,6 +1535,13 @@ mono_main (int argc, char* argv[]) #ifdef MONO_JIT_INFO_TABLE_TEST } else if (strcmp (argv [i], "--test-jit-info-table") == 0) { test_jit_info_table = TRUE; +#endif + } else if (strcmp (argv [i], "--llvm") == 0) { +#ifndef MONO_ARCH_LLVM_SUPPORTED + fprintf (stderr, "--llvm not supported on this platform.\n"); + return 1; +#else + mono_use_llvm = TRUE; #endif } else { fprintf (stderr, "Unknown command line option: '%s'\n", argv [i]); @@ -1488,6 +1557,17 @@ mono_main (int argc, char* argv[]) if (getenv ("MONO_XDEBUG")) enable_debugging = TRUE; +#ifdef MONO_CROSS_COMPILE + if (!mono_compile_aot) { + fprintf (stderr, "This mono runtime is compiled for cross-compiling. Only the --aot option is supported.\n"); + exit (1); + } +#if SIZEOF_VOID_P == 8 && defined(TARGET_ARM) + fprintf (stderr, "Can't cross-compile on 64 bit platforms to arm.\n"); + exit (1); +#endif +#endif + if ((action == DO_EXEC) && mono_debug_using_mono_debugger ()) action = DO_DEBUGGER; @@ -1495,11 +1575,8 @@ mono_main (int argc, char* argv[]) g_set_prgname (argv[i]); } - if (enable_profile) { - /* Needed because of TLS accesses in mono_profiler_load () */ - mono_gc_base_init (); + if (enable_profile) mono_profiler_load (profile_options); - } mono_attach_parse_options (attach_options); @@ -1525,7 +1602,6 @@ mono_main (int argc, char* argv[]) #ifdef MONO_DEBUGGER_SUPPORTED mono_debug_init (MONO_DEBUG_FORMAT_DEBUGGER); - mono_debugger_init (); #else g_print ("The Mono Debugger is not supported on this platform.\n"); return 1; @@ -1533,6 +1609,13 @@ mono_main (int argc, char* argv[]) } else if (enable_debugging) mono_debug_init (MONO_DEBUG_FORMAT_MONO); +#ifdef MONO_DEBUGGER_SUPPORTED + if (enable_debugging) { + if ((opt & MONO_OPT_GSHARED) == 0) + mini_debugger_set_attach_ok (); + } +#endif + mono_set_defaults (mini_verbose, opt); mono_setup_vtable_in_class_init = FALSE; domain = mini_init (argv [i], forced_version); @@ -1629,7 +1712,7 @@ mono_main (int argc, char* argv[]) exit (1); } -#ifdef PLATFORM_WIN32 +#ifdef HOST_WIN32 /* Detach console when executing IMAGE_SUBSYSTEM_WINDOWS_GUI on win32 */ if (!enable_debugging && !mono_compile_aot && ((MonoCLIImageInfo*)(mono_assembly_get_image (assembly)->image_info))->cli_header.nt.pe_subsys_required == IMAGE_SUBSYSTEM_WINDOWS_GUI) FreeConsole (); @@ -1689,7 +1772,7 @@ mono_main (int argc, char* argv[]) exit (1); } - mono_debugger_main (domain, assembly, argc - i, argv + i); + mini_debugger_main (domain, assembly, argc - i, argv + i); mini_cleanup (domain); return 0; #else @@ -1842,6 +1925,12 @@ mono_jit_cleanup (MonoDomain *domain) mini_cleanup (domain); } +void +mono_jit_set_aot_only (gboolean val) +{ + mono_aot_only = val; +} + /** * mono_jit_set_trace_options: * @options: string representing the trace options