https://github.com/GkvJwa updated https://github.com/llvm/llvm-project/pull/71564
>From 60fca5e4300aa88f18daa53f86b56a764834515a Mon Sep 17 00:00:00 2001 From: GkvJwa <gkv...@gmail.com> Date: Wed, 8 Nov 2023 01:37:19 +0800 Subject: [PATCH] Supports viewing class member in lambda when using the vs debugger Use "__this" in the DataMemberRecord when generating pdb, so that the vs debugger can parse the member vars in lambda normally --- clang/lib/CodeGen/CGDebugInfo.cpp | 4 +- clang/test/CodeGenCXX/lambda-this-info.cpp | 48 ++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGenCXX/lambda-this-info.cpp diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 84a166d3ac3659c..774bc0eae157f49 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1657,8 +1657,10 @@ void CGDebugInfo::CollectRecordLambdaFields( FieldDecl *f = *Field; llvm::DIFile *VUnit = getOrCreateFile(f->getLocation()); QualType type = f->getType(); + StringRef ThisName = + CGM.getCodeGenOpts().EmitCodeView ? "__this" : "this"; llvm::DIType *fieldType = createFieldType( - "this", type, f->getLocation(), f->getAccess(), + ThisName, type, f->getLocation(), f->getAccess(), layout.getFieldOffset(fieldno), VUnit, RecordTy, CXXDecl); elements.push_back(fieldType); diff --git a/clang/test/CodeGenCXX/lambda-this-info.cpp b/clang/test/CodeGenCXX/lambda-this-info.cpp new file mode 100644 index 000000000000000..4de4c69e6170c3c --- /dev/null +++ b/clang/test/CodeGenCXX/lambda-this-info.cpp @@ -0,0 +1,48 @@ +// RUN: %clang_cl --target=x86_64-windows-msvc /c /Z7 -o %t.obj -- %s +// RUN: llvm-pdbutil dump -all %t.obj | FileCheck %s + +class Foo { + public: + void foo() { + int aa = 4; + int bb = 5; + int cc = 6; + auto f = [=] { + int aaa = a + aa; + int bbb = b + bb; + int ccc = c + cc; + }; + f(); + } + + private: + int a = 1; + int b = 2; + int c = 3; +}; + +int main() { + Foo f; + f.foo(); + + return 0; +} + +// CHECK: Types (.debug$T) +// CHECK-NEXT: ============================================================ +// CHECK:[[FooIndex:0x[^ ]*]] | LF_CLASS [size = 36] `Foo` +// CHECK: unique name: `.?AVFoo@@` +// CHECK:[[FooIndex:0x[^ ]*]] | LF_FIELDLIST [size = 52] +// CHECK: - LF_MEMBER [name = `a`, Type = 0x0074 (int), offset = 0, attrs = private] +// CHECK: - LF_MEMBER [name = `b`, Type = 0x0074 (int), offset = 4, attrs = private] +// CHECK: - LF_MEMBER [name = `c`, Type = 0x0074 (int), offset = 8, attrs = private] +// CHECK: - LF_ONEMETHOD [name = `foo`] +// CHECK:[[FooIndex:0x[^ ]*]] | LF_POINTER [size = 12] +// CHECK: referent = [[FooIndex:0x[^ ]*]], mode = pointer, opts = None, kind = ptr64 +// CHECK:[[FooIndex:0x[^ ]*]] | LF_CLASS [size = 80] `Foo::foo::<lambda_1>` +// CHECK: unique name: `.?AV<lambda_1>@?0??foo@Foo@@QEAAXXZ@` +// CHECK:[[FooIndex:0x[^ ]*]] | LF_FIELDLIST [size = 72] +// CHECK: - LF_MEMBER [name = `__this`, Type = [[FooIndex:0x[^ ]*]], offset = 0, attrs = private] +// CHECK: - LF_MEMBER [name = `aa`, Type = 0x0074 (int), offset = 8, attrs = private] +// CHECK: - LF_MEMBER [name = `bb`, Type = 0x0074 (int), offset = 12, attrs = private] +// CHECK: - LF_MEMBER [name = `cc`, Type = 0x0074 (int), offset = 16, attrs = private] _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits