[cfe-commits] r99287 - in /cfe/trunk/lib/CodeGen: CGVtable.cpp CGVtable.h

Anders Carlsson andersca at mac.com
Tue Mar 23 09:36:50 PDT 2010


Author: andersca
Date: Tue Mar 23 11:36:50 2010
New Revision: 99287

URL: http://llvm.org/viewvc/llvm-project?rev=99287&view=rev
Log:
More work on thunks.

Modified:
    cfe/trunk/lib/CodeGen/CGVtable.cpp
    cfe/trunk/lib/CodeGen/CGVtable.h

Modified: cfe/trunk/lib/CodeGen/CGVtable.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVtable.cpp?rev=99287&r1=99286&r2=99287&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGVtable.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGVtable.cpp Tue Mar 23 11:36:50 2010
@@ -1291,6 +1291,14 @@
     LayoutVtable();
   }
 
+  ThunksMapTy::const_iterator thunks_begin() const {
+    return Thunks.begin();
+  }
+
+  ThunksMapTy::const_iterator thunks_end() const {
+    return Thunks.end();
+  }
+
   /// dumpLayout - Dump the vtable layout.
   void dumpLayout(llvm::raw_ostream&);
 };
@@ -3642,9 +3650,55 @@
   return GV;
 }
 
+void CodeGenVTables::EmitThunk(GlobalDecl GD, const ThunkInfo &Thunk)
+{
+  // FIXME: Implement this!
+}
+
 void CodeGenVTables::EmitThunks(GlobalDecl GD)
 {
-  CGM.BuildThunksForVirtual(GD);
+  // FIXME: We use the -fdump-vtable-layouts flag to trigger the new thunk
+  // building code for now.
+  if (!CGM.getLangOptions().DumpVtableLayouts) {
+    CGM.BuildThunksForVirtual(GD);
+    return;
+  }
+
+  const CXXMethodDecl *MD = 
+    cast<CXXMethodDecl>(GD.getDecl())->getCanonicalDecl();
+
+  // We don't need to generate thunks for the base destructor.
+  if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
+    return;
+
+  const CXXRecordDecl *RD = MD->getParent();
+  
+  ThunksMapTy::const_iterator I = Thunks.find(MD);
+  if (I == Thunks.end()) {
+    // We did not find a thunk for this method. Check if we've collected thunks
+    // for this record.
+    if (!ClassesWithKnownThunkStatus.insert(RD).second) {
+      // This member function doesn't have any associated thunks.
+      return;
+    }
+    
+    // Use the vtable builder to build thunks for this class.
+    VtableBuilder Builder(*this, RD, 0, /*MostDerivedClassIsVirtual=*/0, RD);
+
+    // Add the known thunks.
+    Thunks.insert(Builder.thunks_begin(), Builder.thunks_end());
+  
+    // Look for the thunk again.
+    I = Thunks.find(MD);
+    if (I == Thunks.end()) {
+      // Looks like this function doesn't have any associated thunks after all.
+      return;
+    }
+  }
+  
+  const ThunkInfoVectorTy &ThunkInfoVector = I->second;
+  for (unsigned I = 0, E = ThunkInfoVector.size(); I != E; ++I)
+    EmitThunk(GD, ThunkInfoVector[I]);
 }
 
 void 

Modified: cfe/trunk/lib/CodeGen/CGVtable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVtable.h?rev=99287&r1=99286&r2=99287&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGVtable.h (original)
+++ cfe/trunk/lib/CodeGen/CGVtable.h Tue Mar 23 11:36:50 2010
@@ -255,6 +255,16 @@
   SavedAdjustmentsTy SavedAdjustments;
   llvm::DenseSet<const CXXRecordDecl*> SavedAdjustmentRecords;
 
+  typedef llvm::SmallVector<ThunkInfo, 1> ThunkInfoVectorTy;
+  typedef llvm::DenseMap<const CXXMethodDecl *, ThunkInfoVectorTy> ThunksMapTy;
+  
+  /// Thunks - Contains all thunks that a given method decl will need.
+  ThunksMapTy Thunks;
+
+  /// ClassesWithKnownThunkStatus - Contains all the classes for which we know
+  /// whether their virtual member functions have thunks or not.
+  llvm::DenseSet<const CXXRecordDecl *> ClassesWithKnownThunkStatus;
+  
   typedef llvm::DenseMap<ClassPairTy, uint64_t> SubVTTIndiciesTy;
   SubVTTIndiciesTy SubVTTIndicies;
 
@@ -274,6 +284,9 @@
                                     bool GenerateDefinition,
                                     const CXXRecordDecl *RD);
 
+  /// EmitThunk - Emit a single thunk.
+  void EmitThunk(GlobalDecl GD, const ThunkInfo &Thunk);
+  
   /// EmitThunks - Emit the associated thunks for the given global decl.
   void EmitThunks(GlobalDecl GD);
   





More information about the cfe-commits mailing list