From 66abf2f92f11d20c6c5c33762bde67f4b1725b04 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 19 Feb 2015 21:01:34 +0000 Subject: [PATCH] Put the implicit weak sized deallocation funciton in C++14 in a comdat Fixes PR22635. llvm-svn: 229913 --- clang/lib/CodeGen/CodeGenFunction.cpp | 2 ++ clang/test/CodeGenCXX/cxx1y-sized-deallocation.cpp | 4 ++-- clang/test/CodeGenCXX/implicit-allocation-functions.cpp | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index ec72609..fa9697e 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -806,6 +806,8 @@ static void EmitSizedDeallocationFunction(CodeGenFunction &CGF, const FunctionDecl *UnsizedDealloc) { // This is a weak discardable definition of the sized deallocation function. CGF.CurFn->setLinkage(llvm::Function::LinkOnceAnyLinkage); + CGF.CurFn->setComdat( + CGF.CGM.getModule().getOrInsertComdat(CGF.CurFn->getName())); // Call the unsized deallocation function and forward the first argument // unchanged. diff --git a/clang/test/CodeGenCXX/cxx1y-sized-deallocation.cpp b/clang/test/CodeGenCXX/cxx1y-sized-deallocation.cpp index ccd1cf9..2daf28c 100644 --- a/clang/test/CodeGenCXX/cxx1y-sized-deallocation.cpp +++ b/clang/test/CodeGenCXX/cxx1y-sized-deallocation.cpp @@ -52,7 +52,7 @@ D::D() {} // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) -// CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8* +// CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat // CHECKDEF: call void @_ZdlPv(i8* %0) // CHECKUND-LABEL: declare void @_ZdlPvm(i8* @@ -74,7 +74,7 @@ D::D() {} // CHECK: add i64 %{{[^ ]*}}, 8 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) -// CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8* +// CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat // CHECKDEF: call void @_ZdaPv(i8* %0) // CHECKUND-LABEL: declare void @_ZdaPvm(i8* diff --git a/clang/test/CodeGenCXX/implicit-allocation-functions.cpp b/clang/test/CodeGenCXX/implicit-allocation-functions.cpp index 0d0f4ce..c3eada2 100644 --- a/clang/test/CodeGenCXX/implicit-allocation-functions.cpp +++ b/clang/test/CodeGenCXX/implicit-allocation-functions.cpp @@ -30,7 +30,7 @@ void foo(A* is) { // CHECK14-DAG: declare noalias i8* @_Znwm(i64) // CHECK14UND-DAG: declare void @_ZdlPvm(i8*, i64) -// CHECK14DEF-DAG: define linkonce void @_ZdlPvm(i8*, i64) +// CHECK14DEF-DAG: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat // CHECK14DEF-DAG: declare void @_ZdlPv(i8*) // CHECK14-DAG: %struct.B = type { i8 } @@ -54,5 +54,5 @@ void f(B *p) { // CHECK14-DAG: declare noalias i8* @_Znam(i64) // CHECK14UND-DAG: declare void @_ZdaPvm(i8*, i64) -// CHECK14DEF-DAG: define linkonce void @_ZdaPvm(i8*, i64) +// CHECK14DEF-DAG: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat // CHECK14DEF-DAG: declare void @_ZdaPv(i8*) -- 2.7.4