Giter Club home page Giter Club logo

shopify / ruby Goto Github PK

View Code? Open in Web Editor NEW

This project forked from ruby/ruby

39.0 9.0 12.0 309.68 MB

The Ruby Programming Language [mirror]

Home Page: https://www.ruby-lang.org/

License: Other

GDB 0.07% Ruby 64.26% Makefile 2.12% C 28.63% Perl 0.01% Python 0.18% Scheme 0.01% M4 0.35% C++ 2.88% HTML 0.32% Shell 0.03% Ragel 0.05% Assembly 0.04% CSS 0.03% JavaScript 0.03% Yacc 0.97% Batchfile 0.02% sed 0.01% Emacs Lisp 0.01% Raku 0.01%

ruby's Introduction

Actions Status: MinGW Actions Status: RJIT Actions Status: Ubuntu Actions Status: Windows Travis Status

What is Ruby?

Ruby is an interpreted object-oriented programming language often used for web development. It also offers many scripting features to process plain text and serialized files, or manage system tasks. It is simple, straightforward, and extensible.

Features of Ruby

  • Simple Syntax
  • Normal Object-oriented Features (e.g. class, method calls)
  • Advanced Object-oriented Features (e.g. mix-in, singleton-method)
  • Operator Overloading
  • Exception Handling
  • Iterators and Closures
  • Garbage Collection
  • Dynamic Loading of Object Files (on some architectures)
  • Highly Portable (works on many Unix-like/POSIX compatible platforms as well as Windows, macOS, etc.) cf. https://docs.ruby-lang.org/en/master/maintainers_md.html#label-Platform+Maintainers

How to get Ruby

For a complete list of ways to install Ruby, including using third-party tools like rvm, see:

https://www.ruby-lang.org/en/downloads/

You can download release packages and the snapshot of the repository. If you want to download whole versions of Ruby, please visit https://www.ruby-lang.org/en/downloads/releases/.

Download with Git

The mirror of the Ruby source tree can be checked out with the following command:

$ git clone https://github.com/ruby/ruby.git

There are some other branches under development. Try the following command to see the list of branches:

$ git ls-remote https://github.com/ruby/ruby.git

You may also want to use https://git.ruby-lang.org/ruby.git (actual master of Ruby source) if you are a committer.

How to build

See Building Ruby

Ruby home page

https://www.ruby-lang.org/

Documentation

Mailing list

There is a mailing list to discuss Ruby. To subscribe to this list, please send the following phrase:

join

in the mail subject (not body) to the address [email protected].

Copying

See the file COPYING.

Feedback

Questions about the Ruby language can be asked on the Ruby-Talk mailing list or on websites like https://stackoverflow.com.

Bugs should be reported at https://bugs.ruby-lang.org. Read "Reporting Issues" for more information.

Contributing

See "Contributing to Ruby", which includes setup and build instructions.

The Author

Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.

[email protected]

ruby's People

Contributors

akr avatar aycabta avatar burdettelamar avatar deivid-rodriguez avatar drbrain avatar eregon avatar hsbt avatar jeremyevans avatar k0kubun avatar kddnewton avatar knu avatar ko1 avatar kosaki avatar kou avatar mame avatar marcandre avatar matz avatar matzbot avatar maximecb avatar mrkn avatar nobu avatar nurse avatar peterzhu2118 avatar shugo avatar shyouhei avatar tenderlove avatar unak avatar xrxr avatar znz avatar zzak avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ruby's Issues

Implement --ujit-call-threshold

There is currently a definition in ujit.h

#define UJIT_CALL_THRESHOLD (1u)

We should make this a command-line argument. That will enable us to set the threshold to 1 when running make check or make btest, so that we can catch as many bugs as possible, but it will also eventually enable us to tune the threshold to maximize performance.

Note: the command line argument parsing code should check that the minimum value is 1.

YJIT: make sure we don't make the performance of unit tests worse

This is not a high priority issue but a nice-to-have. A current flaw with YJIT is that, while we manage speedups on almost every workload, we get a slight performance drop while running unit tests. This is because unit tests run a lot of code not very many times. That's unfortunate because it might negatively affect people's perception of YJIT. Unit tests are typically fairly long to run, so people might naturally be tempted to run YJIT there, and then be disappointed.

The first question is: how slow are we on unit tests? Should we set up a unit test benchmark? Should we simply use first iteration time on the benchmarks we already have as a proxy?

Fixing the problem could be as simple as increasing the default YJIT call threshold. It's currently set to 10, which is very aggressive, but it could easily be bumped to 50 or 100. We would still ideally want some kind of metric on which to base the choice of call threshold that we pick.

The downside of increasing the call threshold is that this could affect our benchmarks. Noah suggests that we could just manually set the benchmarks to use a call threshold of 10 to ensure that they warm up fast as they do now. That's probably acceptable. If we do that, we should probably do the same for yjit-bench.

@noahgibbs

Report inline and outlined generated code size, num functions compiled in `--ujit-stats`

This is information that would be very useful to have in the stats that we dump with the --ujit-stats command-line argument.

The generated code size is just the current write position in the code block objects, cb->write_pos and ocb->write_pos. We should probably report a value in kilobytes for readability.

The number of functions compiled would be how many functions hit the threshold and had a ujit entry point installed.

YJIT: reuse blocks for deferred compilation when possible

We use the defer_compilation() mechanism in many places in YJIT to allow us to peek at run-time values and specialize code (run-time value promotion). However, this has a memory usage cost, as we must generate a stub, and we create a new block and context object each time.

In railsbench, about 31% of the blocks seem to come from deferred compilation:

compiled_iseq_count:         2686
compiled_block_count:       25202
defer_count:                 7903

I think that, since we are essentially just using the deferred compilation mechanism to pause compilation, we should be able, in most cases, to avoid creating a new block and just resume/continue mutating the existing block. This may not always be possible in situations where we have green threads or ractors, because someone else could come and generate code first. However, this should be fairly rare in practice, and we should be able to detect if any code has been generated after the jump to stub or not.

If there are ractors, we might not be able to safely free the branch object that jumped to the stub in the first place, but at least we'd get to reuse the block object.

@XrXr @k0kubun do you think that this idea is viable, or can you see weird corner cases that I'm not thinking of?

I'm also wondering if it would be possible (and safe?) to overwrite the machine code for these blocks in some cases to reduce the frequency of code GC. This would involve "rewinding" the write position. This is much less important than reusing the Block objects themselves though.

Rust-YJIT: Lee benchmark gets incorrect field access with --yjit

If I run the lee benchmark with the current rust-yjit, it's getting "point.y" -- a Struct field access -- returning false instead of an appropriate integer.

ubuntu@ip-172-31-38-197:~/ym/rust-yjit$ PATH=".:$PATH" WARMUP_ITRS=0 MIN_BENCH_ITRS=10 MIN_BENCH_TIME=0 ./ruby --yjit -I../yjit-bench/harness ../yjit-bench/benchmarks/lee/benchmark.rb
/home/ubuntu/ym/yjit-bench/benchmarks/lee/lib/lee/adjacent.rb:6:in `point_on_board?': undefined method `>=' for false:FalseClass (NoMethodError)

    point.x >= 0 && point.y >= 0 && point.x < board.width && point.y < board.height
                            ^^
	from /home/ubuntu/ym/yjit-bench/benchmarks/lee/lib/lee/validate.rb:5:in `block in board_valid?'
	from /home/ubuntu/ym/yjit-bench/benchmarks/lee/lib/lee/validate.rb:5:in `all?'
	from /home/ubuntu/ym/yjit-bench/benchmarks/lee/lib/lee/validate.rb:5:in `board_valid?'
	from /home/ubuntu/ym/yjit-bench/benchmarks/lee/lib/lee/board.rb:49:in `read_board'
	from ../yjit-bench/benchmarks/lee/benchmark.rb:20:in `<main>'

It's not as simple as "create a struct of :x, :y, grab the second field from an instance with YJIT enabled, get false instead of the correct value. I tried that in a trivial test and it didn't do it. But it does seem to always die on iteration 10, which is right after the function is compiled by YJIT. So it seems like it's probably pretty simple.

It also works repeatably.

Small repro:

# test_struct.rb
Point = Struct.new(:x, :y)

MyPoint = Point.new(3, 7);

def main
  STDERR.puts "P: #{MyPoint.x.inspect}, #{MyPoint.y.inspect}"
end

10.times { main }

Run "./miniruby --yjit test_struct.rb" on the above. Note that --yjit-call-threshold=1 does not reproduce the bug.

YJIT: optimize `Module#===`

This is also used very often in SFR, because of case...when patterns. It seems to be used most often with arrays and hashes, so I'm wondering if we could peek at the input and just guard on T_HASH and T_ARRAY ๐Ÿค”

This will need extensive tests for corner cases, etc.

Basic block invalidation mechanism

There are a few situations in which it might be useful to invalidate basic block versions:

  • Primitive op (eg: plus/minus) redefined
  • Method redefined on class, throw away code calling that method
  • A method uses binding to modify local types in a caller

In the case of primitive op redefinitions, we might be better off throwing away all the compiled code, but class method redefinitions might happen too often for that to be practical. We could instead implement a strategy that allows invalidating generated code for one specific basic block version. I think it makes sense to figure out a solution for this early on, to avoid tedious refactorings later down the road.

To invalidate an individual basic block:

  • All branches jumping to the block should be atomically patched with jumps going to a stub instead.
  • There can also be other blocks falling through to the invalidated block because they immediately precede it.
    • If an incoming fall-through branch is too short to be patched, we may need to invalidate its block
      • This may not be an issue in practice, because the block we go to could have space
      • We can force any block that may need to be invalidated to have sufficient space to contain a jump to a stub
  • If the block is an entry point, it needs to be unmapped from its iseq
    • Unmap/remap anything at this iseq/idx
    • Optional: may want to recompile a new deoptimized entry point
  • Call continuation addresses on the stack can also be atomically replaced by jumps going to the stub.

