Skip to content

Commit 6144987

Browse files
authored
Merge pull request #1224 from luoliwoshang/instr/asmfull
cl(feat): llgo.asm implement tinygo.AsmFull
2 parents fdc7d53 + f3de14d commit 6144987

File tree

8 files changed

+460
-6
lines changed

8 files changed

+460
-6
lines changed

_demo/asmfullcall/asmfullcall.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
//llgo:link asmFull llgo.asm
8+
func asmFull(instruction string, regs map[string]any) uintptr { return 0 }
9+
10+
var testVar = 0
11+
12+
func main() {
13+
verify()
14+
}
15+
16+
func check(expected, actual int) {
17+
if expected != actual {
18+
panic(fmt.Sprintf("Expected: %d, Got: %d\n", expected, actual))
19+
}
20+
fmt.Println("asm check passed:", actual)
21+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//go:build darwin && arm64
2+
3+
package main
4+
5+
import "unsafe"
6+
7+
func verify() {
8+
// 0 output & 0 input
9+
asmFull("nop", nil)
10+
11+
// 0 output & 1 input with memory address
12+
addr := uintptr(unsafe.Pointer(&testVar))
13+
asmFull("str {value}, [{addr}]", map[string]any{
14+
"addr": addr,
15+
"value": 43,
16+
})
17+
check(43, testVar)
18+
19+
// 1 output & 1 input
20+
res1 := asmFull("mov {}, {value}", map[string]any{
21+
"value": 41,
22+
})
23+
check(41, int(res1))
24+
25+
// 1 output & 2 inputs
26+
res2 := asmFull("add {}, {a}, {b}", map[string]any{
27+
"a": 25,
28+
"b": 17,
29+
})
30+
check(42, int(res2))
31+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//go:build linux && amd64
2+
3+
package main
4+
5+
import "unsafe"
6+
7+
func verify() {
8+
// 0 output & 0 input
9+
asmFull("nop", nil)
10+
11+
// 0 output & 1 input with memory address
12+
addr := uintptr(unsafe.Pointer(&testVar))
13+
asmFull("movq {value}, ({addr})", map[string]any{
14+
"addr": addr,
15+
"value": 43,
16+
})
17+
check(43, testVar)
18+
19+
// 1 output & 1 input
20+
res1 := asmFull("movq {value}, {}", map[string]any{
21+
"value": 41,
22+
})
23+
check(41, int(res1))
24+
25+
res2 := asmFull("leaq ({a},{b}), {}", map[string]any{
26+
"a": 25,
27+
"b": 17,
28+
})
29+
check(42, int(res2))
30+
}

cl/_testrt/asmfull/in.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package main
2+
3+
import _ "unsafe"
4+
5+
//go:linkname asmFull llgo.asm
6+
func asmFull(instruction string, regs map[string]any) uintptr
7+
8+
func main() {
9+
// no input,no return value
10+
asmFull("nop", nil)
11+
// input only,no return value
12+
asmFull("# test value {value}", map[string]any{"value": 42})
13+
// input with return value
14+
res1 := asmFull("mov {}, {value}", map[string]any{
15+
"value": 42,
16+
})
17+
println("Result:", res1)
18+
// note(zzy): multiple inputs with return value
19+
// only for test register & constraint,not have actual meaning
20+
// the ir compare cannot crossplatform currently
21+
// so just use a comment to test it
22+
res2 := asmFull("# calc {x} + {y} -> {}", map[string]any{
23+
"x": 25,
24+
"y": 17,
25+
})
26+
println("Result:", res2)
27+
}

cl/_testrt/asmfull/out.ll

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
; ModuleID = 'github.com/goplus/llgo/cl/_testrt/asmfull'
2+
source_filename = "github.com/goplus/llgo/cl/_testrt/asmfull"
3+
4+
%"github.com/goplus/llgo/runtime/internal/runtime.eface" = type { ptr, ptr }
5+
%"github.com/goplus/llgo/runtime/internal/runtime.String" = type { ptr, i64 }
6+
%"github.com/goplus/llgo/runtime/internal/runtime.Slice" = type { ptr, i64, i64 }
7+
%"github.com/goplus/llgo/runtime/abi.StructField" = type { %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 }
8+
9+
@"github.com/goplus/llgo/cl/_testrt/asmfull.init$guard" = global i1 false, align 1
10+
@_llgo_string = linkonce global ptr null, align 8
11+
@_llgo_any = linkonce global ptr null, align 8
12+
@0 = private unnamed_addr constant [41 x i8] c"github.com/goplus/llgo/cl/_testrt/asmfull", align 1
13+
@"map[_llgo_string]_llgo_any" = linkonce global ptr null, align 8
14+
@1 = private unnamed_addr constant [7 x i8] c"topbits", align 1
15+
@2 = private unnamed_addr constant [4 x i8] c"keys", align 1
16+
@3 = private unnamed_addr constant [5 x i8] c"elems", align 1
17+
@4 = private unnamed_addr constant [8 x i8] c"overflow", align 1
18+
@_llgo_int = linkonce global ptr null, align 8
19+
@5 = private unnamed_addr constant [5 x i8] c"value", align 1
20+
@6 = private unnamed_addr constant [7 x i8] c"Result:", align 1
21+
@7 = private unnamed_addr constant [1 x i8] c"x", align 1
22+
@8 = private unnamed_addr constant [1 x i8] c"y", align 1
23+
24+
define void @"github.com/goplus/llgo/cl/_testrt/asmfull.init"() {
25+
_llgo_0:
26+
%0 = load i1, ptr @"github.com/goplus/llgo/cl/_testrt/asmfull.init$guard", align 1
27+
br i1 %0, label %_llgo_2, label %_llgo_1
28+
29+
_llgo_1: ; preds = %_llgo_0
30+
store i1 true, ptr @"github.com/goplus/llgo/cl/_testrt/asmfull.init$guard", align 1
31+
call void @"github.com/goplus/llgo/cl/_testrt/asmfull.init$after"()
32+
br label %_llgo_2
33+
34+
_llgo_2: ; preds = %_llgo_1, %_llgo_0
35+
ret void
36+
}
37+
38+
define void @"github.com/goplus/llgo/cl/_testrt/asmfull.main"() {
39+
_llgo_0:
40+
call void asm sideeffect "nop", ""()
41+
%0 = load ptr, ptr @_llgo_string, align 8
42+
%1 = load ptr, ptr @_llgo_any, align 8
43+
%2 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
44+
%3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr %2, i64 1)
45+
%4 = load ptr, ptr @_llgo_int, align 8
46+
%5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %4, 0
47+
%6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, ptr inttoptr (i64 42 to ptr), 1
48+
%7 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
49+
%8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16)
50+
store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 5 }, ptr %8, align 8
51+
%9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr %7, ptr %3, ptr %8)
52+
store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %6, ptr %9, align 8
53+
call void asm sideeffect "# test value ${0}", "r"(i64 42)
54+
%10 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
55+
%11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr %10, i64 1)
56+
%12 = load ptr, ptr @_llgo_int, align 8
57+
%13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %12, 0
58+
%14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, ptr inttoptr (i64 42 to ptr), 1
59+
%15 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
60+
%16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16)
61+
store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 5 }, ptr %16, align 8
62+
%17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr %15, ptr %11, ptr %16)
63+
store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %14, ptr %17, align 8
64+
%18 = call i64 asm sideeffect "mov $0, ${1}", "=&r,r"(i64 42)
65+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 })
66+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32)
67+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %18)
68+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10)
69+
%19 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
70+
%20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr %19, i64 2)
71+
%21 = load ptr, ptr @_llgo_int, align 8
72+
%22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %21, 0
73+
%23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, ptr inttoptr (i64 25 to ptr), 1
74+
%24 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
75+
%25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16)
76+
store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 1 }, ptr %25, align 8
77+
%26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr %24, ptr %20, ptr %25)
78+
store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %23, ptr %26, align 8
79+
%27 = load ptr, ptr @_llgo_int, align 8
80+
%28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %27, 0
81+
%29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %28, ptr inttoptr (i64 17 to ptr), 1
82+
%30 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
83+
%31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16)
84+
store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 1 }, ptr %31, align 8
85+
%32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr %30, ptr %20, ptr %31)
86+
store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %29, ptr %32, align 8
87+
%33 = call i64 asm sideeffect "# calc ${1} + ${2} -> $0", "=&r,r,r"(i64 25, i64 17)
88+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 })
89+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32)
90+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %33)
91+
call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10)
92+
ret void
93+
}
94+
95+
define void @"github.com/goplus/llgo/cl/_testrt/asmfull.init$after"() {
96+
_llgo_0:
97+
%0 = load ptr, ptr @_llgo_string, align 8
98+
%1 = icmp eq ptr %0, null
99+
br i1 %1, label %_llgo_1, label %_llgo_2
100+
101+
_llgo_1: ; preds = %_llgo_0
102+
%2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Basic"(i64 24)
103+
store ptr %2, ptr @_llgo_string, align 8
104+
br label %_llgo_2
105+
106+
_llgo_2: ; preds = %_llgo_1, %_llgo_0
107+
%3 = load ptr, ptr @_llgo_any, align 8
108+
%4 = icmp eq ptr %3, null
109+
br i1 %4, label %_llgo_3, label %_llgo_4
110+
111+
_llgo_3: ; preds = %_llgo_2
112+
%5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0)
113+
%6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %5, 0
114+
%7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 0, 1
115+
%8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 0, 2
116+
%9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Interface"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 41 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8)
117+
store ptr %9, ptr @_llgo_any, align 8
118+
br label %_llgo_4
119+
120+
_llgo_4: ; preds = %_llgo_3, %_llgo_2
121+
%10 = load ptr, ptr @"map[_llgo_string]_llgo_any", align 8
122+
%11 = icmp eq ptr %10, null
123+
br i1 %11, label %_llgo_5, label %_llgo_6
124+
125+
_llgo_5: ; preds = %_llgo_4
126+
%12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Basic"(i64 24)
127+
%13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0)
128+
%14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %13, 0
129+
%15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, i64 0, 1
130+
%16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %15, i64 0, 2
131+
%17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Interface"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 41 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %16)
132+
%18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Basic"(i64 40)
133+
%19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.ArrayOf"(i64 8, ptr %18)
134+
%20 = call %"github.com/goplus/llgo/runtime/abi.StructField" @"github.com/goplus/llgo/runtime/internal/runtime.StructField"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 7 }, ptr %19, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false)
135+
%21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Basic"(i64 24)
136+
%22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.ArrayOf"(i64 8, ptr %21)
137+
%23 = call %"github.com/goplus/llgo/runtime/abi.StructField" @"github.com/goplus/llgo/runtime/internal/runtime.StructField"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 4 }, ptr %22, i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false)
138+
%24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0)
139+
%25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %24, 0
140+
%26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25, i64 0, 1
141+
%27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26, i64 0, 2
142+
%28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Interface"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 41 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %27)
143+
%29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.ArrayOf"(i64 8, ptr %28)
144+
%30 = call %"github.com/goplus/llgo/runtime/abi.StructField" @"github.com/goplus/llgo/runtime/internal/runtime.StructField"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr %29, i64 136, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false)
145+
%31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Basic"(i64 58)
146+
%32 = call %"github.com/goplus/llgo/runtime/abi.StructField" @"github.com/goplus/llgo/runtime/internal/runtime.StructField"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 8 }, ptr %31, i64 264, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false)
147+
%33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 224)
148+
%34 = getelementptr %"github.com/goplus/llgo/runtime/abi.StructField", ptr %33, i64 0
149+
store %"github.com/goplus/llgo/runtime/abi.StructField" %20, ptr %34, align 8
150+
%35 = getelementptr %"github.com/goplus/llgo/runtime/abi.StructField", ptr %33, i64 1
151+
store %"github.com/goplus/llgo/runtime/abi.StructField" %23, ptr %35, align 8
152+
%36 = getelementptr %"github.com/goplus/llgo/runtime/abi.StructField", ptr %33, i64 2
153+
store %"github.com/goplus/llgo/runtime/abi.StructField" %30, ptr %36, align 8
154+
%37 = getelementptr %"github.com/goplus/llgo/runtime/abi.StructField", ptr %33, i64 3
155+
store %"github.com/goplus/llgo/runtime/abi.StructField" %32, ptr %37, align 8
156+
%38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %33, 0
157+
%39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %38, i64 4, 1
158+
%40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %39, i64 4, 2
159+
%41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Struct"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 41 }, i64 272, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40)
160+
%42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapOf"(ptr %12, ptr %17, ptr %41, i64 12)
161+
call void @"github.com/goplus/llgo/runtime/internal/runtime.SetDirectIface"(ptr %42)
162+
store ptr %42, ptr @"map[_llgo_string]_llgo_any", align 8
163+
br label %_llgo_6
164+
165+
_llgo_6: ; preds = %_llgo_5, %_llgo_4
166+
%43 = load ptr, ptr @_llgo_int, align 8
167+
%44 = icmp eq ptr %43, null
168+
br i1 %44, label %_llgo_7, label %_llgo_8
169+
170+
_llgo_7: ; preds = %_llgo_6
171+
%45 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.Basic"(i64 34)
172+
store ptr %45, ptr @_llgo_int, align 8
173+
br label %_llgo_8
174+
175+
_llgo_8: ; preds = %_llgo_7, %_llgo_6
176+
ret void
177+
}
178+
179+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.Basic"(i64)
180+
181+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.Interface"(%"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.Slice")
182+
183+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64)
184+
185+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapOf"(ptr, ptr, ptr, i64)
186+
187+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.Struct"(%"github.com/goplus/llgo/runtime/internal/runtime.String", i64, %"github.com/goplus/llgo/runtime/internal/runtime.Slice")
188+
189+
declare %"github.com/goplus/llgo/runtime/abi.StructField" @"github.com/goplus/llgo/runtime/internal/runtime.StructField"(%"github.com/goplus/llgo/runtime/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/runtime/internal/runtime.String", i1)
190+
191+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.ArrayOf"(i64, ptr)
192+
193+
declare void @"github.com/goplus/llgo/runtime/internal/runtime.SetDirectIface"(ptr)
194+
195+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr, i64)
196+
197+
declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr, ptr, ptr)
198+
199+
declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String")
200+
201+
declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8)
202+
203+
declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64)

cl/builtin_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,52 @@ func TestErrBuiltin(t *testing.T) {
270270
test("atomicCmpXchg", func(ctx *context) { ctx.atomicCmpXchg(nil, nil) })
271271
}
272272

273+
func TestErrAsm(t *testing.T) {
274+
test := func(testName string, fn func(ctx *context)) {
275+
defer func() {
276+
if r := recover(); r == nil {
277+
t.Fatal(testName, ": no error?")
278+
}
279+
}()
280+
var ctx context
281+
fn(&ctx)
282+
}
283+
284+
test("asm(NoArgs)", func(ctx *context) { ctx.asm(nil, []ssa.Value{}) })
285+
test("asm(Nonconst)", func(ctx *context) { ctx.asm(nil, []ssa.Value{&ssa.Parameter{}}) })
286+
test("asmFull(Nonconst)", func(ctx *context) { ctx.asm(nil, []ssa.Value{&ssa.Parameter{}, &ssa.Parameter{}}) })
287+
test("asmFull(NonConstKey)", func(ctx *context) {
288+
makeMap := &ssa.MakeMap{}
289+
nonConstKey := &ssa.Parameter{}
290+
mapUpdate := &ssa.MapUpdate{Key: nonConstKey}
291+
referrers := []ssa.Instruction{mapUpdate}
292+
setRefs(unsafe.Pointer(makeMap), referrers...)
293+
strConst := &ssa.Const{
294+
Value: constant.MakeString("nop"),
295+
}
296+
ctx.asm(nil, []ssa.Value{strConst, makeMap})
297+
})
298+
test("asmFull(RegisterNotFound)", func(ctx *context) {
299+
makeMap := &ssa.MakeMap{}
300+
referrers := []ssa.Instruction{}
301+
setRefs(unsafe.Pointer(makeMap), referrers...)
302+
strConst := &ssa.Const{
303+
Value: constant.MakeString("test {missing}"),
304+
}
305+
ctx.asm(nil, []ssa.Value{strConst, makeMap})
306+
})
307+
test("asmFull(UnknownReferrer)", func(ctx *context) {
308+
makeMap := &ssa.MakeMap{}
309+
unknownRef := &ssa.Return{}
310+
referrers := []ssa.Instruction{unknownRef}
311+
setRefs(unsafe.Pointer(makeMap), referrers...)
312+
strConst := &ssa.Const{
313+
Value: constant.MakeString("test"),
314+
}
315+
ctx.asm(nil, []ssa.Value{strConst, makeMap})
316+
})
317+
}
318+
273319
func TestPkgNoInit(t *testing.T) {
274320
pkg := types.NewPackage("foo", "foo")
275321
ctx := &context{

0 commit comments

Comments
 (0)