aboutsummaryrefslogtreecommitdiffstats
path: root/ujit_iface.c
diff options
context:
space:
mode:
Diffstat (limited to 'ujit_iface.c')
-rw-r--r--ujit_iface.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/ujit_iface.c b/ujit_iface.c
index 3eb134a3bc..2237d37f5f 100644
--- a/ujit_iface.c
+++ b/ujit_iface.c
@@ -23,8 +23,17 @@ VALUE cUjitBlock;
VALUE cUjitDisasm;
VALUE cUjitDisasmInsn;
+bool rb_ujit_enabled;
+
+static int64_t vm_insns_count = 0;
+int64_t rb_ujit_exec_insns_count = 0;
+
extern st_table * version_tbl;
extern codeblock_t *cb;
+// Hash table of encoded instructions
+extern st_table *rb_encoded_insn_data;
+
+struct rb_ujit_options rb_ujit_opts;
static const rb_data_type_t ujit_block_type = {
"UJIT/Block",
@@ -32,11 +41,6 @@ static const rb_data_type_t ujit_block_type = {
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
};
-bool rb_ujit_enabled;
-
-// Hash table of encoded instructions
-extern st_table *rb_encoded_insn_data;
-
// Write the uJIT entry point pre-call bytes
void
cb_write_pre_call_bytes(codeblock_t* cb)
@@ -412,14 +416,36 @@ ujit_disasm(VALUE self, VALUE code, VALUE from)
}
#endif
+__attribute__((destructor))
+static void
+print_ujit_stats(void)
+{
+ if (rb_ujit_opts.gen_stats) {
+ double double_ujit_exec_insns_count = rb_ujit_exec_insns_count;
+ double total_insns_count = vm_insns_count + rb_ujit_exec_insns_count;
+ double ratio = double_ujit_exec_insns_count / total_insns_count;
+
+ fprintf(stderr, "vm_insns_count: %10" PRId64 "\n", vm_insns_count);
+ fprintf(stderr, "ujit_exec_insns_count: %10" PRId64 "\n", rb_ujit_exec_insns_count);
+ fprintf(stderr, "ratio_in_ujit: %9.1f%%\n", ratio * 100);
+ }
+}
+
+void rb_ujit_collect_vm_usage_insn(int insn)
+{
+ vm_insns_count++;
+}
+
void
-rb_ujit_init(void)
+rb_ujit_init(struct rb_ujit_options *options)
{
if (!ujit_scrape_successful || !PLATFORM_SUPPORTED_P)
{
return;
}
+ rb_ujit_opts = *options;
+
rb_ujit_enabled = true;
ujit_init_core();