Home | History | Annotate | Download | only in Analysis

Lines Matching refs:til

62 static bool isIncompletePhi(const til::SExpr *E) {
63 if (const auto *Ph = dyn_cast<til::Phi>(E))
64 return Ph->status() == til::Phi::PH_Incomplete;
70 til::SExpr *SExprBuilder::lookupStmt(const Stmt *S) {
77 til::SCFG *SExprBuilder::buildCFG(CFGWalker &Walker) {
87 /// \brief Translate a clang expression in an attribute to a til::SExpr.
149 /// \brief Translate a clang expression in an attribute to a til::SExpr.
160 return CapabilityExpr(new (Arena) til::Wildcard(), false);
180 til::SExpr *E = translate(AttrExp, Ctx);
184 if (!E || isa<til::Literal>(E))
188 if (auto *CE = dyn_cast_or_null<til::Cast>(E)) {
189 if (CE->castOpcode() == til::CAST_objToPtr)
195 // Translate a clang statement or expression to a TIL expression.
198 til::SExpr *SExprBuilder::translate(const Stmt *S, CallingContext *Ctx) {
204 if (til::SExpr *E = lookupStmt(S))
253 return new (Arena) til::Literal(cast<Expr>(S));
263 return new (Arena) til::Undefined(S);
266 til::SExpr *SExprBuilder::translateDeclRefExpr(const DeclRefExpr *DRE,
287 return new (Arena) til::LiteralPtr(VD);
290 til::SExpr *SExprBuilder::translateCXXThisExpr(const CXXThisExpr *TE,
299 static const ValueDecl *getValueDeclFromSExpr(const til::SExpr *E) {
300 if (auto *V = dyn_cast<til::Variable>(E))
302 if (auto *Ph = dyn_cast<til::Phi>(E))
304 if (auto *P = dyn_cast<til::Project>(E))
306 if (auto *L = dyn_cast<til::LiteralPtr>(E))
311 static bool hasCppPointerType(const til::SExpr *E) {
315 if (auto *C = dyn_cast<til::Cast>(E))
316 return C->castOpcode() == til::CAST_objToPtr;
334 til::SExpr *SExprBuilder::translateMemberExpr(const MemberExpr *ME,
336 til::SExpr *BE = translate(ME->getBase(), Ctx);
337 til::SExpr *E = new (Arena) til::SApply(BE);
344 til::Project *P = new (Arena) til::Project(E, D);
350 til::SExpr *SExprBuilder::translateCallExpr(const CallExpr *CE,
362 return const_cast<til::SExpr*>(
367 til::SExpr *E = translate(CE->getCallee(), Ctx);
369 til::SExpr *A = translate(Arg, Ctx);
370 E = new (Arena) til::Apply(E, A);
372 return new (Arena) til::Call(E, CE);
375 til::SExpr *SExprBuilder::translateCXXMemberCallExpr(
382 return new (Arena) til::Cast(til::CAST_objToPtr, E);
390 til::SExpr *SExprBuilder::translateCXXOperatorCallExpr(
397 return new (Arena) til::Cast(til::CAST_objToPtr, E);
404 til::SExpr *SExprBuilder::translateUnaryOperator(const UnaryOperator *UO,
411 return new (Arena) til::Undefined(UO);
420 auto *W = new (Arena) til::Wildcard();
421 return new (Arena) til::Project(W, DRE->getDecl());
436 til::UnaryOp(til::UOP_Minus, translate(UO->getSubExpr(), Ctx));
439 til::UnaryOp(til::UOP_BitNot, translate(UO->getSubExpr(), Ctx));
442 til::UnaryOp(til::UOP_LogicNot, translate(UO->getSubExpr(), Ctx));
449 return new (Arena) til::Undefined(UO);
451 return new (Arena) til::Undefined(UO);
454 til::SExpr *SExprBuilder::translateBinOp(til::TIL_BinaryOpcode Op,
457 til::SExpr *E0 = translate(BO->getLHS(), Ctx);
458 til::SExpr *E1 = translate(BO->getRHS(), Ctx);
460 return new (Arena) til::BinaryOp(Op, E1, E0);
462 return new (Arena) til::BinaryOp(Op, E0, E1);
465 tiltil::TIL_BinaryOpcode Op,
471 til::SExpr *E0 = translate(LHS, Ctx);
472 til::SExpr *E1 = translate(RHS, Ctx);
475 til::SExpr *CV = nullptr;
482 til::SExpr *Arg = CV ? CV : new (Arena) til::Load(E0);
483 E1 = new (Arena) til::BinaryOp(Op, Arg, E1);
488 return new (Arena) til::Store(E0, E1);
491 til::SExpr *SExprBuilder::translateBinaryOperator(const BinaryOperator *BO,
496 return new (Arena) til::Undefined(BO);
498 case BO_Mul: return translateBinOp(til::BOP_Mul, BO, Ctx);
499 case BO_Div: return translateBinOp(til::BOP_Div, BO, Ctx);
500 case BO_Rem: return translateBinOp(til::BOP_Rem, BO, Ctx);
501 case BO_Add: return translateBinOp(til::BOP_Add, BO, Ctx);
502 case BO_Sub: return translateBinOp(til::BOP_Sub, BO, Ctx);
503 case BO_Shl: return translateBinOp(til::BOP_Shl, BO, Ctx);
504 case BO_Shr: return translateBinOp(til::BOP_Shr, BO, Ctx);
505 case BO_LT: return translateBinOp(til::BOP_Lt, BO, Ctx);
506 case BO_GT: return translateBinOp(til::BOP_Lt, BO, Ctx, true);
507 case BO_LE: return translateBinOp(til::BOP_Leq, BO, Ctx);
508 case BO_GE: return translateBinOp(til::BOP_Leq, BO, Ctx, true);
509 case BO_EQ: return translateBinOp(til::BOP_Eq, BO, Ctx);
510 case BO_NE: return translateBinOp(til::BOP_Neq, BO, Ctx);
511 case BO_And: return translateBinOp(til::BOP_BitAnd, BO, Ctx);
512 case BO_Xor: return translateBinOp(til::BOP_BitXor, BO, Ctx);
513 case BO_Or: return translateBinOp(til::BOP_BitOr, BO, Ctx);
514 case BO_LAnd: return translateBinOp(til::BOP_LogicAnd, BO, Ctx);
515 case BO_LOr: return translateBinOp(til::BOP_LogicOr, BO, Ctx);
517 case BO_Assign: return translateBinAssign(til::BOP_Eq, BO, Ctx, true);
518 case BO_MulAssign: return translateBinAssign(til::BOP_Mul, BO, Ctx);
519 case BO_DivAssign: return translateBinAssign(til::BOP_Div, BO, Ctx);
520 case BO_RemAssign: return translateBinAssign(til::BOP_Rem, BO, Ctx);
521 case BO_AddAssign: return translateBinAssign(til::BOP_Add, BO, Ctx);
522 case BO_SubAssign: return translateBinAssign(til::BOP_Sub, BO, Ctx);
523 case BO_ShlAssign: return translateBinAssign(til::BOP_Shl, BO, Ctx);
524 case BO_ShrAssign: return translateBinAssign(til::BOP_Shr, BO, Ctx);
525 case BO_AndAssign: return translateBinAssign(til::BOP_BitAnd, BO, Ctx);
526 case BO_XorAssign: return translateBinAssign(til::BOP_BitXor, BO, Ctx);
527 case BO_OrAssign: return translateBinAssign(til::BOP_BitOr, BO, Ctx);
533 return new (Arena) til::Undefined(BO);
536 til::SExpr *SExprBuilder::translateCastExpr(const CastExpr *CE,
542 til::SExpr *E0 = lookupVarDecl(DRE->getDecl());
546 til::SExpr *E0 = translate(CE->getSubExpr(), Ctx);
549 // return new (Arena) til::Load(E0);
556 til::SExpr *E0 = translate(CE->getSubExpr(), Ctx);
561 til::SExpr *E0 = translate(CE->getSubExpr(), Ctx);
564 return new (Arena) til::Cast(til::CAST_none, E0);
569 til::SExpr *
572 til::SExpr *E0 = translate(E->getBase(), Ctx);
573 til::SExpr *E1 = translate(E->getIdx(), Ctx);
574 return new (Arena) til::ArrayIndex(E0, E1);
577 til::SExpr *
583 return new (Arena) til::IfThenElse(C, T, E);
586 til::SExpr *
592 til::SExpr* SE = translate(E, Ctx);
611 til::SExpr *SExprBuilder::addStatement(til::SExpr* E, const Stmt *S,
613 if (!E || !CurrentBB || E->block() || til::ThreadSafetyTIL::isTrivial(E))
616 E = new (Arena) til::Variable(E, VD);
624 til::SExpr *SExprBuilder::lookupVarDecl(const ValueDecl *VD) {
633 // if E is a til::Variable, update its clangDecl.
634 static void maybeUpdateVD(til::SExpr *E, const ValueDecl *VD) {
637 if (til::Variable *V = dyn_cast<til::Variable>(E)) {
644 til::SExpr *SExprBuilder::addVarDecl(const ValueDecl *VD, til::SExpr *E) {
653 til::SExpr *SExprBuilder::updateVarDecl(const ValueDecl *VD, til::SExpr *E) {
657 til::SExpr *Ptr = new (Arena) til::LiteralPtr(VD);
658 til::SExpr *St = new (Arena) til::Store(Ptr, E);
669 void SExprBuilder::makePhiNodeVar(unsigned i, unsigned NPreds, til::SExpr *E) {
673 til::SExpr *CurrE = CurrentLVarMap[i].second;
677 til::Phi *Ph = dyn_cast<til::Phi>(CurrE);
686 til::Phi *Ph = new (Arena) til::Phi(Arena, NPreds);
696 Ph->setStatus(til::Phi::PH_Incomplete);
701 if (Ph->status() == til::Phi::PH_Incomplete)
772 til::BasicBlock *BB = lookupBlock(Blk);
776 for (til::SExpr *PE : BB->arguments()) {
777 til::Phi *Ph = dyn_cast_or_null<til::Phi>(PE);
781 til::SExpr *E = lookupVarDecl(Ph->clangDecl());
791 Scfg = new (Arena) til::SCFG(Arena, NBlocks);
796 // create map from clang blockID to til::BasicBlocks
798 auto *BB = new (Arena) til::BasicBlock(Arena);
813 til::SExpr *Lp = new (Arena) til::LiteralPtr(Pm);
814 til::SExpr *Ld = new (Arena) til::Load(Lp);
815 til::SExpr *V = addStatement(Ld, nullptr, Pm);
821 // Intialize TIL basic block and add it to the CFG.
862 til::SExpr *E = translate(S, nullptr);
868 til::SExpr *Sf = new (Arena) til::LiteralPtr(VD);
869 til::SExpr *Dr = new (Arena) til::LiteralPtr(DD);
870 til::SExpr *Ap = new (Arena) til::Apply(Dr, Sf);
871 til::SExpr *E = new (Arena) til::Call(Ap);
885 til::BasicBlock *BB = *It ? lookupBlock(*It) : nullptr;
888 auto *Tm = new (Arena) til::Goto(BB, Idx);
892 til::SExpr *C = translate(B->getTerminatorCondition(true), nullptr);
893 til::BasicBlock *BB1 = *It ? lookupBlock(*It) : nullptr;
895 til::BasicBlock *BB2 = *It ? lookupBlock(*It) : nullptr;
897 auto *Tm = new (Arena) til::Branch(C, BB1, BB2);
921 if (Ph->status() == til::Phi::PH_Incomplete)
933 til::MemRegionRef Arena(&Bpa);
935 til::SCFG *Scfg = SxBuilder.buildCFG(Walker);