No memcpy for copy ctor with -fsanitize-address-field-padding=1
authorKostya Serebryany <kcc@google.com>
Sat, 6 Dec 2014 01:23:08 +0000 (01:23 +0000)
committerKostya Serebryany <kcc@google.com>
Sat, 6 Dec 2014 01:23:08 +0000 (01:23 +0000)
Summary:
When -fsanitize-address-field-padding=1 is present
don't emit memcpy for copy constructor.
Thanks Nico for the extra test case.

Test Plan: regression tests

Reviewers: thakis, rsmith

Reviewed By: rsmith

Subscribers: rsmith, cfe-commits

Differential Revision: http://reviews.llvm.org/D6515

llvm-svn: 223563

clang/lib/CodeGen/CGClass.cpp
clang/test/CodeGen/sanitize-address-field-padding.cpp

index dd19471..e2af17c 100644 (file)
@@ -1735,7 +1735,7 @@ void CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
                                              bool Delegating, llvm::Value *This,
                                              const CXXConstructExpr *E) {
   // If this is a trivial constructor, just emit what's needed.
-  if (D->isTrivial()) {
+  if (D->isTrivial() && !D->getParent()->mayInsertExtraPadding()) {
     if (E->getNumArgs() == 0) {
       // Trivial default constructor, no codegen required.
       assert(D->isDefaultConstructor() &&
@@ -1785,7 +1785,8 @@ void
 CodeGenFunction::EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D,
                                         llvm::Value *This, llvm::Value *Src,
                                         const CXXConstructExpr *E) {
-  if (D->isTrivial()) {
+  if (D->isTrivial() &&
+      !D->getParent()->mayInsertExtraPadding()) {
     assert(E->getNumArgs() == 1 && "unexpected argcount for trivial ctor");
     assert(D->isCopyOrMoveConstructor() &&
            "trivial 1-arg ctor not a copy/move ctor");
index 0683089..d4eea1b 100644 (file)
@@ -229,6 +229,7 @@ struct ClassWithTrivialCopy {
 
 void MakeTrivialCopy(ClassWithTrivialCopy *s1, ClassWithTrivialCopy *s2) {
   *s1 = *s2;
+  ClassWithTrivialCopy s3(*s2);
 }
 
 // CHECK-LABEL: define void @_Z15MakeTrivialCopyP20ClassWithTrivialCopyS0_