summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2011-02-05 18:48:55 +0000
committerAnders Carlsson <andersca@mac.com>2011-02-05 18:48:55 +0000
commit73f97534b04ff9c656ea4665a3c24efe21478e44 (patch)
treec528c2a1f27510856ba2b0b3028299eab6fb9113 /clang/lib
parent36c6d2307401e4ddcc43afdb209bd41e09e0be31 (diff)
downloadbcm5719-llvm-73f97534b04ff9c656ea4665a3c24efe21478e44.tar.gz
bcm5719-llvm-73f97534b04ff9c656ea4665a3c24efe21478e44.zip
Pass a 'ForVTable' flag to GetAddrOfThunk and pass it along to GetOrCreateLLVMFunction so that we
won't assert when building a thunk for an implicit virtual member function that is not marked used. llvm-svn: 124967
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGVTables.cpp11
-rw-r--r--clang/lib/CodeGen/CodeGenModule.h3
2 files changed, 8 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp
index eadfe9f146b..27b4432920a 100644
--- a/clang/lib/CodeGen/CGVTables.cpp
+++ b/clang/lib/CodeGen/CGVTables.cpp
@@ -2451,7 +2451,8 @@ CodeGenVTables::getAddressPoint(BaseSubobject Base, const CXXRecordDecl *RD) {
}
llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD,
- const ThunkInfo &Thunk) {
+ const ThunkInfo &Thunk,
+ bool ForVTable) {
const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
// Compute the mangled name.
@@ -2463,7 +2464,7 @@ llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD,
getCXXABI().getMangleContext().mangleThunk(MD, Thunk, Name);
const llvm::Type *Ty = getTypes().GetFunctionTypeForVTable(GD);
- return GetOrCreateLLVMFunction(Name, Ty, GD, /*ForVTable=*/false);
+ return GetOrCreateLLVMFunction(Name, Ty, GD, ForVTable);
}
static llvm::Value *PerformTypeAdjustment(CodeGenFunction &CGF,
@@ -2681,7 +2682,7 @@ void CodeGenFunction::GenerateThunk(llvm::Function *Fn, GlobalDecl GD,
void CodeGenVTables::EmitThunk(GlobalDecl GD, const ThunkInfo &Thunk)
{
- llvm::Constant *Entry = CGM.GetAddrOfThunk(GD, Thunk);
+ llvm::Constant *Entry = CGM.GetAddrOfThunk(GD, Thunk, /*ForVTable=*/false);
// Strip off a bitcast if we got one back.
if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
@@ -2701,7 +2702,7 @@ void CodeGenVTables::EmitThunk(GlobalDecl GD, const ThunkInfo &Thunk)
// Remove the name from the old thunk function and get a new thunk.
OldThunkFn->setName(llvm::StringRef());
- Entry = CGM.GetAddrOfThunk(GD, Thunk);
+ Entry = CGM.GetAddrOfThunk(GD, Thunk, /*ForVTable=*/false);
// If needed, replace the old thunk with a bitcast.
if (!OldThunkFn->use_empty()) {
@@ -2912,7 +2913,7 @@ CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD,
VTableThunks[NextVTableThunkIndex].first == I) {
const ThunkInfo &Thunk = VTableThunks[NextVTableThunkIndex].second;
- Init = CGM.GetAddrOfThunk(GD, Thunk);
+ Init = CGM.GetAddrOfThunk(GD, Thunk, /*ForVTable=*/true);
NextVTableThunkIndex++;
} else {
diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h
index 1ed56d5b924..7b6e12358d1 100644
--- a/clang/lib/CodeGen/CodeGenModule.h
+++ b/clang/lib/CodeGen/CodeGenModule.h
@@ -325,7 +325,8 @@ public:
llvm::Constant *GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH = false);
/// GetAddrOfThunk - Get the address of the thunk for the given global decl.
- llvm::Constant *GetAddrOfThunk(GlobalDecl GD, const ThunkInfo &Thunk);
+ llvm::Constant *GetAddrOfThunk(GlobalDecl GD, const ThunkInfo &Thunk,
+ bool ForVTable);
/// GetWeakRefReference - Get a reference to the target of VD.
llvm::Constant *GetWeakRefReference(const ValueDecl *VD);
OpenPOWER on IntegriCloud