Skip to content

Commit 9754404

Browse files
cgo,test: fit int-sized lengths and inline IR checks
- expose and reuse Builder.FitIntSize when lowering slice lengths, unsafe.Slice, GoStringN, and GoBytes so cgo helpers receive platform-sized int arguments - convert cgobasic, cgocfiles, cgodefer, cgomacro, and cgopython checks to source-embedded LITTEST expectations - drop the old out.ll golden files replaced by inline CHECK directives Signed-off-by: ZhouGuangyuan <[email protected]>
1 parent 4b9faab commit 9754404

14 files changed

Lines changed: 627 additions & 16 deletions

File tree

cl/_testgo/cgobasic/cgobasic.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// LITTEST
12
package main
23

34
/*
@@ -11,6 +12,90 @@ import (
1112
"unsafe"
1213
)
1314

15+
// CHECK-LABEL: define double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_cos"(double %0){{.*}} {
16+
// CHECK-NEXT: _llgo_0:
17+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
18+
// CHECK-NEXT: %2 = load ptr, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_cos", align 8
19+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
20+
// CHECK-NEXT: %4 = call double %3(double %0)
21+
// CHECK-NEXT: ret double %4
22+
// CHECK-NEXT: }
23+
24+
// CHECK-LABEL: define [0 x i8] @"{{.*}}/cl/_testgo/cgobasic._Cfunc_free"(ptr %0){{.*}} {
25+
// CHECK-NEXT: _llgo_0:
26+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
27+
// CHECK-NEXT: %2 = load ptr, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_free", align 8
28+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
29+
// CHECK-NEXT: %4 = call [0 x i8] %3(ptr %0)
30+
// CHECK-NEXT: ret [0 x i8] %4
31+
// CHECK-NEXT: }
32+
33+
// CHECK-LABEL: define double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_log"(double %0){{.*}} {
34+
// CHECK-NEXT: _llgo_0:
35+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
36+
// CHECK-NEXT: %2 = load ptr, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_log", align 8
37+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
38+
// CHECK-NEXT: %4 = call double %3(double %0)
39+
// CHECK-NEXT: ret double %4
40+
// CHECK-NEXT: }
41+
42+
// CHECK-LABEL: define i32 @"{{.*}}/cl/_testgo/cgobasic._Cfunc_puts"(ptr %0){{.*}} {
43+
// CHECK-NEXT: _llgo_0:
44+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
45+
// CHECK-NEXT: %2 = load ptr, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_puts", align 8
46+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
47+
// CHECK-NEXT: %4 = call i32 %3(ptr %0)
48+
// CHECK-NEXT: ret i32 %4
49+
// CHECK-NEXT: }
50+
51+
// CHECK-LABEL: define double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_sin"(double %0){{.*}} {
52+
// CHECK-NEXT: _llgo_0:
53+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
54+
// CHECK-NEXT: %2 = load ptr, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_sin", align 8
55+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
56+
// CHECK-NEXT: %4 = call double %3(double %0)
57+
// CHECK-NEXT: ret double %4
58+
// CHECK-NEXT: }
59+
60+
// CHECK-LABEL: define double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_sqrt"(double %0){{.*}} {
61+
// CHECK-NEXT: _llgo_0:
62+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
63+
// CHECK-NEXT: %2 = load ptr, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_sqrt", align 8
64+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
65+
// CHECK-NEXT: %4 = call double %3(double %0)
66+
// CHECK-NEXT: ret double %4
67+
// CHECK-NEXT: }
68+
69+
// CHECK-LABEL: define void @"{{.*}}/cl/_testgo/cgobasic.init"(){{.*}} {
70+
// CHECK-NEXT: _llgo_0:
71+
// CHECK-NEXT: %0 = load i1, ptr @"{{.*}}/cl/_testgo/cgobasic.init$guard", align 1
72+
// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1
73+
// CHECK-EMPTY:
74+
// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0
75+
// CHECK-NEXT: store i1 true, ptr @"{{.*}}/cl/_testgo/cgobasic.init$guard", align 1
76+
// CHECK-NEXT: call void @syscall.init()
77+
// CHECK-NEXT: call void @fmt.init()
78+
// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_cos, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_cos", align 8
79+
// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_free, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_free", align 8
80+
// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_log, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_log", align 8
81+
// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_puts, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_puts", align 8
82+
// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_sin, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_sin", align 8
83+
// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_sqrt, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc_sqrt", align 8
84+
// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc__Cmalloc, ptr @"{{.*}}/cl/_testgo/cgobasic._cgo_{{.*}}_Cfunc__Cmalloc", align 8
85+
// CHECK-NEXT: br label %_llgo_2
86+
// CHECK-EMPTY:
87+
// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0
88+
// CHECK-NEXT: ret void
89+
// CHECK-NEXT: }
90+
91+
// CHECK-LABEL: define void @"{{.*}}/cl/_testgo/cgobasic.main"(){{.*}} {
92+
// CHECK: %{{.*}} = call i32 @"{{.*}}/cl/_testgo/cgobasic._Cfunc_puts"(ptr %{{.*}})
93+
// CHECK: %{{.*}} = call double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_sqrt"(double 2.000000e+00)
94+
// CHECK: %{{.*}} = call double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_sin"(double 2.000000e+00)
95+
// CHECK: %{{.*}} = call double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_cos"(double 2.000000e+00)
96+
// CHECK: %{{.*}} = call double @"{{.*}}/cl/_testgo/cgobasic._Cfunc_log"(double 2.000000e+00)
97+
// CHECK: %{{.*}} = insertvalue { ptr, ptr } { ptr @"{{.*}}/cl/_testgo/cgobasic.main$3", ptr undef }, ptr %{{.*}}, 1
98+
// CHECK: %{{.*}} = insertvalue { ptr, ptr } { ptr @"{{.*}}/cl/_testgo/cgobasic.main$4", ptr undef }, ptr %{{.*}}, 1
1499
func main() {
15100
// C.CString example
16101
cstr := C.CString("Hello, World!")
@@ -53,3 +138,45 @@ func main() {
53138
C.free(unsafe.Pointer(cstr))
54139
C.free(cbytes)
55140
}
141+
142+
// CHECK-LABEL: define ptr @"{{.*}}/cl/_testgo/cgobasic.main$1"(ptr %0){{.*}} {
143+
// CHECK-NEXT: _llgo_0:
144+
// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8
145+
// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0
146+
// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %2, align 8
147+
// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24)
148+
// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3, ptr %4, align 8
149+
// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4, 1
150+
// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.CBytes"(%"{{.*}}/runtime/internal/runtime.Slice" %3)
151+
// CHECK-NEXT: ret ptr %6
152+
// CHECK-NEXT: }
153+
154+
// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/cl/_testgo/cgobasic.main$2"(ptr %0){{.*}} {
155+
// CHECK-NEXT: _llgo_0:
156+
// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8
157+
// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0
158+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
159+
// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1
160+
// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.GoBytes"(ptr %3, i64 4)
161+
// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %5
162+
// CHECK-NEXT: }
163+
164+
// CHECK-LABEL: define void @"{{.*}}/cl/_testgo/cgobasic.main$3"(ptr %0){{.*}} {
165+
// CHECK-NEXT: _llgo_0:
166+
// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8
167+
// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0
168+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
169+
// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1
170+
// CHECK-NEXT: %5 = call [0 x i8] @"{{.*}}/cl/_testgo/cgobasic._Cfunc_free"(ptr %3)
171+
// CHECK-NEXT: ret void
172+
// CHECK-NEXT: }
173+
174+
// CHECK-LABEL: define void @"{{.*}}/cl/_testgo/cgobasic.main$4"(ptr %0){{.*}} {
175+
// CHECK-NEXT: _llgo_0:
176+
// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8
177+
// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0
178+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
179+
// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1
180+
// CHECK-NEXT: %5 = call [0 x i8] @"{{.*}}/cl/_testgo/cgobasic._Cfunc_free"(ptr %3)
181+
// CHECK-NEXT: ret void
182+
// CHECK-NEXT: }

cl/_testgo/cgobasic/out.ll

Lines changed: 0 additions & 1 deletion
This file was deleted.

cl/_testgo/cgocfiles/cgocfiles.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// LITTEST
12
package main
23

34
/*
@@ -6,6 +7,53 @@ package main
67
import "C"
78
import "fmt"
89

10+
// CHECK-LABEL: define i32 @"{{.*}}/cl/_testgo/cgocfiles._Cfunc_test_structs"(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4){{.*}} {
11+
// CHECK-NEXT: _llgo_0:
12+
// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
13+
// CHECK-NEXT: %6 = load ptr, ptr @"{{.*}}/cl/_testgo/cgocfiles._cgo_{{.*}}_Cfunc_test_structs", align 8
14+
// CHECK-NEXT: %7 = load ptr, ptr %6, align 8
15+
// CHECK-NEXT: %8 = call i32 %7(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4)
16+
// CHECK-NEXT: ret i32 %8
17+
// CHECK-NEXT: }
18+
19+
// CHECK-LABEL: define void @"{{.*}}/cl/_testgo/cgocfiles.main"(){{.*}} {
20+
// CHECK-NEXT: _llgo_0:
21+
// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4)
22+
// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___3", ptr %0, i32 0, i32 0
23+
// CHECK-NEXT: store i32 1, ptr %1, align 4
24+
// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
25+
// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___4", ptr %2, i32 0, i32 0
26+
// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___4", ptr %2, i32 0, i32 1
27+
// CHECK-NEXT: store i32 1, ptr %3, align 4
28+
// CHECK-NEXT: store i32 2, ptr %4, align 4
29+
// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12)
30+
// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___0", ptr %5, i32 0, i32 0
31+
// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___0", ptr %5, i32 0, i32 1
32+
// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___0", ptr %5, i32 0, i32 2
33+
// CHECK-NEXT: store i32 1, ptr %6, align 4
34+
// CHECK-NEXT: store i32 2, ptr %7, align 4
35+
// CHECK-NEXT: store i32 3, ptr %8, align 4
36+
// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16)
37+
// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___1", ptr %9, i32 0, i32 0
38+
// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___1", ptr %9, i32 0, i32 1
39+
// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___1", ptr %9, i32 0, i32 2
40+
// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___1", ptr %9, i32 0, i32 3
41+
// CHECK-NEXT: store i32 1, ptr %10, align 4
42+
// CHECK-NEXT: store i32 2, ptr %11, align 4
43+
// CHECK-NEXT: store i32 3, ptr %12, align 4
44+
// CHECK-NEXT: store i32 4, ptr %13, align 4
45+
// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 20)
46+
// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___2", ptr %14, i32 0, i32 0
47+
// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___2", ptr %14, i32 0, i32 1
48+
// CHECK-NEXT: %17 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___2", ptr %14, i32 0, i32 2
49+
// CHECK-NEXT: %18 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___2", ptr %14, i32 0, i32 3
50+
// CHECK-NEXT: %19 = getelementptr inbounds %"{{.*}}/cl/_testgo/cgocfiles._Ctype_struct___2", ptr %14, i32 0, i32 4
51+
// CHECK-NEXT: store i32 1, ptr %15, align 4
52+
// CHECK-NEXT: store i32 2, ptr %16, align 4
53+
// CHECK-NEXT: store i32 3, ptr %17, align 4
54+
// CHECK-NEXT: store i32 4, ptr %18, align 4
55+
// CHECK-NEXT: store i32 5, ptr %19, align 4
56+
// CHECK-NEXT: %20 = call i32 @"{{.*}}/cl/_testgo/cgocfiles._Cfunc_test_structs"(ptr %0, ptr %2, ptr %5, ptr %9, ptr %14)
957
func main() {
1058
r := C.test_structs(&C.s4{a: 1}, &C.s8{a: 1, b: 2}, &C.s12{a: 1, b: 2, c: 3}, &C.s16{a: 1, b: 2, c: 3, d: 4}, &C.s20{a: 1, b: 2, c: 3, d: 4, e: 5})
1159
fmt.Println(r)

cl/_testgo/cgocfiles/out.ll

Lines changed: 0 additions & 1 deletion
This file was deleted.

cl/_testgo/cgodefer/cgodefer.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,132 @@
1+
// LITTEST
12
package main
23

34
/*
45
#include <stdlib.h>
56
*/
67
import "C"
78

