From 66d567d849f160593064cd3eae336d8aa2de363c Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Thu, 25 Mar 2010 00:51:13 +0000 Subject: [PATCH] More address point map shuffling. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99462 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGVTT.cpp | 2 +- lib/CodeGen/CGVtable.cpp | 36 +++++++++++++++++++++++++++++------- lib/CodeGen/CGVtable.h | 8 ++++++-- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib/CodeGen/CGVTT.cpp b/lib/CodeGen/CGVTT.cpp index 863eac30d4..14b58fe306 100644 --- a/lib/CodeGen/CGVTT.cpp +++ b/lib/CodeGen/CGVTT.cpp @@ -247,7 +247,7 @@ public: CodeGenModule &cgm, bool GenerateDefinition) : Inits(inits), Class(c), CGM(cgm), BLayout(cgm.getContext().getASTRecordLayout(c)), - AddressPoints(*cgm.getVTables().AddressPoints[c]), + AddressPoints(*cgm.getVTables().OldAddressPoints[c]), VMContext(cgm.getModule().getContext()), GenerateDefinition(GenerateDefinition) { diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index 2d32ee82a4..50b2ac8759 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -1093,6 +1093,9 @@ public: typedef llvm::DenseMap VBaseOffsetOffsetsMapTy; + + typedef llvm::DenseMap + AddressPointsMapTy; private: /// VTables - Global vtable information. @@ -1132,8 +1135,6 @@ private: /// Components - The components of the vtable being built. llvm::SmallVector Components; - typedef llvm::DenseMap AddressPointsMapTy; - /// AddressPoints - Address points for the vtable being built. AddressPointsMapTy AddressPoints; @@ -1311,14 +1312,22 @@ public: return Components.size(); } - const uint64_t *vtable_components_data_begin() { + const uint64_t *vtable_components_data_begin() const { return reinterpret_cast(Components.begin()); } - const uint64_t *vtable_components_data_end() { + const uint64_t *vtable_components_data_end() const { return reinterpret_cast(Components.end()); } + AddressPointsMapTy::const_iterator address_points_begin() const { + return AddressPoints.begin(); + } + + AddressPointsMapTy::const_iterator address_points_end() const { + return AddressPoints.end(); + } + /// dumpLayout - Dump the vtable layout. void dumpLayout(llvm::raw_ostream&); }; @@ -2481,7 +2490,7 @@ private: static llvm::DenseMap& AllocAddressPoint(CodeGenModule &cgm, const CXXRecordDecl *l, const CXXRecordDecl *c) { - CodeGenVTables::AddrMap_t *&oref = cgm.getVTables().AddressPoints[l]; + CodeGenVTables::AddrMap_t *&oref = cgm.getVTables().OldAddressPoints[l]; if (oref == 0) oref = new CodeGenVTables::AddrMap_t; @@ -3575,7 +3584,7 @@ int64_t CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD, const CodeGenVTables::AddrSubMap_t & CodeGenVTables::getAddressPoints(const CXXRecordDecl *RD) { - if (!AddressPoints[RD]) { + if (!OldAddressPoints[RD]) { OldVtableBuilder::AddressPointsMapTy AddressPoints; OldVtableBuilder b(RD, RD, 0, CGM, false, AddressPoints); @@ -3583,7 +3592,7 @@ CodeGenVTables::getAddressPoints(const CXXRecordDecl *RD) { b.GenerateVtableForVBases(RD, 0); } - return *(*AddressPoints[RD])[RD]; + return *(*OldAddressPoints[RD])[RD]; } llvm::GlobalVariable * @@ -3934,6 +3943,19 @@ void CodeGenVTables::ComputeVTableRelatedInformation(const CXXRecordDecl *RD) { // Add the known thunks. Thunks.insert(Builder.thunks_begin(), Builder.thunks_end()); + // Add the address points. + for (VtableBuilder::AddressPointsMapTy::const_iterator I = + Builder.address_points_begin(), E = Builder.address_points_end(); + I != E; ++I) { + + uint64_t &AddressPoint = AddressPoints[std::make_pair(RD, I->first)]; + + // Check if we already have the address points for this base. + assert(!AddressPoint && "Address point already exists for this base!"); + + AddressPoint = I->second; + } + // If we don't have the vbase information for this class, insert it. // getVirtualBaseOffsetOffset will compute it separately without computing // the rest of the vtable related information. diff --git a/lib/CodeGen/CGVtable.h b/lib/CodeGen/CGVtable.h index 28e2bcb084..d2acba0322 100644 --- a/lib/CodeGen/CGVtable.h +++ b/lib/CodeGen/CGVtable.h @@ -225,7 +225,8 @@ public: const CodeGenVTables::AddrSubMap_t& getAddressPoints(const CXXRecordDecl *RD); - llvm::DenseMap AddressPoints; + // FIXME: Remove this. + llvm::DenseMap OldAddressPoints; private: CodeGenModule &CGM; @@ -269,7 +270,10 @@ private: typedef llvm::DenseMap, uint64_t> AddressPointsMapTy; - + + /// Address points - Vtable address points. + AddressPointsMapTy AddressPoints; + uint64_t getNumVTableComponents(const CXXRecordDecl *RD) const { assert(VTableLayoutMap.count(RD) && "No vtable layout for this class!"); -- 2.50.1