aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac9
-rw-r--r--lib/ruby_vm/rjit/stats.rb1
-rw-r--r--rjit.c15
-rw-r--r--rjit.h4
-rw-r--r--rjit_c.h1
-rw-r--r--rjit_c.rb5
-rwxr-xr-xtool/rjit/bindgen.rb1
-rw-r--r--vm_insnhelper.h18
8 files changed, 13 insertions, 41 deletions
diff --git a/configure.ac b/configure.ac
index 1a36dcd1a6..b01ba53839 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3947,18 +3947,11 @@ AC_ARG_ENABLE(rjit,
)
AS_CASE(["$RJIT_SUPPORT"],
-[yes|dev|disasm], [
+[yes|dev], [
AS_CASE(["$RJIT_SUPPORT"],
[dev], [
# Link libcapstone for --rjit-dump-disasm
AC_CHECK_LIB([capstone], [cs_disasm])
-
- # Enable extra stats (vm_insns_count, ratio_in_rjit)
- AC_DEFINE(RJIT_STATS, 1)
- ],
- [disasm], [
- # Link libcapstone for --rjit-dump-disasm
- AC_CHECK_LIB([capstone], [cs_disasm])
])
AC_DEFINE(USE_RJIT, 1)
diff --git a/lib/ruby_vm/rjit/stats.rb b/lib/ruby_vm/rjit/stats.rb
index 8c4253880a..484ddb3a1d 100644
--- a/lib/ruby_vm/rjit/stats.rb
+++ b/lib/ruby_vm/rjit/stats.rb
@@ -15,6 +15,7 @@ module RubyVM::RJIT
C.rb_rjit_runtime_counters.members.each do |member|
stats[member] = C.rb_rjit_counters.public_send(member)
end
+ stats[:vm_insns_count] = C.rb_vm_insns_count
# Other stats are calculated here
stats[:side_exit_count] = stats.select { |name, _count| name.start_with?('exit_') }.sum(&:last)
diff --git a/rjit.c b/rjit.c
index 7eadc9e7b3..7b65f3069f 100644
--- a/rjit.c
+++ b/rjit.c
@@ -151,12 +151,10 @@ rb_rjit_setup_options(const char *s, struct rb_rjit_options *rjit_opt)
#define M(shortopt, longopt, desc) RUBY_OPT_MESSAGE(shortopt, longopt, desc)
const struct ruby_opt_message rb_rjit_option_messages[] = {
- M("--rjit-stats", "", "Enable collecting RJIT statistics"),
-#if RJIT_STATS
- M("--rjit-trace-exits", "", "Trace side exit locations"),
-#endif
M("--rjit-exec-mem-size=num", "", "Size of executable memory block in MiB (default: " STRINGIZE(DEFAULT_EXEC_MEM_SIZE) ")"),
M("--rjit-call-threshold=num", "", "Number of calls to trigger JIT (default: " STRINGIZE(DEFAULT_CALL_THRESHOLD) ")"),
+ M("--rjit-stats", "", "Enable collecting RJIT statistics"),
+ M("--rjit-trace-exits", "", "Trace side exit locations"),
#ifdef HAVE_LIBCAPSTONE
M("--rjit-dump-disasm", "", "Dump all JIT code"),
#endif
@@ -166,15 +164,6 @@ const struct ruby_opt_message rb_rjit_option_messages[] = {
struct rb_rjit_runtime_counters rb_rjit_counters = { 0 };
-#if RJIT_STATS
-void
-rb_rjit_collect_vm_usage_insn(int insn)
-{
- if (!rjit_stats_p) return;
- rb_rjit_counters.vm_insns_count++;
-}
-#endif // YJIT_STATS
-
extern VALUE rb_gc_enable(void);
extern VALUE rb_gc_disable(void);
diff --git a/rjit.h b/rjit.h
index 1efd4f3ae7..dc984c1cdc 100644
--- a/rjit.h
+++ b/rjit.h
@@ -14,10 +14,6 @@
# if USE_RJIT
-#ifndef RJIT_STATS
-# define RJIT_STATS RUBY_DEBUG
-#endif
-
#include "ruby.h"
#include "vm_core.h"
diff --git a/rjit_c.h b/rjit_c.h
index 518d336c00..339dfc38fc 100644
--- a/rjit_c.h
+++ b/rjit_c.h
@@ -17,7 +17,6 @@ extern uint8_t *rb_rjit_mem_block;
#define RJIT_RUNTIME_COUNTERS(...) struct rb_rjit_runtime_counters { size_t __VA_ARGS__; };
RJIT_RUNTIME_COUNTERS(
- vm_insns_count,
rjit_insns_count,
send_args_splat_kw_splat,
diff --git a/rjit_c.rb b/rjit_c.rb
index 4606352a96..ee5759a08d 100644
--- a/rjit_c.rb
+++ b/rjit_c.rb
@@ -512,6 +512,10 @@ module RubyVM::RJIT # :nodoc: all
Primitive.cexpr! %q{ SIZET2NUM(rb_rjit_global_events) }
end
+ def C.rb_vm_insns_count
+ Primitive.cexpr! %q{ SIZET2NUM(rb_vm_insns_count) }
+ end
+
def C.rb_ary_clear
Primitive.cexpr! %q{ SIZET2NUM((size_t)rb_ary_clear) }
end
@@ -1335,7 +1339,6 @@ module RubyVM::RJIT # :nodoc: all
def C.rb_rjit_runtime_counters
@rb_rjit_runtime_counters ||= CType::Struct.new(
"rb_rjit_runtime_counters", Primitive.cexpr!("SIZEOF(struct rb_rjit_runtime_counters)"),
- vm_insns_count: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), vm_insns_count)")],
rjit_insns_count: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), rjit_insns_count)")],
send_args_splat_kw_splat: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat_kw_splat)")],
send_args_splat: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat)")],
diff --git a/tool/rjit/bindgen.rb b/tool/rjit/bindgen.rb
index 328c8b344b..f8040461bc 100755
--- a/tool/rjit/bindgen.rb
+++ b/tool/rjit/bindgen.rb
@@ -501,6 +501,7 @@ generator = BindingGenerator.new(
rb_cTrueClass
rb_rjit_global_events
rb_mRubyVMFrozenCore
+ rb_vm_insns_count
idRespond_to_missing
],
},
diff --git a/vm_insnhelper.h b/vm_insnhelper.h
index 90372853dd..e4a6c5b492 100644
--- a/vm_insnhelper.h
+++ b/vm_insnhelper.h
@@ -16,23 +16,13 @@ RUBY_EXTERN rb_serial_t ruby_vm_constant_cache_invalidations;
RUBY_EXTERN rb_serial_t ruby_vm_constant_cache_misses;
RUBY_EXTERN rb_serial_t ruby_vm_global_cvar_state;
-#ifndef RJIT_STATS
-# define RJIT_STATS RUBY_DEBUG
-#endif
-
-#if USE_YJIT // We want vm_insns_count on any YJIT-enabled build
+#if USE_YJIT || USE_RJIT // We want vm_insns_count on any JIT-enabled build.
// Increment vm_insns_count for --yjit-stats. We increment this even when
// --yjit or --yjit-stats is not used because branching to skip it is slower.
// We also don't use ATOMIC_INC for performance, allowing inaccuracy on Ractors.
-#define YJIT_COLLECT_USAGE_INSN(insn) rb_vm_insns_count++
-#else
-#define YJIT_COLLECT_USAGE_INSN(insn) // none
-#endif
-
-#if RJIT_STATS
-#define RJIT_COLLECT_USAGE_INSN(insn) rb_rjit_collect_vm_usage_insn(insn)
+#define JIT_COLLECT_USAGE_INSN(insn) rb_vm_insns_count++
#else
-#define RJIT_COLLECT_USAGE_INSN(insn) // none
+#define JIT_COLLECT_USAGE_INSN(insn) // none
#endif
#if VM_COLLECT_USAGE_DETAILS
@@ -40,7 +30,7 @@ RUBY_EXTERN rb_serial_t ruby_vm_global_cvar_state;
#define COLLECT_USAGE_OPERAND(insn, n, op) vm_collect_usage_operand((insn), (n), ((VALUE)(op)))
#define COLLECT_USAGE_REGISTER(reg, s) vm_collect_usage_register((reg), (s))
#else
-#define COLLECT_USAGE_INSN(insn) YJIT_COLLECT_USAGE_INSN(insn); RJIT_COLLECT_USAGE_INSN(insn)
+#define COLLECT_USAGE_INSN(insn) JIT_COLLECT_USAGE_INSN(insn)
#define COLLECT_USAGE_OPERAND(insn, n, op) // none
#define COLLECT_USAGE_REGISTER(reg, s) // none
#endif