9+
// CHECK-LABEL: define [0 x i8] @"{{.*}}/cl/_testgo/cgodefer._Cfunc_free"(ptr %0){{.*}} {
10+
// CHECK-NEXT: _llgo_0:
11+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
12+
// CHECK-NEXT: %2 = load ptr, ptr @"{{.*}}/cl/_testgo/cgodefer._cgo_{{.*}}_Cfunc_free", align 8
13+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
14+
// CHECK-NEXT: %4 = call [0 x i8] %3(ptr %0)
15+
// CHECK-NEXT: ret [0 x i8] %4
16+
// CHECK-NEXT: }
17+
18+
// CHECK-LABEL: define void @"{{.*}}/cl/_testgo/cgodefer.main"(){{.*}} {
19+
// CHECK-NEXT: _llgo_0:
20+
// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
21+
// CHECK-NEXT: %1 = call ptr @malloc(i64 1024)
22+
// CHECK-NEXT: store ptr %1, ptr %0, align 8
23+
// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8)
24+
// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0
25+
// CHECK-NEXT: store ptr %0, ptr %3, align 8
26+
// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"{{.*}}/cl/_testgo/cgodefer.main$1", ptr undef }, ptr %2, 1
27+
// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1
28+
// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0
29+
// CHECK-NEXT: %7 = call { ptr, ptr } %6(ptr %5)
30+
// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"()
31+
// CHECK-NEXT: %9 = alloca i8, i64 {{.*}}, align 1
32+
// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48)
33+
// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 0
34+
// CHECK-NEXT: store ptr %9, ptr %11, align 8
35+
// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 1
36+
// CHECK-NEXT: store i64 0, ptr %12, align 8
37+
// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 2
38+
// CHECK-NEXT: store ptr %8, ptr %13, align 8
39+
// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 3
40+
// CHECK-NEXT: store ptr blockaddress(@"{{.*}}/cl/_testgo/cgodefer.main", %_llgo_2), ptr %14, align 8
41+
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %10)
42+
// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 1
43+
// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 3
44+
// CHECK-NEXT: %17 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 4
45+
// CHECK-NEXT: %18 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 5
46+
// CHECK-NEXT: store ptr null, ptr %18, align 8
47+
// CHECK-NEXT: %19 = call i32 @{{.*}}sigsetjmp(ptr %9, i32 0)
48+
// CHECK-NEXT: %20 = icmp eq i32 %19, 0
49+
// CHECK-NEXT: br i1 %20, label %_llgo_4, label %_llgo_5
50+
// CHECK-EMPTY:
51+
// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3
52+
// CHECK-NEXT: ret void
53+
// CHECK-EMPTY:
54+
// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4
55+
// CHECK-NEXT: store ptr blockaddress(@"{{.*}}/cl/_testgo/cgodefer.main", %_llgo_3), ptr %16, align 8
56+
// CHECK-NEXT: %21 = load i64, ptr %15, align 8
57+
// CHECK-NEXT: %22 = load ptr, ptr %18, align 8
58+
// CHECK-NEXT: %23 = icmp ne ptr %22, null
59+
// CHECK-NEXT: br i1 %23, label %_llgo_7, label %_llgo_8
60+
// CHECK-EMPTY:
61+
// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8
62+
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %8)
63+
// CHECK-NEXT: br label %_llgo_1
64+
// CHECK-EMPTY:
65+
// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0
66+
// CHECK-NEXT: %24 = load ptr, ptr %18, align 8
67+
// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32)
68+
// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %25, i32 0, i32 0
69+
// CHECK-NEXT: store ptr %24, ptr %26, align 8
70+
// CHECK-NEXT: %27 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %25, i32 0, i32 1
71+
// CHECK-NEXT: store i64 0, ptr %27, align 8
72+
// CHECK-NEXT: %28 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %25, i32 0, i32 2
73+
// CHECK-NEXT: store { ptr, ptr } %7, ptr %28, align 8
74+
// CHECK-NEXT: store ptr %25, ptr %18, align 8
75+
// CHECK-NEXT: store ptr blockaddress(@"{{.*}}/cl/_testgo/cgodefer.main", %_llgo_6), ptr %17, align 8
76+
// CHECK-NEXT: br label %_llgo_2
77+
// CHECK-EMPTY:
78+
// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0
79+
// CHECK-NEXT: store ptr blockaddress(@"{{.*}}/cl/_testgo/cgodefer.main", %_llgo_3), ptr %17, align 8
80+
// CHECK-NEXT: %29 = load ptr, ptr %16, align 8
81+
// CHECK-NEXT: indirectbr ptr %29, [label %_llgo_3, label %_llgo_2]
82+
// CHECK-EMPTY:
83+
// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8
84+
// CHECK-NEXT: ret void
85+
// CHECK-EMPTY:
86+
// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2
87+
// CHECK-NEXT: %30 = load ptr, ptr %18, align 8
88+
// CHECK-NEXT: %31 = load { ptr, i64, { ptr, ptr } }, ptr %30, align 8
89+
// CHECK-NEXT: %32 = extractvalue { ptr, i64, { ptr, ptr } } %31, 0
90+
// CHECK-NEXT: store ptr %32, ptr %18, align 8
91+
// CHECK-NEXT: %33 = extractvalue { ptr, i64, { ptr, ptr } } %31, 2
92+
// CHECK-NEXT: %34 = extractvalue { ptr, ptr } %33, 1
93+
// CHECK-NEXT: %35 = extractvalue { ptr, ptr } %33, 0
94+
// CHECK-NEXT: call void %35(ptr %34)
95+
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %30)
96+
// CHECK-NEXT: br label %_llgo_8
97+
// CHECK-EMPTY:
98+
// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2
99+
// CHECK-NEXT: %36 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, align 8
100+
// CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %36, 2
101+
// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %37)
102+
// CHECK-NEXT: %38 = load ptr, ptr %17, align 8
103+
// CHECK-NEXT: indirectbr ptr %38, [label %_llgo_3, label %_llgo_6]
104+
// CHECK-NEXT: }
8105
func main() {
106+
// CHECK-LABEL: define { ptr, ptr } @"{{.*}}/cl/_testgo/cgodefer.main$1"(ptr %0){{.*}} {
107+
// CHECK-NEXT: _llgo_0:
108+
// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8)
109+
// CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8
110+
// CHECK-NEXT: %3 = extractvalue { ptr } %2, 0
111+
// CHECK-NEXT: %4 = load ptr, ptr %3, align 8
112+
// CHECK-NEXT: store ptr %4, ptr %1, align 8
113+
// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8)
114+
// CHECK-NEXT: %6 = getelementptr inbounds { ptr }, ptr %5, i32 0, i32 0
115+
// CHECK-NEXT: store ptr %1, ptr %6, align 8
116+
// CHECK-NEXT: %7 = insertvalue { ptr, ptr } { ptr @"{{.*}}/cl/_testgo/cgodefer.main$1$1", ptr undef }, ptr %5, 1
117+
// CHECK-NEXT: ret { ptr, ptr } %7
118+
// CHECK-NEXT: }
9119
p := C.malloc(1024)
120+
// CHECK-LABEL: define void @"{{.*}}/cl/_testgo/cgodefer.main$1$1"(ptr %0){{.*}} {
121+
// CHECK-NEXT: _llgo_0:
122+
// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8
123+
// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0
124+
// CHECK-NEXT: %3 = load ptr, ptr %2, align 8
125+
// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1
126+
// CHECK-NEXT: %5 = extractvalue { ptr } %1, 0
127+
// CHECK-NEXT: %6 = load ptr, ptr %5, align 8
128+
// CHECK-NEXT: %7 = call [0 x i8] @"{{.*}}/cl/_testgo/cgodefer._Cfunc_free"(ptr %6)
129+
// CHECK-NEXT: ret void
130+
// CHECK-NEXT: }
10131
defer C.free(p)
11132
}

cl/_testgo/cgodefer/out.ll

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)