From: Anders Carlsson Date: Tue, 23 Mar 2010 04:59:02 +0000 (+0000) Subject: Baby steps towards making thunks be emitted from the new vtable layout code. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ee5ab9f7a6368e516ab4e9eeadff0b2e9df03b34;p=clang Baby steps towards making thunks be emitted from the new vtable layout code. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99254 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index 9e13a60dc4..83eccc8aa8 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -1253,18 +1253,18 @@ private: bool isEmpty() const { return This.isEmpty() && Return.isEmpty(); } }; - typedef llvm::DenseMap ThunksInfoMapTy; + typedef llvm::DenseMap VtableThunksMapTy; /// VTableThunks - The thunks by vtable index in the vtable currently being /// built. - ThunksInfoMapTy VTableThunks; + VtableThunksMapTy VTableThunks; - typedef llvm::DenseMap > MethodThunksMapTy; + typedef llvm::SmallVector ThunkInfoVectorTy; + typedef llvm::DenseMap ThunksMapTy; /// Thunks - A map that contains all the thunks needed for all methods in the /// most derived class for which the vtable is currently being built. - MethodThunksMapTy Thunks; + ThunksMapTy Thunks; /// AddThunk - Add a thunk for the given method. void AddThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk); @@ -1464,7 +1464,7 @@ void VtableBuilder::ComputeThisAdjustments() { return; } - for (ThunksInfoMapTy::const_iterator I = VTableThunks.begin(), + for (VtableThunksMapTy::const_iterator I = VTableThunks.begin(), E = VTableThunks.end(); I != E; ++I) { const VtableComponent &Component = Components[I->first]; const ThunkInfo &Thunk = I->second; @@ -2329,7 +2329,7 @@ void VtableBuilder::dumpLayout(llvm::raw_ostream& Out) { // We store the method names in a map to get a stable order. std::map MethodNamesAndDecls; - for (MethodThunksMapTy::const_iterator I = Thunks.begin(), E = Thunks.end(); + for (ThunksMapTy::const_iterator I = Thunks.begin(), E = Thunks.end(); I != E; ++I) { const CXXMethodDecl *MD = I->first; std::string MethodName = @@ -2345,7 +2345,7 @@ void VtableBuilder::dumpLayout(llvm::raw_ostream& Out) { const std::string &MethodName = I->first; const CXXMethodDecl *MD = I->second; - llvm::SmallVector ThunksVector = Thunks[MD]; + ThunkInfoVectorTy ThunksVector = Thunks[MD]; std::sort(ThunksVector.begin(), ThunksVector.end()); Out << "Thunks for '" << MethodName << "' (" << ThunksVector.size(); @@ -3732,6 +3732,11 @@ CodeGenVTables::GenerateVtable(llvm::GlobalVariable::LinkageTypes Linkage, return GV; } +void CodeGenVTables::EmitThunks(GlobalDecl GD) +{ + CGM.BuildThunksForVirtual(GD); +} + void CodeGenVTables::GenerateClassData(llvm::GlobalVariable::LinkageTypes Linkage, const CXXRecordDecl *RD) { @@ -3771,7 +3776,7 @@ void CodeGenVTables::EmitVTableRelatedData(GlobalDecl GD) { // Check if we need to emit thunks for this function. if (MD->isVirtual()) - CGM.BuildThunksForVirtual(GD); + EmitThunks(GD); // Get the key function. const CXXMethodDecl *KeyFunction = CGM.getContext().getKeyFunction(RD); @@ -3791,3 +3796,4 @@ void CodeGenVTables::EmitVTableRelatedData(GlobalDecl GD) { else GenerateClassData(CGM.getVtableLinkage(RD), RD); } + diff --git a/lib/CodeGen/CGVtable.h b/lib/CodeGen/CGVtable.h index ae2263e2f3..ba5a4295d3 100644 --- a/lib/CodeGen/CGVtable.h +++ b/lib/CodeGen/CGVtable.h @@ -186,6 +186,9 @@ private: bool GenerateDefinition, const CXXRecordDecl *RD); + /// EmitThunks - Emit the associated thunks for the given global decl. + void EmitThunks(GlobalDecl GD); + public: CodeGenVTables(CodeGenModule &CGM) : CGM(CGM) { }