diff --git a/cl/_testgo/errors/out.ll b/cl/_testgo/errors/out.ll index 5ba87d88..d416bd45 100644 --- a/cl/_testgo/errors/out.ll +++ b/cl/_testgo/errors/out.ll @@ -10,15 +10,15 @@ source_filename = "main" %"github.com/goplus/llgo/internal/abi.Imethod" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr } @"main.init$guard" = global i1 false, align 1 -@_llgo_main.errorString = global ptr null, align 8 -@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = global ptr null, align 8 +@_llgo_main.errorString = linkonce global ptr null, align 8 +@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = linkonce global ptr null, align 8 @0 = private unnamed_addr constant [1 x i8] c"s", align 1 @1 = private unnamed_addr constant [4 x i8] c"main", align 1 @2 = private unnamed_addr constant [5 x i8] c"Error", align 1 @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null, align 8 @_llgo_string = linkonce global ptr null, align 8 @3 = private unnamed_addr constant [11 x i8] c"errorString", align 1 -@"*_llgo_main.errorString" = global ptr null, align 8 +@"*_llgo_main.errorString" = linkonce global ptr null, align 8 @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" = linkonce global ptr null, align 8 @__llgo_argc = global i32 0, align 4 @__llgo_argv = global ptr null, align 8 diff --git a/cl/_testgo/ifaceconv/out.ll b/cl/_testgo/ifaceconv/out.ll index 5870105e..2d0b8174 100644 --- a/cl/_testgo/ifaceconv/out.ll +++ b/cl/_testgo/ifaceconv/out.ll @@ -23,12 +23,12 @@ source_filename = "main" @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac" = linkonce global ptr null, align 8 @3 = private unnamed_addr constant [6 x i8] c"main.f", align 1 @4 = private unnamed_addr constant [7 x i8] c"main.I1", align 1 -@"main.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4" = global ptr null, align 8 +@"main.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4" = linkonce global ptr null, align 8 @5 = private unnamed_addr constant [21 x i8] c"nil i1.(I1) succeeded", align 1 @_llgo_main.I2 = linkonce global ptr null, align 8 @6 = private unnamed_addr constant [6 x i8] c"main.g", align 1 @7 = private unnamed_addr constant [7 x i8] c"main.I2", align 1 -@"main.iface$gZBF8fFlqIMZ9M6lT2VWPyc3eu5Co6j0WoKGIEgDPAw" = global ptr null, align 8 +@"main.iface$gZBF8fFlqIMZ9M6lT2VWPyc3eu5Co6j0WoKGIEgDPAw" = linkonce global ptr null, align 8 @8 = private unnamed_addr constant [21 x i8] c"nil i2.(I2) succeeded", align 1 @_llgo_main.C1 = linkonce global ptr null, align 8 @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw" = linkonce global ptr null, align 8 diff --git a/cl/_testgo/ifaceprom/out.ll b/cl/_testgo/ifaceprom/out.ll index 51d71bdb..f20b24e0 100644 --- a/cl/_testgo/ifaceprom/out.ll +++ b/cl/_testgo/ifaceprom/out.ll @@ -15,7 +15,7 @@ source_filename = "main" @0 = private unnamed_addr constant [3 x i8] c"two", align 1 @__llgo_argc = global i32 0, align 4 @__llgo_argv = global ptr null, align 8 -@_llgo_main.impl = global ptr null, align 8 +@_llgo_main.impl = linkonce global ptr null, align 8 @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw" = linkonce global ptr null, align 8 @1 = private unnamed_addr constant [4 x i8] c"main", align 1 @2 = private unnamed_addr constant [3 x i8] c"one", align 1 @@ -26,7 +26,7 @@ source_filename = "main" @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null, align 8 @_llgo_string = linkonce global ptr null, align 8 @5 = private unnamed_addr constant [4 x i8] c"impl", align 1 -@"main.iface$zZ89tENb5h_KNjvpxf1TXPfaWFYn0IZrZwyVf42lRtA" = global ptr null, align 8 +@"main.iface$zZ89tENb5h_KNjvpxf1TXPfaWFYn0IZrZwyVf42lRtA" = linkonce global ptr null, align 8 @_llgo_main.I = linkonce global ptr null, align 8 @6 = private unnamed_addr constant [6 x i8] c"main.I", align 1 @7 = private unnamed_addr constant [21 x i8] c"type assertion failed", align 1 diff --git a/cl/_testgo/interface/out.ll b/cl/_testgo/interface/out.ll index 1b7b3bb6..a830f5ef 100644 --- a/cl/_testgo/interface/out.ll +++ b/cl/_testgo/interface/out.ll @@ -31,7 +31,7 @@ source_filename = "main" @"_llgo_github.com/goplus/llgo/cl/internal/foo.Gamer" = linkonce global ptr null, align 8 @8 = private unnamed_addr constant [38 x i8] c"github.com/goplus/llgo/cl/internal/foo", align 1 @9 = private unnamed_addr constant [44 x i8] c"github.com/goplus/llgo/cl/internal/foo.Gamer", align 1 -@"main.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg" = global ptr null, align 8 +@"main.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg" = linkonce global ptr null, align 8 @10 = private unnamed_addr constant [2 x i8] c"OK", align 1 @11 = private unnamed_addr constant [4 x i8] c"FAIL", align 1 diff --git a/cl/_testgo/invoke/out.ll b/cl/_testgo/invoke/out.ll index b1222dc0..51f991b9 100644 --- a/cl/_testgo/invoke/out.ll +++ b/cl/_testgo/invoke/out.ll @@ -24,7 +24,7 @@ source_filename = "main" @__llgo_argv = global ptr null, align 8 @7 = private unnamed_addr constant [5 x i8] c"hello", align 1 @_llgo_main.T = linkonce global ptr null, align 8 -@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = global ptr null, align 8 +@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = linkonce global ptr null, align 8 @8 = private unnamed_addr constant [1 x i8] c"s", align 1 @9 = private unnamed_addr constant [4 x i8] c"main", align 1 @10 = private unnamed_addr constant [6 x i8] c"Invoke", align 1 @@ -51,12 +51,12 @@ source_filename = "main" @16 = private unnamed_addr constant [2 x i8] c"T4", align 1 @"*_llgo_main.T4" = linkonce global ptr null, align 8 @_llgo_main.T5 = linkonce global ptr null, align 8 -@"main.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U" = global ptr null, align 8 +@"main.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U" = linkonce global ptr null, align 8 @17 = private unnamed_addr constant [1 x i8] c"n", align 1 @18 = private unnamed_addr constant [2 x i8] c"T5", align 1 @"*_llgo_main.T5" = linkonce global ptr null, align 8 @_llgo_main.T6 = linkonce global ptr null, align 8 -@"main.struct$2bSfJcCYDdttnIT-JASAjsTNUZvojBt4mPXFJdH4M10" = global ptr null, align 8 +@"main.struct$2bSfJcCYDdttnIT-JASAjsTNUZvojBt4mPXFJdH4M10" = linkonce global ptr null, align 8 @_llgo_Pointer = linkonce global ptr null, align 8 @19 = private unnamed_addr constant [1 x i8] c"f", align 1 @20 = private unnamed_addr constant [4 x i8] c"data", align 1 diff --git a/cl/_testgo/reader/out.ll b/cl/_testgo/reader/out.ll index f4ff7db7..6037860b 100644 --- a/cl/_testgo/reader/out.ll +++ b/cl/_testgo/reader/out.ll @@ -34,7 +34,7 @@ source_filename = "main" @5 = private unnamed_addr constant [7 x i8] c"WriteTo", align 1 @6 = private unnamed_addr constant [13 x i8] c"main.WriterTo", align 1 @"_llgo_iface$eN81k1zqixGTyagHw_4nqH4mGfwwehTOCTXUlbT9kzk" = linkonce global ptr null, align 8 -@_llgo_main.nopCloserWriterTo = global ptr null, align 8 +@_llgo_main.nopCloserWriterTo = linkonce global ptr null, align 8 @"_llgo_struct$_3ow4zXXILqvC0WDqDRNq5DPhjE1DInJgN924VHWc2Y" = linkonce global ptr null, align 8 @7 = private unnamed_addr constant [6 x i8] c"Reader", align 1 @8 = private unnamed_addr constant [4 x i8] c"Read", align 1 @@ -43,7 +43,7 @@ source_filename = "main" @"_llgo_func$8rsrSd_r3UHd_2DiYTyaOKR7BYkei4zw5ysG35KF38w" = linkonce global ptr null, align 8 @11 = private unnamed_addr constant [17 x i8] c"nopCloserWriterTo", align 1 @"_llgo_iface$L2Ik-AJcd0jsoBw5fQ07pQpfUM-kh78Wn2bOeak6M3I" = linkonce global ptr null, align 8 -@_llgo_main.nopCloser = global ptr null, align 8 +@_llgo_main.nopCloser = linkonce global ptr null, align 8 @12 = private unnamed_addr constant [9 x i8] c"nopCloser", align 1 @_llgo_main.StringWriter = linkonce global ptr null, align 8 @"_llgo_func$thH5FBpdXzJNnCpSfiLU5ItTntFU6LWp0RJhDm2XJjw" = linkonce global ptr null, align 8 @@ -55,8 +55,8 @@ source_filename = "main" @__llgo_argc = global i32 0, align 4 @__llgo_argv = global ptr null, align 8 @17 = private unnamed_addr constant [11 x i8] c"hello world", align 1 -@_llgo_main.stringReader = global ptr null, align 8 -@"main.struct$Mdt84yjYYwxF9D2i4cRmpEPiWaO6tsjtrbGUjyESypk" = global ptr null, align 8 +@_llgo_main.stringReader = linkonce global ptr null, align 8 +@"main.struct$Mdt84yjYYwxF9D2i4cRmpEPiWaO6tsjtrbGUjyESypk" = linkonce global ptr null, align 8 @18 = private unnamed_addr constant [1 x i8] c"s", align 1 @19 = private unnamed_addr constant [1 x i8] c"i", align 1 @20 = private unnamed_addr constant [8 x i8] c"prevRune", align 1 @@ -77,12 +77,12 @@ source_filename = "main" @27 = private unnamed_addr constant [10 x i8] c"UnreadByte", align 1 @28 = private unnamed_addr constant [10 x i8] c"UnreadRune", align 1 @29 = private unnamed_addr constant [12 x i8] c"stringReader", align 1 -@"*_llgo_main.stringReader" = global ptr null, align 8 +@"*_llgo_main.stringReader" = linkonce global ptr null, align 8 @"_llgo_iface$OFO8Us9n8ajWCabGedeuoJ-Za2zAMk4Jh0FunAcUCFE" = linkonce global ptr null, align 8 -@_llgo_main.errorString = global ptr null, align 8 -@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = global ptr null, align 8 +@_llgo_main.errorString = linkonce global ptr null, align 8 +@"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = linkonce global ptr null, align 8 @30 = private unnamed_addr constant [11 x i8] c"errorString", align 1 -@"*_llgo_main.errorString" = global ptr null, align 8 +@"*_llgo_main.errorString" = linkonce global ptr null, align 8 @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" = linkonce global ptr null, align 8 @31 = private unnamed_addr constant [21 x i8] c"type assertion failed", align 1 @32 = private unnamed_addr constant [37 x i8] c"stringsReader.ReadAt: negative offset", align 1 diff --git a/cl/_testgo/strucintf/out.ll b/cl/_testgo/strucintf/out.ll index 61c77f20..177d2281 100644 --- a/cl/_testgo/strucintf/out.ll +++ b/cl/_testgo/strucintf/out.ll @@ -7,7 +7,7 @@ source_filename = "main" %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } @"main.init$guard" = global i1 false, align 1 -@"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = global ptr null, align 8 +@"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = linkonce global ptr null, align 8 @0 = private unnamed_addr constant [1 x i8] c"v", align 1 @1 = private unnamed_addr constant [4 x i8] c"main", align 1 @__llgo_argc = global i32 0, align 4 diff --git a/cl/_testgo/struczero/out.ll b/cl/_testgo/struczero/out.ll index 6da698bb..078309d8 100644 --- a/cl/_testgo/struczero/out.ll +++ b/cl/_testgo/struczero/out.ll @@ -11,7 +11,7 @@ source_filename = "main" @"main.init$guard" = global i1 false, align 1 @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo" = linkonce global ptr null, align 8 -@"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs" = global ptr null, align 8 +@"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs" = linkonce global ptr null, align 8 @0 = private unnamed_addr constant [2 x i8] c"pb", align 1 @1 = private unnamed_addr constant [1 x i8] c"F", align 1 @2 = private unnamed_addr constant [4 x i8] c"main", align 1 @@ -21,8 +21,8 @@ source_filename = "main" @"*_llgo_byte" = linkonce global ptr null, align 8 @4 = private unnamed_addr constant [38 x i8] c"github.com/goplus/llgo/cl/internal/foo", align 1 @5 = private unnamed_addr constant [3 x i8] c"Foo", align 1 -@_llgo_main.bar = global ptr null, align 8 -@"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo" = global ptr null, align 8 +@_llgo_main.bar = linkonce global ptr null, align 8 +@"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo" = linkonce global ptr null, align 8 @6 = private unnamed_addr constant [1 x i8] c"f", align 1 @7 = private unnamed_addr constant [3 x i8] c"bar", align 1 @__llgo_argc = global i32 0, align 4 diff --git a/cl/_testrt/abinamed/out.ll b/cl/_testrt/abinamed/out.ll index 1c6ef94e..81461c38 100644 --- a/cl/_testrt/abinamed/out.ll +++ b/cl/_testrt/abinamed/out.ll @@ -15,7 +15,7 @@ source_filename = "main" @__llgo_argc = global i32 0, align 4 @__llgo_argv = global ptr null, align 8 @_llgo_main.T = linkonce global ptr null, align 8 -@"main.struct$FYfyNCnlvkYOztpQWjt-y8D_WY3tpxyt5Qo62CJffTE" = global ptr null, align 8 +@"main.struct$FYfyNCnlvkYOztpQWjt-y8D_WY3tpxyt5Qo62CJffTE" = linkonce global ptr null, align 8 @0 = private unnamed_addr constant [1 x i8] c"p", align 1 @1 = private unnamed_addr constant [1 x i8] c"t", align 1 @2 = private unnamed_addr constant [1 x i8] c"n", align 1 diff --git a/cl/_testrt/eface/out.ll b/cl/_testrt/eface/out.ll index 6ccaacc4..bd1b441c 100644 --- a/cl/_testrt/eface/out.ll +++ b/cl/_testrt/eface/out.ll @@ -31,7 +31,7 @@ source_filename = "main" @_llgo_float32 = linkonce global ptr null, align 8 @_llgo_float64 = linkonce global ptr null, align 8 @"[10]_llgo_int" = linkonce global ptr null, align 8 -@"main.struct$hWvPvnlB9uIZSm1cMlcssbAfCpkLhNdpCzAk4conL0o" = global ptr null, align 8 +@"main.struct$hWvPvnlB9uIZSm1cMlcssbAfCpkLhNdpCzAk4conL0o" = linkonce global ptr null, align 8 @_llgo_Pointer = linkonce global ptr null, align 8 @3 = private unnamed_addr constant [1 x i8] c"f", align 1 @4 = private unnamed_addr constant [4 x i8] c"data", align 1 @@ -40,7 +40,7 @@ source_filename = "main" @"[]_llgo_int" = linkonce global ptr null, align 8 @6 = private unnamed_addr constant [5 x i8] c"hello", align 1 @_llgo_string = linkonce global ptr null, align 8 -@"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM" = global ptr null, align 8 +@"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM" = linkonce global ptr null, align 8 @7 = private unnamed_addr constant [1 x i8] c"x", align 1 @8 = private unnamed_addr constant [1 x i8] c"y", align 1 @9 = private unnamed_addr constant [1 x i8] c"z", align 1 diff --git a/cl/_testrt/funcdecl/out.ll b/cl/_testrt/funcdecl/out.ll index f890cb7e..5b91767a 100644 --- a/cl/_testrt/funcdecl/out.ll +++ b/cl/_testrt/funcdecl/out.ll @@ -8,7 +8,7 @@ source_filename = "main" %"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 } @"main.init$guard" = global i1 false, align 1 -@"main.struct$hWvPvnlB9uIZSm1cMlcssbAfCpkLhNdpCzAk4conL0o" = global ptr null, align 8 +@"main.struct$hWvPvnlB9uIZSm1cMlcssbAfCpkLhNdpCzAk4conL0o" = linkonce global ptr null, align 8 @_llgo_Pointer = linkonce global ptr null, align 8 @0 = private unnamed_addr constant [1 x i8] c"f", align 1 @1 = private unnamed_addr constant [4 x i8] c"data", align 1 diff --git a/cl/_testrt/makemap/out.ll b/cl/_testrt/makemap/out.ll index 06549ca2..fe9d5c53 100644 --- a/cl/_testrt/makemap/out.ll +++ b/cl/_testrt/makemap/out.ll @@ -34,7 +34,7 @@ source_filename = "main" @13 = private unnamed_addr constant [21 x i8] c"type assertion failed", align 1 @_llgo_main.K = linkonce global ptr null, align 8 @_llgo_main.N = linkonce global ptr null, align 8 -@"main.struct$e65EDK9vxC36Nz3YTgO1ulssLlNH03Bva_WWaCjH-4A" = global ptr null, align 8 +@"main.struct$e65EDK9vxC36Nz3YTgO1ulssLlNH03Bva_WWaCjH-4A" = linkonce global ptr null, align 8 @14 = private unnamed_addr constant [2 x i8] c"n1", align 1 @15 = private unnamed_addr constant [2 x i8] c"n2", align 1 @16 = private unnamed_addr constant [1 x i8] c"N", align 1 diff --git a/cl/_testrt/tpabi/out.ll b/cl/_testrt/tpabi/out.ll index aaf414b2..052cbec3 100644 --- a/cl/_testrt/tpabi/out.ll +++ b/cl/_testrt/tpabi/out.ll @@ -15,7 +15,7 @@ source_filename = "main" @__llgo_argv = global ptr null, align 8 @0 = private unnamed_addr constant [1 x i8] c"a", align 1 @"_llgo_main.T[string,int]" = linkonce global ptr null, align 8 -@"main.struct$A2OTYqQyUOqOQ-i_F5iXeAKWtxeWGEuyeN7HCfULCDk" = global ptr null, align 8 +@"main.struct$A2OTYqQyUOqOQ-i_F5iXeAKWtxeWGEuyeN7HCfULCDk" = linkonce global ptr null, align 8 @1 = private unnamed_addr constant [1 x i8] c"m", align 1 @2 = private unnamed_addr constant [1 x i8] c"n", align 1 @3 = private unnamed_addr constant [4 x i8] c"main", align 1 diff --git a/cl/builtin_test.go b/cl/builtin_test.go index 615b3274..e468a4ec 100644 --- a/cl/builtin_test.go +++ b/cl/builtin_test.go @@ -285,45 +285,39 @@ func TestErrVarOf(t *testing.T) { func TestContextResolveLinkname(t *testing.T) { tests := []struct { - name string - context *context - input string - want string - panics bool + name string + link map[string]string + input string + want string + panics bool }{ { name: "Normal", - context: &context{ - link: map[string]string{ - "foo": "C.bar", - }, + link: map[string]string{ + "foo": "C.bar", }, input: "foo", want: "bar", }, { name: "MultipleLinks", - context: &context{ - link: map[string]string{ - "foo1": "C.bar1", - "foo2": "C.bar2", - }, + link: map[string]string{ + "foo1": "C.bar1", + "foo2": "C.bar2", }, input: "foo2", want: "bar2", }, { - name: "NoLink", - context: &context{link: map[string]string{}}, - input: "foo", - want: "foo", + name: "NoLink", + link: map[string]string{}, + input: "foo", + want: "foo", }, { name: "InvalidLink", - context: &context{ - link: map[string]string{ - "foo": "invalid.bar", - }, + link: map[string]string{ + "foo": "invalid.bar", }, input: "foo", panics: true, @@ -338,7 +332,11 @@ func TestContextResolveLinkname(t *testing.T) { } }() } - got := tt.context.resolveLinkname(tt.input) + ctx := &context{prog: llssa.NewProgram(nil)} + for k, v := range tt.link { + ctx.prog.SetLinkname(k, v) + } + got := ctx.resolveLinkname(tt.input) if !tt.panics { if got != tt.want { t.Errorf("got %q, want %q", got, tt.want) diff --git a/cl/compile.go b/cl/compile.go index bf0bf358..1c060640 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -89,7 +89,6 @@ type context struct { goTyps *types.Package goPkg *ssa.Package pyMod string - link map[string]string // pkgPath.nameInPkg => linkname skips map[string]none loaded map[*types.Package]*pkgInfo // loaded packages bvals map[ssa.Value]llssa.Expr // block values @@ -827,7 +826,6 @@ func NewPackageEx(prog llssa.Program, patches Patches, pkg *ssa.Package, files [ goTyps: pkgTypes, goPkg: pkg, patches: patches, - link: make(map[string]string), skips: make(map[string]none), vargs: make(map[*ssa.Alloc][]llssa.Expr), loaded: map[*types.Package]*pkgInfo{ @@ -936,7 +934,7 @@ func (p *context) patchType(typ types.Type) types.Type { } func (p *context) resolveLinkname(name string) string { - if link, ok := p.link[name]; ok { + if link, ok := p.prog.Linkname(name); ok { prefix, ltarget, _ := strings.Cut(link, ".") if prefix != "C" { panic("resolveLinkname: invalid link: " + link) diff --git a/cl/import.go b/cl/import.go index 69861dca..58ae08a8 100644 --- a/cl/import.go +++ b/cl/import.go @@ -266,7 +266,7 @@ func (p *context) initLink(line string, prefix int, f func(inPkgName string) (fu if fullName, isVar, ok := f(inPkgName); ok { link := strings.TrimLeft(text[idx+1:], " ") if isVar || strings.Contains(link, ".") { // eg. C.printf, C.strlen, llgo.cstr - p.link[fullName] = link + p.prog.SetLinkname(fullName, link) } else { panic(line + ": no specified call convention. eg. //go:linkname Printf C.printf") } @@ -434,7 +434,7 @@ func (p *context) funcName(fn *ssa.Function, ignore bool) (*types.Package, strin return nil, orgName, ignoredFunc } } - if v, ok := p.link[orgName]; ok { + if v, ok := p.prog.Linkname(orgName); ok { if strings.HasPrefix(v, "C.") { return nil, v[2:], cFunc } @@ -458,7 +458,7 @@ const ( func (p *context) varName(pkg *types.Package, v *ssa.Global) (vName string, vtype int, define bool) { name := llssa.FullName(pkg, v.Name()) - if v, ok := p.link[name]; ok { + if v, ok := p.prog.Linkname(name); ok { if pos := strings.IndexByte(v, '.'); pos >= 0 { if pos == 2 && v[0] == 'p' && v[1] == 'y' { return v[3:], pyVar, false diff --git a/ssa/abitype.go b/ssa/abitype.go index 50912370..3c566dbd 100644 --- a/ssa/abitype.go +++ b/ssa/abitype.go @@ -431,9 +431,7 @@ func (b Builder) loadType(t types.Type) Global { prog := b.Prog g = pkg.doNewVar(name, prog.AbiTypePtrPtr()) g.InitNil() - if pub { - g.impl.SetLinkage(llvm.LinkOnceAnyLinkage) - } + g.impl.SetLinkage(llvm.LinkOnceAnyLinkage) pkg.abiTypeInit(g, t, pub) } return g diff --git a/ssa/package.go b/ssa/package.go index 2e9d6da4..57b3ed1d 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -191,6 +191,7 @@ type aProgram struct { sigljmpTy *types.Signature paramObjPtr_ *types.Var + linkname map[string]string // pkgPath.nameInPkg => linkname ptrSize int @@ -227,6 +228,7 @@ func NewProgram(target *Target) Program { ctx: ctx, gocvt: newGoTypes(), target: target, td: td, is32Bits: is32Bits, ptrSize: td.PointerSize(), named: make(map[string]llvm.Type), fnnamed: make(map[string]int), + linkname: make(map[string]string), } } @@ -245,6 +247,15 @@ func (p Program) SetTypeBackground(fullName string, bg Background) { p.gocvt.typbg[fullName] = bg } +func (p Program) SetLinkname(name, link string) { + p.linkname[name] = link +} + +func (p Program) Linkname(name string) (link string, ok bool) { + link, ok = p.linkname[name] + return +} + func (p Program) runtime() *types.Package { if p.rt == nil { p.rt = p.rtget()