aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGCXX.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-11-03 03:16:46 +0000
committerMike Stump <mrs@apple.com>2009-11-03 03:16:46 +0000
commit4387cd9697374462af10d1b5515f26f4af129432 (patch)
treea52fe768754885a1110eba4823ed7d4ffa8c15c9 /lib/CodeGen/CGCXX.cpp
parentbdd563ec391b0a83fc6d04b8a8ea3022aa702f74 (diff)
Refine codegen for non-virtual this adjustments for thunks.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85856 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r--lib/CodeGen/CGCXX.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index 05b9164af4..d8db9ab7c4 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -746,13 +746,20 @@ llvm::Constant *CodeGenFunction::GenerateCovariantThunk(llvm::Function *Fn,
QualType ArgType = MD->getThisType(getContext());
llvm::Value *Arg = Builder.CreateLoad(LocalDeclMap[ThisDecl], "this");
+ llvm::Type *Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext),
+ 0);
+ const llvm::Type *OrigTy = Arg->getType();
+ if (nv_t) {
+ // Do the non-virtual this adjustment
+ Arg = Builder.CreateBitCast(Arg, Ptr8Ty);
+ Arg = Builder.CreateConstInBoundsGEP1_64(Arg, nv_t);
+ Arg = Builder.CreateBitCast(Arg, OrigTy);
+ }
if (v_t) {
- const llvm::Type *OrigTy = Arg->getType();
- // FIXME: Add this adjustments
+ // Do the virtual this adjustment
const llvm::Type *PtrDiffTy =
ConvertType(getContext().getPointerDiffType());
- llvm::Type *Ptr8Ty, *PtrPtr8Ty, *PtrPtrDiffTy;
- Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext), 0);
+ llvm::Type *PtrPtr8Ty, *PtrPtrDiffTy;
PtrPtr8Ty = llvm::PointerType::get(Ptr8Ty, 0);
PtrPtrDiffTy = llvm::PointerType::get(PtrDiffTy, 0);
llvm::Value *ThisVal = Builder.CreateBitCast(Arg, Ptr8Ty);
@@ -766,7 +773,6 @@ llvm::Constant *CodeGenFunction::GenerateCovariantThunk(llvm::Function *Fn,
Arg = Builder.CreateGEP(ThisVal, Arg);
Arg = Builder.CreateBitCast(Arg, OrigTy);
}
- // FIXME: Add this non-virtual adjustment
CallArgs.push_back(std::make_pair(RValue::get(Arg), ArgType));
for (FunctionDecl::param_const_iterator i = MD->param_begin(),
@@ -780,6 +786,7 @@ llvm::Constant *CodeGenFunction::GenerateCovariantThunk(llvm::Function *Fn,
CallArgs.push_back(std::make_pair(EmitCallArg(Arg, ArgType), ArgType));
}
+ // FIXME: be sure to call the right function when we thunk to a thunk
RValue RV = EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
Callee, CallArgs, MD);
if (nv_r || v_r) {