Need:

  • list of blocks making cc/cme assumptions
    • Alan already created a hash table
    • Should contain blockid (iseq/idx) to invalidate
  • For a given block version, list of incoming branch entries (branch idxs)
    • This could be stored in a hash map or on some block version object
    • We only care about the branches that are actually patched, already executed
      • Jump to stubs can stay as-is

Question: would it be useful to have block version objects?

  • It looks like a blockid_t is not sufficient, we need a specific version
  • For invalidation, we need per-block metadata such as incoming branches
  • Branches may need a pointer to their parent block

Investigate heisenbug in `test_gc_compact.rb`

There is a heisenbug that occurs while running make test-all:

make -j16 test-all
Run options: 
  --seed=85911
  "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems"
  --excludes-dir=./test/excludes
  --name=!/memory_leak/

# Running tests:

/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:583: [BUG] Segmentation fault at 0x0000000000000040exhaustive 81118=test_ossl 81120=te          
ruby 3.1.0dev (2021-02-17T18:30:05Z microjit 9966d9c8e8) [x86_64-darwin19]

-- Crash Report log information --------------------------------------------
   See Crash Report log file in one of the following locations:             
     * ~/Library/Logs/DiagnosticReports                                     
     * /Library/Logs/DiagnosticReports                                      
   for more details.                                                        
Don't forget to include the above Crash Report log file in bug reports.     

-- Control frame information -----------------------------------------------
c:0017 p:0000 s:0111 e:000110 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:583
c:0016 p:0041 s:0105 e:000104 METHOD /Users/maximecb/src/github.com/Shopify/ruby/test/ruby/test_gc_compact.rb:24
c:0015 p:0052 s:0100 e:000099 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit.rb:1284
c:0014 p:0064 s:0094 E:002408 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:1320
c:0013 p:0013 s:0085 e:000084 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/testcase.rb:18
c:0012 p:0077 s:0080 e:000079 BLOCK  /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:969 [FINISH]
c:0011 p:---- s:0073 e:000072 CFUNC  :map
c:0010 p:0006 s:0069 e:000068 BLOCK  /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:962
c:0009 p:0161 s:0065 E:001ea0 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:989
c:0008 p:0042 s:0053 e:000052 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit.rb:1137
c:0007 p:0102 s:0046 E:001140 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:55
c:0006 p:0008 s:0030 e:000029 BLOCK  /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:31 [FINISH]
c:0005 p:---- s:0026 e:000025 CFUNC  :map
c:0004 p:0005 s:0022 e:000021 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:30
c:0003 p:0259 s:0016 e:000015 METHOD /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:125
c:0002 p:0142 s:0006 e:000005 EVAL   /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:208 [FINISH]
c:0001 p:0000 s:0003 E:002170 (none) [FINISH]

-- Ruby level backtrace information ----------------------------------------
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:208:in `<main>'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:125:in `run'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:30:in `_run_suites'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:30:in `map'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:31:in `block in _run_suites'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb:55:in `_run_suite'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit.rb:1137:in `_run_suite'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:989:in `_run_suite'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:962:in `block in _run_suite'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:962:in `map'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:969:in `block (2 levels) in _run_suite'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/testcase.rb:18:in `run'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:1320:in `run'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit.rb:1284:in `run_test'
/Users/maximecb/src/github.com/Shopify/ruby/test/ruby/test_gc_compact.rb:24:in `test_disable_autocompact'
/Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb:583:in `refute'

-- Machine register context ------------------------------------------------
 rax: 0x0000000000000000 rbx: 0x00007ff13ed0e0e0 rcx: 0x0000000000000000
 rdx: 0x00000000000109e9 rdi: 0x00007ff11f0246b8 rsi: 0x0000000000000040
 rbp: 0x00007ffeea876bb0 rsp: 0x00007ffeea876bb0  r8: 0x0000000000000a07
  r9: 0x0000000000000a0d r10: 0x00000000ffffe07f r11: 0x0000000000000000
 r12: 0x00007ffeea876ca0 r13: 0x0000000105795bc6 r14: 0x0000000000000008
 r15: 0x0000000105795bc6 rip: 0x00000001056612c5 rfl: 0x0000000000010293

-- C level backtrace information -------------------------------------------
/Users/maximecb/src/github.com/Shopify/ruby/ruby(rb_print_backtrace+0xf) [0x10564cd96] vm_dump.c:758_lib 81111=test_file_exhaustive 81118=test_ossl 81120=te          
/Users/maximecb/src/github.com/Shopify/ruby/ruby(rb_vm_bugreport) vm_dump.c:1042
/Users/maximecb/src/github.com/Shopify/ruby/ruby(rb_vm_bugreport) (null):0
/Users/maximecb/src/github.com/Shopify/ruby/ruby(bug_report_end+0x0) [0x105434287] error.c:801
/Users/maximecb/src/github.com/Shopify/ruby/ruby(rb_bug_for_fatal_signal) error.c:801
/Users/maximecb/src/github.com/Shopify/ruby/ruby(sigsegv+0x5b) [0x105595b5b] signal.c:960
/usr/lib/system/libsystem_platform.dylib(_sigtramp+0x1d) [0x7fff6c37d5fd]
/Users/maximecb/src/github.com/Shopify/ruby/ruby(opcode_at_pc+0x25) [0x1056612c5] ./include/ruby/internal/fl_type.h:273
/Users/maximecb/src/github.com/Shopify/ruby/ruby(ujit_gen_block+0xb8) [0x105659f98] ujit_codegen.c:44
/Users/maximecb/src/github.com/Shopify/ruby/ruby(gen_block_version+0x6b) [0x105658a2b] ujit_core.c:275
/Users/maximecb/src/github.com/Shopify/ruby/ruby(branch_stub_hit+0x22b) [0x10565911b] ujit_core.c:389

-- Other runtime information -----------------------------------------------

* Loaded script: /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/parallel.rb: TestGCCompact::AutoCompact#test_disable_autocompact

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 fiber.so
    3 rational.so
    4 complex.so
    5 ruby2_keywords.rb
    6 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/encdb.bundle
    7 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
    8 /Users/maximecb/src/github.com/Shopify/ruby/lib/optparse.rb
    9 /Users/maximecb/src/github.com/Shopify/ruby/rbconfig.rb
   10 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/leakchecker.rb
   11 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/minitest/unit.rb
   12 /Users/maximecb/src/github.com/Shopify/ruby/lib/open3.rb
   13 /Users/maximecb/src/github.com/Shopify/ruby/lib/timeout.rb
   14 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/find_executable.rb
   15 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/rbconfig/sizeof.bundle
   16 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/envutil.rb
   17 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/core_assertions.rb
   18 /Users/maximecb/src/github.com/Shopify/ruby/lib/prettyprint.rb
   19 /Users/maximecb/src/github.com/Shopify/ruby/lib/pp.rb
   20 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/assertions.rb
   21 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/colorize.rb
   22 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit/testcase.rb
   23 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/test/unit.rb
   24 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/tracepointchecker.rb
   25 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/zombie_hunter.rb
   26 /Users/maximecb/src/github.com/Shopify/ruby/lib/delegate.rb
   27 /Users/maximecb/src/github.com/Shopify/ruby/lib/fileutils.rb
   28 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/etc.bundle
   29 /Users/maximecb/src/github.com/Shopify/ruby/lib/tmpdir.rb
   30 /Users/maximecb/src/github.com/Shopify/ruby/lib/tempfile.rb
   31 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/iseq_loader_checker.rb
   32 /Users/maximecb/src/github.com/Shopify/ruby/tool/lib/gc_compact_checker.rb
   33 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/compatibility.rb
   34 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/defaults.rb
   35 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/deprecate.rb
   36 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/errors.rb
   37 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/unknown_command_spell_checker.rb
   38 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/exceptions.rb
   39 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/basic_specification.rb
   40 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/stub_specification.rb
   41 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/text.rb
   42 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/user_interaction.rb
   43 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/specification_policy.rb
   44 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/util/list.rb
   45 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/platform.rb
   46 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/version.rb
   47 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/requirement.rb
   48 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/specification.rb
   49 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/util.rb
   50 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/dependency.rb
   51 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/core_ext/kernel_gem.rb
   52 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/monitor.bundle
   53 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/monitor.rb
   54 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/core_ext/kernel_require.rb
   55 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems/core_ext/kernel_warn.rb
   56 /Users/maximecb/src/github.com/Shopify/ruby/lib/rubygems.rb
   57 /Users/maximecb/src/github.com/Shopify/ruby/test/-ext-/arith_seq/test_arith_seq_extract.rb
   58 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/bignum.bundle
   59 /Users/maximecb/src/github.com/Shopify/ruby/test/-ext-/bignum/test_mul.rb
   60 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/debug.bundle
   61 /Users/maximecb/src/github.com/Shopify/ruby/test/-ext-/debug/test_profile_frames.rb
   62 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/iseq_load.bundle
   63 /Users/maximecb/src/github.com/Shopify/ruby/test/-ext-/iseq_load/test_iseq_load.rb
   64 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/string.bundle
   65 /Users/maximecb/src/github.com/Shopify/ruby/test/-ext-/string/test_qsort.rb
   66 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/struct.bundle
   67 /Users/maximecb/src/github.com/Shopify/ruby/test/-ext-/struct/test_duplicate.rb
   68 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/time.bundle
   69 /Users/maximecb/src/github.com/Shopify/ruby/test/-ext-/time/test_new.rb
   70 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/forwardable/impl.rb
   71 /Users/maximecb/src/github.com/Shopify/ruby/lib/forwardable.rb
   72 /Users/maximecb/src/github.com/Shopify/ruby/lib/English.rb
   73 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/date_core.bundle
   74 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/date.rb
   75 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/stringio.bundle
   76 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/fields_converter.rb
   77 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/match_p.rb
   78 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/strscan.bundle
   79 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/delete_suffix.rb
   80 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/row.rb
   81 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/table.rb
   82 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/parser.rb
   83 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/writer.rb
   84 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/version.rb
   85 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/core_ext/array.rb
   86 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv/core_ext/string.rb
   87 /Users/maximecb/src/github.com/Shopify/ruby/lib/csv.rb
   88 /Users/maximecb/src/github.com/Shopify/ruby/test/lib/with_different_ofs.rb
   89 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/helper.rb
   90 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/parse/test_invalid.rb
   91 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/parse/test_rewind.rb
   92 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/parse/test_row_separator.rb
   93 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/parse/test_strip.rb
   94 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/test_data_converters.rb
   95 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/zlib.bundle
   96 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/test_features.rb
   97 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/utf_16be.bundle
   98 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/utf_16_32.bundle
   99 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/single_byte.bundle
  100 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/write/test_force_quotes.rb
  101 /Users/maximecb/src/github.com/Shopify/ruby/test/csv/write/test_quote_empty.rb
  102 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date.rb
  103 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date_arith.rb
  104 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date_attr.rb
  105 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date_compat.rb
  106 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date_conv.rb
  107 /Users/maximecb/src/github.com/Shopify/ruby/lib/time.rb
  108 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date_marshal.rb
  109 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/objspace.bundle
  110 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/objspace.rb
  111 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date_parse.rb
  112 /Users/maximecb/src/github.com/Shopify/ruby/test/date/test_date_strftime.rb
  113 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/socket.bundle
  114 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/io/wait.bundle
  115 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/socket.rb
  116 /Users/maximecb/src/github.com/Shopify/ruby/lib/ipaddr.rb
  117 /Users/maximecb/src/github.com/Shopify/ruby/lib/drb/acl.rb
  118 /Users/maximecb/src/github.com/Shopify/ruby/test/drb/test_acl.rb
  119 /Users/maximecb/src/github.com/Shopify/ruby/lib/drb/eq.rb
  120 /Users/maximecb/src/github.com/Shopify/ruby/lib/drb/invokemethod.rb
  121 /Users/maximecb/src/github.com/Shopify/ruby/lib/drb/drb.rb
  122 /Users/maximecb/src/github.com/Shopify/ruby/lib/drb/extservm.rb
  123 /Users/maximecb/src/github.com/Shopify/ruby/test/drb/drbtest.rb
  124 /Users/maximecb/src/github.com/Shopify/ruby/test/drb/test_drb.rb
  125 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/fiddle.bundle
  126 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/fiddle/closure.rb
  127 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/fiddle/function.rb
  128 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/fiddle/version.rb
  129 /Users/maximecb/src/github.com/Shopify/ruby/.ext/common/fiddle.rb
  130 /Users/maximecb/src/github.com/Shopify/ruby/test/ruby/test_gc_compact.rb

* Process memory map:

105387000-105776000 r-x /Users/maximecb/src/github.com/Shopify/ruby/ruby
105776000-10577d000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby
10577d000-10577e000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby
10577e000-105b50000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby
105b50000-105d33000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby
105d33000-105d35000 rw- /Users/maximecb/src/github.com/Shopify/ruby/mjit_build_dir.dylib
105d35000-105d36000 r-- /Users/maximecb/src/github.com/Shopify/ruby/mjit_build_dir.dylib
105d36000-105d37000 rw- /Users/maximecb/src/github.com/Shopify/ruby/mjit_build_dir.dylib
105d37000-105d38000 r-- /Users/maximecb/src/github.com/Shopify/ruby/mjit_build_dir.dylib
105d38000-105d39000 r-- /Users/maximecb/src/github.com/Shopify/ruby/mjit_build_dir.dylib
105d39000-105d3a000 r-x /Users/maximecb/src/github.com/Shopify/ruby/mjit_build_dir.dylib
105d3a000-105d3b000 r-- /Users/maximecb/src/github.com/Shopify/ruby/mjit_build_dir.dylib
105d3b000-105d3d000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/encdb.bundle
105d3d000-105d3e000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/encdb.bundle
105d3e000-105d3f000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/encdb.bundle
105d3f000-105d40000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/encdb.bundle
105d41000-105d9d000 r-x /usr/local/Cellar/gmp/6.2.0/lib/libgmp.10.dylib
105d9d000-105d9e000 r-- /usr/local/Cellar/gmp/6.2.0/lib/libgmp.10.dylib
105d9e000-105d9f000 rw- /usr/local/Cellar/gmp/6.2.0/lib/libgmp.10.dylib
105d9f000-105da9000 r-- /usr/local/Cellar/gmp/6.2.0/lib/libgmp.10.dylib
105da9000-105daa000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/monitor.bundle
105daa000-105dab000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/monitor.bundle
105dab000-105dac000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/monitor.bundle
105dac000-105dad000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/monitor.bundle
105dad000-10605b000 r-x /usr/local/Cellar/capstone/4.0.2/lib/libcapstone.4.dylib
10605b000-1061a3000 r-- /usr/local/Cellar/capstone/4.0.2/lib/libcapstone.4.dylib
1061a3000-10620f000 rw- /usr/local/Cellar/capstone/4.0.2/lib/libcapstone.4.dylib
10620f000-106224000 r-- /usr/local/Cellar/capstone/4.0.2/lib/libcapstone.4.dylib
106224000-106225000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106225000-10622e000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10622e000-10622f000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10622f000-106230000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106230000-106239000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106239000-10623a000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10623a000-10623b000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10623b000-106244000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106244000-106245000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106245000-106246000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106246000-106287000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106287000-106288000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106288000-1062c9000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1062c9000-1062ca000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1062ca000-10630b000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10630b000-10630c000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10630c000-10634d000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10634d000-10634e000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10634e000-10638f000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10638f000-106390000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106390000-1063d1000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1063d1000-1063d2000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1063d2000-106413000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106413000-106414000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106414000-106455000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106455000-106456000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106456000-106497000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106497000-106498000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106498000-1064d9000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1064d9000-1064da000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1064da000-10651b000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10651b000-10651c000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10651c000-10655d000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10655d000-10655e000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10655e000-10659f000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10659f000-1065a0000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1065a0000-1065e1000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1065e1000-1065e2000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1065e2000-106623000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106623000-106624000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106624000-106665000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106665000-106666000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106666000-1066a7000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1066a7000-1066a8000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1066a8000-1066e9000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1066e9000-1066ea000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1066ea000-10672b000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10672b000-10672c000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10672c000-10676d000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10676d000-10676e000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10676e000-1067af000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1067af000-1067b0000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1067b0000-1067f1000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1067f1000-1067f2000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1067f2000-106833000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106833000-106834000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106834000-106875000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106875000-106876000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106876000-1068b7000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1068b7000-1068b8000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1068b8000-1068f9000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1068f9000-1068fa000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1068fa000-10693b000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10693b000-10693c000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10693c000-10697d000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10697d000-10697e000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
10697e000-1069bf000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1069bf000-1069c0000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
1069c0000-106a01000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a01000-106a02000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a02000-106a43000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a43000-106a44000 --- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a44000-106a85000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a85000-106a87000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a87000-106a88000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a88000-106a89000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a89000-106a8a000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/transdb.bundle
106a8a000-106a8d000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/rbconfig/sizeof.bundle
106a8d000-106a8e000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/rbconfig/sizeof.bundle
106a8e000-106a8f000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/rbconfig/sizeof.bundle
106a8f000-106a90000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/rbconfig/sizeof.bundle
106a90000-106a94000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/etc.bundle
106a94000-106a95000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/etc.bundle
106a95000-106a96000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/etc.bundle
106a96000-106a99000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/etc.bundle
106a99000-106ad9000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/bignum.bundle
106ad9000-106adc000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/bignum.bundle
106adc000-106add000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/bignum.bundle
106add000-106ade000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/bignum.bundle
106ade000-106ae1000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/bignum.bundle
106ae1000-106ae2000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/debug.bundle
106ae2000-106ae3000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/debug.bundle
106ae3000-106ae4000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/debug.bundle
106ae4000-106ae5000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/debug.bundle
106ae5000-106ae6000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/iseq_load.bundle
106ae6000-106ae7000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/iseq_load.bundle
106ae7000-106ae8000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/iseq_load.bundle
106ae8000-106ae9000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/iseq_load.bundle
106ae9000-106aec000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/string.bundle
106aec000-106aed000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/string.bundle
106aed000-106aee000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/string.bundle
106aee000-106af2000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/string.bundle
106af2000-106af3000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/struct.bundle
106af3000-106af4000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/struct.bundle
106af4000-106af5000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/struct.bundle
106af5000-106af6000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/struct.bundle
106af6000-106af7000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/time.bundle
106af7000-106af8000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/time.bundle
106af8000-106af9000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/time.bundle
106af9000-106afa000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/-test-/time.bundle
106afa000-106b45000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/date_core.bundle
106b45000-106b46000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/date_core.bundle
106b46000-106b47000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/date_core.bundle
106b47000-106b48000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/date_core.bundle
106b48000-106b6a000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/date_core.bundle
106b6a000-106b70000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/stringio.bundle
106b70000-106b71000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/stringio.bundle
106b71000-106b72000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/stringio.bundle
106b72000-106b76000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/stringio.bundle
106b76000-106b7a000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/strscan.bundle
106b7a000-106b7b000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/strscan.bundle
106b7b000-106b7c000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/strscan.bundle
106b7c000-106b7f000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/strscan.bundle
106b7f000-106b8b000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/zlib.bundle
106b8b000-106b8c000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/zlib.bundle
106b8c000-106b8d000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/zlib.bundle
106b8d000-106b96000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/zlib.bundle
106b96000-106b97000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/utf_16be.bundle
106b97000-106b98000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/utf_16be.bundle
106b98000-106b99000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/utf_16be.bundle
106b99000-106b9a000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/utf_16be.bundle
106b9a000-106b9c000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/utf_16_32.bundle
106b9c000-106b9d000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/utf_16_32.bundle
106b9d000-106b9e000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/utf_16_32.bundle
106b9e000-106b9f000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/utf_16_32.bundle
106b9f000-106bb3000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/single_byte.bundle
106bb3000-106bb8000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/single_byte.bundle
106bb8000-106bb9000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/single_byte.bundle
106bb9000-106bbc000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/enc/trans/single_byte.bundle
106bbc000-106bc9000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/objspace.bundle
106bc9000-106bca000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/objspace.bundle
106bca000-106bcb000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/objspace.bundle
106bcb000-106bd5000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/objspace.bundle
106bd5000-106bf9000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/socket.bundle
106bf9000-106bfa000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/socket.bundle
106bfa000-106bfb000 rw- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/socket.bundle
106bfb000-106c0c000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/socket.bundle
106c0c000-106c0e000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/io/wait.bundle
106c0e000-106c0f000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/io/wait.bundle
 /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/io/wait.bundle                                                                                      
