diff options
| author | KOBAYASHI Shuji <[email protected]> | 2021-01-27 20:47:10 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2021-01-27 20:47:10 +0900 |
| commit | 3104aed8c67754f14093ea73b2df4f995e4242d3 (patch) | |
| tree | 92370cd2eae6b40a1aaccd13559eb52cdafe04f9 | |
| parent | 251fd743151bb66cde3a3879d3b4b4b8c4ee7356 (diff) | |
| download | mruby-3104aed8c67754f14093ea73b2df4f995e4242d3.tar.gz mruby-3104aed8c67754f14093ea73b2df4f995e4242d3.zip | |
Split `presym_table` for reduced program size
Because a structure that is an element of `presym_table` has padding, split
it into individual arrays for name and length.
#### Result (64-bit CPU with full-core gembox)
| | mruby | libmruby.a |
|--------|------------|------------|
| Before | 1,087,444B | 1,476,872B |
| After | 1,079,340B | 1,469,784B |
| -rw-r--r-- | include/mruby/presym/enable.h | 11 | ||||
| -rw-r--r-- | lib/mruby/presym.rb | 43 | ||||
| -rw-r--r-- | src/symbol.c | 23 | ||||
| -rw-r--r-- | tasks/presym.rake | 6 |
4 files changed, 45 insertions, 38 deletions
diff --git a/include/mruby/presym/enable.h b/include/mruby/presym/enable.h index f4e413532..c70c86659 100644 --- a/include/mruby/presym/enable.h +++ b/include/mruby/presym/enable.h @@ -7,16 +7,7 @@ #ifndef MRUBY_PRESYM_ENABLE_H #define MRUBY_PRESYM_ENABLE_H -#undef MRB_PRESYM_MAX -#define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num), -#define MRB_PRESYM_UNNAMED(lit, num) - -enum mruby_presym { -# include <mruby/presym.inc> -}; - -#undef MRB_PRESYM_NAMED -#undef MRB_PRESYM_UNNAMED +#include <mruby/presym/id.h> #define MRB_OPSYM(name) MRB_OPSYM__##name #define MRB_CVSYM(name) MRB_CVSYM__##name diff --git a/lib/mruby/presym.rb b/lib/mruby/presym.rb index 75a903dba..b00940a65 100644 --- a/lib/mruby/presym.rb +++ b/lib/mruby/presym.rb @@ -67,34 +67,53 @@ module MRuby File.binwrite(list_path, presyms.join("\n") << "\n") end - def write_header(presyms) + def write_id_header(presyms) prefix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:first).uniq) suffix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:last).uniq) sym_re = /\A(#{prefix_re})?([\w&&\D]\w*)(#{suffix_re})?\z/o - _pp "GEN", header_path.relative_path - mkdir_p(File.dirname(header_path)) - File.open(header_path, "w:binary") do |f| - f.puts "/* MRB_PRESYM_NAMED(lit, num, type, name) */" - f.puts "/* MRB_PRESYM_UNNAMED(lit, num) */" + _pp "GEN", id_header_path.relative_path + File.open(id_header_path, "w:binary") do |f| + f.puts "enum mruby_presym {" presyms.each.with_index(1) do |sym, num| if sym_re =~ sym && (affixes = SYMBOL_TO_MACRO[[$1, $3]]) - f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, #{affixes * 'SYM'}, #{$2})| + f.puts " MRB_#{affixes * 'SYM'}__#{$2} = #{num}," elsif name = OPERATORS[sym] - f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, OPSYM, #{name})| - elsif - f.puts %|MRB_PRESYM_UNNAMED("#{sym}", #{num})| + f.puts " MRB_OPSYM__#{name} = #{num}," end end + f.puts "};" + f.puts f.puts "#define MRB_PRESYM_MAX #{presyms.size}" end end + def write_table_header(presyms) + _pp "GEN", table_header_path.relative_path + File.open(table_header_path, "w:binary") do |f| + f.puts "const uint16_t presym_length_table[] = {" + presyms.each{|sym| f.puts " #{sym.bytesize},"} + f.puts "};" + f.puts + f.puts "const char * const presym_name_table[] = {" + presyms.each{|sym| f.puts %| "#{sym}",|} + f.puts "};" + end + end + def list_path @list_pat ||= "#{@build.build_dir}/presym".freeze end - def header_path - @header_path ||= "#{@build.build_dir}/include/mruby/presym.inc".freeze + def header_dir; + @header_dir ||= "#{@build.build_dir}/include/mruby/presym".freeze + end + + def id_header_path + @id_header_path ||= "#{header_dir}/id.h".freeze + end + + def table_header_path + @table_header_path ||= "#{header_dir}/table.h".freeze end private diff --git a/src/symbol.c b/src/symbol.c index 1d2c7c776..b15e0f11c 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -15,31 +15,24 @@ #ifndef MRB_NO_PRESYM -# undef MRB_PRESYM_MAX -# define MRB_PRESYM_NAMED(lit, num, type, name) {lit, sizeof(lit)-1}, -# define MRB_PRESYM_UNNAMED(lit, num) {lit, sizeof(lit)-1}, - -static const struct { - const char *name; - uint16_t len; -} presym_table[] = { #ifndef MRB_PRESYM_SCANNING -# include <mruby/presym.inc> +/* const uint16_t presym_length_table[] */ +/* const char * const presym_name_table[] */ +# include <mruby/presym/table.h> #endif -}; static mrb_sym presym_find(const char *name, size_t len) { - if (presym_table[MRB_PRESYM_MAX-1].len < len) return 0; + if (presym_length_table[MRB_PRESYM_MAX-1] < len) return 0; mrb_sym start, idx, presym_size = MRB_PRESYM_MAX; int cmp; for (start = 0; presym_size != 0; presym_size/=2) { idx = start+presym_size/2; - cmp = (int)len-(int)presym_table[idx].len; + cmp = (int)len-(int)presym_length_table[idx]; if (cmp == 0) { - cmp = memcmp(name, presym_table[idx].name, len); + cmp = memcmp(name, presym_name_table[idx], len); if (cmp == 0) return idx+1; } if (0 < cmp) { @@ -54,8 +47,8 @@ static const char* presym_sym2name(mrb_sym sym, mrb_int *lenp) { if (sym > MRB_PRESYM_MAX) return NULL; - if (lenp) *lenp = presym_table[sym-1].len; - return presym_table[sym-1].name; + if (lenp) *lenp = presym_length_table[sym-1]; + return presym_name_table[sym-1]; } #endif /* MRB_NO_PRESYM */ diff --git a/tasks/presym.rake b/tasks/presym.rake index 8b18acd75..2efc4d790 100644 --- a/tasks/presym.rake +++ b/tasks/presym.rake @@ -33,7 +33,11 @@ MRuby.each_target do |build| current_presyms = presym.read_list if File.exist?(presym.list_path) update = presyms != current_presyms presym.write_list(presyms) if update - presym.write_header(presyms) if update || !File.exist?(presym.header_path) + mkdir_p presym.header_dir + %w[id table].each do |type| + next if !update && File.exist?(presym.send("#{type}_header_path")) + presym.send("write_#{type}_header", presyms) + end end gensym_task.enhance([presym.list_path]) |
