Generalize the swiftcall API since being passed indirectly isn't

C++-specific anymore.

llvm-svn: 329513
This commit is contained in:
John McCall 2018-04-07 20:16:47 +00:00
parent 9487d90e22
commit bfbc05e2f5
2 changed files with 14 additions and 10 deletions

View File

@ -152,9 +152,15 @@ void legalizeVectorType(CodeGenModule &CGM, CharUnits vectorSize,
llvm::VectorType *vectorTy,
llvm::SmallVectorImpl<llvm::Type*> &types);
/// Should a C++ record type be passed and returned indirectly?
bool shouldPassCXXRecordIndirectly(CodeGenModule &CGM,
const CXXRecordDecl *record);
/// Is the given record type required to be passed and returned indirectly
/// because of language restrictions?
///
/// This considers *only* mandatory indirectness due to language restrictions,
/// such as C++'s non-trivially-copyable types and Objective-C's __weak
/// references. A record for which this returns true may still be passed
/// indirectly for other reasons, such as being too large to fit in a
/// reasonable number of registers.
bool mustPassRecordIndirectly(CodeGenModule &CGM, const RecordDecl *record);
/// Classify the rules for how to return a particular type.
ABIArgInfo classifyReturnType(CodeGenModule &CGM, CanQualType type);
@ -166,7 +172,7 @@ ABIArgInfo classifyArgumentType(CodeGenModule &CGM, CanQualType type);
/// private interface for Clang.
void computeABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI);
/// Is swifterror lowered to a register by the target ABI.
/// Is swifterror lowered to a register by the target ABI?
bool isSwiftErrorLoweredInRegister(CodeGenModule &CGM);
} // end namespace swiftcall

View File

@ -740,8 +740,8 @@ void swiftcall::legalizeVectorType(CodeGenModule &CGM, CharUnits origVectorSize,
components.append(numElts, eltTy);
}
bool swiftcall::shouldPassCXXRecordIndirectly(CodeGenModule &CGM,
const CXXRecordDecl *record) {
bool swiftcall::mustPassRecordIndirectly(CodeGenModule &CGM,
const RecordDecl *record) {
// FIXME: should we not rely on the standard computation in Sema, just in
// case we want to diverge from the platform ABI (e.g. on targets where
// that uses the MSVC rule)?
@ -767,10 +767,8 @@ static ABIArgInfo classifyType(CodeGenModule &CGM, CanQualType type,
auto record = recordType->getDecl();
auto &layout = CGM.getContext().getASTRecordLayout(record);
if (auto cxxRecord = dyn_cast<CXXRecordDecl>(record)) {
if (shouldPassCXXRecordIndirectly(CGM, cxxRecord))
return ABIArgInfo::getIndirect(layout.getAlignment(), /*byval*/ false);
}
if (mustPassRecordIndirectly(CGM, record))
return ABIArgInfo::getIndirect(layout.getAlignment(), /*byval*/ false);
SwiftAggLowering lowering(CGM);
lowering.addTypedData(recordType->getDecl(), CharUnits::Zero(), layout);