From 1a9cc3b27c020c33c87d8b4fe659243aacfeedf3 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Tue, 3 Sep 2019 02:51:48 +0900 Subject: Avoid defining unused instructions --- .travis.yml | 2 +- insns.def | 6 +++--- tool/ruby_vm/loaders/insns_def.rb | 34 +++++++++++++++++++--------------- vm_opts.h | 3 ++- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index 02bfc9c390..37e20032f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -154,7 +154,7 @@ env: <<: *cron-only <<: *make-test-only env: - - BEFORE_INSTALL="sed vm_opts.h -e 's/SUPPORT_JOKE *0/SUPPORT_JOKE 1/' -i" + - BEFORE_INSTALL="sed vm_opts.h -e 's/OPT_SUPPORT_JOKE *0/OPT_SUPPORT_JOKE 1/' -i" - &WITH_COROUTINE_UCONTEXT name: COROUTINE=ucontext diff --git a/insns.def b/insns.def index 1399687578..e3edc5e29f 100644 --- a/insns.def +++ b/insns.def @@ -624,7 +624,7 @@ reverse } /* for stack caching. */ -DEFINE_INSN +DEFINE_INSN_IF(STACK_CACHING) reput () (..., VALUE val) @@ -1485,7 +1485,7 @@ opt_call_c_function } /* BLT */ -DEFINE_INSN +DEFINE_INSN_IF(SUPPORT_JOKE) bitblt () () @@ -1495,7 +1495,7 @@ bitblt } /* The Answer to Life, the Universe, and Everything */ -DEFINE_INSN +DEFINE_INSN_IF(SUPPORT_JOKE) answer () () diff --git a/tool/ruby_vm/loaders/insns_def.rb b/tool/ruby_vm/loaders/insns_def.rb index a7d27ad06a..a29d13a661 100644 --- a/tool/ruby_vm/loaders/insns_def.rb +++ b/tool/ruby_vm/loaders/insns_def.rb @@ -11,6 +11,7 @@ # details. require_relative '../helpers/scanner' +require_relative './vm_opts_h' json = [] scanner = RubyVM::Scanner.new '../../../insns.def' @@ -33,7 +34,7 @@ grammar = %r' (? \g ) \g* = \g* (? .+?; ) \g* ){0} - (? DEFINE_INSN \g+ + (? DEFINE_INSN(_IF\((?\w+)\))? \g+ (? \g ) \g* [(] \g* (? \g ) \g* [)] \g* [(] \g* (? \g ) \g* [)] \g* @@ -52,6 +53,7 @@ until scanner.eos? do l1 = scanner.scan!(/\G#{grammar}\g/o) name = scanner["insn:name"] + opt = scanner["insn:if"] ope = split.(scanner["insn:opes"]) pop = split.(scanner["insn:pops"]) ret = split.(scanner["insn:rets"]) @@ -67,21 +69,23 @@ until scanner.eos? do end l3 = scanner.scan!(/\G#{grammar}\g/o) - json << { - name: name, - location: [path, l1], - signature: { + if opt.nil? || RubyVM::VmOptsH[opt] + json << { name: name, - ope: ope, - pop: pop, - ret: ret, - }, - attributes: attrs, - expr: { - location: [path, l3], - expr: scanner["block"], - }, - } + location: [path, l1], + signature: { + name: name, + ope: ope, + pop: pop, + ret: ret, + }, + attributes: attrs, + expr: { + location: [path, l3], + expr: scanner["block"], + }, + } + end end RubyVM::InsnsDef = json diff --git a/vm_opts.h b/vm_opts.h index 6a7dd3d85d..9892d3c999 100644 --- a/vm_opts.h +++ b/vm_opts.h @@ -61,7 +61,8 @@ #define OPT_STACK_CACHING 0 /* misc */ -#define SUPPORT_JOKE 0 +#define OPT_SUPPORT_JOKE 0 +#define SUPPORT_JOKE OPT_SUPPORT_JOKE #ifndef VM_COLLECT_USAGE_DETAILS #define VM_COLLECT_USAGE_DETAILS 0 -- cgit v1.2.3