Skip to content

Commit 0c5737a

Browse files
authored
Only define the type name table in the main LLVM module (#16260)
#15904 made every LLVM module that references the `#as` pseudo-method define its own copy of `__crystal_type_id_to_class_name_map`, when only one copy in the main LLVM module is sufficient. This patch brings the total cache size of the compiler itself from 234 MB to 148 MB on my Windows machine, for example.
1 parent 14c12e5 commit 0c5737a

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

src/compiler/crystal/codegen/codegen.cr

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,26 +1618,37 @@ module Crystal
16181618
end
16191619

16201620
def type_id_to_class_name(type_id)
1621-
map = llvm_mod.globals["__crystal_type_id_to_class_name_map"]? || create_type_id_to_class_name_map("__crystal_type_id_to_class_name_map")
1621+
map_name = "__crystal_type_id_to_class_name_map"
16221622

1623-
str_ptr = gep llvm_type(@program.string), map, type_id
1623+
global = @main_mod.globals[map_name]?
1624+
unless global
1625+
global = @main_mod.globals.add(@main_llvm_typer.llvm_type(@program.string).array(@program.llvm_id.@ids.size), map_name)
1626+
global.linkage = LLVM::Linkage::Internal if @single_module
1627+
global.initializer = create_type_id_to_class_name_map
1628+
global.global_constant = true
1629+
end
1630+
1631+
if @llvm_mod != @main_mod
1632+
global = @llvm_mod.globals[map_name]?
1633+
unless global
1634+
global = @llvm_mod.globals.add(@llvm_typer.llvm_type(@program.string).array(@program.llvm_id.@ids.size), map_name)
1635+
global.linkage = LLVM::Linkage::External
1636+
global.global_constant = true
1637+
end
1638+
end
1639+
1640+
str_ptr = gep llvm_type(@program.string).array(@program.llvm_id.@ids.size), global, 0, type_id
16241641
load llvm_type(@program.string), str_ptr
16251642
end
16261643

1627-
def create_type_id_to_class_name_map(name)
1644+
def create_type_id_to_class_name_map
16281645
ids = @program.llvm_id.@ids
16291646
id_map = Array(LLVM::Value).new(size: ids.size, value: LLVM::Value.null)
16301647
ids.each do |type, (_, type_id)|
1631-
id_map[type_id] = build_string_constant(type.to_s)
1648+
id_map[type_id] = build_string_constant(type.to_s, llvm_mod: @main_mod, llvm_typer: @main_llvm_typer)
16321649
end
16331650

1634-
type = llvm_type(@program.string).array(ids.size)
1635-
1636-
global = @llvm_mod.globals.add(type, name)
1637-
global.linkage = LLVM::Linkage::Private
1638-
global.global_constant = true
1639-
global.initializer = llvm_type(@program.string).const_array(id_map)
1640-
global
1651+
@main_llvm_typer.llvm_type(@program.string).const_array(id_map)
16411652
end
16421653

16431654
def visit(node : IsA)
@@ -2538,22 +2549,23 @@ module Crystal
25382549
@last = last
25392550
end
25402551

2541-
def build_string_constant(str, name = "str")
2552+
def build_string_constant(str, name = "str", *, llvm_mod = @llvm_mod, llvm_typer = @llvm_typer)
25422553
name = "#{name[0..18]}..." if name.bytesize > 18
25432554
name = name.gsub '@', '.'
25442555
name = "'#{name}'"
2545-
key = StringKey.new(@llvm_mod, str)
2546-
@strings[key] ||= begin
2547-
global = @llvm_mod.globals.add(@llvm_typer.llvm_string_type(str.bytesize), name.gsub('\\', "\\\\"))
2556+
key = StringKey.new(llvm_mod, str)
2557+
@strings.put_if_absent(key) do
2558+
llvm_context = llvm_mod.context
2559+
global = llvm_mod.globals.add(llvm_typer.llvm_string_type(str.bytesize), name.gsub('\\', "\\\\"))
25482560
global.linkage = LLVM::Linkage::Private
25492561
global.global_constant = true
25502562
global.initializer = llvm_context.const_struct [
2551-
int32(@program.llvm_id.type_id(@program.string)), # in practice, should always be 1
2552-
int32(str.bytesize),
2553-
int32(str.size),
2563+
llvm_context.int32.const_int(@program.llvm_id.type_id(@program.string)), # in practice, should always be 1
2564+
llvm_context.int32.const_int(str.bytesize),
2565+
llvm_context.int32.const_int(str.size),
25542566
llvm_context.const_string(str),
25552567
]
2556-
cast_to global, @program.string
2568+
pointer_cast global, llvm_typer.llvm_type(@program.string)
25572569
end
25582570
end
25592571

0 commit comments

Comments
 (0)