зеркало из https://github.com/github/ruby.git
Remove more code
This commit is contained in:
Родитель
5d819b9a15
Коммит
c263ce9c80
69
mjit.c
69
mjit.c
|
@ -7,64 +7,6 @@
|
||||||
|
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
/* We utilize widely used C compilers (GCC and LLVM Clang) to
|
|
||||||
implement MJIT. We feed them a C code generated from ISEQ. The
|
|
||||||
industrial C compilers are slower than regular JIT engines.
|
|
||||||
Generated code performance of the used C compilers has a higher
|
|
||||||
priority over the compilation speed.
|
|
||||||
|
|
||||||
So our major goal is to minimize the ISEQ compilation time when we
|
|
||||||
use widely optimization level (-O2). It is achieved by
|
|
||||||
|
|
||||||
o Using a precompiled version of the header
|
|
||||||
o Keeping all files in `/tmp`. On modern Linux `/tmp` is a file
|
|
||||||
system in memory. So it is pretty fast
|
|
||||||
o Implementing MJIT as a multi-threaded code because we want to
|
|
||||||
compile ISEQs in parallel with iseq execution to speed up Ruby
|
|
||||||
code execution. MJIT has one thread (*worker*) to do
|
|
||||||
parallel compilations:
|
|
||||||
o It prepares a precompiled code of the minimized header.
|
|
||||||
It starts at the MRI execution start
|
|
||||||
o It generates PIC object files of ISEQs
|
|
||||||
o It takes one JIT unit from a priority queue unless it is empty.
|
|
||||||
o It translates the JIT unit ISEQ into C-code using the precompiled
|
|
||||||
header, calls CC and load PIC code when it is ready
|
|
||||||
o Currently MJIT put ISEQ in the queue when ISEQ is called
|
|
||||||
o MJIT can reorder ISEQs in the queue if some ISEQ has been called
|
|
||||||
many times and its compilation did not start yet
|
|
||||||
o MRI reuses the machine code if it already exists for ISEQ
|
|
||||||
o The machine code we generate can stop and switch to the ISEQ
|
|
||||||
interpretation if some condition is not satisfied as the machine
|
|
||||||
code can be speculative or some exception raises
|
|
||||||
o Speculative machine code can be canceled.
|
|
||||||
|
|
||||||
Here is a diagram showing the MJIT organization:
|
|
||||||
|
|
||||||
_______
|
|
||||||
|header |
|
|
||||||
|_______|
|
|
||||||
| MRI building
|
|
||||||
--------------|----------------------------------------
|
|
||||||
| MRI execution
|
|
||||||
|
|
|
||||||
_____________|_____
|
|
||||||
| | |
|
|
||||||
| ___V__ | CC ____________________
|
|
||||||
| | |----------->| precompiled header |
|
|
||||||
| | | | |____________________|
|
|
||||||
| | | | |
|
|
||||||
| | MJIT | | |
|
|
||||||
| | | | |
|
|
||||||
| | | | ____V___ CC __________
|
|
||||||
| |______|----------->| C code |--->| .so file |
|
|
||||||
| | |________| |__________|
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| MRI machine code |<-----------------------------
|
|
||||||
|___________________| loading
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ruby/internal/config.h" // defines USE_MJIT
|
#include "ruby/internal/config.h" // defines USE_MJIT
|
||||||
|
|
||||||
#if USE_MJIT
|
#if USE_MJIT
|
||||||
|
@ -125,17 +67,6 @@ bool mjit_enabled = false;
|
||||||
// and `mjit_call_p == false`, any JIT-ed code execution is cancelled as soon as possible.
|
// and `mjit_call_p == false`, any JIT-ed code execution is cancelled as soon as possible.
|
||||||
bool mjit_call_p = false;
|
bool mjit_call_p = false;
|
||||||
|
|
||||||
// Priority queue of iseqs waiting for JIT compilation.
|
|
||||||
// This variable is a pointer to head unit of the queue.
|
|
||||||
static struct rb_mjit_unit_list unit_queue = { CCAN_LIST_HEAD_INIT(unit_queue.head) };
|
|
||||||
// List of units which are successfully compiled.
|
|
||||||
static struct rb_mjit_unit_list active_units = { CCAN_LIST_HEAD_INIT(active_units.head) };
|
|
||||||
// List of compacted so files which will be cleaned up by `free_list()` in `mjit_finish()`.
|
|
||||||
static struct rb_mjit_unit_list compact_units = { CCAN_LIST_HEAD_INIT(compact_units.head) };
|
|
||||||
// List of units before recompilation and just waiting for dlclose().
|
|
||||||
static struct rb_mjit_unit_list stale_units = { CCAN_LIST_HEAD_INIT(stale_units.head) };
|
|
||||||
// The number of so far processed ISEQs, used to generate unique id.
|
|
||||||
|
|
||||||
#include "mjit_config.h"
|
#include "mjit_config.h"
|
||||||
|
|
||||||
// Print the arguments according to FORMAT to stderr only if MJIT
|
// Print the arguments according to FORMAT to stderr only if MJIT
|
||||||
|
|
Загрузка…
Ссылка в новой задаче