git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99287 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2010-03-23 16:36:50 +00:00
Родитель 9de672f6eb
Коммит fbf6ed46dd
2 изменённых файлов: 68 добавлений и 1 удалений

Просмотреть файл

@ -1291,6 +1291,14 @@ public:
LayoutVtable(); LayoutVtable();
} }
ThunksMapTy::const_iterator thunks_begin() const {
return Thunks.begin();
}
ThunksMapTy::const_iterator thunks_end() const {
return Thunks.end();
}
/// dumpLayout - Dump the vtable layout. /// dumpLayout - Dump the vtable layout.
void dumpLayout(llvm::raw_ostream&); void dumpLayout(llvm::raw_ostream&);
}; };
@ -3642,9 +3650,55 @@ CodeGenVTables::GenerateVtable(llvm::GlobalVariable::LinkageTypes Linkage,
return GV; return GV;
} }
void CodeGenVTables::EmitThunk(GlobalDecl GD, const ThunkInfo &Thunk)
{
// FIXME: Implement this!
}
void CodeGenVTables::EmitThunks(GlobalDecl GD) void CodeGenVTables::EmitThunks(GlobalDecl 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); 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 void

Просмотреть файл

@ -255,6 +255,16 @@ private:
SavedAdjustmentsTy SavedAdjustments; SavedAdjustmentsTy SavedAdjustments;
llvm::DenseSet<const CXXRecordDecl*> SavedAdjustmentRecords; 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; typedef llvm::DenseMap<ClassPairTy, uint64_t> SubVTTIndiciesTy;
SubVTTIndiciesTy SubVTTIndicies; SubVTTIndiciesTy SubVTTIndicies;
@ -274,6 +284,9 @@ private:
bool GenerateDefinition, bool GenerateDefinition,
const CXXRecordDecl *RD); 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. /// EmitThunks - Emit the associated thunks for the given global decl.
void EmitThunks(GlobalDecl GD); void EmitThunks(GlobalDecl GD);