diff options
-rw-r--r-- | lib/CodeGen/CGVTT.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 36 | ||||
-rw-r--r-- | 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<const CXXRecordDecl *, int64_t> VBaseOffsetOffsetsMapTy; + + typedef llvm::DenseMap<BaseSubobject, uint64_t> + AddressPointsMapTy; private: /// VTables - Global vtable information. @@ -1132,8 +1135,6 @@ private: /// Components - The components of the vtable being built. llvm::SmallVector<VtableComponent, 64> Components; - typedef llvm::DenseMap<BaseSubobject, uint64_t> 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<const uint64_t *>(Components.begin()); } - const uint64_t *vtable_components_data_end() { + const uint64_t *vtable_components_data_end() const { return reinterpret_cast<const uint64_t *>(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<CtorVtable_t, int64_t>& 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<const CXXRecordDecl *, AddrMap_t*> AddressPoints; + // FIXME: Remove this. + llvm::DenseMap<const CXXRecordDecl *, AddrMap_t*> OldAddressPoints; private: CodeGenModule &CGM; @@ -269,7 +270,10 @@ private: typedef llvm::DenseMap<std::pair<const CXXRecordDecl *, BaseSubobject>, 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!"); |