From d2b299145980dd3d6c6efe1da49af42d629029d3 Mon Sep 17 00:00:00 2001 From: Quinton Miller Date: Tue, 6 May 2025 14:13:34 +0800 Subject: [PATCH] Do not use private linkage for slice literal buffers --- spec/primitives/slice_spec.cr | 11 ++++++++++- src/compiler/crystal/codegen/codegen.cr | 6 +++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/spec/primitives/slice_spec.cr b/spec/primitives/slice_spec.cr index 4f23aefd0200..5444e0f9a556 100644 --- a/spec/primitives/slice_spec.cr +++ b/spec/primitives/slice_spec.cr @@ -2,9 +2,14 @@ require "spec" require "../support/number" require "../support/interpreted" +private module Foo + def self.foo + Slice.literal(1) + end +end + describe "Primitives: Slice" do describe ".literal" do - # TODO: implement in the interpreter {% for num in BUILTIN_NUMBER_TYPES %} it {{ "creates a read-only Slice(#{num})" }} do slice = Slice({{ num }}).literal(0, 1, 4, 9, 16, 25) @@ -29,5 +34,9 @@ describe "Primitives: Slice" do slice.read_only?.should be_true end {% end %} + + it "links against slice literal from a different LLVM module" do + Foo.foo.should eq(Slice.literal(1)) + end end end diff --git a/src/compiler/crystal/codegen/codegen.cr b/src/compiler/crystal/codegen/codegen.cr index 0e7aa7e60e98..90099d1d38fe 100644 --- a/src/compiler/crystal/codegen/codegen.cr +++ b/src/compiler/crystal/codegen/codegen.cr @@ -449,7 +449,11 @@ module Crystal end global = @llvm_mod.globals.add(llvm_element_type.array(info.args.size), info.name) - global.linkage = LLVM::Linkage::Private + if @llvm_mod != @main_mod + global.linkage = LLVM::Linkage::External + elsif @single_module + global.linkage = LLVM::Linkage::Internal + end global.global_constant = true global.initializer = llvm_element_type.const_array(llvm_elements) end