diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -3665,8 +3665,11 @@ Name = getDynamicInitializerName(cast(D), GD.getDynamicInitKind(), Fn); } else { - // Use llvm function name. Name = Fn->getName(); + + if (const auto *BD = dyn_cast(D)) + LinkageName = Name; + Flags |= llvm::DINode::FlagPrototyped; } if (Name.startswith("\01")) diff --git a/clang/test/CodeGenCXX/debug-info-block-invocation-linkage-name.cpp b/clang/test/CodeGenCXX/debug-info-block-invocation-linkage-name.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCXX/debug-info-block-invocation-linkage-name.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -emit-llvm -debug-info-kind=standalone -fblocks -triple %itanium_abi_triple %s -o - | FileCheck %s + +// CHECK: !DISubprogram(name: "___Z1fU13block_pointerFviE_block_invoke", linkageName: "___Z1fU13block_pointerFviE_block_invoke" +void g(void (^call)(int)); + +void f(void (^callback)(int)) { + g(^(int x) { + callback(x); + }); +} + +void h() { + f(^(int x){ + }); +}