Start generating gc'able code using the new

objc gc type attributes.

llvm-svn: 64935
This commit is contained in:
Fariborz Jahanian
2009-02-18 18:52:41 +00:00
parent 24eb28bcf8
commit 9959eee95d
3 changed files with 19 additions and 26 deletions

View File

@@ -903,6 +903,8 @@ DIAG(error_objc_throw_expects_object, ERROR,
"invalid %0 argument (expected an ObjC object type)")
DIAG(error_rethrow_used_outside_catch, ERROR,
"@throw (rethrow) used outside of a @catch block")
DIAG(err_attribute_multiple_objc_gc, ERROR,
"multiple garbage collection attributes specified for type")
// C++ casts

View File

@@ -609,22 +609,17 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
static void SetVarDeclObjCAttribute(ASTContext &Ctx, const Decl *VD,
const QualType &Ty, LValue &LV)
{
#if 0
// FIXME. ObjCGCAttr no more.
if (const ObjCGCAttr *A = VD->getAttr<ObjCGCAttr>()) {
ObjCGCAttr::GCAttrTypes attrType = A->getType();
LValue::SetObjCType(attrType == ObjCGCAttr::Weak,
attrType == ObjCGCAttr::Strong, LV);
}
else
#endif
if (Ctx.getLangOptions().ObjC1 &&
Ctx.getLangOptions().getGCMode() != LangOptions::NonGC) {
Ctx.getLangOptions().getGCMode() != LangOptions::NonGC) {
QualType::GCAttrTypes attr = Ty.getObjCGCAttr();
if (attr != QualType::GCNone)
LValue::SetObjCType(attr == QualType::Weak,
attr == QualType::Strong, LV);
// Default behavious under objective-c's gc is for objective-c pointers
// be treated as though they were declared as __strong.
if (Ctx.isObjCObjectPointerType(Ty))
else if (Ctx.isObjCObjectPointerType(Ty))
LValue::SetObjCType(false, true, LV);
}
}
}
LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
@@ -929,21 +924,17 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue,
LValue LV =
LValue::MakeAddr(V,
Field->getType().getCVRQualifiers()|CVRQualifiers);
#if 0
// FIXME. ObjCGCAttr is no more.
if (const ObjCGCAttr *A = Field->getAttr<ObjCGCAttr>()) {
ObjCGCAttr::GCAttrTypes attrType = A->getType();
// __weak attribute on a field is ignored.
LValue::SetObjCType(false, attrType == ObjCGCAttr::Strong, LV);
}
else
#endif
if (CGM.getLangOptions().ObjC1 &&
CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
QualType ExprTy = Field->getType();
if (getContext().isObjCObjectPointerType(ExprTy))
CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
QualType Ty = Field->getType();
QualType::GCAttrTypes attr = Ty.getObjCGCAttr();
if (attr != QualType::GCNone)
// __weak attribute on a field is ignored.
LValue::SetObjCType(false, attr == QualType::Strong, LV);
else if (getContext().isObjCObjectPointerType(Ty))
LValue::SetObjCType(false, true, LV);
}
}
return LV;
}

View File

@@ -781,7 +781,7 @@ static void HandleObjCGCTypeAttribute(QualType &Type,
const AttributeList &Attr, Sema &S){
// FIXME. change error code.
if (Type.getObjCGCAttr() != QualType::GCNone) {
S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers);
S.Diag(Attr.getLoc(), diag::err_attribute_multiple_objc_gc);
return;
}