diff --git a/clang/include/clang/AST/VTableBuilder.h b/clang/include/clang/AST/VTableBuilder.h index e1efe8cddcc5e..58f6fcbc1270e 100644 --- a/clang/include/clang/AST/VTableBuilder.h +++ b/clang/include/clang/AST/VTableBuilder.h @@ -246,12 +246,12 @@ class VTableLayout { // point for a given vtable index. typedef llvm::SmallVector AddressPointsIndexMapTy; + using VTableIndicesTy = llvm::SmallVector; + private: - // Stores the component indices of the first component of each virtual table in - // the virtual table group. To save a little memory in the common case where - // the vtable group contains a single vtable, an empty vector here represents - // the vector {0}. - OwningArrayRef VTableIndices; + // Stores the component indices of the first component of each virtual table + // in the virtual table group. + VTableIndicesTy VTableIndices; OwningArrayRef VTableComponents; @@ -265,7 +265,8 @@ class VTableLayout { AddressPointsIndexMapTy AddressPointIndices; public: - VTableLayout(ArrayRef VTableIndices, + // Requires `!VTableIndicies.empty()` + VTableLayout(VTableIndicesTy VTableIndices, ArrayRef VTableComponents, ArrayRef VTableThunks, const AddressPointsMapTy &AddressPoints); @@ -292,26 +293,11 @@ class VTableLayout { return AddressPointIndices; } - size_t getNumVTables() const { - if (VTableIndices.empty()) - return 1; - return VTableIndices.size(); - } + size_t getNumVTables() const { return VTableIndices.size(); } - size_t getVTableOffset(size_t i) const { - if (VTableIndices.empty()) { - assert(i == 0); - return 0; - } - return VTableIndices[i]; - } + size_t getVTableOffset(size_t i) const { return VTableIndices[i]; } size_t getVTableSize(size_t i) const { - if (VTableIndices.empty()) { - assert(i == 0); - return vtable_components().size(); - } - size_t thisIndex = VTableIndices[i]; size_t nextIndex = (i + 1 == VTableIndices.size()) ? vtable_components().size() diff --git a/clang/lib/AST/VTableBuilder.cpp b/clang/lib/AST/VTableBuilder.cpp index 9951126c2c3a3..922d43bb3f239 100644 --- a/clang/lib/AST/VTableBuilder.cpp +++ b/clang/lib/AST/VTableBuilder.cpp @@ -999,7 +999,7 @@ class ItaniumVTableBuilder { public: /// Component indices of the first component of each of the vtables in the /// vtable group. - SmallVector VTableIndices; + VTableLayout::VTableIndicesTy VTableIndices; ItaniumVTableBuilder(ItaniumVTableContext &VTables, const CXXRecordDecl *MostDerivedClass, @@ -2306,18 +2306,17 @@ MakeAddressPointIndices(const VTableLayout::AddressPointsMapTy &addressPoints, return indexMap; } -VTableLayout::VTableLayout(ArrayRef VTableIndices, +VTableLayout::VTableLayout(VTableIndicesTy VTableIndices, ArrayRef VTableComponents, ArrayRef VTableThunks, const AddressPointsMapTy &AddressPoints) - : VTableComponents(VTableComponents), VTableThunks(VTableThunks), - AddressPoints(AddressPoints), AddressPointIndices(MakeAddressPointIndices( - AddressPoints, VTableIndices.size())) { - if (VTableIndices.size() <= 1) - assert(VTableIndices.size() == 1 && VTableIndices[0] == 0); - else - this->VTableIndices = OwningArrayRef(VTableIndices); - + : VTableIndices(std::move(VTableIndices)), + VTableComponents(VTableComponents), VTableThunks(VTableThunks), + AddressPoints(AddressPoints), + AddressPointIndices( + MakeAddressPointIndices(AddressPoints, this->VTableIndices.size())) { + assert(!this->VTableIndices.empty() && + "VTableLayout requires at least one index."); llvm::sort(this->VTableThunks, [](const VTableLayout::VTableThunkTy &LHS, const VTableLayout::VTableThunkTy &RHS) { assert((LHS.first != RHS.first || LHS.second == RHS.second) && @@ -3730,8 +3729,8 @@ void MicrosoftVTableContext::computeVTableRelatedInformation( SmallVector VTableThunks( Builder.vtable_thunks_begin(), Builder.vtable_thunks_end()); VFTableLayouts[id] = std::make_unique( - ArrayRef{0}, Builder.vtable_components(), VTableThunks, - EmptyAddressPointsMap); + VTableLayout::VTableIndicesTy{0}, Builder.vtable_components(), + VTableThunks, EmptyAddressPointsMap); Thunks.insert(Builder.thunks_begin(), Builder.thunks_end()); const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);