mono_aot_lock ();
- mono_jit_stats.methods_aot++;
+ InterlockedIncrement (&mono_jit_stats.methods_aot);
amodule->methods_loaded [method_index / 32] |= 1 << (method_index % 32);
MonoBoolean
mono_method_has_declsec (MonoMethod *method)
{
- mono_jit_stats.cas_declsec_check++;
+ InterlockedIncrement (&mono_jit_stats.cas_declsec_check);
if (method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE || method->wrapper_type == MONO_WRAPPER_MANAGED_TO_MANAGED) {
method = mono_marshal_method_from_wrapper (method);
{
MonoDeclSecurityActions linkclass, linkmethod;
- mono_jit_stats.cas_linkdemand++;
+ InterlockedIncrement (&mono_jit_stats.cas_linkdemand);
if (mono_declsec_get_linkdemands (callee, &linkclass, &linkmethod)) {
MonoAssembly *assembly = mono_image_get_assembly (caller->klass->image);
MonoAssembly *assembly;
guint32 size = 0;
- mono_jit_stats.cas_linkdemand_aptc++;
+ InterlockedIncrement (&mono_jit_stats.cas_linkdemand_aptc);
/* A - Applicable only if we're calling into *another* assembly */
if (caller->klass->image == callee->klass->image)
{
MonoAssembly *assembly = mono_image_get_assembly (caller->klass->image);
- mono_jit_stats.cas_linkdemand_pinvoke++;
+ InterlockedIncrement (&mono_jit_stats.cas_linkdemand_pinvoke);
/* Check for P/Invoke flag for the assembly */
if (!MONO_SECMAN_FLAG_INIT (assembly->unmanaged)) {
{
MonoAssembly *assembly;
- mono_jit_stats.cas_linkdemand_icall++;
+ InterlockedIncrement (&mono_jit_stats.cas_linkdemand_icall);
/* check if the _icall_ is defined inside an ECMA signed assembly */
assembly = mono_image_get_assembly (icall->klass->image);
}
}
- mono_jit_stats.regvars += n_regvars;
+ cfg->stat_n_regvars = n_regvars;
/* Compute used regs */
used_regs = 0;
}
}
- mono_jit_stats.regvars += n_regvars;
+ cfg->stat_n_regvars = n_regvars;
/* Compute used regs */
used_regs = 0;
printf ("INLINE START %p %s -> %s\n", cmethod, mono_method_full_name (cfg->method, TRUE), mono_method_full_name (cmethod, TRUE));
if (!cmethod->inline_info) {
- mono_jit_stats.inlineable_methods++;
+ cfg->stat_inlineable_methods++;
cmethod->inline_info = 1;
}
if (cfg->verbose_level > 2)
printf ("INLINE END %s -> %s\n", mono_method_full_name (cfg->method, TRUE), mono_method_full_name (cmethod, TRUE));
- mono_jit_stats.inlined_methods++;
+ cfg->stat_inlined_methods++;
/* always add some code to avoid block split failures */
MONO_INST_NEW (cfg, ins, OP_NOP);
ip = (unsigned char*)header->code;
cfg->cil_start = ip;
end = ip + header->code_size;
- mono_jit_stats.cil_code_size += header->code_size;
+ cfg->stat_cil_code_size += header->code_size;
init_locals = header->init_locals;
seq_points = cfg->gen_seq_points && cfg->method == method;
if (security && (cfg->method == method)) {
MonoInst *args [2];
- mono_jit_stats.cas_demand_generation++;
+ cfg->stat_cas_demand_generation++;
if (actions.demand.blob) {
/* Add code for SecurityAction.Demand */
{
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = (unsigned int *)(cfg->native_code + cfg->code_len);
{
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = (unsigned int *)((char *)cfg->native_code + cfg->code_len);
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
code = (unsigned int *)(cfg->native_code + offset);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
mono_debug_record_line_number (cfg, ins, offset);
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code(cfg);
code = cfg->native_code + offset;
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
if (cfg->debug_info)
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code (cfg);
code = cfg->native_code + offset;
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
while (remaining_size >= 0x1000) {
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code (cfg);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while (cfg->code_len + code_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code (cfg);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
/*
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
code = (guint32*)(cfg->native_code + offset);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code_start = (guint8*)code;
// if (ins->cil_code)
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = (guint32*)(cfg->native_code + cfg->code_len);
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
code_start = cfg->native_code + offset;
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
ia64_codegen_init (code, code_start);
}
while (cfg->code_len + max_epilog_size > cfg->code_size) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
/* FIXME: Emit unwind info */
while (cfg->code_len + code_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
ia64_codegen_init (code, cfg->native_code + cfg->code_len);
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
/*
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
/*
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while ((cfg->code_len + max_epilog_size) > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while ((cfg->code_len + code_size) > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while ((cfg->code_len + max_epilog_size) > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while ((cfg->code_len + code_size) > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = (guint32*)(cfg->native_code + cfg->code_len);
while (cfg->code_len + code_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = (guint32*)(cfg->native_code + cfg->code_len);
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code(cfg);
code = cfg->native_code + offset;
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
if (cfg->debug_info)
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code(cfg);
code = cfg->native_code + offset;
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
while (remaining_size >= 0x1000) {
x86_alu_reg_imm (code, X86_SUB, X86_ESP, 0x1000);
while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code(cfg);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
while (cfg->code_len + code_size > (cfg->code_size - 16)) {
cfg->code_size *= 2;
cfg->native_code = mono_realloc_native_code(cfg);
- mono_jit_stats.code_reallocs++;
+ cfg->stat_code_reallocs++;
}
code = cfg->native_code + cfg->code_len;
memset (&cfg->vars [orig_count], 0, (cfg->varinfo_count - orig_count) * sizeof (MonoMethodVar));
}
- mono_jit_stats.allocate_var++;
+ cfg->stat_allocate_var++;
MONO_INST_NEW (cfg, inst, opcode);
inst->inst_c0 = num;
g_list_free (vtype_stack_slots [i].active);
}
- mono_jit_stats.locals_stack_size += offset;
+ cfg->stat_locals_stack_size += offset;
*stack_size = offset;
return offsets;
g_list_free (vtype_stack_slots [i].active);
}
- mono_jit_stats.locals_stack_size += offset;
+ cfg->stat_locals_stack_size += offset;
*stack_size = offset;
return offsets;
gboolean try_generic_shared, try_llvm = FALSE;
MonoMethod *method_to_compile, *method_to_register;
- mono_jit_stats.methods_compiled++;
+ InterlockedIncrement (&mono_jit_stats.methods_compiled);
if (mono_profiler_get_events () & MONO_PROFILE_JIT_COMPILATION)
mono_profiler_method_jit (method);
if (MONO_PROBE_METHOD_COMPILE_BEGIN_ENABLED ())
return cfg;
}
- mono_jit_stats.basic_blocks += cfg->num_bblocks;
- mono_jit_stats.max_basic_blocks = MAX (cfg->num_bblocks, mono_jit_stats.max_basic_blocks);
+ cfg->stat_basic_blocks += cfg->num_bblocks;
if (COMPILE_LLVM (cfg)) {
MonoInst *ins;
prof_options = cfg->prof_options;
+ /*
+ * Update global stats while holding a lock, instead of doing many
+ * InterlockedIncrement operations during JITting.
+ */
+ mono_jit_stats.allocate_var += cfg->stat_allocate_var;
+ mono_jit_stats.locals_stack_size += cfg->stat_locals_stack_size;
+ mono_jit_stats.basic_blocks += cfg->stat_basic_blocks;
+ mono_jit_stats.max_basic_blocks = MAX (cfg->stat_basic_blocks, mono_jit_stats.max_basic_blocks);
+ mono_jit_stats.cil_code_size += cfg->stat_cil_code_size;
+ mono_jit_stats.regvars += cfg->stat_n_regvars;
+ mono_jit_stats.inlineable_methods += cfg->stat_inlineable_methods;
+ mono_jit_stats.inlined_methods += cfg->stat_inlined_methods;
+ mono_jit_stats.cas_demand_generation += cfg->stat_cas_demand_generation;
+ mono_jit_stats.code_reallocs += cfg->stat_code_reallocs;
+
mono_destroy_compile (cfg);
#ifndef DISABLE_JIT
{
mono_counters_register ("Compiled methods", MONO_COUNTER_JIT | MONO_COUNTER_WORD, &mono_jit_stats.methods_compiled);
mono_counters_register ("Methods from AOT", MONO_COUNTER_JIT | MONO_COUNTER_WORD, &mono_jit_stats.methods_aot);
- mono_counters_register ("Methods JITted using LLVM", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.methods_with_llvm);
mono_counters_register ("Methods JITted using mono JIT", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.methods_without_llvm);
+ mono_counters_register ("Methods JITted using LLVM", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.methods_with_llvm);
mono_counters_register ("Total time spent JITting (sec)", MONO_COUNTER_JIT | MONO_COUNTER_DOUBLE, &mono_jit_stats.jit_time);
+ mono_counters_register ("Basic blocks", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.basic_blocks);
+ mono_counters_register ("Max basic blocks", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.max_basic_blocks);
+ mono_counters_register ("Allocated vars", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.allocate_var);
+ mono_counters_register ("Code reallocs", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.code_reallocs);
+ mono_counters_register ("Allocated code size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.allocated_code_size);
+ mono_counters_register ("Inlineable methods", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.inlineable_methods);
+ mono_counters_register ("Inlined methods", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.inlined_methods);
+ mono_counters_register ("Regvars", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.regvars);
+ mono_counters_register ("Locals stack size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.locals_stack_size);
+ mono_counters_register ("Method cache lookups", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.methods_lookups);
+ mono_counters_register ("Compiled CIL code size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.cil_code_size);
+ mono_counters_register ("Native code size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.native_code_size);
}
static void runtime_invoke_info_free (gpointer value);
{
if (mono_jit_stats.enabled) {
g_print ("Mono Jit statistics\n");
- g_print ("Methods cache lookup: %ld\n", mono_jit_stats.methods_lookups);
- g_print ("Basic blocks: %ld\n", mono_jit_stats.basic_blocks);
- g_print ("Max basic blocks: %ld\n", mono_jit_stats.max_basic_blocks);
- g_print ("Allocated vars: %ld\n", mono_jit_stats.allocate_var);
- g_print ("Compiled CIL code size: %ld\n", mono_jit_stats.cil_code_size);
- g_print ("Native code size: %ld\n", mono_jit_stats.native_code_size);
g_print ("Max code size ratio: %.2f (%s)\n", mono_jit_stats.max_code_size_ratio/100.0,
mono_jit_stats.max_ratio_method);
g_print ("Biggest method: %ld (%s)\n", mono_jit_stats.biggest_method_size,
mono_jit_stats.biggest_method);
- g_print ("Code reallocs: %ld\n", mono_jit_stats.code_reallocs);
- g_print ("Allocated code size: %ld\n", mono_jit_stats.allocated_code_size);
- g_print ("Inlineable methods: %ld\n", mono_jit_stats.inlineable_methods);
- g_print ("Inlined methods: %ld\n", mono_jit_stats.inlined_methods);
- g_print ("Regvars: %ld\n", mono_jit_stats.regvars);
- g_print ("Locals stack size: %ld\n", mono_jit_stats.locals_stack_size);
g_print ("\nCreated object count: %ld\n", mono_stats.new_object_count);
g_print ("Delegates created: %ld\n", mono_stats.delegate_creations);
*/
guint8 *gc_map;
guint32 gc_map_size;
+
+ /* Stats */
+ int stat_allocate_var;
+ int stat_locals_stack_size;
+ int stat_basic_blocks;
+ int stat_cil_code_size;
+ int stat_n_regvars;
+ int stat_inlineable_methods;
+ int stat_inlined_methods;
+ int stat_cas_demand_generation;
+ int stat_code_reallocs;
} MonoCompile;
typedef enum {
} MonoCompileFlags;
typedef struct {
- gulong methods_compiled;
- gulong methods_aot;
- gulong methods_lookups;
- gulong allocate_var;
- gulong cil_code_size;
- gulong native_code_size;
- gulong code_reallocs;
- gulong max_code_size_ratio;
- gulong biggest_method_size;
- gulong allocated_code_size;
- gulong inlineable_methods;
- gulong inlined_methods;
- gulong basic_blocks;
- gulong max_basic_blocks;
- gulong locals_stack_size;
- gulong regvars;
- gulong cas_declsec_check;
- gulong cas_linkdemand_icall;
- gulong cas_linkdemand_pinvoke;
- gulong cas_linkdemand_aptc;
- gulong cas_linkdemand;
- gulong cas_demand_generation;
- gulong generic_virtual_invocations;
- int methods_with_llvm;
+ gint32 methods_compiled;
+ gint32 methods_aot;
+ gint32 methods_lookups;
+ gint32 allocate_var;
+ gint32 cil_code_size;
+ gint32 native_code_size;
+ gint32 code_reallocs;
+ gint32 max_code_size_ratio;
+ gint32 biggest_method_size;
+ gint32 allocated_code_size;
+ gint32 inlineable_methods;
+ gint32 inlined_methods;
+ gint32 basic_blocks;
+ gint32 max_basic_blocks;
+ gint32 locals_stack_size;
+ gint32 regvars;
+ gint32 cas_declsec_check;
+ gint32 cas_linkdemand_icall;
+ gint32 cas_linkdemand_pinvoke;
+ gint32 cas_linkdemand_aptc;
+ gint32 cas_linkdemand;
+ gint32 cas_demand_generation;
+ gint32 generic_virtual_invocations;
+ int methods_with_llvm;
int methods_without_llvm;
char *max_ratio_method;
char *biggest_method;
g_debug("mono_arch_create_specific_trampoline: Target: %p, Arg1: %p",
real_code, arg1);
- mono_jit_stats.method_trampolines++;
-
if (code_len)
*code_len = size;
/* Sanity check */
g_assert ((buf - code) <= METHOD_TRAMPOLINE_SIZE);
- mono_jit_stats.method_trampolines++;
-
return code;
}
ji->code_start = code;
ji->code_size = buf - code;
- mono_jit_stats.method_trampolines++;
-
return ji;
}