Author: compnerd Date: Fri Feb 22 08:29:50 2019 New Revision: 354678 URL: http://llvm.org/viewvc/llvm-project?rev=354678&view=rev Log: CodeGen: use COMDAT for block copy/destroy helpers
SVN r339438 added support to deduplicate the helpers by using a consistent naming scheme and using LinkOnceODR semantics. This works on ELF by means of weak linking semantics, and entirely does not work on PE/COFF where you end up with multiply defined strong symbols, which is a strong error on PE/COFF. Assign the functions a COMDAT group so that they can be uniqued by the linker. This fixes the use of blocks in CoreFoundation on Windows. Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp cfe/trunk/test/CodeGen/blocks-1.c Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=354678&r1=354677&r2=354678&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Fri Feb 22 08:29:50 2019 @@ -2016,6 +2016,8 @@ CodeGenFunction::GenerateCopyHelperFunct llvm::Function *Fn = llvm::Function::Create(LTy, llvm::GlobalValue::LinkOnceODRLinkage, FuncName, &CGM.getModule()); + if (CGM.supportsCOMDAT()) + Fn->setComdat(CGM.getModule().getOrInsertComdat(FuncName)); IdentifierInfo *II = &C.Idents.get(FuncName); @@ -2207,6 +2209,8 @@ CodeGenFunction::GenerateDestroyHelperFu llvm::Function *Fn = llvm::Function::Create(LTy, llvm::GlobalValue::LinkOnceODRLinkage, FuncName, &CGM.getModule()); + if (CGM.supportsCOMDAT()) + Fn->setComdat(CGM.getModule().getOrInsertComdat(FuncName)); IdentifierInfo *II = &C.Idents.get(FuncName); Modified: cfe/trunk/test/CodeGen/blocks-1.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/blocks-1.c?rev=354678&r1=354677&r2=354678&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/blocks-1.c (original) +++ cfe/trunk/test/CodeGen/blocks-1.c Fri Feb 22 08:29:50 2019 @@ -1,10 +1,19 @@ -// RUN: %clang_cc1 %s -emit-llvm -o %t -fblocks +// RUN: %clang_cc1 -triple thumbv7-apple-ios %s -emit-llvm -o %t -fblocks // RUN: grep "_Block_object_dispose" %t | count 12 // RUN: grep "__copy_helper_block_" %t | count 9 // RUN: grep "__destroy_helper_block_" %t | count 9 // RUN: grep "__Block_byref_object_copy_" %t | count 2 // RUN: grep "__Block_byref_object_dispose_" %t | count 2 // RUN: grep "i32 135)" %t | count 2 +// RUN: grep "_Block_object_assign" %t | count 5 + +// RUN: %clang_cc1 -triple thumbv7-unknown-windows %s -emit-llvm -o %t -fblocks +// RUN: grep "_Block_object_dispose" %t | count 12 +// RUN: grep "__copy_helper_block_" %t | count 11 +// RUN: grep "__destroy_helper_block_" %t | count 11 +// RUN: grep "__Block_byref_object_copy_" %t | count 2 +// RUN: grep "__Block_byref_object_dispose_" %t | count 2 +// RUN: grep "i32 135)" %t | count 2 // RUN: grep "_Block_object_assign" %t | count 5 int printf(const char *, ...); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits