Provide basic support for generation of objc2's

objc_assign_global API when assigning to global
objective-c object pointer.

llvm-svn: 70939
This commit is contained in:
Fariborz Jahanian 2009-05-04 23:27:20 +00:00
parent 9b042e06ee
commit 32ff7aeefa
3 changed files with 24 additions and 2 deletions

View File

@ -442,7 +442,10 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
else
CGM.getObjCRuntime().EmitObjCGlobalAssign(*this, src, LvalueDst);
#endif
CGM.getObjCRuntime().EmitObjCStrongCastAssign(*this, src, LvalueDst);
if (Dst.isGlobalObjCRef())
CGM.getObjCRuntime().EmitObjCGlobalAssign(*this, src, LvalueDst);
else
CGM.getObjCRuntime().EmitObjCStrongCastAssign(*this, src, LvalueDst);
return;
}
@ -666,6 +669,8 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
LValue LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
E->getType().getCVRQualifiers(),
getContext().getObjCGCAttrKind(E->getType()));
if (LV.isObjCStrong())
LV.SetGlobalObjCRef(LV, true);
return LV;
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) {
return LValue::MakeAddr(CGM.GetAddrOfFunction(FD),

View File

@ -149,8 +149,12 @@ class LValue {
// variable.
bool NonGC: 1;
// Lvalue is a global reference of an objective-c object
bool GlobalObjCRef : 1;
// objective-c's gc attributes
unsigned ObjCType : 2;
private:
@ -160,7 +164,7 @@ private:
// FIXME: Convenient place to set objc flags to 0. This
// should really be done in a user-defined constructor instead.
R.ObjCType = None;
R.Ivar = R.NonGC = false;
R.Ivar = R.NonGC = R.GlobalObjCRef = false;
}
public:
@ -180,12 +184,17 @@ public:
bool isObjCIvar() const { return Ivar; }
bool isNonGC () const { return NonGC; }
bool isGlobalObjCRef() const { return GlobalObjCRef; }
bool isObjCWeak() const { return ObjCType == Weak; }
bool isObjCStrong() const { return ObjCType == Strong; }
static void SetObjCIvar(LValue& R, bool iValue) {
R.Ivar = iValue;
}
static void SetGlobalObjCRef(LValue& R, bool iValue) {
R.GlobalObjCRef = iValue;
}
static void SetObjCNonGC(LValue& R, bool iValue) {
R.NonGC = iValue;

View File

@ -0,0 +1,8 @@
// RUN: clang-cc -fnext-runtime -fobjc-gc -emit-llvm -o %t %s &&
// RUN: grep -F '@objc_assign_global' %t | count 2 &&
// RUN: true
id a;
int main() {
a = 0;
}