diff options
Diffstat (limited to 'lib/CodeGen/CGVTables.cpp')
-rw-r--r-- | lib/CodeGen/CGVTables.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp index 891697f4cd..6acbe436c8 100644 --- a/lib/CodeGen/CGVTables.cpp +++ b/lib/CodeGen/CGVTables.cpp @@ -2582,8 +2582,11 @@ void CodeGenFunction::GenerateThunk(llvm::Function *Fn, GlobalDecl GD, FunctionArgs.push_back(std::make_pair(Param, Param->getType())); } - - StartFunction(GlobalDecl(), ResultType, Fn, FunctionArgs, SourceLocation()); + + const bool IsWin64 = CGM.getContext().Target.isWin64(); + + StartFunction(GlobalDecl(), ResultType, Fn, FunctionArgs, SourceLocation(), + IsWin64 ? CC_Win64ThisCall : CC_Default); CGM.getCXXABI().EmitInstanceFunctionProlog(*this); @@ -2614,9 +2617,14 @@ void CodeGenFunction::GenerateThunk(llvm::Function *Fn, GlobalDecl GD, FPT->isVariadic()); llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true); + FunctionType::ExtInfo Info = FPT->getExtInfo(); + + if (IsWin64) { + Info = Info.withCallingConv(CC_Win64ThisCall); + } + const CGFunctionInfo &FnInfo = - CGM.getTypes().getFunctionInfo(ResultType, CallArgs, - FPT->getExtInfo()); + CGM.getTypes().getFunctionInfo(ResultType, CallArgs, Info); // Determine whether we have a return value slot to use. ReturnValueSlot Slot; |