#include "jit.h"
#include "regset.h"
#include "codegen.h"
-#include "debug.h"
#include "mono/metadata/debug-helpers.h"
#include "mono/metadata/verify.h"
#include "mono/metadata/profiler.h"
#include "mono/metadata/threadpool.h"
#include "mono/metadata/mono-config.h"
#include <mono/metadata/profiler-private.h>
+#include <mono/metadata/environment.h>
+#include <mono/metadata/mono-debug.h>
+#include <mono/metadata/mono-debug-debugger.h>
#include <mono/os/util.h>
#include <locale.h>
" namespace.name:method compile the given method\n"
" @imagename compile the given image\n"
" --ncompile NUM compile methods NUM times (default: 1000)\n"
+ " --noboundcheck Disables bound checks\n"
"\n"
"Development:\n"
- " --debug[=FORMAT] write a debugging file. FORMAT is one of:\n"
- " stabs to write stabs information\n"
- " dwarf to write dwarf2 information\n"
- " dwarf-plus to write extended dwarf2 information\n"
- " --debug-args ARGS comma-separated list of additional arguments for the\n"
- " symbol writer. See the manpage for details.\n"
+ " --debug enable debugging support.\n"
" --profile record and dump profile info\n"
" --breakonex set a breakpoint for unhandled exception\n"
" --break NAME insert a breakpoint at the start of method NAME\n"
exit (1);
}
+typedef struct
+{
+ MonoDomain *domain;
+ char *file;
+ gboolean testjit;
+ gboolean enable_debugging;
+ char *compile_class;
+ int compile_times;
+ GList *precompile_classes;
+ int verbose;
+ int break_on_main;
+ int argc;
+ char **argv;
+} MainThreadArgs;
+
+static void main_thread_handler (gpointer user_data)
+{
+ MainThreadArgs *main_args=(MainThreadArgs *)user_data;
+ MonoAssembly *assembly;
+
+ if (main_args->enable_debugging)
+ mono_debug_init (MONO_DEBUG_FORMAT_MONO);
+
+ assembly = mono_domain_assembly_open (main_args->domain,
+ main_args->file);
+ if (!assembly){
+ fprintf (stderr, "Can not open image %s\n", main_args->file);
+ exit (1);
+ }
+
+ if (main_args->enable_debugging)
+ mono_debug_init_2 (assembly);
+
+ if (main_args->testjit) {
+ mono_jit_compile_image (assembly->image, TRUE);
+ } else if (main_args->compile_class) {
+ mono_jit_compile_class (assembly, main_args->compile_class, main_args->compile_times, TRUE);
+ } else {
+ GList *tmp;
+
+ for (tmp = main_args->precompile_classes; tmp; tmp = tmp->next)
+ mono_jit_compile_class (assembly, tmp->data, 1,
+ main_args->verbose);
+
+ if (main_args->break_on_main) {
+ MonoImage *image = assembly->image;
+ MonoMethodDesc *desc;
+ MonoMethod *method;
+
+ method = mono_get_method (image, mono_image_get_entry_point (image), NULL);
+ desc = mono_method_desc_from_method (method);
+ mono_debugger_insert_breakpoint_full (desc);
+ }
+
+ mono_jit_exec (main_args->domain, assembly, main_args->argc,
+ main_args->argv);
+ }
+}
+
int
main (int argc, char *argv [])
{
MonoDomain *domain;
- MonoAssembly *assembly;
int retval = 0, i;
int compile_times = 1000;
char *compile_class = NULL;
- char *debug_args = NULL;
+ gboolean enable_debugging = FALSE;
char *file, *error, *config_file = NULL;
gboolean testjit = FALSE;
int verbose = FALSE;
GList *precompile_classes = NULL;
int break_on_main = FALSE;
- MonoDebugHandle *debug = NULL;
-
+ MainThreadArgs main_args;
setlocale(LC_ALL, "");
g_log_set_always_fatal (G_LOG_LEVEL_ERROR);
mono_jit_inline_code = FALSE;
else if (strcmp (argv [i], "--nointrinsic") == 0)
mono_inline_memcpy = FALSE;
+ else if (strcmp (argv [i], "--noboundcheck") == 0)
+ mono_jit_boundcheck = FALSE;
else if (strcmp (argv [i], "--nols") == 0)
mono_use_linear_scan = FALSE;
else if (strcmp (argv [i], "--breakonex") == 0)
break_on_main = TRUE;
i++;
} else {
- if (!mono_insert_breakpoint (argv [++i], FALSE))
+ if (!mono_debugger_insert_breakpoint (argv [++i], FALSE))
g_error ("Invalid method name '%s'", argv [i]);
}
} else if (strcmp (argv [i], "--count") == 0) {
} else if (strcmp (argv [i], "--stats") == 0) {
memset (&mono_jit_stats, 0, sizeof (MonoJitStats));
mono_jit_stats.enabled = TRUE;
- } else if (strncmp (argv [i], "--debug=", 8) == 0) {
- const char *format = &argv [i][8];
-
- if (mono_debug_format != MONO_DEBUG_FORMAT_NONE)
- g_error ("You can only use one debugging format.");
- if (strcmp (format, "stabs") == 0)
- mono_debug_format = MONO_DEBUG_FORMAT_STABS;
- else if (strcmp (format, "dwarf") == 0)
- mono_debug_format = MONO_DEBUG_FORMAT_DWARF2;
- else if (strcmp (format, "mono") == 0)
- mono_debug_format = MONO_DEBUG_FORMAT_MONO;
- else
- g_error ("Unknown debugging format: %s", argv [i] + 8);
} else if (strcmp (argv [i], "--debug") == 0) {
- if (mono_debug_format != MONO_DEBUG_FORMAT_NONE)
- g_error ("You can only use one debugging format.");
- mono_debug_format = MONO_DEBUG_FORMAT_MONO;
- } else if (strcmp (argv [i], "--debug-args") == 0) {
- if (debug_args)
- g_error ("You can use --debug-args only once.");
- debug_args = argv [++i];
+ enable_debugging = TRUE;
} else if (strcmp (argv [i], "--precompile") == 0) {
precompile_classes = g_list_append (precompile_classes, argv [++i]);
} else if (strcmp (argv [i], "--verbose") == 0) {
if (!file)
usage (argv [0]);
+ g_set_prgname (file);
mono_config_parse (config_file);
mono_set_rootdir ();
- if (mono_debug_format != MONO_DEBUG_FORMAT_NONE) {
- gchar **args;
-
- args = g_strsplit (debug_args ? debug_args : "", ",", -1);
- debug = mono_debug_open (file, mono_debug_format, (const char **) args);
- g_strfreev (args);
- }
-
domain = mono_jit_init (file);
error = mono_verify_corlib ();
fprintf (stderr, "Corlib not in sync with this runtime: %s\n", error);
exit (1);
}
-
- assembly = mono_domain_assembly_open (domain, file);
- if (!assembly){
- fprintf (stderr, "Can not open image %s\n", file);
- exit (1);
- }
-
- if (debug)
- mono_debug_add_image (debug, assembly->image);
-
- if (testjit) {
- mono_jit_compile_image (assembly->image, TRUE);
- } else if (compile_class) {
- mono_jit_compile_class (assembly, compile_class, compile_times, TRUE);
- } else {
- GList *tmp;
-
- for (tmp = precompile_classes; tmp; tmp = tmp->next)
- mono_jit_compile_class (assembly, tmp->data, 1, verbose);
-
- if (break_on_main) {
- MonoImage *image = assembly->image;
- MonoMethodDesc *desc;
- MonoMethod *method;
-
- method = mono_get_method (image, mono_image_get_entry_point (image), NULL);
- desc = mono_method_desc_from_method (method);
- mono_insert_breakpoint_full (desc, FALSE);
- }
-
- retval = mono_jit_exec (domain, assembly, argc - i, argv + i);
- }
+
+ main_args.domain=domain;
+ main_args.file=file;
+ main_args.testjit=testjit;
+ main_args.enable_debugging=enable_debugging;
+ main_args.compile_class=compile_class;
+ main_args.compile_times=compile_times;
+ main_args.precompile_classes=precompile_classes;
+ main_args.verbose=verbose;
+ main_args.break_on_main=break_on_main;
+ main_args.argc=argc-i;
+ main_args.argv=argv+i;
+
+ mono_runtime_exec_managed_code (domain, main_thread_handler,
+ &main_args);
mono_profiler_shutdown ();
mono_jit_cleanup (domain);
+ /* Look up return value from System.Environment.ExitCode */
+ retval=mono_environment_exitcode_get ();
+
return retval;
}