[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