44 Expected<EntityPointerLevelSet>> {
48 llvm::Error fallback(
const Stmt *E) {
50 "attempt to translate %s to EntityPointerLevels",
54 EntityPointerLevel createEntityPointerLevelFor(
const EntityName &Name) {
55 return EntityPointerLevel({AddEntity(Name), 1});
65 return SubResult.takeError();
68 return EntityPointerLevelSet{Incremented.begin(), Incremented.end()};
77 : AddEntity(AddEntity), Ctx(Ctx) {}
84 "attempt to call getEntityNameForReturn on a NamedDecl of %s kind",
87 std::optional<EntityName> EN =
91 return createEntityPointerLevelFor(*EN);
96 return EntityPointerLevel({E.getEntity(), E.getPointerLevel() + 1});
100 assert(E.getPointerLevel() > 0);
101 return EntityPointerLevel({E.getEntity(), E.getPointerLevel() - 1});
121 case clang::BO_AddAssign:
122 case clang::BO_SubAssign:
123 case clang::BO_Assign:
125 case clang::BO_Comma:
137 Expected<EntityPointerLevelSet> VisitUnaryOperator(
const UnaryOperator *E) {
139 case clang::UO_PostInc:
140 case clang::UO_PostDec:
141 case clang::UO_PreInc:
142 case clang::UO_PreDec:
144 case clang::UO_AddrOf: {
147 return SubResult.takeError();
150 return EntityPointerLevelSet{Decremented.begin(), Decremented.end()};
152 case clang::UO_Deref:
153 return translateDereferencePointer(E->
getSubExpr());
161 Expected<EntityPointerLevelSet> VisitCastExpr(
const CastExpr *E) {
164 return EntityPointerLevelSet{};
169 Expected<EntityPointerLevelSet> VisitCallExpr(
const CallExpr *E) {
172 return EntityPointerLevelSet{
173 createEntityPointerLevelFor(*FDEntityName)};
174 return EntityPointerLevelSet{};
178 Expected<EntityPointerLevelSet>
179 VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
180 return translateDereferencePointer(E->
getBase());
184 Expected<EntityPointerLevelSet>
185 VisitAbstractConditionalOperator(
const AbstractConditionalOperator *E) {
190 ReT->insert(ReF->begin(), ReF->end());
194 return llvm::joinErrors(ReT.takeError(), ReF.takeError());
196 return ReF.takeError();
197 return ReT.takeError();
200 Expected<EntityPointerLevelSet> VisitParenExpr(
const ParenExpr *E) {
207 Expected<EntityPointerLevelSet> VisitStringLiteral(
const StringLiteral *E) {
208 return EntityPointerLevelSet{};
212 Expected<EntityPointerLevelSet> VisitDeclRefExpr(
const DeclRefExpr *E) {
214 return EntityPointerLevelSet{createEntityPointerLevelFor(*EntityName)};
219 Expected<EntityPointerLevelSet> VisitMemberExpr(
const MemberExpr *E) {
221 return EntityPointerLevelSet{createEntityPointerLevelFor(*EntityName)};
225 Expected<EntityPointerLevelSet>
226 VisitOpaqueValueExpr(
const OpaqueValueExpr *S) {
237 return Translator.translate(E);
246 return Translator.translate(ND, IsFunRet);
254EntityPointerLevel clang::ssaf::buildEntityPointerLevel(
EntityId Id,
256 return EntityPointerLevel({Id, PtrLv});
266 return llvm::json::Array{EntityId2JSON(EPL.getEntity()),
267 llvm::json::Value(EPL.getPointerLevel())};
271 const llvm::json::Value &EPLData,
273 auto *AsArr = EPLData.getAsArray();
275 if (!AsArr || AsArr->size() != 2)
277 EPLData,
"an array with exactly two elements representing "
278 "EntityId and PointerLevel, respectively");
280 auto *EntityIdObj = (*AsArr)[0].getAsObject();
284 "an object representing EntityId");
289 return Id.takeError();
291 std::optional<uint64_t> PtrLv = (*AsArr)[1].getAsInteger();
295 "an integer representing PointerLevel");
297 return buildEntityPointerLevel(*Id, *PtrLv);
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
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...
A builtin binary operation expression such as "x + y" or "x <= y".
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
ASTContext & getASTContext() const LLVM_READONLY
const char * getDeclKindName() const
This represents one expression.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
This represents a decl that may have a name.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
const Expr * getSubExpr() const
Expected< EntityPointerLevelSet > Visit(PTR(Stmt) S, ParamTys... P)
Stmt - This represents one statement.
const char * getStmtClassName() const
Expr * getSubExpr() const
Lightweight opaque handle representing an entity in an EntityIdTable.
Uniquely identifies an entity in a program.
static EntityPointerLevel incrementPointerLevel(const EntityPointerLevel &E)
friend class StmtVisitorBase
Expected< EntityPointerLevelSet > translate(const Expr *E)
EntityPointerLevelTranslator(std::function< EntityId(EntityName EN)> AddEntity, ASTContext &Ctx)
static EntityPointerLevel decrementPointerLevel(const EntityPointerLevel &E)
Expected< EntityPointerLevel > translate(const NamedDecl *D, bool IsRet)
std::optional< EntityName > getEntityNameForReturn(const FunctionDecl *FD)
Maps return entity of a function to an EntityName.
llvm::Error makeErrAtNode(clang::ASTContext &Ctx, const NodeTy *N, llvm::StringRef Fmt, const Ts &...Args)
llvm::json::Value entityPointerLevelToJSON(const EntityPointerLevel &EPL, JSONFormat::EntityIdToJSONFn EntityId2JSON)
EntityPointerLevel incrementPointerLevel(const EntityPointerLevel &E)
An EntityPointerLevel is associated with a level of the declared pointer/array type of an entity.
Expected< EntityPointerLevel > entityPointerLevelFromJSON(const llvm::json::Value &EPLData, JSONFormat::EntityIdFromJSONFn EntityIdFromJSON)
llvm::Error makeEntityNameErr(clang::ASTContext &Ctx, const clang::NamedDecl *D)
std::optional< EntityName > getEntityName(const Decl *D)
Maps a declaration to an EntityName.
llvm::Error makeSawButExpectedError(const llvm::json::Value &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
bool hasPtrOrArrType(const DeclOrExpr *E)
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
U cast(CodeGen::Address addr)
int const char * function