|
| 1 | +; RUN: opt < %s -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -S | FileCheck %s |
| 2 | + |
| 3 | +; We want to check that updating the declaration when updating the linkage name of a DISubporgram with a declaration. |
| 4 | + |
| 5 | +; Original source code: |
| 6 | +; public enum Foo { |
| 7 | +; public func bar() async { |
| 8 | +; await f() |
| 9 | +; } |
| 10 | +; } |
| 11 | +; public func f() async {} |
| 12 | + |
| 13 | + |
| 14 | +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| 15 | +target triple = "x86_64-apple-macosx12.0.0" |
| 16 | + |
| 17 | +%swift.async_func_pointer = type <{ i32, i32 }> |
| 18 | + |
| 19 | +@"$s3foo3FooO3baryyYaFTu" = global %swift.async_func_pointer <{ i32 trunc (i64 sub (i64 ptrtoint (ptr @"$s3foo3FooO3baryyYaF" to i64), i64 ptrtoint (ptr @"$s3foo3FooO3baryyYaFTu" to i64)) to i32), i32 16 }>, align 8 |
| 20 | +@"$s3foo1fyyYaFTu" = global %swift.async_func_pointer <{ i32 trunc (i64 sub (i64 ptrtoint (ptr @"$s3foo1fyyYaF" to i64), i64 ptrtoint (ptr @"$s3foo1fyyYaFTu" to i64)) to i32), i32 16 }>, align 8 |
| 21 | + |
| 22 | +define swifttailcc void @"$s3foo3FooO3baryyYaF"(ptr swiftasync %0) !dbg !5 { |
| 23 | +entry: |
| 24 | + %1 = alloca ptr, align 8 |
| 25 | + %2 = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr @"$s3foo3FooO3baryyYaFTu") |
| 26 | + %3 = call ptr @llvm.coro.begin(token %2, ptr null) |
| 27 | + store ptr %0, ptr %1, align 8 |
| 28 | + %4 = load i32, ptr getelementptr inbounds (%swift.async_func_pointer, ptr @"$s3foo1fyyYaFTu", i32 0, i32 1), align 8, !dbg !10 |
| 29 | + %5 = zext i32 %4 to i64, !dbg !10 |
| 30 | + %6 = call swiftcc ptr @swift_task_alloc(i64 %5), !dbg !10 |
| 31 | + call void @llvm.lifetime.start.p0(i64 -1, ptr %6), !dbg !10 |
| 32 | + %7 = load ptr, ptr %1, align 8, !dbg !10 |
| 33 | + %8 = getelementptr inbounds <{ ptr, ptr }>, ptr %6, i32 0, i32 0, !dbg !10 |
| 34 | + store ptr %7, ptr %8, align 8, !dbg !10 |
| 35 | + %9 = call ptr @llvm.coro.async.resume(), !dbg !10 |
| 36 | + %10 = getelementptr inbounds <{ ptr, ptr }>, ptr %6, i32 0, i32 1, !dbg !10 |
| 37 | + store ptr %9, ptr %10, align 8, !dbg !10 |
| 38 | + %11 = call { ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0s(i32 0, ptr %9, ptr @__swift_async_resume_project_context, ptr @"$s3foo3FooO3baryyYaF.0", ptr @"$s3foo1fyyYaF", ptr %6), !dbg !10 |
| 39 | + %12 = extractvalue { ptr } %11, 0, !dbg !10 |
| 40 | + %13 = call ptr @__swift_async_resume_project_context(ptr %12), !dbg !10 |
| 41 | + store ptr %13, ptr %1, align 8, !dbg !10 |
| 42 | + call swiftcc void @swift_task_dealloc(ptr %6), !dbg !10 |
| 43 | + call void @llvm.lifetime.end.p0(i64 -1, ptr %6), !dbg !10 |
| 44 | + %14 = load ptr, ptr %1, align 8, !dbg !11 |
| 45 | + %15 = getelementptr inbounds <{ ptr, ptr }>, ptr %14, i32 0, i32 1, !dbg !11 |
| 46 | + %16 = load ptr, ptr %15, align 8, !dbg !11 |
| 47 | + %17 = load ptr, ptr %1, align 8, !dbg !11 |
| 48 | + %18 = call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr %3, i1 false, ptr @"$s3foo3FooO3baryyYaF.0.1", ptr %16, ptr %17), !dbg !11 |
| 49 | + unreachable, !dbg !11 |
| 50 | +} |
| 51 | + |
| 52 | +; Function Attrs: nounwind |
| 53 | +declare token @llvm.coro.id.async(i32, i32, i32, ptr) #0 |
| 54 | + |
| 55 | +; Function Attrs: cold noreturn nounwind memory(inaccessiblemem: write) |
| 56 | +declare void @llvm.trap() #1 |
| 57 | + |
| 58 | +; Function Attrs: nounwind |
| 59 | +declare ptr @llvm.coro.begin(token, ptr writeonly) #0 |
| 60 | + |
| 61 | +declare swifttailcc void @"$s3foo1fyyYaF"(ptr swiftasync) |
| 62 | + |
| 63 | +declare swiftcc ptr @swift_task_alloc(i64) |
| 64 | + |
| 65 | +; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) |
| 66 | +declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2 |
| 67 | + |
| 68 | +; Function Attrs: nomerge nounwind |
| 69 | +declare ptr @llvm.coro.async.resume() #3 |
| 70 | + |
| 71 | +define linkonce_odr hidden ptr @__swift_async_resume_project_context(ptr %0) !dbg !12 { |
| 72 | +entry: |
| 73 | + %1 = load ptr, ptr %0, align 8, !dbg !14 |
| 74 | + %2 = call ptr @llvm.swift.async.context.addr(), !dbg !14 |
| 75 | + store ptr %1, ptr %2, align 8, !dbg !14 |
| 76 | + ret ptr %1, !dbg !14 |
| 77 | +} |
| 78 | + |
| 79 | +; Function Attrs: nounwind |
| 80 | +declare ptr @llvm.swift.async.context.addr() #0 |
| 81 | + |
| 82 | +define internal swifttailcc void @"$s3foo3FooO3baryyYaF.0"(ptr %0, ptr %1) !dbg !15 { |
| 83 | +entry: |
| 84 | + musttail call swifttailcc void %0(ptr swiftasync %1), !dbg !16 |
| 85 | + ret void, !dbg !16 |
| 86 | +} |
| 87 | + |
| 88 | +; Function Attrs: nomerge nounwind |
| 89 | +declare { ptr } @llvm.coro.suspend.async.sl_p0s(i32, ptr, ptr, ...) #3 |
| 90 | + |
| 91 | +declare swiftcc void @swift_task_dealloc(ptr) |
| 92 | + |
| 93 | +; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) |
| 94 | +declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2 |
| 95 | + |
| 96 | +define internal swifttailcc void @"$s3foo3FooO3baryyYaF.0.1"(ptr %0, ptr %1) !dbg !17 { |
| 97 | +entry: |
| 98 | + musttail call swifttailcc void %0(ptr swiftasync %1), !dbg !18 |
| 99 | + ret void, !dbg !18 |
| 100 | +} |
| 101 | + |
| 102 | +; Function Attrs: nounwind |
| 103 | +declare i1 @llvm.coro.end.async(ptr, i1, ...) #0 |
| 104 | + |
| 105 | +attributes #0 = { nounwind } |
| 106 | +attributes #1 = { cold noreturn nounwind memory(inaccessiblemem: write) } |
| 107 | +attributes #2 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } |
| 108 | +attributes #3 = { nomerge nounwind } |
| 109 | + |
| 110 | +!llvm.dbg.cu = !{!0} |
| 111 | +!llvm.module.flags = !{!3, !4} |
| 112 | + |
| 113 | +!0 = distinct !DICompileUnit(language: DW_LANG_Swift, file: !1, producer: "Apple Swift version 5.9-dev (LLVM 1c4b88beb62789b, Swift b00d1520f89bb7d)", isOptimized: false, runtimeVersion: 5, emissionKind: LineTablesOnly, imports: !2) |
| 114 | +!1 = !DIFile(filename: "foo.swift", directory: "/tmp") |
| 115 | +!2 = !{} |
| 116 | +!3 = !{i32 7, !"Dwarf Version", i32 4} |
| 117 | +!4 = !{i32 2, !"Debug Info Version", i32 3} |
| 118 | +; CHECK-DAG: ![[DECL:[0-9]+]] = !DISubprogram({{.*}}, linkageName: "$s3foo3FooO3baryyYaF" |
| 119 | +; CHECK-DAG: ![[DECL_Q0:[0-9]+]] = !DISubprogram({{.*}}, linkageName: "$s3foo3FooO3baryyYaFTQ0_" |
| 120 | +; CHECK-DAG: distinct !DISubprogram({{.*}}, linkageName: "$s3foo3FooO3baryyYaF"{{.*}}, declaration: ![[DECL]] |
| 121 | +; CHECK-DAG: distinct !DISubprogram({{.*}}, linkageName: "$s3foo3FooO3baryyYaFTQ0_"{{.*}}, declaration: ![[DECL_Q0]] |
| 122 | +!5 = distinct !DISubprogram(name: "bar", linkageName: "$s3foo3FooO3baryyYaF", scope: !6, file: !1, line: 2, type: !8, scopeLine: 2, spFlags: DISPFlagDefinition, unit: !0, declaration: !9, retainedNodes: !2) |
| 123 | +!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "$s3foo3FooOD", scope: !7, flags: DIFlagFwdDecl, runtimeLang: DW_LANG_Swift) |
| 124 | +!7 = !DIModule(scope: null, name: "foo") |
| 125 | +!8 = !DISubroutineType(types: null) |
| 126 | +!9 = !DISubprogram(name: "bar", linkageName: "$s3foo3FooO3baryyYaF", scope: !6, file: !1, line: 2, type: !8, scopeLine: 2, spFlags: 0) |
| 127 | +!10 = !DILocation(line: 3, column: 11, scope: !5) |
| 128 | +!11 = !DILocation(line: 4, column: 3, scope: !5) |
| 129 | +!12 = distinct !DISubprogram(linkageName: "__swift_async_resume_project_context", scope: !7, file: !13, type: !8, flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) |
| 130 | +!13 = !DIFile(filename: "<compiler-generated>", directory: "") |
| 131 | +!14 = !DILocation(line: 0, scope: !12) |
| 132 | +!15 = distinct !DISubprogram(linkageName: "$s3foo3FooO3baryyYaF", scope: !7, file: !13, type: !8, flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !0, retainedNodes: !2) |
| 133 | +!16 = !DILocation(line: 0, scope: !15) |
| 134 | +!17 = distinct !DISubprogram(linkageName: "$s3foo3FooO3baryyYaF", scope: !7, file: !13, type: !8, flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !0, retainedNodes: !2) |
| 135 | +!18 = !DILocation(line: 0, scope: !17) |
0 commit comments