106c10000-106c11000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/io/wait.bundle
106c11000-106c18000 r-- /Library/Preferences/Logging/.plist-cache.wQa9utET
106c18000-106c20000 r-x /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/fiddle.bundle
106c20000-106c21000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/fiddle.bundle
github.com/Shopify/ruby/.ext/x86_64-darwin19/fiddle.bundlec_compact 81109=test_argf 81110=test_files_lib 81111=test_file_exhaustive 81118=test_ossl 81120=te
106c22000-106c29000 r-- /Users/maximecb/src/github.com/Shopify/ruby/.ext/x86_64-darwin19/fiddle.bundle
10769b000-10772d000 r-x /usr/lib/dyld
10772d000-107732000 r-- /usr/lib/dyld
107732000-107733000 rw- /usr/lib/dyld
107733000-107768000 rw- /usr/lib/dyld
107768000-1077a0000 r-- /usr/lib/dyld
1077a0000-10f7a0000 rwx /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
10f7a0000-11099e000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
11099e000-111b9c000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000aabb000-70000aabc000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000aabc000-70000ab3e000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000ab3e000-70000ab3f000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000ab3f000-70000ac61000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000ac61000-70000ac62000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000ac62000-70000ad84000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000ad84000-70000ad85000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000ad85000-70000aea7000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000aea7000-70000aea8000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000aea8000-70000afca000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000afca000-70000afcb000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000afcb000-70000b0ed000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000b0ed000-70000b0ee000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000b0ee000-70000b210000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000b210000-70000b211000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
70000b211000-70000b333000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a0000000-7ff0a0800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a0800000-7ff0a1000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a1000000-7ff0a1800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a1800000-7ff0a2000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a2000000-7ff0a2800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a2800000-7ff0a3000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a3000000-7ff0a3800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a3800000-7ff0a4000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a4000000-7ff0a4800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a4800000-7ff0a5000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a5000000-7ff0a5800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a5800000-7ff0a6000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a6000000-7ff0a6800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a6800000-7ff0a7000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a7000000-7ff0a7800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0a7800000-7ff0a8000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b0000000-7ff0b0800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b0800000-7ff0b1000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b1000000-7ff0b1800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b1800000-7ff0b2000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b2000000-7ff0b2800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b2800000-7ff0b3000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b3000000-7ff0b3800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b3800000-7ff0b4000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b4000000-7ff0b4800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b4800000-7ff0b5000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b5000000-7ff0b5800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b5800000-7ff0b6000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b6000000-7ff0b6800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b6800000-7ff0b7000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b7000000-7ff0b7800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0b7800000-7ff0b8000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0bec00000-7ff0bed00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0bf000000-7ff0bf800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0bf800000-7ff0c0000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c0000000-7ff0c0800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c0800000-7ff0c1000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c1000000-7ff0c1800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c1800000-7ff0c2000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c2000000-7ff0c2800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c2800000-7ff0c3000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c3000000-7ff0c3800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c3800000-7ff0c4000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c4000000-7ff0c4800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c4800000-7ff0c5000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c5000000-7ff0c5800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c5800000-7ff0c6000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c6000000-7ff0c6800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c6800000-7ff0c7000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c7000000-7ff0c7800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0c7800000-7ff0c8000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0cec00000-7ff0ced00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0ced00000-7ff0cee00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0cee00000-7ff0cef00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0cf000000-7ff0cf800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d0000000-7ff0d0800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d0800000-7ff0d1000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d1000000-7ff0d1800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d1800000-7ff0d2000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d2000000-7ff0d2800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d2800000-7ff0d3000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d3000000-7ff0d3800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d3800000-7ff0d4000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d4000000-7ff0d4800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d4800000-7ff0d5000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d5000000-7ff0d5800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d5800000-7ff0d6000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d6000000-7ff0d6800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d6800000-7ff0d7000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d7000000-7ff0d7800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d7800000-7ff0d8000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d8000000-7ff0d8800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d8800000-7ff0d9000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d9000000-7ff0d9800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0d9800000-7ff0da000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0da000000-7ff0da800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0da800000-7ff0db000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0db000000-7ff0db800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0db800000-7ff0dc000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0dc000000-7ff0dc800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0dc800000-7ff0dd000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0dd000000-7ff0dd800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0dd800000-7ff0de000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0de000000-7ff0de800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0de800000-7ff0df000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0df000000-7ff0df800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0df800000-7ff0e0000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e0000000-7ff0e0800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e0800000-7ff0e1000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e1000000-7ff0e1800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e1800000-7ff0e2000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e2000000-7ff0e2800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e2800000-7ff0e3000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e3000000-7ff0e3800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e3800000-7ff0e4000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e4000000-7ff0e4800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e4800000-7ff0e5000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e5000000-7ff0e5800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e5800000-7ff0e6000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e6000000-7ff0e6800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e6800000-7ff0e7000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e7000000-7ff0e7800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0e7800000-7ff0e8000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0ef000000-7ff0ef800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0ef800000-7ff0f0000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f0000000-7ff0f0800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f0800000-7ff0f1000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f1000000-7ff0f1800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f1800000-7ff0f2000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f2000000-7ff0f2800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f2800000-7ff0f3000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f3000000-7ff0f3800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f3800000-7ff0f4000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f4000000-7ff0f4800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f4800000-7ff0f5000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f5000000-7ff0f5800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f5800000-7ff0f6000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f6000000-7ff0f6800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f6800000-7ff0f7000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f7000000-7ff0f7800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f7800000-7ff0f8000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f8000000-7ff0f8800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f8800000-7ff0f9000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f9000000-7ff0f9800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0f9800000-7ff0fa000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fa000000-7ff0fa800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fa800000-7ff0fb000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fb000000-7ff0fb800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fb800000-7ff0fc000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fc000000-7ff0fc800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fc800000-7ff0fd000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fd000000-7ff0fd800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fd800000-7ff0fe000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fe000000-7ff0fe800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0fe800000-7ff0ff000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0ff000000-7ff0ff800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff0ff800000-7ff100000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff100000000-7ff100800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff100800000-7ff101000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff101000000-7ff101800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff101800000-7ff102000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff102000000-7ff102800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff102800000-7ff103000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff103000000-7ff103800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff103800000-7ff104000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff104000000-7ff104800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff104800000-7ff105000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff105000000-7ff105800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff105800000-7ff106000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff106000000-7ff106800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff106800000-7ff107000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff107000000-7ff107800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff107800000-7ff108000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff10ec00000-7ff10ed00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff10f000000-7ff10f800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff110000000-7ff110800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff110800000-7ff111000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff111000000-7ff111800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff111800000-7ff112000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff112000000-7ff112800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff112800000-7ff113000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff113000000-7ff113800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff113800000-7ff114000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff114000000-7ff114800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff114800000-7ff115000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff115000000-7ff115800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff115800000-7ff116000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff116000000-7ff116800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff116800000-7ff117000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff117000000-7ff117800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff117800000-7ff118000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff11ec00000-7ff11ec01000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff11ed00000-7ff11ee00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff11ee00000-7ff11ef00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff11ef00000-7ff11f000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff11f000000-7ff11f800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff11f800000-7ff120000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff120000000-7ff120800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff120800000-7ff121000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff121000000-7ff121800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff121800000-7ff122000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff122000000-7ff122800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff122800000-7ff123000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff123000000-7ff123800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff123800000-7ff124000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff124000000-7ff124800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff124800000-7ff125000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff125000000-7ff125800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff125800000-7ff126000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff126000000-7ff126800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff126800000-7ff127000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff127000000-7ff127800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff127800000-7ff128000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff128000000-7ff12a000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff12a000000-7ff12a100000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff12a100000-7ff12a200000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff12a800000-7ff12b000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff12b000000-7ff12b800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff12ec00000-7ff12ed00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff12f000000-7ff12f800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff130000000-7ff130800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff130800000-7ff131000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff131000000-7ff131800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff131800000-7ff132000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff132000000-7ff132800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff132800000-7ff133000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff133000000-7ff133800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff133800000-7ff134000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff134000000-7ff134800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff134800000-7ff135000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff135000000-7ff135800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff135800000-7ff136000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff136000000-7ff136800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff136800000-7ff137000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff137000000-7ff137800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff137800000-7ff138000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff13ec00000-7ff13ed00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff13ed00000-7ff13ee00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff13ee00000-7ff13ef00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff13ef00000-7ff13f000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff13f000000-7ff13f800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff13f800000-7ff140000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff140000000-7ff140100000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ff140800000-7ff141000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ffee6879000-7ffee687a000 --- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ffee687a000-7ffeea877000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ffeea877000-7ffeea879000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff00000000-7fff80000000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff80000000-7fff89000000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff89000000-7fff89200000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff89200000-7fff89c00000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff89c00000-7fff89e00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff89e00000-7fff8a000000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff8a000000-7fff8a200000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff8a200000-7fff8b600000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff8b600000-7fff8b800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff8b800000-7fff8f000000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff8f000000-7fff8f200000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff8f200000-7fff92400000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff92400000-7fff92600000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff92600000-7fff92800000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff92800000-7fff92a00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff92a00000-7fff92c00000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff92c00000-7fff93000000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff93000000-7fff931f7000 rw- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fff931f7000-7fffc0000000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fffc0000000-7fffffe00000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7fffffe00000-7fffffe01000 r-- /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
7ffffff5b000-7ffffff5c000 r-x /Users/maximecb/src/github.com/Shopify/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby
[IMPORTANT]
Don't forget to include the Crash Report log file under
DiagnosticReports directory in bug reports.

