summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hawthorn <[email protected]>2023-04-18 07:09:16 -0700
committerGitHub <[email protected]>2023-04-18 10:09:16 -0400
commit2dff1d4fdabd0fafeeac675baaaf7b06bb3150f9 (patch)
tree222beb26cb8855103700fe880ccf32e518f3f89e
parentd8a6db7292e8c92540f3dd2c939508ca1dd8cc41 (diff)
YJIT: Fix raw sample stack lengths in exit traces (#7728)
yjit-trace-exits appends a synthetic sample for the instruction being exited, but we didn't increment the size of the stack. Fixing this count correctly lets us successfully generate a flamegraph from the exits. I also replaced the line number for instructions with 0, as I don't think the previous value had meaning. Co-authored-by: Adam Hess <[email protected]>
Notes
Notes: Merged-By: maximecb <[email protected]>
-rw-r--r--yjit.c5
-rw-r--r--yjit.rb2
-rw-r--r--yjit/src/stats.rs6
3 files changed, 6 insertions, 7 deletions
diff --git a/yjit.c b/yjit.c
index 2d3b7c9e9d..72d01d78f4 100644
--- a/yjit.c
+++ b/yjit.c
@@ -186,8 +186,9 @@ rb_yjit_exit_locations_dict(VALUE *yjit_raw_samples, int *yjit_line_samples, int
int line_num = (int)yjit_line_samples[idx];
idx++;
- rb_ary_push(raw_samples, SIZET2NUM(num));
- rb_ary_push(line_samples, INT2NUM(line_num));
+ // + 1 as we append an additional sample for the insn
+ rb_ary_push(raw_samples, SIZET2NUM(num + 1));
+ rb_ary_push(line_samples, INT2NUM(line_num + 1));
// Loop through the length of samples_len and add data to the
// frames hash. Also push the current value onto the raw_samples
diff --git a/yjit.rb b/yjit.rb
index 60a263c322..b2af7ef0be 100644
--- a/yjit.rb
+++ b/yjit.rb
@@ -67,7 +67,7 @@ module RubyVM::YJIT
# [ length, line_1, line_2, line_n, ..., dummy value, count
i = 0
while i < raw_samples.length
- stack_length = raw_samples[i] + 1
+ stack_length = raw_samples[i]
i += 1 # consume the stack length
sample_count = raw_samples[i + stack_length]
diff --git a/yjit/src/stats.rs b/yjit/src/stats.rs
index cc7f71b9bc..bf90b233f7 100644
--- a/yjit/src/stats.rs
+++ b/yjit/src/stats.rs
@@ -724,10 +724,8 @@ pub extern "C" fn rb_yjit_record_exit_stack(exit_pc: *const VALUE)
// Push the insn value into the yjit_raw_samples Vec.
yjit_raw_samples.push(VALUE(insn as usize));
- // Push the current line onto the yjit_line_samples Vec. This
- // points to the line in insns.def.
- let line = yjit_line_samples.len() - 1;
- yjit_line_samples.push(line as i32);
+ // We don't know the line
+ yjit_line_samples.push(0);
// Push number of times seen onto the stack, which is 1
// because it's the first time we've seen it.