summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2023-03-11 21:10:44 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2023-03-11 21:26:40 -0800
commit58f7e8b7f83babeefb39d1a919d43de237c36c8a (patch)
treeba59a593ad5f7fc16aa25261d2d8471d77162c06 /tool
parent47a6cfca720729d1ae3af534521cbe2a2f93cd50 (diff)
downloadruby-58f7e8b7f83babeefb39d1a919d43de237c36c8a.tar.gz
RJIT: Automate function pointer imports
Diffstat (limited to 'tool')
-rwxr-xr-xtool/rjit/bindgen.rb50
1 files changed, 49 insertions, 1 deletions
diff --git a/tool/rjit/bindgen.rb b/tool/rjit/bindgen.rb
index 499443af7a..abff60fdc3 100755
--- a/tool/rjit/bindgen.rb
+++ b/tool/rjit/bindgen.rb
@@ -107,14 +107,16 @@ class BindingGenerator
# @param src_path [String]
# @param values [Hash{ Symbol => Array<String> }]
+ # @param funcs [Array<String>]
# @param types [Array<String>]
# @param dynamic_types [Array<String>] #ifdef-dependent immediate types, which need Primitive.cexpr! for type detection
# @param skip_fields [Hash{ Symbol => Array<String> }] Struct fields that are skipped from bindgen
# @param ruby_fields [Hash{ Symbol => Array<String> }] Struct VALUE fields that are considered Ruby objects
- def initialize(src_path:, values:, types:, dynamic_types:, skip_fields:, ruby_fields:)
+ def initialize(src_path:, values:, funcs:, types:, dynamic_types:, skip_fields:, ruby_fields:)
@preamble, @postamble = split_ambles(src_path)
@src = String.new
@values = values.transform_values(&:sort)
+ @funcs = funcs.sort
@types = types.sort
@dynamic_types = dynamic_types.sort
@skip_fields = skip_fields.transform_keys(&:to_s)
@@ -135,6 +137,13 @@ class BindingGenerator
end
end
+ @funcs.each do |func|
+ println " def C.#{func}"
+ println " Primitive.cexpr! %q{ SIZET2NUM((size_t)#{func}) }"
+ println " end"
+ println
+ end
+
# TODO: Support nested declarations
nodes_index = nodes.group_by(&:spelling).transform_values do |values|
# Try to search a declaration with definitions
@@ -447,8 +456,47 @@ generator = BindingGenerator.new(
rb_cNilClass
rb_cSymbol
rb_cTrueClass
+ rb_rjit_global_events
],
},
+ funcs: %w[
+ rb_ary_entry_internal
+ rb_ary_push
+ rb_ary_resurrect
+ rb_ary_store
+ rb_ec_ary_new_from_values
+ rb_ec_str_resurrect
+ rb_ensure_iv_list_size
+ rb_fix_aref
+ rb_fix_div_fix
+ rb_fix_mod_fix
+ rb_fix_mul_fix
+ rb_gc_writebarrier
+ rb_get_symbol_id
+ rb_hash_aref
+ rb_hash_aset
+ rb_hash_bulk_insert
+ rb_hash_new
+ rb_hash_new_with_size
+ rb_ivar_get
+ rb_obj_as_string_result
+ rb_obj_is_kind_of
+ rb_str_concat_literals
+ rb_str_eql_internal
+ rb_str_getbyte
+ rb_vm_bh_to_procval
+ rb_vm_concat_array
+ rb_vm_defined
+ rb_vm_get_ev_const
+ rb_vm_getclassvariable
+ rb_vm_ic_hit_p
+ rb_vm_opt_newarray_min
+ rb_vm_setinstancevariable
+ rb_vm_splat_array
+ rjit_full_cfunc_return
+ rjit_optimized_call
+ rjit_str_neq_internal
+ ],
types: %w[
CALL_DATA
IC