diff options
author | John Hawthorn <[email protected]> | 2023-04-18 07:09:16 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2023-04-18 10:09:16 -0400 |
commit | 2dff1d4fdabd0fafeeac675baaaf7b06bb3150f9 (patch) | |
tree | 222beb26cb8855103700fe880ccf32e518f3f89e | |
parent | d8a6db7292e8c92540f3dd2c939508ca1dd8cc41 (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.c | 5 | ||||
-rw-r--r-- | yjit.rb | 2 | ||||
-rw-r--r-- | yjit/src/stats.rs | 6 |
3 files changed, 6 insertions, 7 deletions
@@ -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 @@ -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. |