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 9e13a60..83eccc8 100644
--- a/lib/CodeGen/CGVtable.cpp
+++ b/lib/CodeGen/CGVtable.cpp
@@ -1253,18 +1253,18 @@
bool isEmpty() const { return This.isEmpty() && Return.isEmpty(); }
};
- typedef llvm::DenseMap<uint64_t, ThunkInfo> ThunksInfoMapTy;
+ typedef llvm::DenseMap<uint64_t, ThunkInfo> VtableThunksMapTy;
/// VTableThunks - The thunks by vtable index in the vtable currently being
/// built.
- ThunksInfoMapTy VTableThunks;
+ VtableThunksMapTy VTableThunks;
- typedef llvm::DenseMap<const CXXMethodDecl *,
- llvm::SmallVector<ThunkInfo, 1> > MethodThunksMapTy;
+ typedef llvm::SmallVector<ThunkInfo, 1> ThunkInfoVectorTy;
+ typedef llvm::DenseMap<const CXXMethodDecl *, ThunkInfoVectorTy> 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 @@
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 @@
// We store the method names in a map to get a stable order.
std::map<std::string, const CXXMethodDecl *> 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 @@
const std::string &MethodName = I->first;
const CXXMethodDecl *MD = I->second;
- llvm::SmallVector<ThunkInfo, 1> ThunksVector = Thunks[MD];
+ ThunkInfoVectorTy ThunksVector = Thunks[MD];
std::sort(ThunksVector.begin(), ThunksVector.end());
Out << "Thunks for '" << MethodName << "' (" << ThunksVector.size();
@@ -3732,6 +3732,11 @@
return GV;
}
+void CodeGenVTables::EmitThunks(GlobalDecl GD)
+{
+ CGM.BuildThunksForVirtual(GD);
+}
+
void
CodeGenVTables::GenerateClassData(llvm::GlobalVariable::LinkageTypes Linkage,
const CXXRecordDecl *RD) {
@@ -3771,7 +3776,7 @@
// 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 @@
else
GenerateClassData(CGM.getVtableLinkage(RD), RD);
}
+
diff --git a/lib/CodeGen/CGVtable.h b/lib/CodeGen/CGVtable.h
index ae2263e..ba5a429 100644
--- a/lib/CodeGen/CGVtable.h
+++ b/lib/CodeGen/CGVtable.h
@@ -186,6 +186,9 @@
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) { }