diff --git a/clang/include/clang/AST/VTableBuilder.h b/clang/include/clang/AST/VTableBuilder.h index e1efe8cddcc5e..25aa8ef7ba4a3 100644 --- a/clang/include/clang/AST/VTableBuilder.h +++ b/clang/include/clang/AST/VTableBuilder.h @@ -246,17 +246,17 @@ 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; + std::vector VTableComponents; /// Contains thunks needed by vtables, sorted by indices. - OwningArrayRef VTableThunks; + std::vector VTableThunks; /// Address points for all vtables. AddressPointsMapTy AddressPoints; @@ -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/include/clang/Basic/LLVM.h b/clang/include/clang/Basic/LLVM.h index f4956cd16cbcf..fed23f0c44f38 100644 --- a/clang/include/clang/Basic/LLVM.h +++ b/clang/include/clang/Basic/LLVM.h @@ -29,8 +29,7 @@ namespace llvm { class Twine; class VersionTuple; template class ArrayRef; - template class MutableArrayRef; - template class OwningArrayRef; + template class MutableArrayRef; template class SmallString; template class SmallVector; template class SmallVectorImpl; @@ -65,7 +64,6 @@ namespace clang { // ADT's. using llvm::ArrayRef; using llvm::MutableArrayRef; - using llvm::OwningArrayRef; using llvm::SaveAndRestore; using llvm::SmallString; using llvm::SmallVector; 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); diff --git a/llvm/include/llvm/ADT/ArrayRef.h b/llvm/include/llvm/ADT/ArrayRef.h index d7ed2c78749f0..00b5534469d65 100644 --- a/llvm/include/llvm/ADT/ArrayRef.h +++ b/llvm/include/llvm/ADT/ArrayRef.h @@ -445,29 +445,6 @@ namespace llvm { } }; - /// This is a MutableArrayRef that owns its array. - template class OwningArrayRef : public MutableArrayRef { - public: - OwningArrayRef() = default; - OwningArrayRef(size_t Size) : MutableArrayRef(new T[Size], Size) {} - - OwningArrayRef(ArrayRef Data) - : MutableArrayRef(new T[Data.size()], Data.size()) { - std::copy(Data.begin(), Data.end(), this->begin()); - } - - OwningArrayRef(OwningArrayRef &&Other) { *this = std::move(Other); } - - OwningArrayRef &operator=(OwningArrayRef &&Other) { - delete[] this->data(); - this->MutableArrayRef::operator=(Other); - Other.MutableArrayRef::operator=(MutableArrayRef()); - return *this; - } - - ~OwningArrayRef() { delete[] this->data(); } - }; - /// @name ArrayRef Deduction guides /// @{ /// Deduction guide to construct an ArrayRef from a single element. diff --git a/llvm/include/llvm/CGData/CGDataPatchItem.h b/llvm/include/llvm/CGData/CGDataPatchItem.h index d13f89b032542..e9aad8c23fefc 100644 --- a/llvm/include/llvm/CGData/CGDataPatchItem.h +++ b/llvm/include/llvm/CGData/CGDataPatchItem.h @@ -22,10 +22,10 @@ struct CGDataPatchItem { // Where to patch. uint64_t Pos; // Source data. - OwningArrayRef D; + std::vector D; CGDataPatchItem(uint64_t Pos, const uint64_t *D, int N) - : Pos(Pos), D(ArrayRef(D, N)) {} + : Pos(Pos), D(D, D + N) {} }; } // namespace llvm diff --git a/llvm/include/llvm/CodeGen/PBQP/Math.h b/llvm/include/llvm/CodeGen/PBQP/Math.h index 1cbbeeba3f32b..ba673dd9380a8 100644 --- a/llvm/include/llvm/CodeGen/PBQP/Math.h +++ b/llvm/include/llvm/CodeGen/PBQP/Math.h @@ -41,10 +41,10 @@ class Vector { Vector(Vector &&V) : Data(std::move(V.Data)) {} // Iterator-based access. - const PBQPNum *begin() const { return Data.begin(); } - const PBQPNum *end() const { return Data.end(); } - PBQPNum *begin() { return Data.begin(); } - PBQPNum *end() { return Data.end(); } + const PBQPNum *begin() const { return Data.data(); } + const PBQPNum *end() const { return Data.data() + Data.size(); } + PBQPNum *begin() { return Data.data(); } + PBQPNum *end() { return Data.data() + Data.size(); } /// Comparison operator. bool operator==(const Vector &V) const { @@ -87,7 +87,7 @@ class Vector { } private: - OwningArrayRef Data; + std::vector Data; }; /// Return a hash_value for the given vector. diff --git a/llvm/include/llvm/DebugInfo/BTF/BTFParser.h b/llvm/include/llvm/DebugInfo/BTF/BTFParser.h index f8b5b29738b3f..32644e6700e78 100644 --- a/llvm/include/llvm/DebugInfo/BTF/BTFParser.h +++ b/llvm/include/llvm/DebugInfo/BTF/BTFParser.h @@ -46,7 +46,7 @@ class BTFParser { // A copy of types table from the object file but using native byte // order. Should not be too big in practice, e.g. for ~250MiB vmlinux // image it is ~4MiB. - OwningArrayRef TypesBuffer; + std::vector TypesBuffer; // Maps ELF section number to instruction line number information. // Each BTFLinesVector is sorted by `InsnOffset` to allow fast lookups. diff --git a/llvm/lib/DebugInfo/BTF/BTFParser.cpp b/llvm/lib/DebugInfo/BTF/BTFParser.cpp index 4fc31a4456031..971a0d9f01769 100644 --- a/llvm/lib/DebugInfo/BTF/BTFParser.cpp +++ b/llvm/lib/DebugInfo/BTF/BTFParser.cpp @@ -206,7 +206,8 @@ Error BTFParser::parseTypesInfo(ParseContext &Ctx, uint64_t TypesInfoStart, StringRef RawData) { using support::endian::byte_swap; - TypesBuffer = OwningArrayRef(arrayRefFromStringRef(RawData)); + auto RawDataAsBytes = arrayRefFromStringRef(RawData); + TypesBuffer.assign(RawDataAsBytes.begin(), RawDataAsBytes.end()); // Switch endianness if necessary. endianness Endianness = Ctx.Obj.isLittleEndian() ? llvm::endianness::little : llvm::endianness::big; @@ -380,7 +381,7 @@ Error BTFParser::parse(const ObjectFile &Obj, const ParseOptions &Opts) { SectionLines.clear(); SectionRelocs.clear(); Types.clear(); - TypesBuffer = OwningArrayRef(); + TypesBuffer.clear(); ParseContext Ctx(Obj, Opts); std::optional BTF; diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 3b36ccbd677dc..1a7200201d1c0 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -23390,9 +23390,10 @@ bool SLPVectorizerPass::vectorizeStores( unsigned End = Operands.size(); unsigned Repeat = 0; constexpr unsigned MaxAttempts = 4; - OwningArrayRef> RangeSizes(Operands.size()); - for (std::pair &P : RangeSizes) - P.first = P.second = 1; + std::vector> RangeSizesStorage( + Operands.size(), {1, 1}); + // The `slice` and `drop_front` interfaces are convenient + const auto RangeSizes = MutableArrayRef(RangeSizesStorage); DenseMap> NonSchedulable; auto IsNotVectorized = [](bool First, const std::pair &P) { diff --git a/llvm/unittests/ADT/ArrayRefTest.cpp b/llvm/unittests/ADT/ArrayRefTest.cpp index 736c8fbb26b38..b1a86f0214b74 100644 --- a/llvm/unittests/ADT/ArrayRefTest.cpp +++ b/llvm/unittests/ADT/ArrayRefTest.cpp @@ -307,13 +307,6 @@ TEST(ArrayRefTest, ArrayRef) { EXPECT_TRUE(AR2.equals(AR2Ref)); } -TEST(ArrayRefTest, OwningArrayRef) { - static const int A1[] = {0, 1}; - OwningArrayRef A{ArrayRef(A1)}; - OwningArrayRef B(std::move(A)); - EXPECT_EQ(A.data(), nullptr); -} - TEST(ArrayRefTest, ArrayRefFromStdArray) { std::array A1{{42, -5, 0, 1000000, -1000000}}; ArrayRef A2 = ArrayRef(A1);