[cfe-commits] r65205 - in /cfe/trunk/lib/CodeGen: CGExpr.cpp CGValue.h
Fariborz Jahanian
fjahanian at apple.com
Fri Feb 20 16:30:43 PST 2009
Author: fjahanian
Date: Fri Feb 20 18:30:43 2009
New Revision: 65205
URL: http://llvm.org/viewvc/llvm-project?rev=65205&view=rev
Log:
Handle case of none gc'able objects regardless of their
type.
Modified:
cfe/trunk/lib/CodeGen/CGExpr.cpp
cfe/trunk/lib/CodeGen/CGValue.h
Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=65205&r1=65204&r2=65205&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Fri Feb 20 18:30:43 2009
@@ -405,7 +405,7 @@
assert(0 && "Unknown LValue type");
}
- if (Dst.isObjCWeak()) {
+ if (Dst.isObjCWeak() && !Dst.isNonGC()) {
// load of a __weak object.
llvm::Value *LvalueDst = Dst.getAddress();
llvm::Value *src = Src.getScalarVal();
@@ -413,7 +413,7 @@
return;
}
- if (Dst.isObjCStrong()) {
+ if (Dst.isObjCStrong() && !Dst.isNonGC()) {
// load of a __strong object.
llvm::Value *LvalueDst = Dst.getAddress();
llvm::Value *src = Src.getScalarVal();
@@ -629,10 +629,11 @@
// local variables do not get their gc attribute set.
QualType::GCAttrTypes attr = QualType::GCNone;
// local static?
- if (VD->getStorageClass() == VarDecl::Static)
+ if (!VD->hasLocalStorage())
attr = getContext().getObjCGCAttrKind(E->getType());
LV = LValue::MakeAddr(V, E->getType().getCVRQualifiers(), attr);
}
+ LValue::SetObjCNonGC(LV, VD->hasLocalStorage());
return LV;
} else if (VD && VD->isFileVarDecl()) {
LValue LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
@@ -834,6 +835,7 @@
LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
bool isUnion = false;
bool isIvar = false;
+ bool isNonGC = false;
Expr *BaseExpr = E->getBase();
llvm::Value *BaseValue = NULL;
unsigned CVRQualifiers=0;
@@ -857,6 +859,8 @@
LValue BaseLV = EmitLValue(BaseExpr);
if (BaseLV.isObjCIvar())
isIvar = true;
+ if (BaseLV.isNonGC())
+ isNonGC = true;
// FIXME: this isn't right for bitfields.
BaseValue = BaseLV.getAddress();
if (BaseExpr->getType()->isUnionType())
@@ -870,6 +874,7 @@
LValue MemExpLV = EmitLValueForField(BaseValue, Field, isUnion,
CVRQualifiers);
LValue::SetObjCIvar(MemExpLV, isIvar);
+ LValue::SetObjCNonGC(MemExpLV, isNonGC);
return MemExpLV;
}
Modified: cfe/trunk/lib/CodeGen/CGValue.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGValue.h?rev=65205&r1=65204&r2=65205&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGValue.h (original)
+++ cfe/trunk/lib/CodeGen/CGValue.h Fri Feb 20 18:30:43 2009
@@ -144,6 +144,10 @@
// objective-c's ivar
bool Ivar:1;
+
+ // LValue is non-gc'able for any reason, including being a parameter or local
+ // variable.
+ bool NonGC: 1;
// objective-c's gc attributes
unsigned ObjCType : 2;
@@ -156,7 +160,7 @@
// 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 = false;
+ R.Ivar = R.NonGC = false;
}
public:
@@ -175,18 +179,24 @@
}
bool isObjCIvar() const { return Ivar; }
+ bool isNonGC () const { return NonGC; }
bool isObjCWeak() const { return ObjCType == Weak; }
bool isObjCStrong() const { return ObjCType == Strong; }
static void SetObjCIvar(LValue& R, bool iValue) {
R.Ivar = iValue;
}
-
+
+ static void SetObjCNonGC(LValue& R, bool iValue) {
+ R.NonGC = iValue;
+ }
static void SetObjCType(QualType::GCAttrTypes GCAttrs, LValue& R) {
if (GCAttrs == QualType::Weak)
R.ObjCType = Weak;
else if (GCAttrs == QualType::Strong)
R.ObjCType = Strong;
+ else
+ R.ObjCType = None;
}
// simple lvalue
More information about the cfe-commits
mailing list