llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-debuginfo Author: Orlando Cazalet-Hyams (OCHyams) <details> <summary>Changes</summary> --- Full diff: https://github.com/llvm/llvm-project/pull/144346.diff 3 Files Affected: - (modified) clang/lib/CodeGen/CGClass.cpp (+4-1) - (added) clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp (+36) - (added) clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp (+38) ``````````diff diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 13792c1042046..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) { @@ -1341,6 +1342,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-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); +} 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); +} `````````` </details> https://github.com/llvm/llvm-project/pull/144346 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits