https://github.com/OCHyams created https://github.com/llvm/llvm-project/pull/144346
None >From 99c40d7c7eeaf8f1a58b7223491abe0e4ad9936a Mon Sep 17 00:00:00 2001 From: Orlando Cazalet-Hyams <orlando.hy...@sony.com> Date: Mon, 16 Jun 2025 12:07:08 +0100 Subject: [PATCH 1/2] [KeyInstr][Clang] Memcopyable members init - store --- clang/lib/CodeGen/CGClass.cpp | 2 + .../init-member-memcopyable.cpp | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 13792c1042046..c91bfa4ba86b7 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -1341,6 +1341,8 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD, ApplyAtomGroup Grp(getDebugInfo()); CM.addMemberInitializer(Member); } + + ApplyAtomGroup Grp(getDebugInfo()); CM.finish(); } diff --git a/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp new file mode 100644 index 0000000000000..b73683c660b4e --- /dev/null +++ b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp @@ -0,0 +1,38 @@ +// RUN: %clang_cc1 -triple x86_64-linux-gnu -gkey-instructions %s -gno-column-info -debug-info-kind=line-tables-only -emit-llvm -o - \ +// RUN: | FileCheck %s + +// g::h can be memcpy'd (in this case emitted as load/stored), check the +// assignment gets Key Instructions metadata. + +struct e { + e(e &); +}; + +struct g { + e f; + int h; +}; + +// CHECK: define{{.*}}void @_ZN1gC2ERS_ +// CHECK-NEXT: entry: +// CHECK-NEXT: %this.addr = alloca ptr, align 8 +// CHECK-NEXT: %.addr = alloca ptr, align 8 +// CHECK-NEXT: store ptr %this, ptr %this.addr, align 8 +// CHECK-NEXT: store ptr %0, ptr %.addr, align 8 +// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 8 +// CHECK-NEXT: %1 = load ptr, ptr %.addr, align 8 +// CHECK-NEXT: call void @_ZN1eC1ERS_ +// CHECK-NEXT: %h = getelementptr inbounds nuw %struct.g, ptr %this1, i32 0, i32 1 +// CHECK-NEXT: %2 = load ptr, ptr %.addr, align 8 +// CHECK-NEXT: %h2 = getelementptr inbounds nuw %struct.g, ptr %2, i32 0, i32 1 +// CHECK-NEXT: %3 = load i32, ptr %h2, align 4, !dbg [[G1R2:!.*]] +// CHECK-NEXT: store i32 %3, ptr %h, align 4, !dbg [[G1R1:!.*]] +// CHECK-NEXT: ret void, !dbg + +// CHECK: [[G1R2]] = !DILocation(line: 11, scope: ![[#]], atomGroup: 1, atomRank: 2) +// CHECK: [[G1R1]] = !DILocation(line: 11, scope: ![[#]], atomGroup: 1, atomRank: 1) + +[[gnu::nodebug]] +void fun(g *x) { + g y = g(*x); +} >From c21aa9413009b645c3af49682213fe32ca1c694c Mon Sep 17 00:00:00 2001 From: Orlando Cazalet-Hyams <orlando.hy...@sony.com> Date: Mon, 16 Jun 2025 13:11:33 +0100 Subject: [PATCH 2/2] [KeyInstr][Clang] Memcopyable members init - memcpy --- clang/lib/CodeGen/CGClass.cpp | 3 +- .../init-member-memcopyable-2.cpp | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index c91bfa4ba86b7..c78267857bc9e 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -1000,7 +1000,8 @@ namespace { void emitMemcpyIR(Address DestPtr, Address SrcPtr, CharUnits Size) { DestPtr = DestPtr.withElementType(CGF.Int8Ty); SrcPtr = SrcPtr.withElementType(CGF.Int8Ty); - CGF.Builder.CreateMemCpy(DestPtr, SrcPtr, Size.getQuantity()); + auto *I = CGF.Builder.CreateMemCpy(DestPtr, SrcPtr, Size.getQuantity()); + CGF.addInstToCurrentSourceAtom(I, nullptr); } void addInitialField(FieldDecl *F) { diff --git a/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp new file mode 100644 index 0000000000000..3df5dc357169e --- /dev/null +++ b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp @@ -0,0 +1,36 @@ +// RUN: %clang_cc1 -triple x86_64-linux-gnu -gkey-instructions %s -gno-column-info -debug-info-kind=line-tables-only -emit-llvm -o - \ +// RUN: | FileCheck %s + +// g::h and i can be memcpy'd, check the assignment gets Key Instructions metadata. + +struct e { + e(e &); +}; + +struct g { + e f; + int h; + int i; +}; + +// CHECK: define{{.*}}void @_ZN1gC2ERS_ +// CHECK-NEXT: entry: +// CHECK-NEXT: %this.addr = alloca ptr, align 8 +// CHECK-NEXT: %.addr = alloca ptr, align 8 +// CHECK-NEXT: store ptr %this, ptr %this.addr, align 8 +// CHECK-NEXT: store ptr %0, ptr %.addr, align 8 +// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 8 +// CHECK-NEXT: %1 = load ptr, ptr %.addr, align 8 +// CHECK-NEXT: call void @_ZN1eC1ERS_ +// CHECK-NEXT: %h = getelementptr inbounds nuw %struct.g, ptr %this1, i32 0, i32 1 +// CHECK-NEXT: %2 = load ptr, ptr %.addr, align 8 +// CHECK-NEXT: %h2 = getelementptr inbounds nuw %struct.g, ptr %2, i32 0, i32 1 +// CHECK-NEXT: call void @llvm.memcpy{{.*}}(ptr align 4 %h, ptr align 4 %h2, i64 8, i1 false), !dbg [[G1R1:!.*]] +// CHECK-NEXT: ret void, !dbg + +// CHECK: [[G1R1]] = !DILocation(line: 10, scope: ![[#]], atomGroup: 1, atomRank: 1) + +[[gnu::nodebug]] +void fun(g *x) { + g y = g(*x); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits