Lines Matching +full:neg +full:- +full:edge
1 //===- ThreadSafetyCommon.cpp ---------------------------------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
42 switch (CE->getStmtClass()) { in getSourceLiteralString()
44 return toString(cast<IntegerLiteral>(CE)->getValue(), 10, true); in getSourceLiteralString()
47 ret += cast<StringLiteral>(CE)->getString(); in getSourceLiteralString()
66 return Ph->status() == til::Phi::PH_Incomplete; in isIncompletePhi()
80 const auto *ME = dyn_cast<MemberExpr>(E->IgnoreParenCasts()); in isCalleeArrow()
81 return ME ? ME->isArrow() : false; in isCalleeArrow()
85 return A->getName(); in ClassifyDiagnostic()
92 if (const auto *RT = VDT->getAs<RecordType>()) { in ClassifyDiagnostic()
93 if (const auto *RD = RT->getDecl()) in ClassifyDiagnostic()
94 if (const auto *CA = RD->getAttr<CapabilityAttr>()) in ClassifyDiagnostic()
96 } else if (const auto *TT = VDT->getAs<TypedefType>()) { in ClassifyDiagnostic()
97 if (const auto *TD = TT->getDecl()) in ClassifyDiagnostic()
98 if (const auto *CA = TD->getAttr<CapabilityAttr>()) in ClassifyDiagnostic()
100 } else if (VDT->isPointerType() || VDT->isReferenceType()) in ClassifyDiagnostic()
101 return ClassifyDiagnostic(VDT->getPointeeType()); in ClassifyDiagnostic()
113 /// \param Self S-expression to substitute for a \ref CXXThisExpr in a call,
130 Ctx.SelfArg = ME->getBase(); in translateAttrExpr()
131 Ctx.SelfArrow = ME->isArrow(); in translateAttrExpr()
133 Ctx.SelfArg = CE->getImplicitObjectArgument(); in translateAttrExpr()
134 Ctx.SelfArrow = isCalleeArrow(CE->getCallee()); in translateAttrExpr()
135 Ctx.NumArgs = CE->getNumArgs(); in translateAttrExpr()
136 Ctx.FunArgs = CE->getArgs(); in translateAttrExpr()
138 Ctx.NumArgs = CE->getNumArgs(); in translateAttrExpr()
139 Ctx.FunArgs = CE->getArgs(); in translateAttrExpr()
142 Ctx.NumArgs = CE->getNumArgs(); in translateAttrExpr()
143 Ctx.FunArgs = CE->getArgs(); in translateAttrExpr()
159 cast<CXXMethodDecl>(D)->getFunctionObjectParameterType()), in translateAttrExpr()
180 if (SLit->getString() == "*") in translateAttrExpr()
190 bool Neg = false; in translateAttrExpr() local
192 if (OE->getOperator() == OO_Exclaim) { in translateAttrExpr()
193 Neg = true; in translateAttrExpr()
194 AttrExp = OE->getArg(0); in translateAttrExpr()
198 if (UO->getOpcode() == UO_LNot) { in translateAttrExpr()
199 Neg = true; in translateAttrExpr()
200 AttrExp = UO->getSubExpr()->IgnoreImplicit(); in translateAttrExpr()
211 StringRef Kind = ClassifyDiagnostic(AttrExp->getType()); in translateAttrExpr()
213 // Hack to deal with smart pointers -- strip off top-level pointer casts. in translateAttrExpr()
215 if (CE->castOpcode() == til::CAST_objToPtr) in translateAttrExpr()
216 return CapabilityExpr(CE->expr(), Kind, Neg); in translateAttrExpr()
218 return CapabilityExpr(E, Kind, Neg); in translateAttrExpr()
228 ClassifyDiagnostic(Exp->getType())}; in createThisPlaceholder()
243 switch (S->getStmtClass()) { in translate()
273 // We treat these as no-ops in translate()
275 return translate(cast<ConstantExpr>(S)->getSubExpr(), Ctx); in translate()
277 return translate(cast<ParenExpr>(S)->getSubExpr(), Ctx); in translate()
279 return translate(cast<ExprWithCleanups>(S)->getSubExpr(), Ctx); in translate()
281 return translate(cast<CXXBindTemporaryExpr>(S)->getSubExpr(), Ctx); in translate()
283 return translate(cast<MaterializeTemporaryExpr>(S)->getSubExpr(), Ctx); in translate()
310 const auto *VD = cast<ValueDecl>(DRE->getDecl()->getCanonicalDecl()); in translateDeclRefExpr()
314 unsigned I = PV->getFunctionScopeIndex(); in translateDeclRefExpr()
315 const DeclContext *D = PV->getDeclContext(); in translateDeclRefExpr()
316 if (Ctx && Ctx->FunArgs) { in translateDeclRefExpr()
317 const Decl *Canonical = Ctx->AttrDecl->getCanonicalDecl(); in translateDeclRefExpr()
319 ? (cast<FunctionDecl>(D)->getCanonicalDecl() == Canonical) in translateDeclRefExpr()
320 : (cast<ObjCMethodDecl>(D)->getCanonicalDecl() == Canonical)) { in translateDeclRefExpr()
323 Ctx->FunArgs.dyn_cast<const Expr *const *>()) { in translateDeclRefExpr()
324 assert(I < Ctx->NumArgs); in translateDeclRefExpr()
325 return translate(FunArgs[I], Ctx->Prev); in translateDeclRefExpr()
329 return Ctx->FunArgs.get<til::SExpr *>(); in translateDeclRefExpr()
335 ? cast<FunctionDecl>(D)->getCanonicalDecl()->getParamDecl(I) in translateDeclRefExpr()
336 : cast<ObjCMethodDecl>(D)->getCanonicalDecl()->getParamDecl(I); in translateDeclRefExpr()
339 // For non-local variables, treat it as a reference to a named object. in translateDeclRefExpr()
346 if (Ctx && Ctx->SelfArg) { in translateCXXThisExpr()
347 if (const auto *SelfArg = dyn_cast<const Expr *>(Ctx->SelfArg)) in translateCXXThisExpr()
348 return translate(SelfArg, Ctx->Prev); in translateCXXThisExpr()
350 return cast<til::SExpr *>(Ctx->SelfArg); in translateCXXThisExpr()
358 return V->clangDecl(); in getValueDeclFromSExpr()
360 return Ph->clangDecl(); in getValueDeclFromSExpr()
362 return P->clangDecl(); in getValueDeclFromSExpr()
364 return L->clangDecl(); in getValueDeclFromSExpr()
370 if (VD && VD->getType()->isAnyPointerType()) in hasAnyPointerType()
373 return C->castOpcode() == til::CAST_objToPtr; in hasAnyPointerType()
381 D = D->getCanonicalDecl(); in getFirstVirtualDecl()
382 auto OverriddenMethods = D->overridden_methods(); in getFirstVirtualDecl()
393 til::SExpr *BE = translate(ME->getBase(), Ctx); in translateMemberExpr()
396 const auto *D = cast<ValueDecl>(ME->getMemberDecl()->getCanonicalDecl()); in translateMemberExpr()
402 P->setArrow(true); in translateMemberExpr()
408 til::SExpr *BE = translate(IVRE->getBase(), Ctx); in translateObjCIVarRefExpr()
411 const auto *D = cast<ObjCIvarDecl>(IVRE->getDecl()->getCanonicalDecl()); in translateObjCIVarRefExpr()
415 P->setArrow(true); in translateObjCIVarRefExpr()
424 if (const FunctionDecl *FD = CE->getDirectCallee()) { in translateCallExpr()
425 FD = FD->getMostRecentDecl(); in translateCallExpr()
426 if (LockReturnedAttr *At = FD->getAttr<LockReturnedAttr>()) { in translateCallExpr()
428 LRCallCtx.AttrDecl = CE->getDirectCallee(); in translateCallExpr()
430 LRCallCtx.NumArgs = CE->getNumArgs(); in translateCallExpr()
431 LRCallCtx.FunArgs = CE->getArgs(); in translateCallExpr()
433 translateAttrExpr(At->getArg(), &LRCallCtx).sexpr()); in translateCallExpr()
438 til::SExpr *E = translate(CE->getCallee(), Ctx); in translateCallExpr()
439 for (const auto *Arg : CE->arguments()) { in translateCallExpr()
450 if (ME->getMethodDecl()->getNameAsString() == "get" && in translateCXXMemberCallExpr()
451 ME->getNumArgs() == 0) { in translateCXXMemberCallExpr()
452 auto *E = translate(ME->getImplicitObjectArgument(), Ctx); in translateCXXMemberCallExpr()
458 ME->getImplicitObjectArgument()); in translateCXXMemberCallExpr()
464 // Ignore operator * and operator -> on smart pointers. in translateCXXOperatorCallExpr()
465 OverloadedOperatorKind k = OCE->getOperator(); in translateCXXOperatorCallExpr()
467 auto *E = translate(OCE->getArg(0), Ctx); in translateCXXOperatorCallExpr()
477 switch (UO->getOpcode()) { in translateUnaryOperator()
487 if (const auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr())) { in translateUnaryOperator()
488 if (DRE->getDecl()->isCXXInstanceMember()) { in translateUnaryOperator()
489 // This is a pointer-to-member expression, e.g. &MyClass::mu_. in translateUnaryOperator()
492 return new (Arena) til::Project(W, DRE->getDecl()); in translateUnaryOperator()
496 // otherwise, & is a no-op in translateUnaryOperator()
497 return translate(UO->getSubExpr(), Ctx); in translateUnaryOperator()
499 // We treat these as no-ops in translateUnaryOperator()
502 return translate(UO->getSubExpr(), Ctx); in translateUnaryOperator()
506 til::UnaryOp(til::UOP_Minus, translate(UO->getSubExpr(), Ctx)); in translateUnaryOperator()
509 til::UnaryOp(til::UOP_BitNot, translate(UO->getSubExpr(), Ctx)); in translateUnaryOperator()
512 til::UnaryOp(til::UOP_LogicNot, translate(UO->getSubExpr(), Ctx)); in translateUnaryOperator()
527 til::SExpr *E0 = translate(BO->getLHS(), Ctx); in translateBinOp()
528 til::SExpr *E1 = translate(BO->getRHS(), Ctx); in translateBinOp()
539 const Expr *LHS = BO->getLHS(); in translateBinAssign()
540 const Expr *RHS = BO->getRHS(); in translateBinAssign()
547 VD = DRE->getDecl(); in translateBinAssign()
563 switch (BO->getOpcode()) { in translateBinaryOperator()
602 return translate(BO->getRHS(), Ctx); in translateBinaryOperator()
609 CastKind K = CE->getCastKind(); in translateCastExpr()
612 if (const auto *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr())) { in translateCastExpr()
613 til::SExpr *E0 = lookupVarDecl(DRE->getDecl()); in translateCastExpr()
617 til::SExpr *E0 = translate(CE->getSubExpr(), Ctx); in translateCastExpr()
619 // FIXME!! -- get Load working properly in translateCastExpr()
627 til::SExpr *E0 = translate(CE->getSubExpr(), Ctx); in translateCastExpr()
632 til::SExpr *E0 = translate(CE->getSubExpr(), Ctx); in translateCastExpr()
643 til::SExpr *E0 = translate(E->getBase(), Ctx); in translateArraySubscriptExpr()
644 til::SExpr *E1 = translate(E->getIdx(), Ctx); in translateArraySubscriptExpr()
651 auto *C = translate(CO->getCond(), Ctx); in translateAbstractConditionalOperator()
652 auto *T = translate(CO->getTrueExpr(), Ctx); in translateAbstractConditionalOperator()
653 auto *E = translate(CO->getFalseExpr(), Ctx); in translateAbstractConditionalOperator()
659 DeclGroupRef DGrp = S->getDeclGroup(); in translateDeclStmt()
662 Expr *E = VD->getInit(); in translateDeclStmt()
666 QualType T = VD->getType(); in translateDeclStmt()
667 if (T.isTrivialType(VD->getASTContext())) in translateDeclStmt()
677 // If (E) is non-trivial, then add it to the current basic block, and
683 if (!E || !CurrentBB || E->block() || til::ThreadSafetyTIL::isTrivial(E)) in addStatement()
697 assert(CurrentLVarMap[It->second].first == VD); in lookupVarDecl()
698 return CurrentLVarMap[It->second].second; in lookupVarDecl()
708 if (!V->clangDecl()) in maybeUpdateVD()
709 V->setClangDecl(VD); in maybeUpdateVD()
732 CurrentLVarMap.elem(It->second).second = E; in updateVarDecl()
737 // If E != null, sets Phi[CurrentBlockInfo->ArgIndex] = E.
740 unsigned ArgIndex = CurrentBlockInfo->ProcessedPredecessors; in makePhiNodeVar()
744 if (CurrE->block() == CurrentBB) { in makePhiNodeVar()
750 Ph->values()[ArgIndex] = E; in makePhiNodeVar()
757 Ph->values().setValues(NPreds, nullptr); in makePhiNodeVar()
759 Ph->values()[PIdx] = CurrE; in makePhiNodeVar()
761 Ph->values()[ArgIndex] = E; in makePhiNodeVar()
762 Ph->setClangDecl(CurrentLVarMap[i].first); in makePhiNodeVar()
763 // If E is from a back-edge, or either E or CurrE are incomplete, then in makePhiNodeVar()
766 Ph->setStatus(til::Phi::PH_Incomplete); in makePhiNodeVar()
770 if (Ph->status() == til::Phi::PH_Incomplete) in makePhiNodeVar()
783 // Steal Map, using copy-on-write. in mergeEntryMap()
790 unsigned NPreds = CurrentBB->numPredecessors(); in mergeEntryMap()
811 // Merge a back edge into the current variable map.
815 // haven't gotten that far in the CFG. Thus, when encountering a back edge, in mergeEntryMapBackEdge()
824 if (CurrentBlockInfo->HasBackEdges) in mergeEntryMapBackEdge()
826 CurrentBlockInfo->HasBackEdges = true; in mergeEntryMapBackEdge()
830 unsigned NPreds = CurrentBB->numPredecessors(); in mergeEntryMapBackEdge()
836 // Update the phi nodes that were initially created for a back edge
841 unsigned ArgIndex = BBInfo[Blk->getBlockID()].ProcessedPredecessors; in mergePhiNodesBackEdge()
842 assert(ArgIndex > 0 && ArgIndex < BB->numPredecessors()); in mergePhiNodesBackEdge()
844 for (til::SExpr *PE : BB->arguments()) { in mergePhiNodesBackEdge()
847 assert(Ph->values()[ArgIndex] == nullptr && "Wrong index for back edge."); in mergePhiNodesBackEdge()
849 til::SExpr *E = lookupVarDecl(Ph->clangDecl()); in mergePhiNodesBackEdge()
851 Ph->values()[ArgIndex] = E; in mergePhiNodesBackEdge()
858 unsigned NBlocks = Cfg->getNumBlockIDs(); in enterCFG()
867 BB->reserveInstructions(B->size()); in enterCFG()
868 BlockMap[B->getBlockID()] = BB; in enterCFG()
871 CurrentBB = lookupBlock(&Cfg->getEntry()); in enterCFG()
872 auto Parms = isa<ObjCMethodDecl>(D) ? cast<ObjCMethodDecl>(D)->parameters() in enterCFG()
873 : cast<FunctionDecl>(D)->parameters(); in enterCFG()
875 QualType T = Pm->getType(); in enterCFG()
876 if (!T.isTrivialType(Pm->getASTContext())) in enterCFG()
891 CurrentBB->reservePredecessors(B->pred_size()); in enterCFGBlock()
892 Scfg->add(CurrentBB); in enterCFGBlock()
894 CurrentBlockInfo = &BBInfo[B->getBlockID()]; in enterCFGBlock()
904 CurrentBB->addPredecessor(BlockMap[Pred->getBlockID()]); in handlePredecessor()
905 BlockInfo *PredInfo = &BBInfo[Pred->getBlockID()]; in handlePredecessor()
906 assert(PredInfo->UnprocessedSuccessors > 0); in handlePredecessor()
908 if (--PredInfo->UnprocessedSuccessors == 0) in handlePredecessor()
909 mergeEntryMap(std::move(PredInfo->ExitMap)); in handlePredecessor()
911 mergeEntryMap(PredInfo->ExitMap.clone()); in handlePredecessor()
913 ++CurrentBlockInfo->ProcessedPredecessors; in handlePredecessor()
923 CurrentBB->arguments().reserve( in enterCFGBlockBody()
926 CurrentBB->addArgument(A); in enterCFGBlockBody()
944 CurrentBB->instructions().reserve( in exitCFGBlockBody()
947 CurrentBB->addInstruction(V); in exitCFGBlockBody()
950 unsigned N = B->succ_size(); in exitCFGBlockBody()
951 auto It = B->succ_begin(); in exitCFGBlockBody()
955 unsigned Idx = BB ? BB->findPredecessorIndex(CurrentBB) : 0; in exitCFGBlockBody()
957 CurrentBB->setTerminator(Tm); in exitCFGBlockBody()
960 til::SExpr *C = translate(B->getTerminatorCondition(true), nullptr); in exitCFGBlockBody()
966 CurrentBB->setTerminator(Tm); in exitCFGBlockBody()
971 ++CurrentBlockInfo->UnprocessedSuccessors; in handleSuccessor()
976 ++BBInfo[Succ->getBlockID()].ProcessedPredecessors; in handleSuccessorBackEdge()
982 CurrentBlockInfo->ExitMap = std::move(CurrentLVarMap); in exitCFGBlock()
989 if (Ph->status() == til::Phi::PH_Incomplete) in exitCFG()