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);
407 if (
const auto *
V = dyn_cast<til::Variable>(E))
408 return V->clangDecl();
409 if (
const auto *Ph = dyn_cast<til::Phi>(E))
410 return Ph->clangDecl();
411 if (
const auto *P = dyn_cast<til::Project>(E))
412 return P->clangDecl();
413 if (
const auto *L = dyn_cast<til::LiteralPtr>(E))
414 return L->clangDecl();
420 if (VD && VD->getType()->isAnyPointerType())
422 if (
const auto *
C = dyn_cast<til::Cast>(E))
428til::SExpr *SExprBuilder::translateDeclRefExpr(
const DeclRefExpr *DRE,
433 if (
const auto *PV = dyn_cast<ParmVarDecl>(VD)) {
434 unsigned I = PV->getFunctionScopeIndex();
435 const DeclContext *D = PV->getDeclContext();
439 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
440 Match = (FD->getCanonicalDecl() == Canonical);
441 else if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
442 Match = (MD->getCanonicalDecl() == Canonical);
446 llvm_unreachable(
"ParmVarDecl does not belong to current declaration");
450 if (
const Expr *
const *FunArgs =
451 dyn_cast<const Expr *const *>(Ctx->
FunArgs)) {
452 assert(I < Ctx->NumArgs);
466 if (
const auto *VarD = dyn_cast<VarDecl>(VD))
474 if (
const auto *FD = dyn_cast<FieldDecl>(VD); FD && Ctx && Ctx->
SelfArg) {
475 til::SExpr *BE = translateCXXThisExpr(
nullptr, Ctx);
476 til::SExpr *E =
new (Arena) til::SApply(BE);
477 til::Project *P =
new (Arena) til::Project(E, FD);
484 return new (Arena) til::LiteralPtr(VD);
487til::SExpr *SExprBuilder::translateCXXThisExpr(
const CXXThisExpr *TE,
491 if (
const auto *SelfArg = dyn_cast<const Expr *>(Ctx->
SelfArg))
496 assert(SelfVar &&
"We have no variable for 'this'!");
505 if (OverriddenMethods.begin() == OverriddenMethods.end())
508 D = *OverriddenMethods.begin();
513til::SExpr *SExprBuilder::translateMemberExpr(
const MemberExpr *ME,
516 til::SExpr *E =
new (Arena) til::SApply(BE);
519 if (
const auto *VD = dyn_cast<CXXMethodDecl>(D))
522 til::Project *P =
new (Arena) til::Project(E, D);
528til::SExpr *SExprBuilder::translateObjCIVarRefExpr(
const ObjCIvarRefExpr *IVRE,
531 til::SExpr *E =
new (Arena) til::SApply(BE);
535 til::Project *P =
new (Arena) til::Project(E, D);
541til::SExpr *SExprBuilder::translateCallExpr(
const CallExpr *CE,
544 if (CapabilityExprMode) {
547 FD = FD->getMostRecentDecl();
548 if (LockReturnedAttr *At = FD->getAttr<LockReturnedAttr>()) {
551 LRCallCtx.SelfArg = SelfE;
553 LRCallCtx.FunArgs = CE->
getArgs();
554 return const_cast<til::SExpr *
>(
561 for (
const auto *Arg : CE->
arguments()) {
563 E =
new (Arena) til::Apply(E, A);
565 return new (Arena) til::Call(E, CE);
568til::SExpr *SExprBuilder::translateCXXMemberCallExpr(
570 if (CapabilityExprMode) {
583til::SExpr *SExprBuilder::translateCXXOperatorCallExpr(
585 if (CapabilityExprMode) {
588 if (k == OO_Star || k == OO_Arrow) {
597til::SExpr *SExprBuilder::translateUnaryOperator(
const UnaryOperator *UO,
604 return new (Arena) til::Undefined(UO);
607 if (CapabilityExprMode) {
609 if (
const auto *DRE = dyn_cast<DeclRefExpr>(UO->
getSubExpr())) {
613 auto *W =
new (Arena) til::Wildcard();
614 return new (Arena) til::Project(W, DRE->
getDecl());
641 return new (Arena) til::Undefined(UO);
643 return new (Arena) til::Undefined(UO);
647 const BinaryOperator *BO,
652 return new (Arena) til::BinaryOp(Op, E1, E0);
654 return new (Arena) til::BinaryOp(Op, E0, E1);
658 const BinaryOperator *BO,
661 const Expr *LHS = BO->
getLHS();
662 const Expr *RHS = BO->
getRHS();
666 const ValueDecl *VD =
nullptr;
667 til::SExpr *CV =
nullptr;
668 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHS)) {
670 CV = lookupVarDecl(VD);
674 til::SExpr *Arg = CV ? CV :
new (Arena) til::Load(E0);
675 E1 =
new (Arena) til::BinaryOp(Op, Arg, E1);
676 E1 = addStatement(E1,
nullptr, VD);
679 return updateVarDecl(VD, E1);
680 return new (Arena) til::Store(E0, E1);
683til::SExpr *SExprBuilder::translateBinaryOperator(
const BinaryOperator *BO,
688 return new (Arena) til::Undefined(BO);
690 case BO_Mul:
return translateBinOp(
til::BOP_Mul, BO, Ctx);
691 case BO_Div:
return translateBinOp(
til::BOP_Div, BO, Ctx);
692 case BO_Rem:
return translateBinOp(
til::BOP_Rem, BO, Ctx);
693 case BO_Add:
return translateBinOp(
til::BOP_Add, BO, Ctx);
694 case BO_Sub:
return translateBinOp(
til::BOP_Sub, BO, Ctx);
695 case BO_Shl:
return translateBinOp(
til::BOP_Shl, BO, Ctx);
696 case BO_Shr:
return translateBinOp(
til::BOP_Shr, BO, Ctx);
697 case BO_LT:
return translateBinOp(
til::BOP_Lt, BO, Ctx);
698 case BO_GT:
return translateBinOp(
til::BOP_Lt, BO, Ctx,
true);
699 case BO_LE:
return translateBinOp(
til::BOP_Leq, BO, Ctx);
700 case BO_GE:
return translateBinOp(
til::BOP_Leq, BO, Ctx,
true);
701 case BO_EQ:
return translateBinOp(
til::BOP_Eq, BO, Ctx);
702 case BO_NE:
return translateBinOp(
til::BOP_Neq, BO, Ctx);
703 case BO_Cmp:
return translateBinOp(
til::BOP_Cmp, BO, Ctx);
710 case BO_Assign:
return translateBinAssign(
til::BOP_Eq, BO, Ctx,
true);
711 case BO_MulAssign:
return translateBinAssign(
til::BOP_Mul, BO, Ctx);
712 case BO_DivAssign:
return translateBinAssign(
til::BOP_Div, BO, Ctx);
713 case BO_RemAssign:
return translateBinAssign(
til::BOP_Rem, BO, Ctx);
714 case BO_AddAssign:
return translateBinAssign(
til::BOP_Add, BO, Ctx);
715 case BO_SubAssign:
return translateBinAssign(
til::BOP_Sub, BO, Ctx);
716 case BO_ShlAssign:
return translateBinAssign(
til::BOP_Shl, BO, Ctx);
717 case BO_ShrAssign:
return translateBinAssign(
til::BOP_Shr, BO, Ctx);
718 case BO_AndAssign:
return translateBinAssign(
til::BOP_BitAnd, BO, Ctx);
719 case BO_XorAssign:
return translateBinAssign(
til::BOP_BitXor, BO, Ctx);
720 case BO_OrAssign:
return translateBinAssign(
til::BOP_BitOr, BO, Ctx);
726 return new (Arena) til::Undefined(BO);
733 case CK_LValueToRValue: {
734 if (
const auto *DRE = dyn_cast<DeclRefExpr>(CE->
getSubExpr())) {
735 til::SExpr *E0 = lookupVarDecl(DRE->
getDecl());
745 case CK_DerivedToBase:
746 case CK_UncheckedDerivedToBase:
747 case CK_ArrayToPointerDecay:
748 case CK_FunctionToPointerDecay: {
755 if (CapabilityExprMode)
763SExprBuilder::translateArraySubscriptExpr(
const ArraySubscriptExpr *E,
767 return new (Arena) til::ArrayIndex(E0, E1);
771SExprBuilder::translateAbstractConditionalOperator(
776 return new (Arena) til::IfThenElse(
C, T, E);
780SExprBuilder::translateDeclStmt(
const DeclStmt *S,
CallingContext *Ctx) {
782 for (
auto *I : DGrp) {
783 if (
auto *VD = dyn_cast_or_null<VarDecl>(I)) {
784 Expr *E = VD->getInit();
790 return addVarDecl(VD, SE);
799til::SExpr *SExprBuilder::translateStmtExpr(
const StmtExpr *SE,
804 return CS->
body_empty() ?
new (Arena) til::Undefined(SE)
813 const ValueDecl *VD) {
817 E =
new (Arena) til::Variable(E, VD);
818 CurrentInstructions.push_back(E);
825til::SExpr *SExprBuilder::lookupVarDecl(
const ValueDecl *VD) {
826 auto It = LVarIdxMap.find(VD);
827 if (It != LVarIdxMap.end()) {
828 assert(CurrentLVarMap[It->second].first == VD);
829 return CurrentLVarMap[It->second].second;
838 if (
auto *
V = dyn_cast<til::Variable>(E)) {
847 LVarIdxMap.insert(std::make_pair(VD, CurrentLVarMap.size()));
848 CurrentLVarMap.makeWritable();
849 CurrentLVarMap.push_back(std::make_pair(VD, E));
856 auto It = LVarIdxMap.find(VD);
857 if (It == LVarIdxMap.end()) {
858 til::SExpr *Ptr =
new (Arena) til::LiteralPtr(VD);
859 til::SExpr *St =
new (Arena) til::Store(Ptr, E);
862 CurrentLVarMap.makeWritable();
863 CurrentLVarMap.elem(It->second).second = E;
870void SExprBuilder::makePhiNodeVar(
unsigned i,
unsigned NPreds,
til::SExpr *E) {
871 unsigned ArgIndex = CurrentBlockInfo->ProcessedPredecessors;
872 assert(ArgIndex > 0 && ArgIndex < NPreds);
874 til::SExpr *CurrE = CurrentLVarMap[i].second;
875 if (CurrE->
block() == CurrentBB) {
878 auto *Ph = dyn_cast<til::Phi>(CurrE);
879 assert(Ph &&
"Expecting Phi node.");
881 Ph->values()[ArgIndex] = E;
887 til::Phi *Ph =
new (Arena) til::Phi(Arena, NPreds);
889 for (
unsigned PIdx = 0; PIdx < ArgIndex; ++PIdx)
890 Ph->
values()[PIdx] = CurrE;
892 Ph->
values()[ArgIndex] = E;
900 CurrentArguments.push_back(Ph);
902 IncompleteArgs.push_back(Ph);
904 CurrentLVarMap.makeWritable();
905 CurrentLVarMap.elem(i).second = Ph;
910void SExprBuilder::mergeEntryMap(LVarDefinitionMap Map) {
911 assert(CurrentBlockInfo &&
"Not processing a block!");
913 if (!CurrentLVarMap.valid()) {
915 CurrentLVarMap = std::move(Map);
918 if (CurrentLVarMap.sameAs(Map))
921 unsigned NPreds = CurrentBB->numPredecessors();
922 unsigned ESz = CurrentLVarMap.size();
923 unsigned MSz = Map.size();
924 unsigned Sz = std::min(ESz, MSz);
926 for (
unsigned i = 0; i < Sz; ++i) {
927 if (CurrentLVarMap[i].first != Map[i].first) {
929 CurrentLVarMap.makeWritable();
930 CurrentLVarMap.downsize(i);
933 if (CurrentLVarMap[i].second != Map[i].second)
934 makePhiNodeVar(i, NPreds, Map[i].second);
937 CurrentLVarMap.makeWritable();
938 CurrentLVarMap.downsize(Map.size());
944void SExprBuilder::mergeEntryMapBackEdge() {
953 assert(CurrentBlockInfo &&
"Not processing a block!");
955 if (CurrentBlockInfo->HasBackEdges)
957 CurrentBlockInfo->HasBackEdges =
true;
959 CurrentLVarMap.makeWritable();
960 unsigned Sz = CurrentLVarMap.size();
961 unsigned NPreds = CurrentBB->numPredecessors();
963 for (
unsigned i = 0; i < Sz; ++i)
964 makePhiNodeVar(i, NPreds,
nullptr);
970void SExprBuilder::mergePhiNodesBackEdge(
const CFGBlock *Blk) {
972 unsigned ArgIndex = BBInfo[Blk->
getBlockID()].ProcessedPredecessors;
973 assert(ArgIndex > 0 && ArgIndex < BB->numPredecessors());
976 auto *Ph = dyn_cast_or_null<til::Phi>(PE);
977 assert(Ph &&
"Expecting Phi Node.");
978 assert(Ph->
values()[ArgIndex] ==
nullptr &&
"Wrong index for back edge.");
980 til::SExpr *E = lookupVarDecl(Ph->
clangDecl());
981 assert(E &&
"Couldn't find local variable for Phi node.");
982 Ph->
values()[ArgIndex] = E;
986void SExprBuilder::enterCFG(CFG *Cfg,
const NamedDecl *D,
987 const CFGBlock *
First) {
990 Scfg =
new (Arena) til::SCFG(Arena, NBlocks);
993 BBInfo.resize(NBlocks);
994 BlockMap.resize(NBlocks,
nullptr);
996 for (
auto *B : *Cfg) {
997 auto *BB =
new (Arena) til::BasicBlock(Arena);
999 BlockMap[B->getBlockID()] = BB;
1005 for (
auto *Pm : Parms) {
1006 QualType T = Pm->getType();
1012 til::SExpr *Lp =
new (Arena) til::LiteralPtr(Pm);
1013 til::SExpr *Ld =
new (Arena) til::Load(Lp);
1014 til::SExpr *
V = addStatement(Ld,
nullptr, Pm);
1019void SExprBuilder::enterCFGBlock(
const CFGBlock *B) {
1022 CurrentBB->reservePredecessors(B->
pred_size());
1023 Scfg->add(CurrentBB);
1032void SExprBuilder::handlePredecessor(
const CFGBlock *Pred) {
1035 CurrentBB->addPredecessor(BlockMap[Pred->
getBlockID()]);
1036 BlockInfo *PredInfo = &BBInfo[Pred->
getBlockID()];
1037 assert(PredInfo->UnprocessedSuccessors > 0);
1039 if (--PredInfo->UnprocessedSuccessors == 0)
1040 mergeEntryMap(std::move(PredInfo->ExitMap));
1042 mergeEntryMap(PredInfo->ExitMap.clone());
1044 ++CurrentBlockInfo->ProcessedPredecessors;
1047void SExprBuilder::handlePredecessorBackEdge(
const CFGBlock *Pred) {
1048 mergeEntryMapBackEdge();
1051void SExprBuilder::enterCFGBlockBody(
const CFGBlock *B) {
1054 CurrentBB->arguments().reserve(
1055 static_cast<unsigned>(CurrentArguments.size()), Arena);
1056 for (
auto *A : CurrentArguments)
1057 CurrentBB->addArgument(A);
1060void SExprBuilder::handleStatement(
const Stmt *S) {
1065void SExprBuilder::handleDestructorCall(
const VarDecl *VD,
1066 const CXXDestructorDecl *DD) {
1067 til::SExpr *Sf =
new (Arena) til::LiteralPtr(VD);
1068 til::SExpr *Dr =
new (Arena) til::LiteralPtr(DD);
1069 til::SExpr *Ap =
new (Arena) til::Apply(Dr, Sf);
1070 til::SExpr *E =
new (Arena) til::Call(Ap);
1071 addStatement(E,
nullptr);
1074void SExprBuilder::exitCFGBlockBody(
const CFGBlock *B) {
1075 CurrentBB->instructions().reserve(
1076 static_cast<unsigned>(CurrentInstructions.size()), Arena);
1077 for (
auto *
V : CurrentInstructions)
1078 CurrentBB->addInstruction(
V);
1087 auto *Tm =
new (Arena) til::Goto(BB, Idx);
1088 CurrentBB->setTerminator(Tm);
1096 auto *Tm =
new (Arena) til::Branch(
C, BB1, BB2);
1097 CurrentBB->setTerminator(Tm);
1101void SExprBuilder::handleSuccessor(
const CFGBlock *Succ) {
1102 ++CurrentBlockInfo->UnprocessedSuccessors;
1105void SExprBuilder::handleSuccessorBackEdge(
const CFGBlock *Succ) {
1106 mergePhiNodesBackEdge(Succ);
1107 ++BBInfo[Succ->
getBlockID()].ProcessedPredecessors;
1110void SExprBuilder::exitCFGBlock(
const CFGBlock *B) {
1111 CurrentArguments.clear();
1112 CurrentInstructions.clear();
1113 CurrentBlockInfo->ExitMap = std::move(CurrentLVarMap);
1114 CurrentBB =
nullptr;
1115 CurrentBlockInfo =
nullptr;
1118void SExprBuilder::exitCFG(
const CFGBlock *
Last) {
1119 for (
auto *Ph : IncompleteArgs) {
1124 CurrentArguments.clear();
1125 CurrentInstructions.clear();
1126 IncompleteArgs.clear();
1141 llvm::BumpPtrAllocator Bpa;
1145 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