diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2022-11-28 21:22:02 -0800 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2022-11-28 21:23:14 -0800 |
commit | acb76663ba20241e7c2552aafae8b1d883520b9a (patch) | |
tree | 837d5b9537466e93410c8c0a06bf842439f49070 /mjit_c.h | |
parent | 74bdf09215da3c9f1eb31feea3666359acbce527 (diff) |
MJIT: Rename mjit_compiler.h to mjit_c.h
because it exists primarily for generating mjit_c.rb.
Diffstat (limited to 'mjit_c.h')
-rw-r--r-- | mjit_c.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/mjit_c.h b/mjit_c.h new file mode 100644 index 0000000000..01d624233a --- /dev/null +++ b/mjit_c.h @@ -0,0 +1,58 @@ +// This file is parsed by tool/mjit/generate.rb to generate mjit_c.rb +#ifndef MJIT_COMPILER_H +#define MJIT_COMPILER_H + +#include "ruby/internal/config.h" +#include "vm_core.h" +#include "vm_callinfo.h" +#include "builtin.h" +#include "mjit.h" +#include "mjit_unit.h" +#include "shape.h" + +// Macros to check if a position is already compiled using compile_status.stack_size_for_pos +#define NOT_COMPILED_STACK_SIZE -1 +#define ALREADY_COMPILED_P(status, pos) (status->stack_size_for_pos[pos] != NOT_COMPILED_STACK_SIZE) + +// Storage to keep data which is consistent in each conditional branch. +// This is created and used for one `compile_insns` call and its values +// should be copied for extra `compile_insns` call. +struct compile_branch { + unsigned int stack_size; // this simulates sp (stack pointer) of YARV + bool finish_p; // if true, compilation in this branch should stop and let another branch to be compiled +}; + +// For propagating information needed for lazily pushing a frame. +struct inlined_call_context { + int orig_argc; // ci->orig_argc + VALUE me; // vm_cc_cme(cc) + int param_size; // def_iseq_ptr(vm_cc_cme(cc)->def)->body->param.size + int local_size; // def_iseq_ptr(vm_cc_cme(cc)->def)->body->local_table_size +}; + +// Storage to keep compiler's status. This should have information +// which is global during one `mjit_compile` call. Ones conditional +// in each branch should be stored in `compile_branch`. +struct compile_status { + bool success; // has true if compilation has had no issue + int *stack_size_for_pos; // stack_size_for_pos[pos] has stack size for the position (otherwise -1) + // If true, JIT-ed code will use local variables to store pushed values instead of + // using VM's stack and moving stack pointer. + bool local_stack_p; + // Safely-accessible ivar cache entries copied from main thread. + union iseq_inline_storage_entry *is_entries; + // Index of call cache entries captured to compiled_iseq to be marked on GC + int cc_entries_index; + // A pointer to root (i.e. not inlined) iseq being compiled. + const struct rb_iseq_constant_body *compiled_iseq; + int compiled_id; // Just a copy of compiled_iseq->jit_unit->id + // Mutated optimization levels + struct rb_mjit_compile_info *compile_info; + bool merge_ivar_guards_p; // If true, merge guards of ivar accesses + size_t max_ivar_index; // Max IVC index in is_entries (used only when merge_ivar_guards_p) + // If `inlined_iseqs[pos]` is not NULL, `mjit_compile_body` tries to inline ISeq there. + const struct rb_iseq_constant_body **inlined_iseqs; + struct inlined_call_context inline_context; +}; + +#endif /* MJIT_COMPILER_H */ |