diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2013-02-13 08:37:51 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2013-02-13 08:37:51 +0000 |
commit | 59660c21178b6af518bd4b564e032d5c9cc218cb (patch) | |
tree | ec2b540757d9aa3ffb3cdfbc7ff2048e65f42df4 /lib/AST/VTableBuilder.cpp | |
parent | e0dc7c70ee3fc1d6bdd8e2f166cc9e9be89061d9 (diff) |
Emit virtual/deleting destructors properly with -cxx-abi microsoft, PR15058
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175045 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/VTableBuilder.cpp')
-rw-r--r-- | lib/AST/VTableBuilder.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/lib/AST/VTableBuilder.cpp b/lib/AST/VTableBuilder.cpp index 9a03faace2..f80232f44c 100644 --- a/lib/AST/VTableBuilder.cpp +++ b/lib/AST/VTableBuilder.cpp @@ -1160,6 +1160,8 @@ void VTableBuilder::ComputeThisAdjustments() { break; case VTableComponent::CK_DeletingDtorPointer: // We've already added the thunk when we saw the complete dtor pointer. + // FIXME: check how this works in the Microsoft ABI + // while working on the multiple inheritance patch. continue; } @@ -1302,11 +1304,8 @@ VTableBuilder::AddMethod(const CXXMethodDecl *MD, Components.push_back(VTableComponent::MakeCompleteDtor(DD)); Components.push_back(VTableComponent::MakeDeletingDtor(DD)); } else { - // Add only one destructor in MS mode. - // FIXME: The virtual destructors are handled differently in MS ABI, - // we should add such a support later. For now, put the complete - // destructor into the vftable just to make its layout right. - Components.push_back(VTableComponent::MakeCompleteDtor(DD)); + // Add the scalar deleting destructor. + Components.push_back(VTableComponent::MakeDeletingDtor(DD)); } } else { // Add the return adjustment if necessary. @@ -1951,6 +1950,8 @@ void VTableBuilder::dumpLayout(raw_ostream& Out) { Out << DD->getQualifiedNameAsString(); if (IsComplete) Out << "() [complete]"; + else if (isMicrosoftABI()) + Out << "() [scalar deleting]"; else Out << "() [deleting]"; @@ -2142,8 +2143,8 @@ void VTableBuilder::dumpLayout(raw_ostream& Out) { IndicesMap[VTables.getMethodVTableIndex(GlobalDecl(DD, Dtor_Deleting))] = MethodName + " [deleting]"; } else { - IndicesMap[VTables.getMethodVTableIndex(GlobalDecl(DD, Dtor_Complete))] - = MethodName; + IndicesMap[VTables.getMethodVTableIndex(GlobalDecl(DD, Dtor_Deleting))] + = MethodName + " [scalar deleting]"; } } else { IndicesMap[VTables.getMethodVTableIndex(MD)] = MethodName; @@ -2275,8 +2276,9 @@ void VTableContext::ComputeMethodVTableIndices(const CXXRecordDecl *RD) { MethodVTableIndices[GlobalDecl(DD, Dtor_Deleting)] = getMethodVTableIndex(GlobalDecl(OverriddenDD, Dtor_Deleting)); } else { - MethodVTableIndices[GlobalDecl(DD, Dtor_Complete)] = - getMethodVTableIndex(GlobalDecl(OverriddenDD, Dtor_Complete)); + // Add the scalar deleting destructor. + MethodVTableIndices[GlobalDecl(DD, Dtor_Deleting)] = + getMethodVTableIndex(GlobalDecl(OverriddenDD, Dtor_Deleting)); } } else { MethodVTableIndices[MD] = getMethodVTableIndex(OverriddenMD); @@ -2302,11 +2304,8 @@ void VTableContext::ComputeMethodVTableIndices(const CXXRecordDecl *RD) { // Add the deleting dtor. MethodVTableIndices[GlobalDecl(DD, Dtor_Deleting)] = CurrentIndex++; } else { - // Add only the deleting dtor. - // FIXME: The virtual destructors are handled differently in MS ABI, - // we should add such a support later. For now, put the complete - // destructor into the vftable indices. - MethodVTableIndices[GlobalDecl(DD, Dtor_Complete)] = CurrentIndex++; + // Add the scalar deleting dtor. + MethodVTableIndices[GlobalDecl(DD, Dtor_Deleting)] = CurrentIndex++; } } else { // Add the entry. |