|
| 1 | +// LITTEST |
1 | 2 | package main |
2 | 3 |
|
3 | 4 | /* |
4 | 5 | #include <stdlib.h> |
5 | 6 | */ |
6 | 7 | import "C" |
7 | 8 |
|
| 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: } |
8 | 105 | 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: } |
9 | 119 | 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: } |
10 | 131 | defer C.free(p) |
11 | 132 | } |
0 commit comments