running file: /Users/maximecb/src/github.com/Shopify/ruby/test/ruby/test_gc_compact.rb

Some worker was crashed. It seems ruby interpreter's bug
or, a bug of test/unit/parallel.rb. try again without -j
option.

81105:running:test_gc_compact: Broken pipe
make: *** [yes-test-all] Error 1

YJIT: avoid using deferred compilation if context already has the type info we need

At the moment, we often use deferred compilation to peek at a value on the stack, or to peek at self (see jit_peek_at_stack and jit_peek_at_self). The downside of that is that it breaks blocks into smaller parts. That adds overhead, increases JIT memory usage, and also potentially takes away some optimization opportunities, because our backend is looking at smaller blocks with less opportunities to do peephole optimizations.

I was thinking that in some cases, the context may already have the type information we're looking for. We might already know the type of the value we want to peek at. If that's true, then we could avoid doing deferred compilation in order to peek at value type(s). If we can improve our type tracking (see #460 for example) the need to do deferred compilation might decrease over time as well.

A good first step may be to check how often we actually know all the types we need and may be able to avoid doing deferred compilation. If we choose to go forward, this can also be broken into multiple PRs if it's easier.

Aaron has expressed interest in taking this first issue. I was thinking it might make sense for him to pair with the amazing @jhawthorn if he's available, since John has already made multiple improvements to the type information tracking in the context.

Report instructions causing side-exits in `--ujit-stats`

It would be very useful to know which instructions trigger exits to the interpreter and how often, and display a list sorted by decreasing frequency. That will help us target our efforts to increase coverage.

The simplest way to implement this would be to call a method which takes note of which opcode is at the exit_pc in ujit_gen_exit(). Maybe we can generate a call to a function that takes the exit PC as a parameter when RUBY_DEBUG is set.

https://github.com/Shopify/ruby/blob/microjit/ujit_codegen.c#L55

New `--yjit-stats` entries for bindings usage

It would be useful to collect stats relating to how bindings is used as part of --yjit-stats. That would enable us to easily check for this, and automate checks as well. The code for collecting stats is currently in ujit_iface.c.

Two stats we might want to collect are:

  1. How many times is bindings used?
  2. How many times is bindings used to write over the local variables in a caller (we hope that this never happens)

We're also curious to know if this happens on railsbench in particular.

YJIT: splat args changes reduce ratio in YJIT on railsbench

The changes introduced in the splat args pull requests seem to reduce the percentage of instructions executed in YJIT on railsbench (cause us to side-exit more often), which is the opposite of what would be expected.

I think we need to be more careful in the future about merging optimizations without benchmarking them, especially if they are non-trivial changes, because it's unfortunately too easy to accidentally break things without noticing.

Splat args PRs:
ruby#6341
ruby#6385

The command I used to get the stats from yjit-bench is:

./run_once.sh --yjit-stats benchmarks/railsbench/benchmark.rb
Stats before splat changes, commit 8f37e9c:
method call exit reasons:
                block_arg     228603 (28.7%)
               args_splat     179635 (22.6%)
    optimized_method_call     177094 (22.2%)
                  bmethod      94020 (11.8%)
      iseq_complex_callee      72656 ( 9.1%)
    optimized_method_send      36336 ( 4.6%)
                 kw_splat       6598 ( 0.8%)
           refined_method        853 ( 0.1%)
    cfunc_ruby_array_varg        494 ( 0.1%)
                 keywords         92 ( 0.0%)
            zsuper_method          7 ( 0.0%)
invokesuper exit reasons:
         block       4837 (99.2%)
    me_changed         37 ( 0.8%)
leave exit reasons:
        interp_return    1738367 (96.5%)
    start_pc_non_zero      63476 ( 3.5%)
         se_interrupt         29 ( 0.0%)
getblockparamproxy exit reasons:
    block_param_modified       2383 (100.0%)
getinstancevariable exit reasons:
    idx_out_of_range          3 (100.0%)
setinstancevariable exit reasons:
    (all relevant counters are zero)
opt_aref exit reasons:
    (all relevant counters are zero)
expandarray exit reasons:
    rhs_too_small         14 (93.3%)
            splat          1 ( 6.7%)
opt_getinlinecache exit reasons:
    miss          5 (100.0%)
invalidation reasons:
          method_lookup        226 (43.9%)
    constant_state_bump        200 (38.8%)
       constant_ic_fill         89 (17.3%)
bindings_allocations:         171
bindings_set:                   0
compiled_iseq_count:         5644
compiled_block_count:       22840
invalidation_count:           515
constant_state_bumps:           0
inline_code_size:         2518529
outlined_code_size:       1857506
num_gc_obj_refs:            19977
total_exit_count:         2689038
total_insns_count:       85869680
vm_insns_count:          12047378
yjit_insns_count:        74772973
ratio_in_yjit:              86.0%
avg_len_in_yjit:             27.5
Top-20 most frequent exit ops (100.0% of exits):
    opt_send_without_block:     403111 (42.4%)
                      send:     297707 (31.3%)
               invokesuper:     106591 (11.2%)
               invokeblock:      70222 (7.4%)
               getconstant:      17337 (1.8%)
                  opt_aref:      14065 (1.5%)
                     throw:      10544 (1.1%)
               concatarray:      10018 (1.1%)
               expandarray:       9979 (1.0%)
             setlocal_WC_0:       6261 (0.7%)
        getblockparamproxy:       2531 (0.3%)
        opt_getinlinecache:       1404 (0.1%)
Stats after splat changes, commit: 2387fbf
method call exit reasons: 
                block_arg     259060 (32.4%)
    optimized_method_call     177095 (22.2%)
      iseq_complex_callee     120428 (15.1%)
                  bmethod      94020 (11.8%)
              iseq_zsuper      46022 ( 5.8%)
    optimized_method_send      36336 ( 4.6%)
      iseq_ruby2_keywords      35515 ( 4.4%)
         args_splat_cfunc      13902 ( 1.7%)
                 kw_splat      12626 ( 1.6%)
      args_splat_non_iseq       2123 ( 0.3%)
           refined_method        854 ( 0.1%)
    cfunc_ruby_array_varg        494 ( 0.1%)
                 keywords         92 ( 0.0%)
         iseq_arity_error          7 ( 0.0%)
            zsuper_method          7 ( 0.0%)
invokesuper exit reasons: 
         block       4846 (70.5%)
    me_changed       2032 (29.5%)
leave exit reasons: 
        interp_return    1759531 (96.5%)
    start_pc_non_zero      63476 ( 3.5%)
         se_interrupt         25 ( 0.0%)
getblockparamproxy exit reasons: 
    block_param_modified         97 (100.0%)
getinstancevariable exit reasons:
    idx_out_of_range          3 (100.0%)
setinstancevariable exit reasons:
    (all relevant counters are zero)
opt_aref exit reasons: 
    (all relevant counters are zero)
expandarray exit reasons: 
            splat       9965 (99.9%)
    rhs_too_small         14 ( 0.1%)
opt_getinlinecache exit reasons: 
    miss          5 (100.0%)
invalidation reasons: 
          method_lookup        227 (44.2%)
    constant_state_bump        198 (38.5%)
       constant_ic_fill         89 (17.3%)
bindings_allocations:         171
bindings_set:                   0
compiled_iseq_count:         5645
compiled_block_count:       22914
invalidation_count:           514
constant_state_bumps:           0
inline_code_size:         2586980
outlined_code_size:       1850491
num_gc_obj_refs:            16085
total_exit_count:         2710549
total_insns_count:       85670405
vm_insns_count:          12373040
yjit_insns_count:        74248383
ratio_in_yjit:              85.6%
avg_len_in_yjit:             27.0
Top-20 most frequent exit ops (100.0% of exits):
    opt_send_without_block:     440911 (46.4%)
                      send:     266590 (28.0%)
               invokesuper:     112535 (11.8%)
               invokeblock:      70221 (7.4%)
               getconstant:      17337 (1.8%)
                  opt_aref:      14065 (1.5%)
                     throw:      10543 (1.1%)
               expandarray:       9979 (1.0%)
             setlocal_WC_0:       6260 (0.7%)
      opt_getconstant_path:       1404 (0.1%)

We went from 86.0% in YJIT to 85.6%.

Other changes have been made between these two commits, but we can also see that the opt_send_without_block exits increased from 42.4% of exits to 46.4%, meaning we're exiting a higher proportion of the time specifically in send.

YJIT: improve support for optional parameters at function entry points

In CRuby, optional parameters are handled by having the ISEQ for methods begin executing at different PC values depending on which parameters are passed or not.

YJIT installs a JIT entry point when the call threshold is reached, but it has only a single entry point, no matter what PC execution begins at. In order to make sure we handle things correctly, we have a function gen_pc_guard which checks that the PC is what we expect. We are able to peek at the PC in gen_entry_point so that we can support nonzero PCs, but we only support one possible value.

In railsbench, the current stats show:

./run_once.sh --yjit-stats benchmarks/railsbench/benchmark.rb
start_pc_non_zero      63476

Which has a frequency close to invokeblock:

invokeblock:      69840 (7.4%)
getconstant:      17337 (1.8%)

So this happens relatively often. Those exits also happen right at the beginning of an iseq, meaning we don't execute any instructions in that iseq, and the time we spend entering and exiting YJIT is definitely wasted, so they might disproportionately affect our performance.

If we wanted to support multiple entry PCs with side-chaining and stubs, we could implement this in branch_stub_hit, but I think the logic for branch_stub_hit is already fairly complex, it already handles a lot of different things, so we might actually want a new kind of entry stub that calls an entry_stub_hit function just to keep things simpler. When that stub is hit, we should peek at the current PC and generate a guard against it, followed by a side-chain that triggers another stub.

I don't know what the total performance impact will be, so this isn't necessarily high priority, but it's something we can think about.

@XrXr @tenderlove @jhawthorn

YJIT: things to wrap up for Ruby 3.2

This is a list of things to do and wrap up in time for the Ruby 3.2 release ๐ŸŽ๐ŸŽ„

  • Fix memory leak bug #463
  • Update default --yjit-call-threshold to 30 ruby#6850
  • #461
  • Complete #446
  • Double-check message ruby --yjit prints when built without YJIT support
  • Update yjit.md and fix inaccurate/outdated information
  • Double-check CRuby NEWS.md for YJIT
  • Investigate continuous growth of object shapes count on SFR ๐Ÿฆ–
  • Update CRuby release notes for YJIT
    • Move closer to the top of the document
    • Brag more about performance and memory usage (provide specifics)
  • Create a performance graph for the CRuby release notes
  • Implement fix for pathological shapes growth case (transition to hash)
  • Fix ARM64 CI illegal instruction crash bug triggered by code GC https://bugs.ruby-lang.org/issues/19234
  • Post on Ruby core Slack, remind people to install rustc >= 1.58.0
  • Fix Zeitwerk YJIT bug: https://github.com/eileencodes/zeitwerk_yjit_repro
  • Make sure that Ruby head passes all checks on the Shopify Core CI with YJIT enabled
  • Re-enable Ractor tests for YJIT before the release (see ruby@85f041c and ruby@7b38853)

If you think of anything else we need to wrap up or keep track of, please mention it in the comments :)

YJIT: check if YJIT can easily compile and run on a Raspberry Pi 4 ๐Ÿค” and benchmark it.

Iโ€™ve been meaning to find out of YJIT can compile and run easily on a Raspberry Pi (and if not report issues).

If it does run, I'd really like to benchmark it using yjit-bench on that platform, and maybe produce some graphs to share on twitter or future blog posts and talks. It could be really cool if we could speed up Ruby on that platform :)

YJIT installation instructions: https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md#building-yjit
Note that YJIT should be built in release mode for benchmarking (not dev/debug).

Summary is that in order to build YJIT, rustc >= 1.58.0 should be installed on the host machine. Then, YJIT should automatically build when compiling Ruby head (through any method). The command ruby -v --yjit should contain the string +YJIT if YJIT has been compiled.

Please report performance results or any issues (or special steps you needed to take) on this issue! If there's anything we need to fix, we'd like to know about it :)

Investigate slow language shootout benchmarks

Last week I added two of the classic computer language shootout benchmarks to our suite. To my surprise, even though we do pretty well on some larger benchmarks, we do poorly on these two benchmarks. These two are nbody and binary-trees. The performance is about the same as in the interpreter, which is a bit puzzling. One of the first steps might be to run with --yjit-stats to see if our coverage is bad. Beyond that, profiling, etc. might also be useful.

YJIT: test that configure script auto-enables building YJIT in dev mode on supported platform(s)

We've added code in configure.ac to auto-enable building YJIT on x86/arm64, on Linux/BSD/MacOS. I'm slightly worried that this code could get reverted or broken at some point.

It would make sense to at least test that on Linux/x86-64, YJIT automatically builds in dev mode. This can probably done with a little bit of shell scripting, given that ruby -v --yjit will contain the string YJIT if the binary is built with YJIT. Alternatively, just trying to call --yjit-stats and checking the return code would also work.

Attempt to set memory executable before setting up YJIT and deactivate YJIT on failure

Using Docker and QEMU, running what looks like x86-based YJIT on an ARM64 host, @byroot encountered some problems. That makes sense, and it's a great example of the kind of platform we will probably never test regularly.

But he points out that if we did a quick capability check for setting memory as executable, we could refuse to activate YJIT if it fails. I've seen this error happen before on weird platforms, and that sounds like a very sane approach to it. Then we'd have no YJIT in those weird cases, but also few-or-no bug reports.

@XrXr - does this seem like a reasonable approach to you?

When YJIT is used with very low memory, we show an unnecessary crash report on console when we run out of memory

If I set "ulimit -Sv 100000" on the x86 benchmark CI machine and then run Rubykon, I get a crash report with YJIT, but not without YJIT:

ulimit -Sv 100000

# Fine, no crash
WARMUP_ITRS=1 MIN_BENCH_ITRS=10 MIN_BENCH_TIME=0 ruby -I./harness benchmarks/rubykon/benchmark.rb

# Bad, prints a crash report
WARMUP_ITRS=1 MIN_BENCH_ITRS=10 MIN_BENCH_TIME=0 ruby -I./harness --yjit-call-threshold=1 benchmarks/rubykon/benchmark.rb

However, the crash report is exactly what you'd hope as far as the actual error:

