forked from OSchip/llvm-project
Generalize the swiftcall API since being passed indirectly isn't
C++-specific anymore. llvm-svn: 329513
This commit is contained in:
parent
9487d90e22
commit
bfbc05e2f5
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue