CodeGenObjCXX: handle inalloca appropriately for msgSend variant

objc_msgSend_stret takes a hidden parameter for the returned structure's
address for the construction.  When the function signature is rewritten
for the inalloca passing, the return type is no longer marked as
indirect but rather inalloca stret.  This enhances the test for the
indirect return to check for that case as well.  This fixes the
incorrect return classification for Windows x86.

llvm-svn: 326362
This commit is contained in:
Saleem Abdulrasool 2018-02-28 20:16:12 +00:00
parent b95298b041
commit f181f1a6a2
2 changed files with 20 additions and 1 deletions

View File

@ -1479,7 +1479,8 @@ void ClangToLLVMArgMapping::construct(const ASTContext &Context,
/***/
bool CodeGenModule::ReturnTypeUsesSRet(const CGFunctionInfo &FI) {
return FI.getReturnInfo().isIndirect();
const auto &RI = FI.getReturnInfo();
return RI.isIndirect() || (RI.isInAlloca() && RI.getInAllocaSRet());
}
bool CodeGenModule::ReturnSlotInterferesWithArgs(const CGFunctionInfo &FI) {

View File

@ -0,0 +1,18 @@
// RUN: %clang_cc1 -triple i686-unknown-windows-msvc -fobjc-runtime=ios-6.0 -Os -S -emit-llvm -o - %s -mdisable-fp-elim | FileCheck %s
struct S {
S() = default;
S(const S &) {}
};
@interface I
+ (S)m:(S)s;
@end
S f() {
return [I m:S()];
}
// CHECK: declare dllimport void @objc_msgSend_stret(i8*, i8*, ...)
// CHECK-NOT: declare dllimport void @objc_msgSend(i8*, i8*, ...)