Skip to content

Commit 3d4ba0c

Browse files
Merge pull request #7168 from DianQK/stable/20221013
[Coroutine][DebugInfo] Update the linkage name of the declaration of coro-split functions in the debug info.
2 parents c3dc7ee + 50f53a4 commit 3d4ba0c

File tree

3 files changed

+151
-2
lines changed

3 files changed

+151
-2
lines changed

llvm/include/llvm/IR/DebugInfoMetadata.h

+1
Original file line numberDiff line numberDiff line change
@@ -2085,6 +2085,7 @@ class DISubprogram : public DILocalScope {
20852085
DISubprogram *getDeclaration() const {
20862086
return cast_or_null<DISubprogram>(getRawDeclaration());
20872087
}
2088+
void replaceDeclaration(DISubprogram *Decl) { replaceOperandWith(6, Decl); }
20882089
DINodeArray getRetainedNodes() const {
20892090
return cast_or_null<MDTuple>(getRawRetainedNodes());
20902091
}

llvm/lib/Transforms/Coroutines/CoroSplit.cpp

+15-2
Original file line numberDiff line numberDiff line change
@@ -932,9 +932,22 @@ void CoroCloner::create() {
932932
// abstract specification, since the DWARF backend expects the
933933
// abstract specification to contain the linkage name and asserts
934934
// that they are identical.
935-
if (!SP->getDeclaration() && SP->getUnit() &&
936-
SP->getUnit()->getSourceLanguage() == dwarf::DW_LANG_Swift)
935+
if (SP->getUnit() &&
936+
SP->getUnit()->getSourceLanguage() == dwarf::DW_LANG_Swift) {
937937
SP->replaceLinkageName(MDString::get(Context, NewF->getName()));
938+
if (auto *Decl = SP->getDeclaration()) {
939+
auto *NewDecl = DISubprogram::get(
940+
Decl->getContext(), Decl->getScope(), Decl->getName(),
941+
NewF->getName(), Decl->getFile(), Decl->getLine(), Decl->getType(),
942+
Decl->getScopeLine(), Decl->getContainingType(),
943+
Decl->getVirtualIndex(), Decl->getThisAdjustment(),
944+
Decl->getFlags(), Decl->getSPFlags(), Decl->getUnit(),
945+
Decl->getTemplateParams(), nullptr, Decl->getRetainedNodes(),
946+
Decl->getThrownTypes(), Decl->getAnnotations(),
947+
Decl->getTargetFuncName());
948+
SP->replaceDeclaration(NewDecl);
949+
}
950+
}
938951
}
939952

940953
NewF->setLinkage(savedLinkage);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
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

Comments
 (0)