@@ -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