aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGClass.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-09-16 15:18:21 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-09-16 15:18:21 +0000
commit1e4df92f4939a79a77be57ff145a252730749b11 (patch)
tree939202d44c99415dbf25610d58610db8a446f3fb /clang/lib/CodeGen/CGClass.cpp
parent65f105719121ecddd8826f6d1f4f3b60d7d3a28d (diff)
downloadllvm-1e4df92f4939a79a77be57ff145a252730749b11.zip
llvm-1e4df92f4939a79a77be57ff145a252730749b11.tar.gz
llvm-1e4df92f4939a79a77be57ff145a252730749b11.tar.bz2
Add support for putting constructors and destructos in explicit comdats.
There are situations when clang knows that the C1 and C2 constructors or the D1 and D2 destructors are identical. We already optimize some of these cases, but cannot optimize it when the GlobalValue is weak_odr. The problem with weak_odr is that an old TU seeing the same code will have a C1 and a C2 comdat with the corresponding symbols. We cannot suddenly start putting the C2 symbol in the C1 comdat as we cannot guarantee that the linker will not pick a .o with only C1 in it. The solution implemented by GCC is to expand the ABI to have a comdat whose name uses a C5/D5 suffix and always has both symbols. That is what this patch implements. llvm-svn: 217874
Diffstat (limited to 'clang/lib/CodeGen/CGClass.cpp')
-rw-r--r--clang/lib/CodeGen/CGClass.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index 72869d8c..941e998 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -1292,6 +1292,9 @@ void CodeGenFunction::EmitDestructorBody(FunctionArgList &Args) {
// we'd introduce *two* handler blocks. In the Microsoft ABI, we
// always delegate because we might not have a definition in this TU.
switch (DtorType) {
+ case Dtor_Comdat:
+ llvm_unreachable("not expecting a COMDAT");
+
case Dtor_Deleting: llvm_unreachable("already handled deleting case");
case Dtor_Complete: