summaryrefslogtreecommitdiff
path: root/yjit_codegen.h
Commit message (Collapse)AuthorAgeFilesLines
* Deduplicate side exitsAlan Wu2021-10-201-2/+5
| | | | | | | | Send instructions currently generate the exact same side exit twice. Cache the exit the first time we generate it. Also add a comment explaining what side exits do. Closes GH-117.
* typo, rename, commentAlan Wu2021-10-201-1/+1
|
* TracePoint supportAlan Wu2021-10-201-0/+5
| | | | | | | | | | | | | | | | | | | | | | This change fixes some cases where YJIT fails to fire tracing events. Most of the situations YJIT did not handle correctly involves enabling tracing while running inside generated code. A new operation to invalidate all generated code is added, which uses patching to make generated code exit at the next VM instruction boundary. A new routine called `jit_prepare_routine_call()` is introduced to facilitate this and should be used when generating code that could allocate, or could otherwise use `RB_VM_LOCK_ENTER()`. The `c_return` event is fired in the middle of an instruction as opposed to at an instruction boundary, so it requires special handling. C method call return points are patched to go to a fucntion which does everything the interpreter does, including firing the `c_return` event. The generated code for C method calls normally does not fire the event. Invalided code should not change after patching so the exits are not clobbered. A new variable is introduced to track the region of code that should not change.
* Add a guard that we start executing on the first PCAaron Patterson2021-10-201-1/+1
| | | | | | | Methods with optional parameters don't always start executing at the first PC, but we compile all methods assuming that they do. This commit adds a guard to ensure that we're actually starting at the first PC for methods with optional params
* Implement send with blocksAlan Wu2021-10-201-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | * Implement send with blocks Not that much extra work compared to `opt_send_without_block`. Moved the stack over flow check because it could've exited after changes are made to cfp. * rename oswb counters * Might as well implement sending block to cfuncs * Disable sending blocks to cfuncs for now * Reconstruct interpreter sp before calling into cfuncs In case the callee cfunc calls a method or delegates to a block. This also has the side benefit of letting call sites that sometimes are iseq calls and sometimes cfunc call share the same successor. * only sync with interpreter sp when passing a block Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com> Co-authored-by: Aaron Patterson <aaron.patterson@shopify.com>
* Implement greedy versioning. Refactor versioning logic. (#10)Maxime Chevalier-Boisvert2021-10-201-1/+1
| | | | | | * Implement eager versioning. Refactor versioning logic. * Add --version-limit and --greedy-versioning command-line args
* Yet Another Ruby JIT!Jose Narvaez2021-10-201-0/+47
Renaming uJIT to YJIT. AKA s/ujit/yjit/g.