29#include "llvm/ADT/ScopeExit.h"
30#include "llvm/ADT/StringExtras.h"
31#include "llvm/ADT/StringRef.h"
43 case Stmt::IntegerLiteralClass:
45 case Stmt::StringLiteralClass: {
46 std::string ret(
"\"");
51 case Stmt::CharacterLiteralClass:
52 case Stmt::CXXNullPtrLiteralExprClass:
53 case Stmt::GNUNullExprClass:
54 case Stmt::CXXBoolLiteralExprClass:
55 case Stmt::FloatingLiteralClass:
56 case Stmt::ImaginaryLiteralClass:
57 case Stmt::ObjCStringLiteralClass:
65 if (
const auto *Ph = dyn_cast<til::Phi>(E))
76 if (
const auto *CA = TD.
getAttr<CapabilityAttr>())
77 return {CA->getName(), TD.
hasAttr<ReentrantCapabilityAttr>()};
113 return ME ? ME->isArrow() :
false;
130 if (!DeclExp && !
Self)
139 else if (
const auto *ME = dyn_cast<MemberExpr>(DeclExp)) {
142 }
else if (
const auto *CE = dyn_cast<CXXMemberCallExpr>(DeclExp)) {
143 Ctx.
SelfArg = CE->getImplicitObjectArgument();
145 Ctx.
NumArgs = CE->getNumArgs();
147 }
else if (
const auto *CE = dyn_cast<CallExpr>(DeclExp)) {
152 Ctx.
NumArgs = CE->getNumArgs() - 1;
153 Ctx.
FunArgs = CE->getArgs() + 1;
155 Ctx.
NumArgs = CE->getNumArgs();
158 }
else if (
const auto *CE = dyn_cast<CXXConstructExpr>(DeclExp)) {
160 Ctx.
NumArgs = CE->getNumArgs();
168 if (
const auto *CMD = dyn_cast<CXXMethodDecl>(D))
169 if (CMD->getParent()->isLambda())
173 assert(!Ctx.
SelfArg &&
"Ambiguous self argument");
208 if (
const auto* SLit = dyn_cast<StringLiteral>(AttrExp)) {
209 if (SLit->getString() ==
"*")
220 if (
const auto *OE = dyn_cast<CXXOperatorCallExpr>(AttrExp)) {
221 if (OE->getOperator() == OO_Exclaim) {
223 AttrExp = OE->getArg(0);
226 else if (
const auto *UO = dyn_cast<UnaryOperator>(AttrExp)) {
227 if (UO->getOpcode() == UO_LNot) {
241 if (
const auto *CE = dyn_cast<til::Cast>(E)) {
259 llvm::scope_exit Cleanup([&, RestoreClosure = VarsBeingTranslated.empty()
262 VarsBeingTranslated.erase(VD->getCanonicalDecl());
263 if (VarsBeingTranslated.empty())
264 LookupLocalVarExpr = RestoreClosure;
271 if (LookupLocalVarExpr) {
275 if (
const Expr *E = LookupLocalVarExpr(VD)) {
302 case Stmt::DeclRefExprClass:
304 case Stmt::CXXThisExprClass:
306 case Stmt::MemberExprClass:
308 case Stmt::ObjCIvarRefExprClass:
310 case Stmt::CallExprClass:
312 case Stmt::CXXMemberCallExprClass:
314 case Stmt::CXXOperatorCallExprClass:
316 case Stmt::UnaryOperatorClass:
318 case Stmt::BinaryOperatorClass:
319 case Stmt::CompoundAssignOperatorClass:
322 case Stmt::ArraySubscriptExprClass:
324 case Stmt::ConditionalOperatorClass:
325 return translateAbstractConditionalOperator(
327 case Stmt::BinaryConditionalOperatorClass:
328 return translateAbstractConditionalOperator(
332 case Stmt::ConstantExprClass:
334 case Stmt::ParenExprClass:
336 case Stmt::ExprWithCleanupsClass:
338 case Stmt::CXXBindTemporaryExprClass:
340 case Stmt::MaterializeTemporaryExprClass:
344 case Stmt::CharacterLiteralClass:
347 case Stmt::CXXNullPtrLiteralExprClass:
348 case Stmt::GNUNullExprClass:
350 case Stmt::CXXBoolLiteralExprClass:
352 case Stmt::IntegerLiteralClass: {
355 const llvm::APInt &
Value = IL->getValue();
356 if (BT->isSignedInteger())
358 else if (BT->isUnsignedInteger())
361 llvm_unreachable(
"Invalid integer type");
363 case Stmt::StringLiteralClass:
365 case Stmt::ObjCStringLiteralClass:
369 case Stmt::DeclStmtClass:
371 case Stmt::StmtExprClass:
376 if (
const auto *CE = dyn_cast<CastExpr>(S))
377 return translateCastExpr(CE, Ctx);
386 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
388 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
390 if (
const auto *DD = dyn_cast<DeclaratorDecl>(D)) {
391 if (
auto *TSI = DD->getTypeSourceInfo()) {
392 TypeLoc TL = TSI->getTypeLoc();
394 TL = RTL.getPointeeLoc();
397 TL = PTL.getPointeeLoc();
399 if (I < FPTL.getNumParams())
400 return FPTL.getParam(I);
406til::SExpr *SExprBuilder::translateDeclRefExpr(
const DeclRefExpr *DRE,
411 if (
const auto *PV = dyn_cast<ParmVarDecl>(VD)) {
412 unsigned I = PV->getFunctionScopeIndex();
413 const DeclContext *D = PV->getDeclContext();
417 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
418 Match = (FD->getCanonicalDecl() == Canonical);
419 else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
420 Match = (MD->getCanonicalDecl() == Canonical);
424 llvm_unreachable(
"ParmVarDecl does not belong to current declaration");
428 if (
const Expr *
const *FunArgs =
429 dyn_cast<const Expr *const *>(Ctx->
FunArgs)) {
430 assert(I < Ctx->NumArgs);
444 if (
const auto *VarD = dyn_cast<VarDecl>(VD))
448 return new (Arena) til::LiteralPtr(VD);
451til::SExpr *SExprBuilder::translateCXXThisExpr(
const CXXThisExpr *TE,
455 if (
const auto *SelfArg = dyn_cast<const Expr *>(Ctx->
SelfArg))
460 assert(SelfVar &&
"We have no variable for 'this'!");
465 if (
const auto *
V = dyn_cast<til::Variable>(E))
466 return V->clangDecl();
467 if (
const auto *Ph = dyn_cast<til::Phi>(E))
468 return Ph->clangDecl();
469 if (
const auto *P = dyn_cast<til::Project>(E))
470 return P->clangDecl();
471 if (
const auto *L = dyn_cast<til::LiteralPtr>(E))
472 return L->clangDecl();
478 if (VD && VD->getType()->isAnyPointerType())
480 if (
const auto *
C = dyn_cast<til::Cast>(E))
491 if (OverriddenMethods.begin() == OverriddenMethods.end())
494 D = *OverriddenMethods.begin();
499til::SExpr *SExprBuilder::translateMemberExpr(
const MemberExpr *ME,
502 til::SExpr *E =
new (Arena) til::SApply(BE);
505 if (
const auto *VD = dyn_cast<CXXMethodDecl>(D))
508 til::Project *P =
new (Arena) til::Project(E, D);
514til::SExpr *SExprBuilder::translateObjCIVarRefExpr(
const ObjCIvarRefExpr *IVRE,
517 til::SExpr *E =
new (Arena) til::SApply(BE);
521 til::Project *P =
new (Arena) til::Project(E, D);
527til::SExpr *SExprBuilder::translateCallExpr(
const CallExpr *CE,
530 if (CapabilityExprMode) {
533 FD = FD->getMostRecentDecl();
534 if (LockReturnedAttr *At = FD->getAttr<LockReturnedAttr>()) {
537 LRCallCtx.SelfArg = SelfE;
539 LRCallCtx.FunArgs = CE->
getArgs();
540 return const_cast<til::SExpr *
>(
547 for (
const auto *Arg : CE->
arguments()) {
549 E =
new (Arena) til::Apply(E, A);
551 return new (Arena) til::Call(E, CE);
554til::SExpr *SExprBuilder::translateCXXMemberCallExpr(
556 if (CapabilityExprMode) {
569til::SExpr *SExprBuilder::translateCXXOperatorCallExpr(
571 if (CapabilityExprMode) {
574 if (k == OO_Star || k == OO_Arrow) {
583til::SExpr *SExprBuilder::translateUnaryOperator(
const UnaryOperator *UO,
590 return new (Arena) til::Undefined(UO);
593 if (CapabilityExprMode) {
595 if (
const auto *DRE = dyn_cast<DeclRefExpr>(UO->
getSubExpr())) {
599 auto *W =
new (Arena) til::Wildcard();
600 return new (Arena) til::Project(W, DRE->
getDecl());
627 return new (Arena) til::Undefined(UO);
629 return new (Arena) til::Undefined(UO);
633 const BinaryOperator *BO,
638 return new (Arena) til::BinaryOp(Op, E1, E0);
640 return new (Arena) til::BinaryOp(Op, E0, E1);
644 const BinaryOperator *BO,
647 const Expr *LHS = BO->
getLHS();
648 const Expr *RHS = BO->
getRHS();
652 const ValueDecl *VD =
nullptr;
653 til::SExpr *CV =
nullptr;
654 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHS)) {
656 CV = lookupVarDecl(VD);
660 til::SExpr *Arg = CV ? CV :
new (Arena) til::Load(E0);
661 E1 =
new (Arena) til::BinaryOp(Op, Arg, E1);
662 E1 = addStatement(E1,
nullptr, VD);
665 return updateVarDecl(VD, E1);
666 return new (Arena) til::Store(E0, E1);
669til::SExpr *SExprBuilder::translateBinaryOperator(
const BinaryOperator *BO,
674 return new (Arena) til::Undefined(BO);
676 case BO_Mul:
return translateBinOp(
til::BOP_Mul, BO, Ctx);
677 case BO_Div:
return translateBinOp(
til::BOP_Div, BO, Ctx);
678 case BO_Rem:
return translateBinOp(
til::BOP_Rem, BO, Ctx);
679 case BO_Add:
return translateBinOp(
til::BOP_Add, BO, Ctx);
680 case BO_Sub:
return translateBinOp(
til::BOP_Sub, BO, Ctx);
681 case BO_Shl:
return translateBinOp(
til::BOP_Shl, BO, Ctx);
682 case BO_Shr:
return translateBinOp(
til::BOP_Shr, BO, Ctx);
683 case BO_LT:
return translateBinOp(
til::BOP_Lt, BO, Ctx);
684 case BO_GT:
return translateBinOp(
til::BOP_Lt, BO, Ctx,
true);
685 case BO_LE:
return translateBinOp(
til::BOP_Leq, BO, Ctx);
686 case BO_GE:
return translateBinOp(
til::BOP_Leq, BO, Ctx,
true);
687 case BO_EQ:
return translateBinOp(
til::BOP_Eq, BO, Ctx);
688 case BO_NE:
return translateBinOp(
til::BOP_Neq, BO, Ctx);
689 case BO_Cmp:
return translateBinOp(
til::BOP_Cmp, BO, Ctx);
696 case BO_Assign:
return translateBinAssign(
til::BOP_Eq, BO, Ctx,
true);
697 case BO_MulAssign:
return translateBinAssign(
til::BOP_Mul, BO, Ctx);
698 case BO_DivAssign:
return translateBinAssign(
til::BOP_Div, BO, Ctx);
699 case BO_RemAssign:
return translateBinAssign(
til::BOP_Rem, BO, Ctx);
700 case BO_AddAssign:
return translateBinAssign(
til::BOP_Add, BO, Ctx);
701 case BO_SubAssign:
return translateBinAssign(
til::BOP_Sub, BO, Ctx);
702 case BO_ShlAssign:
return translateBinAssign(
til::BOP_Shl, BO, Ctx);
703 case BO_ShrAssign:
return translateBinAssign(
til::BOP_Shr, BO, Ctx);
704 case BO_AndAssign:
return translateBinAssign(
til::BOP_BitAnd, BO, Ctx);
705 case BO_XorAssign:
return translateBinAssign(
til::BOP_BitXor, BO, Ctx);
706 case BO_OrAssign:
return translateBinAssign(
til::BOP_BitOr, BO, Ctx);
712 return new (Arena) til::Undefined(BO);
719 case CK_LValueToRValue: {
720 if (
const auto *DRE = dyn_cast<DeclRefExpr>(CE->
getSubExpr())) {
721 til::SExpr *E0 = lookupVarDecl(DRE->
getDecl());
731 case CK_DerivedToBase:
732 case CK_UncheckedDerivedToBase:
733 case CK_ArrayToPointerDecay:
734 case CK_FunctionToPointerDecay: {
741 if (CapabilityExprMode)
749SExprBuilder::translateArraySubscriptExpr(
const ArraySubscriptExpr *E,
753 return new (Arena) til::ArrayIndex(E0, E1);
757SExprBuilder::translateAbstractConditionalOperator(
762 return new (Arena) til::IfThenElse(
C, T, E);
766SExprBuilder::translateDeclStmt(
const DeclStmt *S,
CallingContext *Ctx) {
768 for (
auto *I : DGrp) {
769 if (
auto *VD = dyn_cast_or_null<VarDecl>(I)) {
770 Expr *E = VD->getInit();
776 return addVarDecl(VD, SE);
785til::SExpr *SExprBuilder::translateStmtExpr(
const StmtExpr *SE,
790 return CS->
body_empty() ?
new (Arena) til::Undefined(SE)
799 const ValueDecl *VD) {
803 E =
new (Arena) til::Variable(E, VD);
804 CurrentInstructions.push_back(E);
811til::SExpr *SExprBuilder::lookupVarDecl(
const ValueDecl *VD) {
812 auto It = LVarIdxMap.find(VD);
813 if (It != LVarIdxMap.end()) {
814 assert(CurrentLVarMap[It->second].first == VD);
815 return CurrentLVarMap[It->second].second;
824 if (
auto *
V = dyn_cast<til::Variable>(E)) {
833 LVarIdxMap.insert(std::make_pair(VD, CurrentLVarMap.size()));
834 CurrentLVarMap.makeWritable();
835 CurrentLVarMap.push_back(std::make_pair(VD, E));
842 auto It = LVarIdxMap.find(VD);
843 if (It == LVarIdxMap.end()) {
844 til::SExpr *Ptr =
new (Arena) til::LiteralPtr(VD);
845 til::SExpr *St =
new (Arena) til::Store(Ptr, E);
848 CurrentLVarMap.makeWritable();
849 CurrentLVarMap.elem(It->second).second = E;
856void SExprBuilder::makePhiNodeVar(
unsigned i,
unsigned NPreds,
til::SExpr *E) {
857 unsigned ArgIndex = CurrentBlockInfo->ProcessedPredecessors;
858 assert(ArgIndex > 0 && ArgIndex < NPreds);
860 til::SExpr *CurrE = CurrentLVarMap[i].second;
861 if (CurrE->
block() == CurrentBB) {
864 auto *Ph = dyn_cast<til::Phi>(CurrE);
865 assert(Ph &&
"Expecting Phi node.");
867 Ph->values()[ArgIndex] = E;
873 til::Phi *Ph =
new (Arena) til::Phi(Arena, NPreds);
875 for (
unsigned PIdx = 0; PIdx < ArgIndex; ++PIdx)
876 Ph->
values()[PIdx] = CurrE;
878 Ph->
values()[ArgIndex] = E;
886 CurrentArguments.push_back(Ph);
888 IncompleteArgs.push_back(Ph);
890 CurrentLVarMap.makeWritable();
891 CurrentLVarMap.elem(i).second = Ph;
896void SExprBuilder::mergeEntryMap(LVarDefinitionMap Map) {
897 assert(CurrentBlockInfo &&
"Not processing a block!");
899 if (!CurrentLVarMap.valid()) {
901 CurrentLVarMap = std::move(Map);
904 if (CurrentLVarMap.sameAs(Map))
907 unsigned NPreds = CurrentBB->numPredecessors();
908 unsigned ESz = CurrentLVarMap.size();
909 unsigned MSz = Map.size();
910 unsigned Sz = std::min(ESz, MSz);
912 for (
unsigned i = 0; i < Sz; ++i) {
913 if (CurrentLVarMap[i].first != Map[i].first) {
915 CurrentLVarMap.makeWritable();
916 CurrentLVarMap.downsize(i);
919 if (CurrentLVarMap[i].second != Map[i].second)
920 makePhiNodeVar(i, NPreds, Map[i].second);
923 CurrentLVarMap.makeWritable();
924 CurrentLVarMap.downsize(Map.size());
930void SExprBuilder::mergeEntryMapBackEdge() {
939 assert(CurrentBlockInfo &&
"Not processing a block!");
941 if (CurrentBlockInfo->HasBackEdges)
943 CurrentBlockInfo->HasBackEdges =
true;
945 CurrentLVarMap.makeWritable();
946 unsigned Sz = CurrentLVarMap.size();
947 unsigned NPreds = CurrentBB->numPredecessors();
949 for (
unsigned i = 0; i < Sz; ++i)
950 makePhiNodeVar(i, NPreds,
nullptr);
956void SExprBuilder::mergePhiNodesBackEdge(
const CFGBlock *Blk) {
958 unsigned ArgIndex = BBInfo[Blk->
getBlockID()].ProcessedPredecessors;
959 assert(ArgIndex > 0 && ArgIndex < BB->numPredecessors());
962 auto *Ph = dyn_cast_or_null<til::Phi>(PE);
963 assert(Ph &&
"Expecting Phi Node.");
964 assert(Ph->
values()[ArgIndex] ==
nullptr &&
"Wrong index for back edge.");
966 til::SExpr *E = lookupVarDecl(Ph->
clangDecl());
967 assert(E &&
"Couldn't find local variable for Phi node.");
968 Ph->
values()[ArgIndex] = E;
972void SExprBuilder::enterCFG(CFG *Cfg,
const NamedDecl *D,
973 const CFGBlock *
First) {
976 Scfg =
new (Arena) til::SCFG(Arena, NBlocks);
979 BBInfo.resize(NBlocks);
980 BlockMap.resize(NBlocks,
nullptr);
982 for (
auto *B : *Cfg) {
983 auto *BB =
new (Arena) til::BasicBlock(Arena);
985 BlockMap[B->getBlockID()] = BB;
991 for (
auto *Pm : Parms) {
992 QualType T = Pm->getType();
998 til::SExpr *Lp =
new (Arena) til::LiteralPtr(Pm);
999 til::SExpr *Ld =
new (Arena) til::Load(Lp);
1000 til::SExpr *
V = addStatement(Ld,
nullptr, Pm);
1005void SExprBuilder::enterCFGBlock(
const CFGBlock *B) {
1008 CurrentBB->reservePredecessors(B->
pred_size());
1009 Scfg->add(CurrentBB);
1018void SExprBuilder::handlePredecessor(
const CFGBlock *Pred) {
1021 CurrentBB->addPredecessor(BlockMap[Pred->
getBlockID()]);
1022 BlockInfo *PredInfo = &BBInfo[Pred->
getBlockID()];
1023 assert(PredInfo->UnprocessedSuccessors > 0);
1025 if (--PredInfo->UnprocessedSuccessors == 0)
1026 mergeEntryMap(std::move(PredInfo->ExitMap));
1028 mergeEntryMap(PredInfo->ExitMap.clone());
1030 ++CurrentBlockInfo->ProcessedPredecessors;
1033void SExprBuilder::handlePredecessorBackEdge(
const CFGBlock *Pred) {
1034 mergeEntryMapBackEdge();
1037void SExprBuilder::enterCFGBlockBody(
const CFGBlock *B) {
1040 CurrentBB->arguments().reserve(
1041 static_cast<unsigned>(CurrentArguments.size()), Arena);
1042 for (
auto *A : CurrentArguments)
1043 CurrentBB->addArgument(A);
1046void SExprBuilder::handleStatement(
const Stmt *S) {
1051void SExprBuilder::handleDestructorCall(
const VarDecl *VD,
1052 const CXXDestructorDecl *DD) {
1053 til::SExpr *Sf =
new (Arena) til::LiteralPtr(VD);
1054 til::SExpr *Dr =
new (Arena) til::LiteralPtr(DD);
1055 til::SExpr *Ap =
new (Arena) til::Apply(Dr, Sf);
1056 til::SExpr *E =
new (Arena) til::Call(Ap);
1057 addStatement(E,
nullptr);
1060void SExprBuilder::exitCFGBlockBody(
const CFGBlock *B) {
1061 CurrentBB->instructions().reserve(
1062 static_cast<unsigned>(CurrentInstructions.size()), Arena);
1063 for (
auto *
V : CurrentInstructions)
1064 CurrentBB->addInstruction(
V);
1073 auto *Tm =
new (Arena) til::Goto(BB, Idx);
1074 CurrentBB->setTerminator(Tm);
1082 auto *Tm =
new (Arena) til::Branch(
C, BB1, BB2);
1083 CurrentBB->setTerminator(Tm);
1087void SExprBuilder::handleSuccessor(
const CFGBlock *Succ) {
1088 ++CurrentBlockInfo->UnprocessedSuccessors;
1091void SExprBuilder::handleSuccessorBackEdge(
const CFGBlock *Succ) {
1092 mergePhiNodesBackEdge(Succ);
1093 ++BBInfo[Succ->
getBlockID()].ProcessedPredecessors;
1096void SExprBuilder::exitCFGBlock(
const CFGBlock *B) {
1097 CurrentArguments.clear();
1098 CurrentInstructions.clear();
1099 CurrentBlockInfo->ExitMap = std::move(CurrentLVarMap);
1100 CurrentBB =
nullptr;
1101 CurrentBlockInfo =
nullptr;
1104void SExprBuilder::exitCFG(
const CFGBlock *
Last) {
1105 for (
auto *Ph : IncompleteArgs) {
1110 CurrentArguments.clear();
1111 CurrentInstructions.clear();
1112 IncompleteArgs.clear();
1127 llvm::BumpPtrAllocator Bpa;
1131 TILPrinter::print(Scfg, llvm::errs());
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines an enumeration for C++ overloaded operators.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines various enumerations that describe declaration and type specifiers.
static bool isIncompletePhi(const til::SExpr *E)
SExprBuilder::CallingContext CallingContext
static const ParmVarDecl * getCanonicalParamDecl(const Decl *D, unsigned I)
Helper to extract the canonical parameter declaration from a function or function pointer.
static const ValueDecl * getValueDeclFromSExpr(const til::SExpr *E)
static void maybeUpdateVD(til::SExpr *E, const ValueDecl *VD)
static bool hasAnyPointerType(const til::SExpr *E)
static const CXXMethodDecl * getFirstVirtualDecl(const CXXMethodDecl *D)
static std::pair< StringRef, bool > classifyCapability(const TypeDecl &TD)
static bool isCalleeArrow(const Expr *E)
static constexpr std::pair< StringRef, bool > ClassifyCapabilityFallback
C Language Family Type Representation.
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression representing the value of the expression if the condition eval...
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression representing the value of the expression if the condition eva...
succ_iterator succ_begin()
unsigned pred_size() const
const Stmt * getTerminatorCondition(bool StripParens=true) const
unsigned getBlockID() const
unsigned succ_size() const
unsigned getNumBlockIDs() const
Returns the total number of BlockIDs allocated (which start at 0).
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Expr * getImplicitObjectArgument() const
Retrieve the implicit object argument for the member call.
Represents a static or instance method of a struct/union/class.
overridden_method_range overridden_methods() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Expr ** getArgs()
Retrieve the call arguments.
CastKind getCastKind() const
const DeclGroupRef getDeclGroup() const
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
This represents a decl that may have a name.
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
ObjCIvarDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
const Expr * getBase() const
Represents a parameter to a function.
Wrapper for source info for pointers.
A (possibly-)qualified type.
bool isTrivialType(const ASTContext &Context) const
Return true if this is a trivial type per (C++0x [basic.types]p9)
CompoundStmt * getSubStmt()
Stmt - This represents one statement.
StmtClass getStmtClass() const
Represents a declaration of a type.
Base wrapper for a particular "section" of type source info.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isPointerOrReferenceType() const
const T * getAs() const
Member-template getAs<specific type>'.
Expr * getSubExpr() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
const til::SExpr * sexpr() const
CapabilityExpr translateAttrExpr(const Expr *AttrExp, const NamedDecl *D, const Expr *DeclExp, til::SExpr *Self=nullptr)
Translate a clang expression in an attribute to a til::SExpr.
til::SExpr * translate(const Stmt *S, CallingContext *Ctx)
til::SExpr * lookupStmt(const Stmt *S)
til::SCFG * buildCFG(CFGWalker &Walker)
til::SExpr * translateVariable(const VarDecl *VD, CallingContext *Ctx)
til::BasicBlock * lookupBlock(const CFGBlock *B)
const InstrArray & arguments() const
void reserveInstructions(unsigned Nins)
unsigned findPredecessorIndex(const BasicBlock *BB) const
Return the index of BB, or Predecessors.size if BB is not a predecessor.
A Literal pointer to an object allocated in memory.
const ValueDecl * clangDecl() const
Return the clang declaration of the variable for this Phi node, if any.
void setClangDecl(const ValueDecl *Cvd)
Set the clang variable associated with this Phi node.
const ValArray & values() const
An SCFG is a control-flow graph.
Base class for AST nodes in the typed intermediate language.
BasicBlock * block() const
Returns the block, if this is an instruction in a basic block, otherwise returns null.
void setValues(unsigned Sz, const T &C)
Placeholder for expressions that cannot be represented in the TIL.
Placeholder for a wildcard that matches any other expression.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool isTrivial(const SExpr *E)
void simplifyIncompleteArg(til::Phi *Ph)
TIL_BinaryOpcode
Opcode for binary arithmetic operations.
void printSCFG(CFGWalker &Walker)
std::string getSourceLiteralString(const Expr *CE)
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
bool isa(CodeGen::Address addr)
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Result
The result type of a method or function.
CastKind
CastKind - The kind of operation required for a conversion.
U cast(CodeGen::Address addr)
Encapsulates the lexical context of a function call.
llvm::PointerUnion< const Expr *const *, til::SExpr * > FunArgs
const NamedDecl * AttrDecl
llvm::PointerUnion< const Expr *, til::SExpr * > SelfArg