Commit 3104aed8 authored by KOBAYASHI Shuji's avatar KOBAYASHI Shuji

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 |
parent 251fd743
...@@ -7,16 +7,7 @@ ...@@ -7,16 +7,7 @@
#ifndef MRUBY_PRESYM_ENABLE_H #ifndef MRUBY_PRESYM_ENABLE_H
#define MRUBY_PRESYM_ENABLE_H #define MRUBY_PRESYM_ENABLE_H
#undef MRB_PRESYM_MAX #include <mruby/presym/id.h>
#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
#define MRB_OPSYM(name) MRB_OPSYM__##name #define MRB_OPSYM(name) MRB_OPSYM__##name
#define MRB_CVSYM(name) MRB_CVSYM__##name #define MRB_CVSYM(name) MRB_CVSYM__##name
......
...@@ -67,34 +67,53 @@ module MRuby ...@@ -67,34 +67,53 @@ module MRuby
File.binwrite(list_path, presyms.join("\n") << "\n") File.binwrite(list_path, presyms.join("\n") << "\n")
end end
def write_header(presyms) def write_id_header(presyms)
prefix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:first).uniq) prefix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:first).uniq)
suffix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:last).uniq) suffix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:last).uniq)
sym_re = /\A(#{prefix_re})?([\w&&\D]\w*)(#{suffix_re})?\z/o sym_re = /\A(#{prefix_re})?([\w&&\D]\w*)(#{suffix_re})?\z/o
_pp "GEN", header_path.relative_path _pp "GEN", id_header_path.relative_path
mkdir_p(File.dirname(header_path)) File.open(id_header_path, "w:binary") do |f|
File.open(header_path, "w:binary") do |f| f.puts "enum mruby_presym {"
f.puts "/* MRB_PRESYM_NAMED(lit, num, type, name) */"
f.puts "/* MRB_PRESYM_UNNAMED(lit, num) */"
presyms.each.with_index(1) do |sym, num| presyms.each.with_index(1) do |sym, num|
if sym_re =~ sym && (affixes = SYMBOL_TO_MACRO[[$1, $3]]) 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] elsif name = OPERATORS[sym]
f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, OPSYM, #{name})| f.puts " MRB_OPSYM__#{name} = #{num},"
elsif
f.puts %|MRB_PRESYM_UNNAMED("#{sym}", #{num})|
end end
end end
f.puts "};"
f.puts
f.puts "#define MRB_PRESYM_MAX #{presyms.size}" f.puts "#define MRB_PRESYM_MAX #{presyms.size}"
end end
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 def list_path
@list_pat ||= "#{@build.build_dir}/presym".freeze @list_pat ||= "#{@build.build_dir}/presym".freeze
end end
def header_path def header_dir;
@header_path ||= "#{@build.build_dir}/include/mruby/presym.inc".freeze @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 end
private private
......
...@@ -15,31 +15,24 @@ ...@@ -15,31 +15,24 @@
#ifndef MRB_NO_PRESYM #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 #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 #endif
};
static mrb_sym static mrb_sym
presym_find(const char *name, size_t len) 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; mrb_sym start, idx, presym_size = MRB_PRESYM_MAX;
int cmp; int cmp;
for (start = 0; presym_size != 0; presym_size/=2) { for (start = 0; presym_size != 0; presym_size/=2) {
idx = start+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) { 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 (cmp == 0) return idx+1;
} }
if (0 < cmp) { if (0 < cmp) {
...@@ -54,8 +47,8 @@ static const char* ...@@ -54,8 +47,8 @@ static const char*
presym_sym2name(mrb_sym sym, mrb_int *lenp) presym_sym2name(mrb_sym sym, mrb_int *lenp)
{ {
if (sym > MRB_PRESYM_MAX) return NULL; if (sym > MRB_PRESYM_MAX) return NULL;
if (lenp) *lenp = presym_table[sym-1].len; if (lenp) *lenp = presym_length_table[sym-1];
return presym_table[sym-1].name; return presym_name_table[sym-1];
} }
#endif /* MRB_NO_PRESYM */ #endif /* MRB_NO_PRESYM */
......
...@@ -33,7 +33,11 @@ MRuby.each_target do |build| ...@@ -33,7 +33,11 @@ MRuby.each_target do |build|
current_presyms = presym.read_list if File.exist?(presym.list_path) current_presyms = presym.read_list if File.exist?(presym.list_path)
update = presyms != current_presyms update = presyms != current_presyms
presym.write_list(presyms) if update 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 end
gensym_task.enhance([presym.list_path]) gensym_task.enhance([presym.list_path])
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment