Skip to content

Commit 4d25691

Browse files
luoliwoshangclaude
andcommitted
ssa: fix slice return value corruption when struct field modified
Fixes #1608 When a function returns a single slice value, and that slice is read from a struct field, then the field is modified before return, llgo incorrectly returns the modified value instead of the original value. Root cause: The compiler reuses the same stack slot for both the local variable and the struct field, causing memory aliasing. When the field is updated, the return value gets overwritten. Example of the bug: ```go func problem() []string { var t = T{data: []string{"a", "b"}} a := t.data // Read field t.data = []string{"a", "b", "c"} // Modify field return a // Expected: ["a", "b"], Actual: ["a", "b", "c"] } ``` Solution: Force materialization of aggregate return values by creating a temporary copy via alloca + store + load. This ensures the return value has its own stack slot, independent of any struct fields. The fix applies to all aggregate types (struct, array, slice) to prevent similar issues. Multi-value returns were already working correctly because insertvalue creates an implicit copy. Impact: This also fixes control flow statement initialization bugs (if/switch/typeswitch) that rely on gogen's clearBlockStmt() function, which was affected by this issue. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 643d61e commit 4d25691

File tree

22 files changed

+338
-109
lines changed

22 files changed

+338
-109
lines changed

cl/_testdata/foo/out.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ _llgo_0:
3737
%3 = extractvalue { i64 } %2, 0
3838
%4 = inttoptr i64 %3 to ptr
3939
%5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", ptr undef }, ptr %4, 1
40-
ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5
40+
%6 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.eface", align 8
41+
store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, ptr %6, align 8
42+
%7 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %6, align 8
43+
ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7
4144
}
4245

4346
define %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/goplus/llgo/cl/_testdata/foo.F"() {
@@ -50,7 +53,10 @@ _llgo_0:
5053
%3 = extractvalue { i64 } %2, 0
5154
%4 = inttoptr i64 %3 to ptr
5255
%5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %4, 1
53-
ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5
56+
%6 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.eface", align 8
57+
store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, ptr %6, align 8
58+
%7 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %6, align 8
59+
ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7
5460
}
5561

5662
define ptr @"github.com/goplus/llgo/cl/_testdata/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/_testdata/foo.Foo" %0) {

cl/_testdata/print/out.ll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,10 @@ _llgo_0:
9797
%12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.slice", ptr %2, i32 0, i32 2
9898
store i64 %11, ptr %12, align 4
9999
%13 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %2, align 8
100-
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13
100+
%14 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice", align 8
101+
store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13, ptr %14, align 8
102+
%15 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %14, align 8
103+
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %15
101104
}
102105

103106
define void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0) {

cl/_testgo/abimethod/out.ll

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,15 +1059,21 @@ _llgo_0:
10591059
%1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1
10601060
%2 = load ptr, ptr %1, align 8
10611061
%3 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %2)
1062-
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3
1062+
%4 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice", align 8
1063+
store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, ptr %4, align 8
1064+
%5 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %4, align 8
1065+
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5
10631066
}
10641067

10651068
define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Bytes"(ptr %0) {
10661069
_llgo_0:
10671070
%1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1
10681071
%2 = load ptr, ptr %1, align 8
10691072
%3 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %2)
1070-
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3
1073+
%4 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice", align 8
1074+
store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, ptr %4, align 8
1075+
%5 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %4, align 8
1076+
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5
10711077
}
10721078

10731079
define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Cap"(ptr %0) {
@@ -1099,7 +1105,10 @@ _llgo_0:
10991105
%2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1
11001106
%3 = load ptr, ptr %2, align 8
11011107
%4 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %3, i64 %1)
1102-
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4
1108+
%5 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice", align 8
1109+
store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4, ptr %5, align 8
1110+
%6 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %5, align 8
1111+
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6
11031112
}
11041113

11051114
define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Read"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) {
@@ -1189,7 +1198,10 @@ _llgo_0:
11891198
%1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1
11901199
%2 = load ptr, ptr %1, align 8
11911200
%3 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %2)
1192-
ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %3
1201+
%4 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.String", align 8
1202+
store %"github.com/goplus/llgo/runtime/internal/runtime.String" %3, ptr %4, align 8
1203+
%5 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %4, align 8
1204+
ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %5
11931205
}
11941206

