From 92db05310efb9d1612d9f11c2d56e60607c99fb8 Mon Sep 17 00:00:00 2001 From: Quinton Miller Date: Tue, 18 Feb 2025 17:43:47 +0800 Subject: [PATCH] Only refer to symbol table in definition of `Symbol#to_s` --- src/compiler/crystal/codegen/codegen.cr | 11 ++++++++++- src/compiler/crystal/codegen/fun.cr | 1 - src/compiler/crystal/codegen/primitives.cr | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/compiler/crystal/codegen/codegen.cr b/src/compiler/crystal/codegen/codegen.cr index e4d05ba4aaae..305086066d80 100644 --- a/src/compiler/crystal/codegen/codegen.cr +++ b/src/compiler/crystal/codegen/codegen.cr @@ -411,7 +411,16 @@ module Crystal end def define_symbol_table(llvm_mod, llvm_typer) - llvm_mod.globals.add llvm_typer.llvm_type(@program.string).array(@symbol_table_values.size), SYMBOL_TABLE_NAME + llvm_mod.globals[SYMBOL_TABLE_NAME]? || begin + global = llvm_mod.globals.add llvm_typer.llvm_type(@program.string).array(@symbol_table_values.size), SYMBOL_TABLE_NAME + if llvm_mod != @main_mod + global.linkage = LLVM::Linkage::External + elsif @single_module + global.linkage = LLVM::Linkage::Internal + end + global.global_constant = true + global + end end def define_slice_constant(info : Program::ConstSliceInfo) diff --git a/src/compiler/crystal/codegen/fun.cr b/src/compiler/crystal/codegen/fun.cr index de6a9e32a233..4723edec77fa 100644 --- a/src/compiler/crystal/codegen/fun.cr +++ b/src/compiler/crystal/codegen/fun.cr @@ -633,7 +633,6 @@ class Crystal::CodeGenVisitor llvm_mod = configure_module(llvm_context.new_module(type_name)) llvm_builder = new_builder(llvm_context) - define_symbol_table llvm_mod, llvm_typer ModuleInfo.new(llvm_mod, llvm_typer, llvm_builder) end end diff --git a/src/compiler/crystal/codegen/primitives.cr b/src/compiler/crystal/codegen/primitives.cr index eb048076de50..19f827b8dd7a 100644 --- a/src/compiler/crystal/codegen/primitives.cr +++ b/src/compiler/crystal/codegen/primitives.cr @@ -922,7 +922,8 @@ class Crystal::CodeGenVisitor def codegen_primitive_symbol_to_s(node, target_def, call_args) string = llvm_type(@program.string) table_type = string.array(@symbol_table_values.size) - string_ptr = gep table_type, @llvm_mod.globals[SYMBOL_TABLE_NAME], int(0), call_args[0] + table = define_symbol_table(@llvm_mod, @llvm_typer) + string_ptr = gep table_type, table, int(0), call_args[0] load(string, string_ptr) end