[prev in list] [next in list] [prev in thread] [next in thread] 

List:       llvm-commits
Subject:    [PATCH] D99693: Update the linkage name of coro-split functions where applicable
From:       Adrian Prantl via Phabricator via llvm-commits <llvm-commits () lists ! llvm ! org>
Date:       2021-03-31 23:52:51
Message-ID: Qw1Ion59TryQmmGuhRWkoA () geopod-ismtpd-2-1
[Download RAW message or body]

aprantl created this revision.
aprantl added reviewers: friss, vsk, ChuanqiXu.
Herald added subscribers: dexonsmith, lxfind, hiraditya.
aprantl requested review of this revision.
Herald added a project: LLVM.

This patch updates the linkage name in the DISubprogram of coro-split functions, \
which is particularly important for Swift, where the funclets have a special name \
mangling. This patch does not affect C++ coroutines, since the DW_AT_specification is \
expected to hold the (original) linkage name.


https://reviews.llvm.org/D99693

Files:
  llvm/include/llvm/IR/DebugInfoMetadata.h
  llvm/lib/Transforms/Coroutines/CoroSplit.cpp
  llvm/test/Transforms/Coroutines/coro-async.ll
  llvm/test/Transforms/Coroutines/coro-debug.ll


Index: llvm/test/Transforms/Coroutines/coro-debug.ll
===================================================================
--- llvm/test/Transforms/Coroutines/coro-debug.ll
+++ llvm/test/Transforms/Coroutines/coro-debug.ll
@@ -114,7 +114,7 @@
 !3 = !{i32 2, !"Dwarf Version", i32 4}
 !4 = !{i32 2, !"Debug Info Version", i32 3}
 !5 = !{!"clang version 5.0.0"}
-!6 = distinct !DISubprogram(name: "f", linkageName: "flink", scope: !7, file: !7, \
line: 55, type: !8, isLocal: false, isDefinition: true, scopeLine: 55, flags: \
DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) +!6 = distinct \
!DISubprogram(name: "f", linkageName: "flink", scope: !7, file: !7, line: 55, type: \
!8, isLocal: false, isDefinition: true, scopeLine: 55, flags: DIFlagPrototyped, \
isOptimized: false, unit: !0, retainedNodes: !2, declaration: !DISubprogram(name: \
"f", linkageName: "flink", scope: !7, file: !7, line: 55, type: !8, isLocal: false, \
                isDefinition: false, flags: DIFlagPrototyped))
 !7 = !DIFile(filename: "simple-repro.c", directory: \
                "C:\5CGitHub\5Cllvm\5Cbuild\5CDebug\5Cbin")
 !8 = !DISubroutineType(types: !9)
 !9 = !{!10, !11}
Index: llvm/test/Transforms/Coroutines/coro-async.ll
===================================================================
--- llvm/test/Transforms/Coroutines/coro-async.ll
+++ llvm/test/Transforms/Coroutines/coro-async.ll
@@ -547,7 +547,7 @@
                             scope: !2, file: !3, line: 1, type: !4,
                             scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2)
 ; CHECK: ![[SP2]] = distinct !DISubprogram(name: "my_async_function",
-; CHECK-SAME:                              linkageName: "my_async_function",
+; CHECK-SAME:                              linkageName: \
"my_async_function.resume.0",  ; CHECK-SAME:                              scopeLine: \
                2
 !2 = distinct !DICompileUnit(language: DW_LANG_Swift, file: !3, emissionKind: \
                FullDebug)
 !3 = !DIFile(filename: "/tmp/1.swift", directory: "/")
Index: llvm/lib/Transforms/Coroutines/CoroSplit.cpp
===================================================================
--- llvm/lib/Transforms/Coroutines/CoroSplit.cpp
+++ llvm/lib/Transforms/Coroutines/CoroSplit.cpp
@@ -846,6 +846,9 @@
 
   CloneFunctionInto(NewF, &OrigF, VMap,
                     CloneFunctionChangeType::LocalChangesOnly, Returns);
+
+  auto &Context = NewF->getContext();
+
   // For async functions / continuations, adjust the scope line of the
   // clone to the line number of the suspend point. The scope line is
   // associated with all pre-prologue instructions. This avoids a jump
@@ -855,6 +858,13 @@
     if (ActiveSuspend)
       if (auto DL = ActiveSuspend->getDebugLoc())
         SP->setScopeLine(DL->getLine());
+    // Update the linkage name to reflect the modified symbol
+    // name. This affects Swift, but not C++. We can only do this if
+    // the function doesn't have an abstract specification since the
+    // DWARF backend expects the abstract specification to contain the
+    // linkage name and asserts that they are identical.
+    if (!SP->getDeclaration())
+      SP->replaceLinkageName(MDString::get(Context, NewF->getName()));
   }
 
   NewF->setLinkage(savedLinkage);
@@ -862,8 +872,6 @@
   NewF->setUnnamedAddr(savedUnnamedAddr);
   NewF->setDLLStorageClass(savedDLLStorageClass);
 
-  auto &Context = NewF->getContext();
-
   // Replace the attributes of the new function:
   auto OrigAttrs = NewF->getAttributes();
   auto NewAttrs = AttributeList();
Index: llvm/include/llvm/IR/DebugInfoMetadata.h
===================================================================
--- llvm/include/llvm/IR/DebugInfoMetadata.h
+++ llvm/include/llvm/IR/DebugInfoMetadata.h
@@ -2010,6 +2010,8 @@
 
   StringRef getName() const { return getStringOperand(2); }
   StringRef getLinkageName() const { return getStringOperand(3); }
+  /// Only used by clients of CloneFunction, and only right after the cloning.
+  void replaceLinkageName(MDString *LN) { replaceOperandWith(3, LN); }
 
   DISubroutineType *getType() const {
     return cast_or_null<DISubroutineType>(getRawType());


["D99693.334560.patch" (D99693.334560.patch)]

Index: llvm/test/Transforms/Coroutines/coro-debug.ll
===================================================================
--- llvm/test/Transforms/Coroutines/coro-debug.ll
+++ llvm/test/Transforms/Coroutines/coro-debug.ll
@@ -114,7 +114,7 @@
 !3 = !{i32 2, !"Dwarf Version", i32 4}
 !4 = !{i32 2, !"Debug Info Version", i32 3}
 !5 = !{!"clang version 5.0.0"}
-!6 = distinct !DISubprogram(name: "f", linkageName: "flink", scope: !7, file: !7, \
line: 55, type: !8, isLocal: false, isDefinition: true, scopeLine: 55, flags: \
DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) +!6 = distinct \
!DISubprogram(name: "f", linkageName: "flink", scope: !7, file: !7, line: 55, type: \
!8, isLocal: false, isDefinition: true, scopeLine: 55, flags: DIFlagPrototyped, \
isOptimized: false, unit: !0, retainedNodes: !2, declaration: !DISubprogram(name: \
"f", linkageName: "flink", scope: !7, file: !7, line: 55, type: !8, isLocal: false, \
                isDefinition: false, flags: DIFlagPrototyped))
 !7 = !DIFile(filename: "simple-repro.c", directory: \
                "C:\5CGitHub\5Cllvm\5Cbuild\5CDebug\5Cbin")
 !8 = !DISubroutineType(types: !9)
 !9 = !{!10, !11}
Index: llvm/test/Transforms/Coroutines/coro-async.ll
===================================================================
--- llvm/test/Transforms/Coroutines/coro-async.ll
+++ llvm/test/Transforms/Coroutines/coro-async.ll
@@ -547,7 +547,7 @@
                             scope: !2, file: !3, line: 1, type: !4,
                             scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2)
 ; CHECK: ![[SP2]] = distinct !DISubprogram(name: "my_async_function",
-; CHECK-SAME:                              linkageName: "my_async_function",
+; CHECK-SAME:                              linkageName: \
"my_async_function.resume.0",  ; CHECK-SAME:                              scopeLine: \
                2
 !2 = distinct !DICompileUnit(language: DW_LANG_Swift, file: !3, emissionKind: \
                FullDebug)
 !3 = !DIFile(filename: "/tmp/1.swift", directory: "/")
Index: llvm/lib/Transforms/Coroutines/CoroSplit.cpp
===================================================================
--- llvm/lib/Transforms/Coroutines/CoroSplit.cpp
+++ llvm/lib/Transforms/Coroutines/CoroSplit.cpp
@@ -846,6 +846,9 @@
 
   CloneFunctionInto(NewF, &OrigF, VMap,
                     CloneFunctionChangeType::LocalChangesOnly, Returns);
+
+  auto &Context = NewF->getContext();
+
   // For async functions / continuations, adjust the scope line of the
   // clone to the line number of the suspend point. The scope line is
   // associated with all pre-prologue instructions. This avoids a jump
@@ -855,6 +858,13 @@
     if (ActiveSuspend)
       if (auto DL = ActiveSuspend->getDebugLoc())
         SP->setScopeLine(DL->getLine());
+    // Update the linkage name to reflect the modified symbol
+    // name. This affects Swift, but not C++. We can only do this if
+    // the function doesn't have an abstract specification since the
+    // DWARF backend expects the abstract specification to contain the
+    // linkage name and asserts that they are identical.
+    if (!SP->getDeclaration())
+      SP->replaceLinkageName(MDString::get(Context, NewF->getName()));
   }
 
   NewF->setLinkage(savedLinkage);
@@ -862,8 +872,6 @@
   NewF->setUnnamedAddr(savedUnnamedAddr);
   NewF->setDLLStorageClass(savedDLLStorageClass);
 
-  auto &Context = NewF->getContext();
-
   // Replace the attributes of the new function:
   auto OrigAttrs = NewF->getAttributes();
   auto NewAttrs = AttributeList();
Index: llvm/include/llvm/IR/DebugInfoMetadata.h
===================================================================
--- llvm/include/llvm/IR/DebugInfoMetadata.h
+++ llvm/include/llvm/IR/DebugInfoMetadata.h
@@ -2010,6 +2010,8 @@
 
   StringRef getName() const { return getStringOperand(2); }
   StringRef getLinkageName() const { return getStringOperand(3); }
+  /// Only used by clients of CloneFunction, and only right after the cloning.
+  void replaceLinkageName(MDString *LN) { replaceOperandWith(3, LN); }
 
   DISubroutineType *getType() const {
     return cast_or_null<DISubroutineType>(getRawType());


[Attachment #4 (text/plain)]

_______________________________________________
llvm-commits mailing list
llvm-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic