diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2018-03-12 17:05:06 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2018-03-12 17:05:06 +0000 |
commit | be7daa3d50e8a65e6bba6b522768ca225b818c39 (patch) | |
tree | 5f807d6ceabb3a1905d891ad6c85fdd7cc7c84db /clang/lib/CodeGen | |
parent | 144b0c8036e1edac15ff1a69faa31eb23c1eef3f (diff) | |
download | bcm5719-llvm-be7daa3d50e8a65e6bba6b522768ca225b818c39.tar.gz bcm5719-llvm-be7daa3d50e8a65e6bba6b522768ca225b818c39.zip |
Revert "[ObjC] Allow declaring __weak pointer fields in C structs in
ARC."
This reverts commit r327206 as there were test failures caused by this
patch.
http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20180312/221427.html
llvm-svn: 327294
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGBlocks.cpp | 7 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGNonTrivialStruct.cpp | 59 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 15 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 27 |
5 files changed, 14 insertions, 96 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index 2c34447ec7e..132314ad2dc 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -1525,9 +1525,6 @@ computeCopyInfoForBlockCapture(const BlockDecl::Capture &CI, QualType T, case QualType::PCK_Struct: return std::make_pair(BlockCaptureEntityKind::NonTrivialCStruct, BlockFieldFlags()); - case QualType::PCK_ARCWeak: - // We need to register __weak direct captures with the runtime. - return std::make_pair(BlockCaptureEntityKind::ARCWeak, Flags); case QualType::PCK_ARCStrong: // We need to retain the copied value for __strong direct captures. // If it's a block pointer, we have to copy the block and assign that to @@ -1545,6 +1542,10 @@ computeCopyInfoForBlockCapture(const BlockDecl::Capture &CI, QualType T, // Special rules for ARC captures: Qualifiers QS = T.getQualifiers(); + // We need to register __weak direct captures with the runtime. + if (QS.getObjCLifetime() == Qualifiers::OCL_Weak) + return std::make_pair(BlockCaptureEntityKind::ARCWeak, Flags); + // Non-ARC captures of retainable pointers are strong and // therefore require a call to _Block_object_assign. if (!QS.getObjCLifetime() && !LangOpts.ObjCAutoRefCount) diff --git a/clang/lib/CodeGen/CGNonTrivialStruct.cpp b/clang/lib/CodeGen/CGNonTrivialStruct.cpp index 731938af867..3b0b1731987 100644 --- a/clang/lib/CodeGen/CGNonTrivialStruct.cpp +++ b/clang/lib/CodeGen/CGNonTrivialStruct.cpp @@ -77,8 +77,6 @@ struct DefaultInitializedTypeVisitor { switch (PDIK) { case QualType::PDIK_ARCStrong: return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...); - case QualType::PDIK_ARCWeak: - return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...); case QualType::PDIK_Struct: return asDerived().visitStruct(FT, std::forward<Ts>(Args)...); case QualType::PDIK_Trivial: @@ -110,8 +108,6 @@ struct CopiedTypeVisitor { switch (PCK) { case QualType::PCK_ARCStrong: return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...); - case QualType::PCK_ARCWeak: - return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...); case QualType::PCK_Struct: return asDerived().visitStruct(FT, std::forward<Ts>(Args)...); case QualType::PCK_Trivial: @@ -145,6 +141,11 @@ template <class Derived> struct StructVisitor { template <class... Ts> void visitTrivial(Ts... Args) {} + template <class... Ts> void visitARCWeak(Ts... Args) { + // FIXME: remove this when visitARCWeak is implemented in the subclasses. + llvm_unreachable("weak field is not expected"); + } + template <class... Ts> void visitCXXDestructor(Ts... Args) { llvm_unreachable("field of a C++ struct type is not expected"); } @@ -244,13 +245,6 @@ template <class Derived> struct GenFuncNameBase { appendStr(getVolatileOffsetStr(FT.isVolatileQualified(), FieldOffset)); } - void visitARCWeak(QualType FT, const FieldDecl *FD, - CharUnits CurStructOffset) { - appendStr("_w"); - CharUnits FieldOffset = CurStructOffset + asDerived().getFieldOffset(FD); - appendStr(getVolatileOffsetStr(FT.isVolatileQualified(), FieldOffset)); - } - void visitStruct(QualType QT, const FieldDecl *FD, CharUnits CurStructOffset) { CharUnits FieldOffset = CurStructOffset + asDerived().getFieldOffset(FD); @@ -621,12 +615,6 @@ struct GenDestructor : StructVisitor<GenDestructor>, *CGF, getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD), QT); } - void visitARCWeak(QualType QT, const FieldDecl *FD, CharUnits CurStackOffset, - std::array<Address, 1> Addrs) { - CGF->destroyARCWeak( - *CGF, getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD), QT); - } - void callSpecialFunction(QualType FT, CharUnits Offset, std::array<Address, 1> Addrs) { CGF->callCStructDestructor( @@ -648,12 +636,6 @@ struct GenDefaultInitialize getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD), QT); } - void visitARCWeak(QualType QT, const FieldDecl *FD, CharUnits CurStackOffset, - std::array<Address, 1> Addrs) { - CGF->EmitNullInitialization( - getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD), QT); - } - template <class FieldKind, size_t... Is> void visitArray(FieldKind FK, QualType QT, const FieldDecl *FD, CharUnits CurStackOffset, std::array<Address, 1> Addrs) { @@ -696,14 +678,6 @@ struct GenCopyConstructor : GenBinaryFunc<GenCopyConstructor, false> { llvm::Value *Val = CGF->EmitARCRetain(QT, SrcVal); CGF->EmitStoreOfScalar(Val, CGF->MakeAddrLValue(Addrs[DstIdx], QT), true); } - - void visitARCWeak(QualType QT, const FieldDecl *FD, CharUnits CurStackOffset, - std::array<Address, 2> Addrs) { - Addrs[DstIdx] = getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD); - Addrs[SrcIdx] = getAddrWithOffset(Addrs[SrcIdx], CurStackOffset, FD); - CGF->EmitARCCopyWeak(Addrs[DstIdx], Addrs[SrcIdx]); - } - void callSpecialFunction(QualType FT, CharUnits Offset, std::array<Address, 2> Addrs) { CGF->callCStructCopyConstructor(CGF->MakeAddrLValue(Addrs[DstIdx], FT), @@ -726,14 +700,6 @@ struct GenMoveConstructor : GenBinaryFunc<GenMoveConstructor, true> { CGF->EmitStoreOfScalar(SrcVal, CGF->MakeAddrLValue(Addrs[DstIdx], QT), /* isInitialization */ true); } - - void visitARCWeak(QualType QT, const FieldDecl *FD, CharUnits CurStackOffset, - std::array<Address, 2> Addrs) { - Addrs[DstIdx] = getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD); - Addrs[SrcIdx] = getAddrWithOffset(Addrs[SrcIdx], CurStackOffset, FD); - CGF->EmitARCMoveWeak(Addrs[DstIdx], Addrs[SrcIdx]); - } - void callSpecialFunction(QualType FT, CharUnits Offset, std::array<Address, 2> Addrs) { CGF->callCStructMoveConstructor(CGF->MakeAddrLValue(Addrs[DstIdx], FT), @@ -754,14 +720,6 @@ struct GenCopyAssignment : GenBinaryFunc<GenCopyAssignment, false> { CGF->EmitARCStoreStrong(CGF->MakeAddrLValue(Addrs[DstIdx], QT), SrcVal, false); } - - void visitARCWeak(QualType QT, const FieldDecl *FD, CharUnits CurStackOffset, - std::array<Address, 2> Addrs) { - Addrs[DstIdx] = getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD); - Addrs[SrcIdx] = getAddrWithOffset(Addrs[SrcIdx], CurStackOffset, FD); - CGF->emitARCCopyAssignWeak(QT, Addrs[DstIdx], Addrs[SrcIdx]); - } - void callSpecialFunction(QualType FT, CharUnits Offset, std::array<Address, 2> Addrs) { CGF->callCStructCopyAssignmentOperator( @@ -789,13 +747,6 @@ struct GenMoveAssignment : GenBinaryFunc<GenMoveAssignment, true> { CGF->EmitARCRelease(DstVal, ARCImpreciseLifetime); } - void visitARCWeak(QualType QT, const FieldDecl *FD, CharUnits CurStackOffset, - std::array<Address, 2> Addrs) { - Addrs[DstIdx] = getAddrWithOffset(Addrs[DstIdx], CurStackOffset, FD); - Addrs[SrcIdx] = getAddrWithOffset(Addrs[SrcIdx], CurStackOffset, FD); - CGF->emitARCMoveAssignWeak(QT, Addrs[DstIdx], Addrs[SrcIdx]); - } - void callSpecialFunction(QualType FT, CharUnits Offset, std::array<Address, 2> Addrs) { CGF->callCStructMoveAssignmentOperator( diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 6ece1d3bd7e..e812ef399e7 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -2307,21 +2307,6 @@ void CodeGenFunction::EmitARCCopyWeak(Address dst, Address src) { "objc_copyWeak"); } -void CodeGenFunction::emitARCCopyAssignWeak(QualType Ty, Address DstAddr, - Address SrcAddr) { - llvm::Value *Object = EmitARCLoadWeakRetained(SrcAddr); - Object = EmitObjCConsumeObject(Ty, Object); - EmitARCStoreWeak(DstAddr, Object, false); -} - -void CodeGenFunction::emitARCMoveAssignWeak(QualType Ty, Address DstAddr, - Address SrcAddr) { - llvm::Value *Object = EmitARCLoadWeakRetained(SrcAddr); - Object = EmitObjCConsumeObject(Ty, Object); - EmitARCStoreWeak(DstAddr, Object, false); - EmitARCDestroyWeak(SrcAddr); -} - /// Produce the code to do a objc_autoreleasepool_push. /// call i8* \@objc_autoreleasePoolPush(void) llvm::Value *CodeGenFunction::EmitObjCAutoreleasePoolPush() { diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 7bb9466ca2f..95d8229c7de 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -3548,8 +3548,6 @@ public: llvm::Value *EmitARCLoadWeak(Address addr); llvm::Value *EmitARCLoadWeakRetained(Address addr); llvm::Value *EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored); - void emitARCCopyAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr); - void emitARCMoveAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr); void EmitARCCopyWeak(Address dst, Address src); void EmitARCMoveWeak(Address dst, Address src); llvm::Value *EmitARCRetainAutorelease(QualType type, llvm::Value *value); diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 939679e7943..aadbd3016bf 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -140,11 +140,8 @@ bool SwiftABIInfo::isLegalVectorTypeForSwift(CharUnits vectorSize, static CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT, CGCXXABI &CXXABI) { const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()); - if (!RD) { - if (!RT->getDecl()->canPassInRegisters()) - return CGCXXABI::RAA_Indirect; + if (!RD) return CGCXXABI::RAA_Default; - } return CXXABI.getRecordArgABI(RD); } @@ -156,20 +153,6 @@ static CGCXXABI::RecordArgABI getRecordArgABI(QualType T, return getRecordArgABI(RT, CXXABI); } -static bool classifyReturnType(const CGCXXABI &CXXABI, CGFunctionInfo &FI, - const ABIInfo &Info) { - QualType Ty = FI.getReturnType(); - - if (const auto *RT = Ty->getAs<RecordType>()) - if (!isa<CXXRecordDecl>(RT->getDecl()) && - !RT->getDecl()->canPassInRegisters()) { - FI.getReturnInfo() = Info.getNaturalAlignIndirect(Ty); - return true; - } - - return CXXABI.classifyReturnType(FI); -} - /// Pass transparent unions as if they were the type of the first element. Sema /// should ensure that all elements of the union have the same "machine type". static QualType useFirstFieldIfTransparentUnion(QualType Ty) { @@ -1766,7 +1749,7 @@ void X86_32ABIInfo::computeInfo(CGFunctionInfo &FI) const { } else State.FreeRegs = DefaultNumRegisterParameters; - if (!::classifyReturnType(getCXXABI(), FI, *this)) { + if (!getCXXABI().classifyReturnType(FI)) { FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), State); } else if (FI.getReturnInfo().isIndirect()) { // The C++ ABI is not aware of register usage, so we have to check if the @@ -3562,7 +3545,7 @@ void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const { unsigned FreeSSERegs = IsRegCall ? 16 : 8; unsigned NeededInt, NeededSSE; - if (!::classifyReturnType(getCXXABI(), FI, *this)) { + if (!getCXXABI().classifyReturnType(FI)) { if (IsRegCall && FI.getReturnType()->getTypePtr()->isRecordType() && !FI.getReturnType()->getTypePtr()->isUnionType()) { FI.getReturnInfo() = @@ -4912,7 +4895,7 @@ private: bool isIllegalVectorType(QualType Ty) const; void computeInfo(CGFunctionInfo &FI) const override { - if (!::classifyReturnType(getCXXABI(), FI, *this)) + if (!getCXXABI().classifyReturnType(FI)) FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); for (auto &it : FI.arguments()) @@ -5643,7 +5626,7 @@ void WindowsARMTargetCodeGenInfo::setTargetAttributes( } void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const { - if (!::classifyReturnType(getCXXABI(), FI, *this)) + if (!getCXXABI().classifyReturnType(FI)) FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), FI.isVariadic()); |