]> granicus.if.org Git - clang/commitdiff
More address point map shuffling.
authorAnders Carlsson <andersca@mac.com>
Thu, 25 Mar 2010 00:51:13 +0000 (00:51 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 25 Mar 2010 00:51:13 +0000 (00:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99462 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGVTT.cpp
lib/CodeGen/CGVtable.cpp
lib/CodeGen/CGVtable.h

index 863eac30d4696df64ad377e9f4da66c48c024c1b..14b58fe3060d7e9ee2bfabec60f3048e66619763 100644 (file)
@@ -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) {
     
index 2d32ee82a4fe27f2376724cc0ec4da430f4ae6aa..50b2ac8759aec5d916f4247711af5e570d88bbdc 100644 (file)
@@ -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.
index 28e2bcb084bce3ca02d2c9f642a4f8ab3d52160e..d2acba032289968f2eab047253f2b0baf91e6745 100644 (file)
@@ -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!");