ruby: yjit: mmap:: Cannot allocate memory
ruby: [BUG] mmap failed
ruby 3.2.0dev (2022-10-30T14:21:31Z master 7ed10abdd9) +YJIT [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0003 E:0019a0 DUMMY  [FINISH]


-- C level backtrace information -------------------------------------------
mmap: Cannot allocate memory
ruby(0x5602426bcf48) [0x5602426bcf48]
[0x5602427d402f]
[0x5602424b5e93]

So we just need to recognise this case and not dump a crash report to console.

When we use very low --yjit-exec-mem-size, YJIT segfaults on x86_64

With Ruby SHA 7ed10ab:

cd yjit-bench
WARMUP_ITRS=1 MIN_BENCH_ITRS=10 MIN_BENCH_TIME=0  ruby --yjit-call-threshold=1 --yjit-exec-mem-size=3 -I./harness benchmarks/30k_methods.rb

Notice the very low --yjit-exec-mem-size.

We get a crash report:

ruby 3.2.0dev (2022-10-30T14:21:31Z master 7ed10abdd9) +YJIT [x86_64-linux]
benchmarks/30k_methods.rb:120013: [BUG] Segmentation fault at 0x0000000000000fa1
ruby 3.2.0dev (2022-10-30T14:21:31Z master 7ed10abdd9) +YJIT [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0007 p:---- s:0033 e:000032 CFUNC  :times
c:0006 p:0005 s:0029 e:000028 BLOCK  benchmarks/30k_methods.rb:120013
c:0005 p:0002 s:0026 e:000025 BLOCK  /home/ubuntu/ym/yjit-bench/harness/harness.rb:25
c:0004 p:0010 s:0023 e:000022 METHOD /home/ubuntu/.rubies/ruby-yjit-metrics-prod/lib/ruby/3.2.0+3/benchmark.rb:311
c:0003 p:0021 s:0018 e:000017 METHOD /home/ubuntu/ym/yjit-bench/harness/harness.rb:25
c:0002 p:90035 s:0006 e:000005 EVAL   benchmarks/30k_methods.rb:120012 [FINISH]
c:0001 p:0000 s:0003 E:001f80 DUMMY  [FINISH]

-- Ruby level backtrace information ----------------------------------------
benchmarks/30k_methods.rb:120012:in `<main>'
/home/ubuntu/ym/yjit-bench/harness/harness.rb:25:in `run_benchmark'
/home/ubuntu/.rubies/ruby-yjit-metrics-prod/lib/ruby/3.2.0+3/benchmark.rb:311:in `realtime'
/home/ubuntu/ym/yjit-bench/harness/harness.rb:25:in `block in run_benchmark'
benchmarks/30k_methods.rb:120013:in `block in <main>'
benchmarks/30k_methods.rb:120013:in `times'

-- Machine register context ------------------------------------------------
 RIP: 0x000055a8cafa3128 RBP: 0x000055a8cd0fb2c0 RSP: 0x00007fff61bf34e0
 RAX: 0x0000000000000fa1 RBX: 0x00007fed745080f8 RCX: 0x000055a8cde9e7c0
 RDX: 0x00007fed74508130 RDI: 0x000055a8cc49b550 RSI: 0x000055a8cc49b550
  R8: 0x0000000000000004  R9: 0x00007fed74508548 R10: 0x00007fed744acd60
 R11: 0x000055a8cc74c7e0 R12: 0x000055a8cc49b550 R13: 0x00007fed74607e90
 R14: 0x000055a8cd0fb2d0 R15: 0x00007fed74607ed0 EFL: 0x0000000000010202

-- C level backtrace information -------------------------------------------
/home/ubuntu/.rubies/ruby-yjit-metrics-prod/bin/ruby(rb_print_backtrace+0x11) [0x55a8cab7dcdd] vm_dump.c:770
/home/ubuntu/.rubies/ruby-yjit-metrics-prod/bin/ruby(rb_vm_bugreport) vm_dump.c:1065
/home/ubuntu/.rubies/ruby-yjit-metrics-prod/bin/ruby(rb_bug_for_fatal_signal+0xec) [0x55a8cac9523c] error.c:819
/home/ubuntu/.rubies/ruby-yjit-metrics-prod/bin/ruby(sigsegv+0x4d) [0x55a8caad15ad] signal.c:964
/lib/x86_64-linux-gnu/libpthread.so.0(__restore_rt+0x0) [0x7fed74b46420] ../sysdeps/pthread/funlockfile.c:28
[0x55a8cafa3128]

Dynamic instruction coverage stats (--ujit-stats)

We have to increase the proportion of instruction that gets executed in the JIT as opposed to the interpreter, to increase our "JIT coverage", so to speak. In order to do that, it would be really useful to have statistics such as the percentage of instructions executed by JIT over the total number of bytecode instructions executed.

I think it would also be very helpful to know which instructions trigger exits to the interpreter and how often, and display a list sorted by decreasing frequency. That will help us target our efforts to increase coverage.

Additional thoughts:

  • Maximize the readability of the --ujit-stats dump, make it human readable and easy to parse
  • Make it so the output of the dump can easily be converted into a CSV file (space separated) or grabbed by a script

Investigate how `defined` is used in railsbench

Should collect percentages for how defined is used in railsbench (from microjit-bench). Makes up ~5% of exits to the interpreter.

Is it mostly used for constants, for instance variables, or something else?

Intermittent Ractor bug found with YJIT debug builds

Looks like occasionally, rarely, we hit an error in CI on Ractor bootstrap tests.

Example: https://github.com/ruby/ruby/runs/6863158408?check_suite_focus=true

Looks like it's happening on a YJIT-debug build (--yjit-enable=dev) but without YJIT actually enabled at runtime (no RUN_OPTS). The assertion that's failing doesn't look like one of ours either -- it's in vm_method.c line 1354 in callable_method_entry, asserting that it was passed a T_CLASS or a T_ICLASS.

After I can reproduce it with a YJIT debug build, I'll see if it reproduces on a non-YJIT debug Ruby build and go from there.

Propagate type information (context) across basic blocks

The first step will be to do a refactoring to allow us to have a list of multiple block versions per basic block. I think that I will use a linked list because it's a good fit here, since each block_t object is already heap allocated.

The second step will be to implement a matching function to look for compatible block versions.

Slowdown in some benchmarks after Rust port of YJIT

Looks like some of our benchmarks have slowed down a bit after the YJIT port, and others are noisy enough it's hard to tell. Worth exploring the definitely-slower ones to figure out what changed, and generally make sure code quality is where we want it.

This isn't shocking - we found a few subtle slowdowns during porting, makes sense there would be more left.

Looking at the speed-over-time deep dive (https://speed.yjit.org/timeline-deep), some benchmarks are slower. I'll compare 26th April at 7pm to 29th April at 9am below, so these slowdowns will vary a bit per-run. Benchmarks that seem to have gotten worse with Rust-YJIT are:

  • chunky_png (5.5% slower)
  • getivar (160% slower - but also noisy and a microbenchmark)
  • nbody (28% slower)
  • optcarrot (29% slower)
  • rubykon (17.5% slower)

Possibly worse but hard to tell due to measurement error:

  • hexapdf (0.3% slower)
  • lee (1.3% slower)
  • respond_to (3.5% slower and a microbenchmark)

Relevant links:

Look into ActiveRecord (micro)benchmark for yjit-bench

Look into creating or borrowing a small to medium size benchmark for ActiveRecord, to be included in the yjit-bench repo. If borrowing an existing benchmark, make sure to include the LICENSE file into the benchmark's subdirectory.

Avoid moving REG_SP (make it a base pointer)

This is an idea to improve how we handle stack addresses to make codegen simpler to write and possibly improve performance.

Currently, REG_SP always has the same value of reg_cfp->sp, but to avoid unnecessary register/memory reads/writes we store an sp_offset and build our memory operands (ctx_sp_opnd) using that offset. When we call into C code, call another method, or return to the interpreter, we call jit_save_sp, which updates both REG_SP and REG_CFP->sp.

This causes some awkwardness in our codegen, because any memory operands we build using ctx_sp_opnd become invalid when REG_SP is updated (since they are relative to REG_SP). This requires us to be careful about when these operands are created vs used.

For example in gen_opt_aref

            // About to change REG_SP which these operands depend on. Yikes.
            mov(cb, R8, recv_opnd);
            mov(cb, R9, idx_opnd);

            // Write sp to cfp->sp since rb_hash_aref might need to call #hash on the key
            jit_save_sp(jit, ctx);

            yjit_save_regs(cb);

            mov(cb, C_ARG_REGS[0], R8);
            mov(cb, C_ARG_REGS[1], R9);

I think it would be possible to avoid this issue by treating REG_SP as a base pointer of the stack rather than a moving stack pointer (should we also rename it?). Basically this means that REG_SP would not move throughout the iseq, it would keep the same value it had at the YJIT entry point. Updating REG_CFP->sp would be done in the same way in the same places, however we'd now use a temporary register instead of updating REG_SP (same as we do for jit_save_pc).

In addition to making codegen simpler to write, I believe this will reduce the number of block versions.

Currently there is this comment at the end of gen_send_cfunc:

    // Note: gen_send_iseq() jumps to the next instruction with ctx->sp_offset == 0
    // after the call, while this does not. This difference prevents
    // the two call types from sharing the same successor.

Calling an iseq ends up with an sp_offset of 0, but calling a cfunc ends up with an sp_offset of 1 (we must push the return value from the cfunc ourselves). If we instead use the base SP rather than a moving SP, the sp_offsets will be the same leaving both basic blocks, therefore have compatible ctx, and can jump into the same target.

Another potential advantage (less sure of this) is that by not moving the register we will avoid a data dependency in following stack operations, which may improve CPU pipelining by avoiding stalls.

YJIT: upstream `yjit_backend_ir` branch (new backend)

Starting from yjit_backend_ir (currently: d17b53c), I'll create a new branch without merge commits and with some level of commit-squashing. TODO items include:

  • Linearize the commit history, removing merge commits
  • Update that commit history to be relative to a recent CRuby-master commit
  • Squash multi-commit PRs to a single commit
  • For each PR, make sure the Shopify/ruby PR URL is in the commit message (git filter-branch?)
  • Mention that arm64 support is less mature than x86-64 support in yjit.md
  • Determine how much to squash the commit history
  • Doublecheck rebased compiler code - did we include everything we wanted, and exclude everything we wanted?
  • Review test code - did we include/exclude everything correctly? Do we want to reduce test-code changes in the history?
  • Merge/update CI workflows, including cirrus.yml; grab anything useful from test_yjit_new_backend.rb. Remove temp backend tests workflow.
  • Add any final commits that have been pushed to yjit_backend_ir
  • Open a ruby/ruby PR

I'm biasing toward fewer commit-squashes early in the process, since it's easier to squash than un-squash if needed later.

YJIT: run our own Mastodon instance and federate it

In the last YJIT team meeting, @jimmyhmiller suggested that we could potentially run our own Mastodon instance and federate it to get traffic. I quite like this idea because Mastodon is a large open source rails app, with real-world relevance. The best part though is that, as Jimmy pointed out, we could instrument this as much as we want without worrying about disrupting production.

There is currently an open PR on Mastodon to add Ruby 3.1 support: mastodon/mastodon#21061

I'm trying to get attention from community members there so that the PR gets approval. If that can get merged, then I think upgrading to Ruby 3.2 would be a relatively small change, and we could even offer help to accelerate the process.

One tricky bit is that if we wanted a performance comparison against a baseline using the interpreter, we'd need two identical instances, which may be hard/impractical. However, we might be able to just compare our instance against its own past performance, and we might be able to track a number of useful stats, even if we can't easily compare against interpreter performance.

If we create such an instance, we could call it ruby social, or YJIT social or something like that, and run it on the cheapest GCP instance.

YJIT: precise stack scanning for code GC

Kokubun identified a limitation with the current code GC approach. This is not a critical problem because we can still run several code GC cycles. However, it could be an issue for some very long running programs. It would be nice if we can fix it for 3.2, but if we don't have time, that is an ok answer as well.

Currently, if an ISEQ is on the Ruby stack, we keep all of its code pages alive. The issue is that we are slightly overestimating the amount of live pages, and we may start generating code again for these ISEQs, and said ISEQs may remain on the stack. As such, these ISEQs will accumulate a few extra dead pages at every code GC cycle.

Ideally, we would precisely track which code pages are referenced by C return addresses on the stack, and only keep those specific pages alive. This solves the problem of old versions of C exit code that can't be returned to remaining live.

We use the jit_return field to track return addresses for some C function calls (the ones that are re-entrant, not leaves). However, we don't create a Ruby frame for every C function call, in particular leaf functions. I'm wondering if we already create a Ruby frame with a jit_return field for every C function that could trigger code GC? Also not sure how Ruby fibers interact with the C stack.

@XrXr @k0kubun

Implement ruby-to-ruby calls in `opt_send_without_block`

If we know the identity of a callee, it should be possible to directly jump to its entry block, and eventually to pass along type information to the callee. The first step is to implement basic Ruby-to-Ruby calls that can jump to the entry block when the callee is known and there is no vararg, etc.

YJIT: implement send (optimized calls)

I've been working on this for a few workdays now. A tracking issue seems appropriate.

Send is implemented by CRuby as a special optimised function call type. As such, it doesn't push an extra stack frame. Given how much extra code a CRuby call-with-stack-frame generates, that's probably a significant optimisation.

The special-case call code for send in CRuby lives in vm_eval.c, mostly.

I have a branch that kinda-mostly works, but does not 100% fully work. And send is likely to be tricky. I've added a bunch of unit tests, but I'm not 100% sure they don't side-exit in weird ways that keep me from seeing all the bugs. I'll need to check that.

Type capture mechanism

It would be nice to have a type capture mechanism so that we can specialized based on potentially unknown types while generating code. This could be used to request the type of the Nth operand on the stack, with 0 being the topmost.

type ctx_capture_top_type(ctx_t* ctx)

If the type is unknown, a branch and code patching will be used to extract the type. Compilation can then be halted based on a special return value.

The mechanism can be generalized to capture things like object classes, method identity. It can also be used to speculate based on how a property is to be read on an object (field on object vs extended table). Any kind of query, with the benefit that we can reduce code size. Though we should probably start by implementing a less general mechanism that only does type capture for stack values.

YJIT: memory leak exposed by code GC

I decided to run an experiment to check if we had any memory leaks in YJIT by running railsbench in a loop, triggering a code GC every iteration and checking the memory usage. It looks like the memory usage does increase over time, and quite fast. The issue reproduces with both release and dev builds.

To be clear, I don't necessarily think that the code GC itself is causing the leak. The leak is probably somewhere else in YJIT, it's just that triggering code GC causes us to compile more code, which causes more Rust objects to be allocated. I suspect we maybe don't free branches, blocks (or other resources we use to keep track of invalidations?) correctly.

Either way, I'm not overly worried. This probably won't be too hard to fix ๐Ÿคž๐Ÿคž , and we still have time before the 3.2 release.

I made a small modification to harness-continuous in yjit-bench to print the following data:

$ git diff harness-continuous 
diff --git a/harness-continuous/harness.rb b/harness-continuous/harness.rb
index 29a8aa7..49204a3 100644
--- a/harness-continuous/harness.rb
+++ b/harness-continuous/harness.rb
@@ -32,5 +32,23 @@ def run_benchmark(_)
     iterations = 1 if iterations.zero?
 
     start_time = end_time
+
+    if defined? RubyVM::YJIT
+      puts ""
+      puts "triggering code GC"
+      RubyVM::YJIT::code_gc
+
+      stats = RubyVM::YJIT::runtime_stats
+      if stats
+        puts "code_gc_count: #{stats[:code_gc_count]}"
+        puts "live_page_count: #{stats[:live_page_count]}"
+
+        if stats.key?(:yjit_alloc_size)
+          alloc_size = stats[:yjit_alloc_size].to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
+          puts "yjit_alloc_size: #{alloc_size} bytes"
+        end
+      end
+    end
+
   end
 end

Then we can monitor code GC and Rust alloc size for railsbench as follows:

$ ruby --yjit --yjit-stats -I./harness-continuous benchmarks/railsbench/benchmark.rb

triggering code GC
code_gc_count: 1
live_page_count: 2
yjit_alloc_size: 13,545,989 bytes
0.17841681128845283

triggering code GC
code_gc_count: 2
live_page_count: 2
yjit_alloc_size: 18,455,681 bytes
0.1921023275312122

triggering code GC
code_gc_count: 3
live_page_count: 2
yjit_alloc_size: 23,362,569 bytes
0.1877545012261644

...

triggering code GC
code_gc_count: 13
live_page_count: 2
yjit_alloc_size: 72,417,105 bytes

And it just keeps growing. I've checked with ps that the rss of the process will grow to 500MB+ (and presumably forever):

$ps x -o command,etime,rss,vsz | grep "\-\-yjit"
ruby --yjit --yj       02:41 544308 37022456
maximecb@Maximes-MBP-2 yjit % 

Tagging @XrXr @k0kubun (if you see this over the weekend, please enjoy your weekend, this can wait until next week).

Disassembly strings

For the MicroJIT prototype, not being able to see the generated code was OK, but as we migrate to a more sophisticated JIT with control flow and various optimizations, it will become increasingly important to be able to look at the machine code we produce.

The simplest strategy is not to implement a disassembler, but just to just store stings associated with machine code addresses in a code block. Then each instruction can simply write a disassembly string for its mnemonic and its arguments. That has the added benefit that we can also write comments in the generated code (eg: which Ruby bytecode instruction is this, why are these instructions here).

Because there's overhead associated with storing disassembly strings, we will want to add a --ujit-disasm command-line flag to enable/disable this. I would propose that we add a Ruby method to print the disassembly for a method, similar to the existing RubyVM::InstructionSequence.disasm(method(:hello)). This would then print a listing of the machine instructions for the method, in increasing order of machine code addresses. This can be done by querying for basic blocks associated with the iseq of the method.

YJIT: optimize `setinstancevariable` using object shapes

Currently, for setinstancevariable, we always call a C function because of write barriers because we don't want to deal with the complexity of write barriers in YJIT. This is pretty slow and inefficient.

However, it's possible to know which generation an object is from based on header bits. We may also be able to know statically that write barriers are not necessary (i.e.: writing an integer property into an object).

We should be able to implement polymorphic inline caches for setinstancevariable in YJIT and make use of them when write barriers are not required. Potentially, we could start by checking at compile time if we know based on the type of the value being written that write barriers won't be necessary. We could also peek at the header bits of the object we're writing to and insert a dynamic guard. Only if we don't think write barriers won't be needed would we then generate code for a fast path using polymorphic inline caches. Otherwise we could rely on the old system using a C function call.

This is a bit more complex than what we currently have for getinstancevariable, but it seems manageable.

@tenderlove has expressed that he would like to tackle this after object shapes are upstreamed.

Optimise shovel operator (<<) for string concatenation

Based on our analysis of Liquid, we suspect that optimising the string concatenation operator can give us some good gains in performance. We'd also like a yjit-bench microbenchmark for string concatenation (done) to check our work.

I've been reading through the CRuby source for << (a.k.a. rb_str_concat in CRuby's string.c) and I see three interesting levels of optimisation.

Hypothesis 1: If the receiver and (single) argument of the shovel operator are both strings, we can call rb_str_append on them rather than rb_str_concat, which saves a Ruby function call plus a C function call and perhaps gains us a bit of cache locality. Rb_str_concat's code is nearly all concerned with appending an integer/character second argument, which almost never happens. This seems pretty easy, and like a fairly small CPU savings in most cases. I'll implement it first.

Hypothesis 2: if the receiver and argument are both (YJIT's idea of) strings, that might guarantee that the RB_TYPE_P of both is T_STRING. If so, we can skip rb_str_concat and rb_str_append and call straight down to rb_str_buf_append, avoiding another layer of C function calls and (sometimes?) an in-place destructive to_str on the second argument. This needs a bit of extra checking about RB_TYPE_P for objects of type String, so I'll do this next.

Hypothesis 3: if everything in hypothesis 2 is true and the two have the same string encoding (e.g. binary, ASCII, UTF-8) and a compatible coderange type (7bit vs Valid vs Unknown vs Broken), we can just call through to rb_str_cat, a much simpler function, which mostly just concatenates the two string buffers together. This probably requires a guard on the generated code to verify that its encoding and coderange are as-expected. This would be a potentially-large CPU savings with much better cache locality. But it also requires some nontrivial generated code. I'll look at this after the first two are done.

YJIT: optimize `opt_aref` with arrays and integer indices

Aaron indicated that opt_aref uses a C function call for every element read, we call rb_ary_entry_internal. It' understandable why that is as the logic for rb_ary_entry_internal is fairly convoluted.

That code has to deal with:

  • Qnil if index out of bounds
  • Negative indices
  • embedded arrays vs not

However, it's also pretty slow. We should be able to generate a faster instruction sequence, possibly using csel instructions to avoid branches.

This might make a performance difference in optcarrot as well as those pesky language shootout benchmarks ๐Ÿ˜†

Prototype type-specialization with temps and integer types

The simplest thing to do, to start playing with type-specialization, would be to propagate types within blocks, but stop at branch instructions.

This will require modifying the context struct ctx_t to have somewhere to store local variable types.

We can start by propagating integer types and constants between instructions like putobject_INT2FIX_1_, opt_plus, opt_minus, etc. A good candidate benchmark to test such optimizations is optcarrot. We might also be able to eliminate multiple redundant array type checks.

Counter printing bug with --ujit-stats

I'm getting an error when trying to print the stat counters on the yjit branch:

./miniruby --ujit-stats -e1              

***uJIT: Printing runtime counters from ujit.rb***
opt_send_without_block exit reasons: 
<internal:ujit>:75:in `print_counters': undefined method `first' for nil:NilClass (NoMethodError)
	from <internal:ujit>:63:in `_print_stats'
compiled_iseq_count:            2
main_block_code_size:     0.0 MiB
side_block_code_size:     0.0 MiB
vm_insns_count:               506
ujit_exec_insns_count:        129
ratio_in_ujit:              20.3%
total_exit_count:              51
most frequent exit op:
    opt_send_without_block:         27 (52.9%)
                    opt_gt:         24 (47.1%)
                  setlocal:          0 (0.0%)
             getblockparam:          0 (0.0%)
             setblockparam:          0 (0.0%)
        getblockparamproxy:          0 (0.0%)
                getspecial:          0 (0.0%)
                setspecial:          0 (0.0%)
       getinstancevariable:          0 (0.0%)
       setinstancevariable:          0 (0.0%)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.