diff options
author | Reid Kleckner <rnk@google.com> | 2018-03-16 19:40:50 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2018-03-16 19:40:50 +0000 |
commit | ae9b07011140037c364e5efa2bb3ff422163d5b5 (patch) | |
tree | 3388ccca7a0b75251bffb10bdd35ed71bdac9575 /clang/lib/CodeGen/CGCXX.cpp | |
parent | 5ba2fe3720c51c1ea5740c32c525d48a64105626 (diff) | |
download | bcm5719-llvm-ae9b07011140037c364e5efa2bb3ff422163d5b5.tar.gz bcm5719-llvm-ae9b07011140037c364e5efa2bb3ff422163d5b5.zip |
[MS] Always use base dtors in place of complete/vbase dtors when possible
Summary:
Previously we tried too hard to uphold the fiction that destructor
variants work like they do on Itanium throughout the ABI-neutral parts
of clang. This lead to MS C++ ABI incompatiblities and other bugs. Now,
-mconstructor-aliases will no longer control this ABI detail, and clang
-cc1's LLVM IR output will be this much closer to the clang driver's.
Based on a patch by Zahira Ammarguellat:
https://reviews.llvm.org/D39063
I've tried to move the logic that Zahira added into MicrosoftCXXABI.cpp.
There is only one ABI-specific detail sticking out, and that is in
CodeGenModule::getAddrOfCXXStructor, where we collapse complete dtors to
base dtors in the MS ABI.
This fixes PR32990.
Reviewers: erichkeane, zahiraam, majnemer, rjmccall
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D44505
llvm-svn: 327732
Diffstat (limited to 'clang/lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGCXX.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index 738c635d26f..dfae7d5f5f7 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -242,6 +242,11 @@ llvm::Constant *CodeGenModule::getAddrOfCXXStructor( if (auto *CD = dyn_cast<CXXConstructorDecl>(MD)) { GD = GlobalDecl(CD, toCXXCtorType(Type)); } else { + // Always alias equivalent complete destructors to base destructors in the + // MS ABI. + if (getTarget().getCXXABI().isMicrosoft() && + Type == StructorType::Complete && MD->getParent()->getNumVBases() == 0) + Type = StructorType::Base; GD = GlobalDecl(cast<CXXDestructorDecl>(MD), toCXXDtorType(Type)); } |