diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp --- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp @@ -1920,6 +1920,26 @@ // This invalidates SwiftErrorOps in the Shape. replaceSwiftErrorOps(F, Shape, nullptr); + // Finally, salvage the llvm.dbg.{declare,addr} in our original function that + // point into the coroutine frame. We only do this for the current function + // since the Cloner salvaged debug info for us in the new coroutine funclets. + SmallVector Worklist; + SmallDenseMap DbgPtrAllocaCache; + for (auto &BB : F) { + for (auto &I : BB) { + if (auto *DDI = dyn_cast(&I)) { + Worklist.push_back(DDI); + continue; + } + if (auto *DDI = dyn_cast(&I)) { + Worklist.push_back(DDI); + continue; + } + } + } + for (auto *DDI : Worklist) + coro::salvageDebugInfo(DbgPtrAllocaCache, DDI, Shape.OptimizeFrame); + return Shape; } diff --git a/llvm/test/Transforms/Coroutines/coro-debug-dbg.addr-swift.ll b/llvm/test/Transforms/Coroutines/coro-debug-dbg.addr-swift.ll --- a/llvm/test/Transforms/Coroutines/coro-debug-dbg.addr-swift.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug-dbg.addr-swift.ll @@ -8,8 +8,8 @@ ; RUN: opt %s -passes='function(coro-early),cgscc(coro-split,simplifycfg)' -S | FileCheck %s ; CHECK-LABEL: define swifttailcc void @"$s10async_args14withGenericArgyyxnYalF"(%swift.context* swiftasync %0, %swift.opaque* noalias %1, %swift.type* %T){{.*}} { -; CHECK: call void @llvm.dbg.declare( -; CHECK: call void @llvm.dbg.addr( +; CHECK: call void @llvm.dbg.declare(metadata %swift.context** [[CORO_CTX:%[a-z0-9\.]+]], +; CHECK: call void @llvm.dbg.addr(metadata %swift.context** [[CORO_CTX]], ; CHECK-NOT: llvm.dbg.value ; CHECK-NOT: llvm.dbg.addr ; CHECK-NOT: llvm.dbg.declare @@ -19,15 +19,15 @@ ; CHECK-LABEL: define internal swifttailcc void @"$s10async_args14withGenericArgyyxnYalFTY0_"(i8* swiftasync %0) ; CHECK: entryresume.0 -; CHECK: call void @llvm.dbg.declare( -; CHECK: call void @llvm.dbg.addr( +; CHECK: call void @llvm.dbg.declare(metadata i8** [[CORO_CTX:%[a-z0-9\.]+]], +; CHECK: call void @llvm.dbg.addr(metadata i8** [[CORO_CTX]], ; CHECK: musttail call swifttailcc void @"$s10async_args10forceSplityyYaF"(%swift.context* swiftasync ; CHECK-NEXT: ret void ; CHECK-NEXT: } ; CHECK: define internal swifttailcc void @"$s10async_args14withGenericArgyyxnYalFTQ1_"(i8* swiftasync %0) -; CHECK: call void @llvm.dbg.declare -; CHECK: call void @llvm.dbg.addr +; CHECK: call void @llvm.dbg.declare(metadata i8** [[CORO_CTX:%[a-z0-9\.]+]], +; CHECK: call void @llvm.dbg.addr(metadata i8** [[CORO_CTX]], ; CHECK: call void @llvm.dbg.value(metadata %swift.opaque** undef, ; CHECK: ret void ; CHECK-NEXT: }