diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2021-07-07 12:22:40 +0900 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2021-10-04 09:43:09 -0700 |
commit | b44c5187b4d05d8644242e532f2243210d0b74df (patch) | |
tree | 3b6f2dfc226aa3b07f06368142a7d4da1ab52505 | |
parent | aa2a1fb04719a819b21a2c4ae30cf50008901eeb (diff) | |
download | ruby-b44c5187b4d05d8644242e532f2243210d0b74df.tar.gz |
Expose instruction information for debuggers [Feature #18026]
-rw-r--r-- | tool/ruby_vm/views/_insn_len_info.erb | 23 | ||||
-rw-r--r-- | tool/ruby_vm/views/_insn_name_info.erb | 30 | ||||
-rw-r--r-- | tool/ruby_vm/views/_insn_operand_info.erb | 29 |
3 files changed, 51 insertions, 31 deletions
diff --git a/tool/ruby_vm/views/_insn_len_info.erb b/tool/ruby_vm/views/_insn_len_info.erb index b292f42fb5..569dca5845 100644 --- a/tool/ruby_vm/views/_insn_len_info.erb +++ b/tool/ruby_vm/views/_insn_len_info.erb @@ -7,15 +7,22 @@ %# details. CONSTFUNC(MAYBE_UNUSED(static int insn_len(VALUE insn))); -int -insn_len(VALUE i) -{ - static const char t[] = { +RUBY_SYMBOL_EXPORT_BEGIN /* for debuggers */ +extern const uint8_t rb_vm_insn_len_info[VM_INSTRUCTION_SIZE]; +RUBY_SYMBOL_EXPORT_END + +#ifdef RUBY_VM_INSNS_INFO +const uint8_t rb_vm_insn_len_info[] = { % RubyVM::Instructions.each_slice 23 do |a| - <%= a.map(&:width).join(', ') -%>, + <%= a.map(&:width).join(', ') -%>, % end - }; +}; - ASSERT_VM_INSTRUCTION_SIZE(t); - return t[i]; +ASSERT_VM_INSTRUCTION_SIZE(rb_vm_insn_len_info); +#endif + +int +insn_len(VALUE i) +{ + return rb_vm_insn_len_info[i]; } diff --git a/tool/ruby_vm/views/_insn_name_info.erb b/tool/ruby_vm/views/_insn_name_info.erb index 767346093e..e7ded75e65 100644 --- a/tool/ruby_vm/views/_insn_name_info.erb +++ b/tool/ruby_vm/views/_insn_name_info.erb @@ -13,26 +13,32 @@ % CONSTFUNC(MAYBE_UNUSED(static const char *insn_name(VALUE insn))); +RUBY_SYMBOL_EXPORT_BEGIN /* for debuggers */ +extern const int rb_vm_max_insn_name_size; +extern const char rb_vm_insn_name_base[]; +extern const unsigned short rb_vm_insn_name_offset[VM_INSTRUCTION_SIZE]; +RUBY_SYMBOL_EXPORT_END + #ifdef RUBY_VM_INSNS_INFO const int rb_vm_max_insn_name_size = <%= a.map(&:size).max %>; -#endif -const char * -insn_name(VALUE i) -{ - static const char x[] = +const char rb_vm_insn_name_base[] = % a.each do |i| - <%=cstr i%> "\0" + <%=cstr i%> "\0" % end - ; + ; - static const unsigned short y[] = { +const unsigned short rb_vm_insn_name_offset[] = { % c.each_slice 12 do |d| - <%= d.map {|i| sprintf("%4d", i) }.join(', ') %>, + <%= d.map {|i| sprintf("%4d", i) }.join(', ') %>, % end - }; +}; - ASSERT_VM_INSTRUCTION_SIZE(y); +ASSERT_VM_INSTRUCTION_SIZE(rb_vm_insn_name_offset); +#endif - return &x[y[i]]; +const char * +insn_name(VALUE i) +{ + return &rb_vm_insn_name_base[rb_vm_insn_name_offset[i]]; } diff --git a/tool/ruby_vm/views/_insn_operand_info.erb b/tool/ruby_vm/views/_insn_operand_info.erb index 69d361521a..996c33e960 100644 --- a/tool/ruby_vm/views/_insn_operand_info.erb +++ b/tool/ruby_vm/views/_insn_operand_info.erb @@ -14,24 +14,31 @@ CONSTFUNC(MAYBE_UNUSED(static const char *insn_op_types(VALUE insn))); CONSTFUNC(MAYBE_UNUSED(static int insn_op_type(VALUE insn, long pos))); -const char * -insn_op_types(VALUE i) -{ - static const char x[] = +RUBY_SYMBOL_EXPORT_BEGIN /* for debuggers */ +extern const char rb_vm_insn_op_base[]; +extern const unsigned short rb_vm_insn_op_offset[VM_INSTRUCTION_SIZE]; +RUBY_SYMBOL_EXPORT_END + +#ifdef RUBY_VM_INSNS_INFO +const char rb_vm_insn_op_base[] = % a.each_slice 5 do |d| - <%= d.map {|i| sprintf("%-6s", cstr(i)) }.join(' "\0" ') %> "\0" + <%= d.map {|i| sprintf("%-6s", cstr(i)) }.join(' "\0" ') %> "\0" % end - ; + ; - static const unsigned short y[] = { +const unsigned short rb_vm_insn_op_offset[] = { % c.each_slice 12 do |d| - <%= d.map {|i| sprintf("%3d", i) }.join(', ') %>, + <%= d.map {|i| sprintf("%3d", i) }.join(', ') %>, % end - }; +}; - ASSERT_VM_INSTRUCTION_SIZE(y); +ASSERT_VM_INSTRUCTION_SIZE(rb_vm_insn_op_offset); +#endif - return &x[y[i]]; +const char * +insn_op_types(VALUE i) +{ + return &rb_vm_insn_op_base[rb_vm_insn_op_offset[i]]; } int |