summaryrefslogtreecommitdiff
path: root/yjit.h
diff options
context:
space:
mode:
Diffstat (limited to 'yjit.h')
-rw-r--r--yjit.h74
1 files changed, 40 insertions, 34 deletions
diff --git a/yjit.h b/yjit.h
index cc1e23d327..a1e3efb330 100644
--- a/yjit.h
+++ b/yjit.h
@@ -22,52 +22,58 @@
# define YJIT_SUPPORTED_P 0
#endif
-struct rb_yjit_options {
- // Enable compilation with YJIT
- bool yjit_enabled;
-
- // Size of the executable memory block to allocate in MiB
- unsigned exec_mem_size;
-
- // Number of method calls after which to start generating code
- // Threshold==1 means compile on first execution
- unsigned call_threshold;
-
- // Generate versions greedily until the limit is hit
- bool greedy_versioning;
-
- // Disable the propagation of type information
- bool no_type_prop;
-
- // Maximum number of versions per block
- // 1 means always create generic versions
- unsigned max_versions;
-
- // Capture and print out stats
- bool gen_stats;
+// Is the output binary going to include YJIT?
+#if USE_MJIT && USE_YJIT && YJIT_SUPPORTED_P
+# define YJIT_BUILD 1
+#else
+# define YJIT_BUILD 0
+#endif
- // Run backend tests
- bool test_backend;
-};
+#if YJIT_BUILD
+// Expose these as declarations since we are building YJIT.
bool rb_yjit_enabled_p(void);
unsigned rb_yjit_call_threshold(void);
-
void rb_yjit_invalidate_all_method_lookup_assumptions(void);
void rb_yjit_method_lookup_change(VALUE klass, ID mid);
-void rb_yjit_cme_invalidate(VALUE cme);
+void rb_yjit_cme_invalidate(rb_callable_method_entry_t *cme);
void rb_yjit_collect_vm_usage_insn(int insn);
void rb_yjit_collect_binding_alloc(void);
void rb_yjit_collect_binding_set(void);
bool rb_yjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec);
-void rb_yjit_init(struct rb_yjit_options *options);
-void rb_yjit_bop_redefined(VALUE klass, const rb_method_entry_t *me, enum ruby_basic_operators bop);
-void rb_yjit_constant_state_changed(void);
-void rb_yjit_iseq_mark(const struct rb_iseq_constant_body *body);
-void rb_yjit_iseq_update_references(const struct rb_iseq_constant_body *body);
-void rb_yjit_iseq_free(const struct rb_iseq_constant_body *body);
+void rb_yjit_init(void);
+void rb_yjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop);
+void rb_yjit_constant_state_changed(ID id);
+void rb_yjit_iseq_mark(void *payload);
+void rb_yjit_iseq_update_references(void *payload);
+void rb_yjit_iseq_free(void *payload);
void rb_yjit_before_ractor_spawn(void);
void rb_yjit_constant_ic_update(const rb_iseq_t *const iseq, IC ic);
void rb_yjit_tracing_invalidate_all(void);
+#else
+// !YJIT_BUILD
+// In these builds, YJIT could never be turned on. Provide dummy implementations.
+
+static inline bool rb_yjit_enabled_p(void) { return false; }
+static inline unsigned rb_yjit_call_threshold(void) { return UINT_MAX; }
+static inline void rb_yjit_invalidate_all_method_lookup_assumptions(void) {}
+static inline void rb_yjit_method_lookup_change(VALUE klass, ID mid) {}
+static inline void rb_yjit_cme_invalidate(rb_callable_method_entry_t *cme) {}
+static inline void rb_yjit_collect_vm_usage_insn(int insn) {}
+static inline void rb_yjit_collect_binding_alloc(void) {}
+static inline void rb_yjit_collect_binding_set(void) {}
+static inline bool rb_yjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec) { return false; }
+static inline void rb_yjit_init(void) {}
+static inline void rb_yjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop) {}
+static inline void rb_yjit_constant_state_changed(ID id) {}
+static inline void rb_yjit_iseq_mark(void *payload) {}
+static inline void rb_yjit_iseq_update_references(void *payload) {}
+static inline void rb_yjit_iseq_free(void *payload) {}
+static inline void rb_yjit_before_ractor_spawn(void) {}
+static inline void rb_yjit_constant_ic_update(const rb_iseq_t *const iseq, IC ic) {}
+static inline void rb_yjit_tracing_invalidate_all(void) {}
+
+#endif // #if YJIT_BUILD
+
#endif // #ifndef YJIT_H