Put the implicit weak sized deallocation funciton in C++14 in a comdat
authorReid Kleckner <reid@kleckner.net>
Thu, 19 Feb 2015 21:01:34 +0000 (21:01 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 19 Feb 2015 21:01:34 +0000 (21:01 +0000)
Fixes PR22635.

llvm-svn: 229913

clang/lib/CodeGen/CodeGenFunction.cpp
clang/test/CodeGenCXX/cxx1y-sized-deallocation.cpp
clang/test/CodeGenCXX/implicit-allocation-functions.cpp

index ec72609..fa9697e 100644 (file)
@@ -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.
index ccd1cf9..2daf28c 100644 (file)
@@ -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*
 
index 0d0f4ce..c3eada2 100644 (file)
@@ -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*)