11951207
define void @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Truncate"(ptr %0, i64 %1) {
@@ -1205,15 +1217,21 @@ _llgo_0:
12051217
%1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1
12061218
%2 = load ptr, ptr %1, align 8
12071219
%3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %2)
1208-
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3
1220+
%4 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.iface", align 8
1221+
store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, ptr %4, align 8
1222+
%5 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %4, align 8
1223+
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5
12091224
}
12101225

12111226
define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.UnreadRune"(ptr %0) {
12121227
_llgo_0:
12131228
%1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1
12141229
%2 = load ptr, ptr %1, align 8
12151230
%3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %2)
1216-
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3
1231+
%4 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.iface", align 8
1232+
store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, ptr %4, align 8
1233+
%5 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %4, align 8
1234+
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5
12171235
}
12181236

12191237
define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Write"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) {
@@ -1233,7 +1251,10 @@ _llgo_0:
12331251
%2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1
12341252
%3 = load ptr, ptr %2, align 8
12351253
%4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %3, i8 %1)
1236-
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4
1254+
%5 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.iface", align 8
1255+
store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %5, align 8
1256+
%6 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %5, align 8
1257+
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6
12371258
}
12381259

12391260
define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteRune"(ptr %0, i32 %1) {
@@ -1331,7 +1352,10 @@ _llgo_0:
13311352
%2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1
13321353
%3 = load ptr, ptr %2, align 8
13331354
%4 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %3)
1334-
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4
1355+
%5 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice", align 8
1356+
store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4, ptr %5, align 8
1357+
%6 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %5, align 8
1358+
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6
13351359
}
13361360

13371361
define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Bytes"({ i64, ptr } %0) {
@@ -1342,7 +1366,10 @@ _llgo_0:
13421366
%2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1
13431367
%3 = load ptr, ptr %2, align 8
13441368
%4 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %3)
1345-
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4
1369+
%5 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice", align 8
1370+
store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4, ptr %5, align 8
1371+
%6 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %5, align 8
1372+
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6
13461373
}
13471374

13481375
define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Cap"({ i64, ptr } %0) {
@@ -1386,7 +1413,10 @@ _llgo_0:
13861413
%3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1
13871414
%4 = load ptr, ptr %3, align 8
13881415
%5 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %4, i64 %1)
1389-
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5
1416+
%6 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice", align 8
1417+
store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, ptr %6, align 8
1418+
%7 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %6, align 8
1419+
ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7
13901420
}
13911421

13921422
define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Read"({ i64, ptr } %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) {
@@ -1500,7 +1530,10 @@ _llgo_0:
15001530
%2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1
15011531
%3 = load ptr, ptr %2, align 8
15021532
%4 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %3)
1503-
ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4
1533+
%5 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.String", align 8
1534+
store %"github.com/goplus/llgo/runtime/internal/runtime.String" %4, ptr %5, align 8
1535+
%6 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %5, align 8
1536+
ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %6
15041537
}
15051538

15061539
define void @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Truncate"({ i64, ptr } %0, i64 %1) {
@@ -1522,7 +1555,10 @@ _llgo_0:
15221555
%2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1
15231556
%3 = load ptr, ptr %2, align 8
15241557
%4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %3)
1525-
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4
1558+
%5 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.iface", align 8
1559+
store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %5, align 8
1560+
%6 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %5, align 8
1561+
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6
15261562
}
15271563

15281564
define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.UnreadRune"({ i64, ptr } %0) {
@@ -1533,7 +1569,10 @@ _llgo_0:
15331569
%2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1
15341570
%3 = load ptr, ptr %2, align 8
15351571
%4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %3)
1536-
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4
1572+
%5 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.iface", align 8
1573+
store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %5, align 8
1574+
%6 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %5, align 8
1575+
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6
15371576
}
15381577

15391578
define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Write"({ i64, ptr } %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) {
@@ -1559,7 +1598,10 @@ _llgo_0:
15591598
%3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1
15601599
%4 = load ptr, ptr %3, align 8
15611600
%5 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %4, i8 %1)
1562-
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5
1601+
%6 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.iface", align 8
1602+
store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %6, align 8
1603+
%7 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %6, align 8
1604+
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7
15631605
}
15641606

15651607
define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteRune"({ i64, ptr } %0, i32 %1) {

cl/_testgo/closure2/out.ll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ _llgo_0:
4444
%5 = getelementptr inbounds { ptr }, ptr %4, i32 0, i32 0
4545
store ptr %3, ptr %5, align 8
4646
%6 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/closure2.main$1$1", ptr undef }, ptr %4, 1
47-
ret { ptr, ptr } %6
47+
%7 = alloca { ptr, ptr }, align 8
48+
store { ptr, ptr } %6, ptr %7, align 8
49+
%8 = load { ptr, ptr }, ptr %7, align 8
50+
ret { ptr, ptr } %8
4851
}
4952

5053
define void @"github.com/goplus/llgo/cl/_testgo/closure2.main$1$1"(ptr %0, i64 %1) {

cl/_testgo/closureall/out.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ _llgo_0:
152152

153153
define %"github.com/goplus/llgo/cl/_testgo/closureall.Fn" @"github.com/goplus/llgo/cl/_testgo/closureall.makeNoFree"() {
154154
_llgo_0:
155-
ret %"github.com/goplus/llgo/cl/_testgo/closureall.Fn" { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/closureall.makeNoFree$1", ptr null }
155+
%0 = alloca %"github.com/goplus/llgo/cl/_testgo/closureall.Fn", align 8
156+
store %"github.com/goplus/llgo/cl/_testgo/closureall.Fn" { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/closureall.makeNoFree$1", ptr null }, ptr %0, align 8
157+
%1 = load %"github.com/goplus/llgo/cl/_testgo/closureall.Fn", ptr %0, align 8
158+
ret %"github.com/goplus/llgo/cl/_testgo/closureall.Fn" %1
156159
}
157160

158161
define i64 @"github.com/goplus/llgo/cl/_testgo/closureall.makeNoFree$1"(i64 %0) {
@@ -172,7 +175,10 @@ _llgo_0:
172175
%5 = alloca %"github.com/goplus/llgo/cl/_testgo/closureall.Fn", align 8
173176
store { ptr, ptr } %4, ptr %5, align 8
174177
%6 = load %"github.com/goplus/llgo/cl/_testgo/closureall.Fn", ptr %5, align 8
175-
ret %"github.com/goplus/llgo/cl/_testgo/closureall.Fn" %6
178+
%7 = alloca %"github.com/goplus/llgo/cl/_testgo/closureall.Fn", align 8
179+
store %"github.com/goplus/llgo/cl/_testgo/closureall.Fn" %6, ptr %7, align 8
180+
%8 = load %"github.com/goplus/llgo/cl/_testgo/closureall.Fn", ptr %7, align 8
181+
ret %"github.com/goplus/llgo/cl/_testgo/closureall.Fn" %8
176182
}
177183

178184
define i64 @"github.com/goplus/llgo/cl/_testgo/closureall.makeWithFree$1"(ptr %0, i64 %1) {

cl/_testgo/errors/out.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,20 @@ _llgo_0:
4444
%3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/errors.errorString")
4545
%4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0
4646
%5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %1, 1
47-
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5
47+
%6 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.iface", align 8
48+
store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %6, align 8
49+
%7 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %6, align 8
50+
ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7
4851
}
4952

5053
define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/errors.(*errorString).Error"(ptr %0) {
5154
_llgo_0:
5255
%1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/errors.errorString", ptr %0, i32 0, i32 0
5356
%2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8
54-
ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %2
57+
%3 = alloca %"github.com/goplus/llgo/runtime/internal/runtime.String", align 8
58+
store %"github.com/goplus/llgo/runtime/internal/runtime.String" %2, ptr %3, align 8
59+
%4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8
60+
ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4
5561
}
5662

5763
define void @"github.com/goplus/llgo/cl/_testgo/errors.init"() {

0 commit comments

Comments
 (0)