summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2021-01-27 20:47:10 +0900
committerKOBAYASHI Shuji <[email protected]>2021-01-27 20:47:10 +0900
commit3104aed8c67754f14093ea73b2df4f995e4242d3 (patch)
tree92370cd2eae6b40a1aaccd13559eb52cdafe04f9
parent251fd743151bb66cde3a3879d3b4b4b8c4ee7356 (diff)
downloadmruby-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.h11
-rw-r--r--lib/mruby/presym.rb43
-rw-r--r--src/symbol.c23
-rw-r--r--tasks/presym.rake6
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])