summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2021-01-21 14:05:11 -0800
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:27 -0400
commit11512a80fce8bfac3adf7038e9d9e3839e5cbbfb (patch)
tree21ddfb9486e9e1e0f7d91952416daf1997a80732 /misc
parentd9176d9fca1af8750f9d8f97586e150d9261cc7f (diff)
add a helper script for ujit disasm
Diffstat (limited to 'misc')
-rw-r--r--misc/ujit_disasm.rb34
1 files changed, 34 insertions, 0 deletions
diff --git a/misc/ujit_disasm.rb b/misc/ujit_disasm.rb
new file mode 100644
index 0000000000..0e54f952c9
--- /dev/null
+++ b/misc/ujit_disasm.rb
@@ -0,0 +1,34 @@
+begin
+require "crabstone"
+require "stringio"
+
+module UJIT
+ def self.disasm(iseq)
+ blocks = UJIT.blocks_for(iseq)
+ return if blocks.empty?
+
+ io = StringIO.new
+
+ cs = Crabstone::Disassembler.new(Crabstone::ARCH_X86, Crabstone::MODE_64)
+
+ io.puts iseq.disasm
+
+ blocks.sort_by(&:address).reverse.each do |block|
+ io.puts "== ISEQ RANGE: #{block.iseq_start_index} -> #{block.iseq_end_index} ".ljust(80, "=")
+ cs.disasm(block.code, 0).each do |i|
+ io.printf(
+ "\t0x%<address>x:\t%<instruction>s\t%<details>s\n",
+ address: i.address,
+ instruction: i.mnemonic,
+ details: i.op_str
+ )
+ end
+ end
+ io.string
+ end
+end
+rescue
+ puts "Please install crabstone like this:"
+ puts " $ brew install capstone"
+ puts " $ gem install capstone"
+end