diff options
Diffstat (limited to 'contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h')
-rw-r--r-- | contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h | 144 |
1 files changed, 71 insertions, 73 deletions
diff --git a/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h b/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h index 481fd11..5cbcf51 100644 --- a/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h +++ b/contrib/llvm/tools/clang/include/clang/AST/VTableBuilder.h @@ -20,7 +20,6 @@ #include "clang/AST/RecordLayout.h" #include "clang/Basic/ABI.h" #include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/SetVector.h" #include <memory> #include <utility> @@ -219,76 +218,76 @@ private: class VTableLayout { public: typedef std::pair<uint64_t, ThunkInfo> VTableThunkTy; - - typedef const VTableComponent *vtable_component_iterator; - typedef const VTableThunkTy *vtable_thunk_iterator; - typedef llvm::iterator_range<vtable_component_iterator> - vtable_component_range; - - typedef llvm::DenseMap<BaseSubobject, uint64_t> AddressPointsMapTy; + struct AddressPointLocation { + unsigned VTableIndex, AddressPointIndex; + }; + typedef llvm::DenseMap<BaseSubobject, AddressPointLocation> + AddressPointsMapTy; private: - uint64_t NumVTableComponents; - std::unique_ptr<VTableComponent[]> VTableComponents; + // 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<size_t> VTableIndices; + + OwningArrayRef<VTableComponent> VTableComponents; /// \brief Contains thunks needed by vtables, sorted by indices. - uint64_t NumVTableThunks; - std::unique_ptr<VTableThunkTy[]> VTableThunks; + OwningArrayRef<VTableThunkTy> VTableThunks; /// \brief Address points for all vtables. AddressPointsMapTy AddressPoints; - bool IsMicrosoftABI; - public: - VTableLayout(uint64_t NumVTableComponents, - const VTableComponent *VTableComponents, - uint64_t NumVTableThunks, - const VTableThunkTy *VTableThunks, - const AddressPointsMapTy &AddressPoints, - bool IsMicrosoftABI); + VTableLayout(ArrayRef<size_t> VTableIndices, + ArrayRef<VTableComponent> VTableComponents, + ArrayRef<VTableThunkTy> VTableThunks, + const AddressPointsMapTy &AddressPoints); ~VTableLayout(); - uint64_t getNumVTableComponents() const { - return NumVTableComponents; + ArrayRef<VTableComponent> vtable_components() const { + return VTableComponents; } - vtable_component_range vtable_components() const { - return vtable_component_range(vtable_component_begin(), - vtable_component_end()); + ArrayRef<VTableThunkTy> vtable_thunks() const { + return VTableThunks; } - vtable_component_iterator vtable_component_begin() const { - return VTableComponents.get(); + AddressPointLocation getAddressPoint(BaseSubobject Base) const { + assert(AddressPoints.count(Base) && "Did not find address point!"); + return AddressPoints.find(Base)->second; } - vtable_component_iterator vtable_component_end() const { - return VTableComponents.get() + NumVTableComponents; + const AddressPointsMapTy &getAddressPoints() const { + return AddressPoints; } - uint64_t getNumVTableThunks() const { return NumVTableThunks; } - - vtable_thunk_iterator vtable_thunk_begin() const { - return VTableThunks.get(); + size_t getNumVTables() const { + if (VTableIndices.empty()) + return 1; + return VTableIndices.size(); } - vtable_thunk_iterator vtable_thunk_end() const { - return VTableThunks.get() + NumVTableThunks; + size_t getVTableOffset(size_t i) const { + if (VTableIndices.empty()) { + assert(i == 0); + return 0; + } + return VTableIndices[i]; } - uint64_t getAddressPoint(BaseSubobject Base) const { - assert(AddressPoints.count(Base) && - "Did not find address point!"); - - uint64_t AddressPoint = AddressPoints.lookup(Base); - assert(AddressPoint != 0 || IsMicrosoftABI); - (void)IsMicrosoftABI; + size_t getVTableSize(size_t i) const { + if (VTableIndices.empty()) { + assert(i == 0); + return vtable_components().size(); + } - return AddressPoint; - } - - const AddressPointsMapTy &getAddressPoints() const { - return AddressPoints; + size_t thisIndex = VTableIndices[i]; + size_t nextIndex = (i + 1 == VTableIndices.size()) + ? vtable_components().size() + : VTableIndices[i + 1]; + return nextIndex - thisIndex; } }; @@ -339,8 +338,9 @@ private: typedef llvm::DenseMap<GlobalDecl, int64_t> MethodVTableIndicesTy; MethodVTableIndicesTy MethodVTableIndices; - typedef llvm::DenseMap<const CXXRecordDecl *, const VTableLayout *> - VTableLayoutMapTy; + typedef llvm::DenseMap<const CXXRecordDecl *, + std::unique_ptr<const VTableLayout>> + VTableLayoutMapTy; VTableLayoutMapTy VTableLayouts; typedef std::pair<const CXXRecordDecl *, @@ -367,11 +367,9 @@ public: return *VTableLayouts[RD]; } - VTableLayout * - createConstructionVTableLayout(const CXXRecordDecl *MostDerivedClass, - CharUnits MostDerivedClassOffset, - bool MostDerivedClassIsVirtual, - const CXXRecordDecl *LayoutClass); + std::unique_ptr<VTableLayout> createConstructionVTableLayout( + const CXXRecordDecl *MostDerivedClass, CharUnits MostDerivedClassOffset, + bool MostDerivedClassIsVirtual, const CXXRecordDecl *LayoutClass); /// \brief Locate a virtual function in the vtable. /// @@ -399,21 +397,21 @@ struct VPtrInfo { typedef SmallVector<const CXXRecordDecl *, 1> BasePath; VPtrInfo(const CXXRecordDecl *RD) - : ReusingBase(RD), BaseWithVPtr(RD), NextBaseToMangle(RD) {} + : ObjectWithVPtr(RD), IntroducingObject(RD), NextBaseToMangle(RD) {} + + /// This is the most derived class that has this vptr at offset zero. When + /// single inheritance is used, this is always the most derived class. If + /// multiple inheritance is used, it may be any direct or indirect base. + const CXXRecordDecl *ObjectWithVPtr; - /// The vtable will hold all of the virtual bases or virtual methods of - /// ReusingBase. This may or may not be the same class as VPtrSubobject.Base. - /// A derived class will reuse the vptr of the first non-virtual base - /// subobject that has one. - const CXXRecordDecl *ReusingBase; + /// This is the class that introduced the vptr by declaring new virtual + /// methods or virtual bases. + const CXXRecordDecl *IntroducingObject; - /// BaseWithVPtr is at this offset from its containing complete object or + /// IntroducingObject is at this offset from its containing complete object or /// virtual base. CharUnits NonVirtualOffset; - /// The vptr is stored inside this subobject. - const CXXRecordDecl *BaseWithVPtr; - /// The bases from the inheritance path that got used to mangle the vbtable /// name. This is not really a full path like a CXXBasePath. It holds the /// subset of records that need to be mangled into the vbtable symbol name in @@ -432,7 +430,7 @@ struct VPtrInfo { /// This holds the base classes path from the complete type to the first base /// with the given vfptr offset, in the base-to-derived order. Only used for /// vftables. - BasePath PathToBaseWithVPtr; + BasePath PathToIntroducingObject; /// Static offset from the top of the most derived class to this vfptr, /// including any virtual base offset. Only used for vftables. @@ -444,14 +442,12 @@ struct VPtrInfo { } }; -typedef SmallVector<VPtrInfo *, 2> VPtrInfoVector; +typedef SmallVector<std::unique_ptr<VPtrInfo>, 2> VPtrInfoVector; /// All virtual base related information about a given record decl. Includes /// information on all virtual base tables and the path components that are used /// to mangle them. struct VirtualBaseInfo { - ~VirtualBaseInfo() { llvm::DeleteContainerPointers(VBPtrPaths); } - /// A map from virtual base to vbtable index for doing a conversion from the /// the derived class to the a base. llvm::DenseMap<const CXXRecordDecl *, unsigned> VBTableIndices; @@ -504,15 +500,17 @@ private: MethodVFTableLocationsTy; MethodVFTableLocationsTy MethodVFTableLocations; - typedef llvm::DenseMap<const CXXRecordDecl *, VPtrInfoVector *> - VFPtrLocationsMapTy; + typedef llvm::DenseMap<const CXXRecordDecl *, VPtrInfoVector> + VFPtrLocationsMapTy; VFPtrLocationsMapTy VFPtrLocations; typedef std::pair<const CXXRecordDecl *, CharUnits> VFTableIdTy; - typedef llvm::DenseMap<VFTableIdTy, const VTableLayout *> VFTableLayoutMapTy; + typedef llvm::DenseMap<VFTableIdTy, std::unique_ptr<const VTableLayout>> + VFTableLayoutMapTy; VFTableLayoutMapTy VFTableLayouts; - llvm::DenseMap<const CXXRecordDecl *, VirtualBaseInfo *> VBaseInfo; + llvm::DenseMap<const CXXRecordDecl *, std::unique_ptr<VirtualBaseInfo>> + VBaseInfo; void enumerateVFPtrs(const CXXRecordDecl *ForClass, VPtrInfoVector &Result); @@ -522,7 +520,7 @@ private: const MethodVFTableLocationsTy &NewMethods, raw_ostream &); - const VirtualBaseInfo * + const VirtualBaseInfo & computeVBTableRelatedInformation(const CXXRecordDecl *RD); void computeVTablePaths(bool ForVBTables, const CXXRecordDecl *RD, |