From: Ted Kremenek Date: Fri, 12 Oct 2012 00:18:19 +0000 (+0000) Subject: Conditionally use an integral cast for BodyFarm support for OSAtomicCompareAndSwap... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5dbd990d7978fb990b61a9bcf1b71314a3e743fe;p=clang Conditionally use an integral cast for BodyFarm support for OSAtomicCompareAndSwap if the return type is not a boolean. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165774 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/BodyFarm.cpp b/lib/Analysis/BodyFarm.cpp index 9a04a82675..794ff9cc2b 100644 --- a/lib/Analysis/BodyFarm.cpp +++ b/lib/Analysis/BodyFarm.cpp @@ -64,7 +64,7 @@ public: UnaryOperator *makeDereference(const Expr *Arg, QualType Ty); /// Create an implicit cast for an integer conversion. - ImplicitCastExpr *makeIntegralCast(const Expr *Arg, QualType Ty); + Expr *makeIntegralCast(const Expr *Arg, QualType Ty); /// Create an implicit cast to a builtin boolean type. ImplicitCastExpr *makeIntegralCastToBoolean(const Expr *Arg); @@ -131,7 +131,10 @@ ImplicitCastExpr *ASTMaker::makeLvalueToRvalue(const Expr *Arg, QualType Ty) { const_cast(Arg), 0, VK_RValue); } -ImplicitCastExpr *ASTMaker::makeIntegralCast(const Expr *Arg, QualType Ty) { +Expr *ASTMaker::makeIntegralCast(const Expr *Arg, QualType Ty) { + if (Arg->getType() == Ty) + return const_cast(Arg); + return ImplicitCastExpr::Create(C, Ty, CK_IntegralCast, const_cast(Arg), 0, VK_RValue); } @@ -274,6 +277,11 @@ static Stmt *create_OSAtomicCompareAndSwap(ASTContext &C, const FunctionDecl *D) // } // else return NO; + QualType ResultTy = D->getResultType(); + bool isBoolean = ResultTy->isBooleanType(); + if (!isBoolean && !ResultTy->isIntegralType(C)) + return 0; + const ParmVarDecl *OldValue = D->getParamDecl(0); QualType OldValueTy = OldValue->getType(); @@ -310,13 +318,18 @@ static Stmt *create_OSAtomicCompareAndSwap(ASTContext &C, const FunctionDecl *D) PointeeTy), M.makeLvalueToRvalue(M.makeDeclRefExpr(NewValue), NewValueTy), NewValueTy); - Stmts[1] = - M.makeReturn(M.makeIntegralCastToBoolean(M.makeObjCBool(true))); + + Expr *BoolVal = M.makeObjCBool(true); + Expr *RetVal = isBoolean ? M.makeIntegralCastToBoolean(BoolVal) + : M.makeIntegralCast(BoolVal, ResultTy); + Stmts[1] = M.makeReturn(RetVal); CompoundStmt *Body = M.makeCompound(ArrayRef(Stmts, 2)); // Construct the else clause. - Stmt *Else = - M.makeReturn(M.makeIntegralCastToBoolean(M.makeObjCBool(false))); + BoolVal = M.makeObjCBool(false); + RetVal = isBoolean ? M.makeIntegralCastToBoolean(BoolVal) + : M.makeIntegralCast(BoolVal, ResultTy); + Stmt *Else = M.makeReturn(RetVal); /// Construct the If. Stmt *If =