aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGObjCMac.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2012-11-02 22:51:18 +0000
committerFariborz Jahanian <fjahanian@apple.com>2012-11-02 22:51:18 +0000
commit44fcff9ff40f400403dae57096040496a5ab3227 (patch)
treee90dad2cf9de645ca0f781dd1befe5985a13f069 /lib/CodeGen/CGObjCMac.cpp
parente50904f83b1b09bff487185dd823dfc8415cb300 (diff)
objective-C mrr block. Block variable layout metadata in
mrr mode. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167331 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r--lib/CodeGen/CGObjCMac.cpp31
1 files changed, 26 insertions, 5 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 676f22ebc5..514f550ad4 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -942,6 +942,8 @@ protected:
unsigned int BytePos, bool ForStrongLayout,
bool &HasUnion);
+ Qualifiers::ObjCLifetime GetObjCLifeTime(QualType QT);
+
void UpdateRunSkipBlockVars(bool IsByref,
Qualifiers::ObjCLifetime LifeTime,
unsigned FieldOffset,
@@ -1962,6 +1964,25 @@ llvm::Constant *CGObjCCommonMac::BuildGCBlockLayout(CodeGenModule &CGM,
return C;
}
+Qualifiers::ObjCLifetime CGObjCCommonMac::GetObjCLifeTime(QualType FQT) {
+ if (CGM.getLangOpts().ObjCAutoRefCount)
+ return FQT.getObjCLifetime();
+
+ // MRR, is more ad hoc.
+ if (FQT.isObjCGCStrong())
+ return Qualifiers::OCL_Strong;
+ if (FQT.isObjCGCWeak())
+ return Qualifiers::OCL_Weak;
+
+ if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
+ return Qualifiers::OCL_Strong;
+
+ if (const PointerType *PT = FQT->getAs<PointerType>())
+ return (GetObjCLifeTime(PT->getPointeeType()));
+
+ return Qualifiers::OCL_None;
+}
+
void CGObjCCommonMac::UpdateRunSkipBlockVars(bool IsByref,
Qualifiers::ObjCLifetime LifeTime,
unsigned FieldOffset,
@@ -2074,7 +2095,7 @@ void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
}
} else {
UpdateRunSkipBlockVars(false,
- Field->getType().getObjCLifetime(),
+ GetObjCLifeTime(FQT),
BytePos + FieldOffset,
FieldSize);
}
@@ -2089,7 +2110,7 @@ void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
((BitFieldSize % ByteSizeInBits) != 0);
Size += LastBitfieldOrUnnamedOffset;
UpdateRunSkipBlockVars(false,
- LastFieldBitfieldOrUnnamed->getType().getObjCLifetime(),
+ GetObjCLifeTime(LastFieldBitfieldOrUnnamed->getType()),
BytePos + LastBitfieldOrUnnamedOffset,
Size*ByteSizeInBits);
} else {
@@ -2098,7 +2119,7 @@ void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
unsigned FieldSize
= CGM.getContext().getTypeSize(LastFieldBitfieldOrUnnamed->getType());
UpdateRunSkipBlockVars(false,
- LastFieldBitfieldOrUnnamed->getType().getObjCLifetime(),
+ GetObjCLifeTime(LastFieldBitfieldOrUnnamed->getType()),
BytePos + LastBitfieldOrUnnamedOffset,
FieldSize);
}
@@ -2106,7 +2127,7 @@ void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
if (MaxField)
UpdateRunSkipBlockVars(false,
- MaxField->getType().getObjCLifetime(),
+ GetObjCLifeTime(MaxField->getType()),
BytePos + MaxFieldOffset,
MaxUnionSize);
}
@@ -2274,7 +2295,7 @@ llvm::Constant *CGObjCCommonMac::BuildRCBlockLayout(CodeGenModule &CGM,
}
unsigned fieldSize = ci->isByRef() ? WordSizeInBits
: CGM.getContext().getTypeSize(type);
- UpdateRunSkipBlockVars(ci->isByRef(), type.getObjCLifetime(),
+ UpdateRunSkipBlockVars(ci->isByRef(), GetObjCLifeTime(type),
fieldOffset, fieldSize);
}