diff options
author | John McCall <rjmccall@apple.com> | 2018-01-07 06:28:49 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2018-01-07 06:28:49 +0000 |
commit | 56331e28648458aa9482dfab4c10e81b30f9e05c (patch) | |
tree | 47117170ab2576ee060226791c9c00a812b0bfbc | |
parent | d0859a03b560629f58498d1346e1c47ae32c6cc1 (diff) | |
download | bcm5719-llvm-56331e28648458aa9482dfab4c10e81b30f9e05c.tar.gz bcm5719-llvm-56331e28648458aa9482dfab4c10e81b30f9e05c.zip |
Simplify the internal API for checking whether swiftcall passes a type indirectly and expose that API externally.
llvm-svn: 321957
-rw-r--r-- | clang/include/clang/CodeGen/SwiftCallingConv.h | 6 | ||||
-rw-r--r-- | clang/lib/CodeGen/ABIInfo.h | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/SwiftCallingConv.cpp | 14 | ||||
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 18 |
4 files changed, 22 insertions, 19 deletions
diff --git a/clang/include/clang/CodeGen/SwiftCallingConv.h b/clang/include/clang/CodeGen/SwiftCallingConv.h index 23db43e6739..8ea2b9d35db 100644 --- a/clang/include/clang/CodeGen/SwiftCallingConv.h +++ b/clang/include/clang/CodeGen/SwiftCallingConv.h @@ -116,6 +116,12 @@ private: void splitVectorEntry(unsigned index); }; +/// Should an aggregate which expands to the given type sequence +/// be passed/returned indirectly under swiftcall? +bool shouldPassIndirectly(CodeGenModule &CGM, + ArrayRef<llvm::Type*> types, + bool asReturnValue); + /// Return the maximum voluntary integer size for the current target. CharUnits getMaximumVoluntaryIntegerSize(CodeGenModule &CGM); diff --git a/clang/lib/CodeGen/ABIInfo.h b/clang/lib/CodeGen/ABIInfo.h index 575506da84d..4cfc3d059d9 100644 --- a/clang/lib/CodeGen/ABIInfo.h +++ b/clang/lib/CodeGen/ABIInfo.h @@ -137,8 +137,7 @@ namespace swiftcall { bool supportsSwift() const final override { return true; } - virtual bool shouldPassIndirectlyForSwift(CharUnits totalSize, - ArrayRef<llvm::Type*> types, + virtual bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> types, bool asReturnValue) const = 0; virtual bool isLegalVectorTypeForSwift(CharUnits totalSize, diff --git a/clang/lib/CodeGen/SwiftCallingConv.cpp b/clang/lib/CodeGen/SwiftCallingConv.cpp index fc8e36d2c59..2a12078e198 100644 --- a/clang/lib/CodeGen/SwiftCallingConv.cpp +++ b/clang/lib/CodeGen/SwiftCallingConv.cpp @@ -579,11 +579,9 @@ bool SwiftAggLowering::shouldPassIndirectly(bool asReturnValue) const { // Empty types don't need to be passed indirectly. if (Entries.empty()) return false; - CharUnits totalSize = Entries.back().End; - // Avoid copying the array of types when there's just a single element. if (Entries.size() == 1) { - return getSwiftABIInfo(CGM).shouldPassIndirectlyForSwift(totalSize, + return getSwiftABIInfo(CGM).shouldPassIndirectlyForSwift( Entries.back().Type, asReturnValue); } @@ -593,8 +591,14 @@ bool SwiftAggLowering::shouldPassIndirectly(bool asReturnValue) const { for (auto &entry : Entries) { componentTys.push_back(entry.Type); } - return getSwiftABIInfo(CGM).shouldPassIndirectlyForSwift(totalSize, - componentTys, + return getSwiftABIInfo(CGM).shouldPassIndirectlyForSwift(componentTys, + asReturnValue); +} + +bool swiftcall::shouldPassIndirectly(CodeGenModule &CGM, + ArrayRef<llvm::Type*> componentTys, + bool asReturnValue) { + return getSwiftABIInfo(CGM).shouldPassIndirectlyForSwift(componentTys, asReturnValue); } diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 4b8006428f8..e3f3ba1be49 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -1028,8 +1028,7 @@ public: IsMCUABI(CGT.getTarget().getTriple().isOSIAMCU()), DefaultNumRegisterParameters(NumRegisterParameters) {} - bool shouldPassIndirectlyForSwift(CharUnits totalSize, - ArrayRef<llvm::Type*> scalars, + bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars, bool asReturnValue) const override { // LLVM's x86-32 lowering currently only assigns up to three // integer registers and three fp registers. Oddly, it'll use up to @@ -2168,8 +2167,7 @@ public: return Has64BitPointers; } - bool shouldPassIndirectlyForSwift(CharUnits totalSize, - ArrayRef<llvm::Type*> scalars, + bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars, bool asReturnValue) const override { return occupiesMoreThan(CGT, scalars, /*total*/ 4); } @@ -2201,8 +2199,7 @@ public: return isX86VectorCallAggregateSmallEnough(NumMembers); } - bool shouldPassIndirectlyForSwift(CharUnits totalSize, - ArrayRef<llvm::Type *> scalars, + bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type *> scalars, bool asReturnValue) const override { return occupiesMoreThan(CGT, scalars, /*total*/ 4); } @@ -4922,8 +4919,7 @@ private: Address EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr, QualType Ty) const override; - bool shouldPassIndirectlyForSwift(CharUnits totalSize, - ArrayRef<llvm::Type*> scalars, + bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars, bool asReturnValue) const override { return occupiesMoreThan(CGT, scalars, /*total*/ 4); } @@ -5521,8 +5517,7 @@ private: llvm::CallingConv::ID getABIDefaultCC() const; void setCCs(); - bool shouldPassIndirectlyForSwift(CharUnits totalSize, - ArrayRef<llvm::Type*> scalars, + bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars, bool asReturnValue) const override { return occupiesMoreThan(CGT, scalars, /*total*/ 4); } @@ -6313,8 +6308,7 @@ public: Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr, QualType Ty) const override; - bool shouldPassIndirectlyForSwift(CharUnits totalSize, - ArrayRef<llvm::Type*> scalars, + bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars, bool asReturnValue) const override { return occupiesMoreThan(CGT, scalars, /*total*/ 4); } |