diff options
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
| -rw-r--r-- | lib/CodeGen/CGCall.cpp | 24 | 
1 files changed, 21 insertions, 3 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 1632cb3c22b4..3d1e143dca2b 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -564,10 +564,28 @@ static void CreateCoercedStore(llvm::Value *Src,  /***/ -bool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) { +bool CodeGenModule::ReturnTypeUsesSRet(const CGFunctionInfo &FI) {    return FI.getReturnInfo().isIndirect();  } +bool CodeGenModule::ReturnTypeUsesFPRet(QualType ResultType) { +  if (const BuiltinType *BT = ResultType->getAs<BuiltinType>()) { +    switch (BT->getKind()) { +    default: +      return false; +    case BuiltinType::Float: +      return getContext().Target.useObjCFPRetForRealType(TargetInfo::Float); +    case BuiltinType::Double: +      return getContext().Target.useObjCFPRetForRealType(TargetInfo::Double); +    case BuiltinType::LongDouble: +      return getContext().Target.useObjCFPRetForRealType( +        TargetInfo::LongDouble); +    } +  } + +  return false; +} +  const llvm::FunctionType *CodeGenTypes::GetFunctionType(GlobalDecl GD) {    const CGFunctionInfo &FI = getFunctionInfo(GD); @@ -841,7 +859,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,    llvm::Function::arg_iterator AI = Fn->arg_begin();    // Name the struct return argument. -  if (CGM.ReturnTypeUsesSret(FI)) { +  if (CGM.ReturnTypeUsesSRet(FI)) {      AI->setName("agg.result");      ++AI;    } @@ -1116,7 +1134,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,    // If the call returns a temporary with struct return, create a temporary    // alloca to hold the result, unless one is given to us. -  if (CGM.ReturnTypeUsesSret(CallInfo)) { +  if (CGM.ReturnTypeUsesSRet(CallInfo)) {      llvm::Value *Value = ReturnValue.getValue();      if (!Value)        Value = CreateMemTemp(RetTy);  | 
