17#include "llvm/ADT/STLExtras.h"
45 Expected<DeclPointerLevelVec>> {
57 "attempt to translate %s to EntityPointerLevels",
58 E->getStmtClassName());
63 createEntityPointerLevelFor(
const NamedDecl *ND) {
64 std::optional<EntityId> Id = Extractor.
addEntity(ND);
66 return makeErrAtNode(Ctx, ND,
"failed to create EntityId for %s",
71 Expected<EntityPointerLevel>
72 createEntityPointerLevelForReturn(
const FunctionDecl *FD) {
73 std::optional<EntityId> Id = Extractor.addEntityForReturn(FD);
75 return makeErrAtNode(Ctx, FD,
"failed to create EntityId for function %s",
83 Expected<DeclPointerLevelVec> translateDereferencePointer(
const Expr *
Ptr) {
86 Expected<DeclPointerLevelVec> SubResult =
Visit(
Ptr);
88 return SubResult.takeError();
90 llvm::for_each(*SubResult, [](DeclPointerLevel &D) { ++D.
PointerLevel; });
94 TUSummaryExtractor &Extractor;
99 : Extractor(Extractor), Ctx(Ctx) {}
104 return createEntityPointerLevelFor(D);
106 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
107 return createEntityPointerLevelForReturn(FD);
109 return makeErrAtNode(Ctx, D,
"attempt to get entity for return of %s",
117 return Base.takeError();
136 case clang::BO_AddAssign:
137 case clang::BO_SubAssign:
138 case clang::BO_Assign:
140 case clang::BO_Comma:
153 Expected<DeclPointerLevelVec> VisitUnaryOperator(
const UnaryOperator *E) {
155 case clang::UO_PostInc:
156 case clang::UO_PostDec:
157 case clang::UO_PreInc:
158 case clang::UO_PreDec:
160 case clang::UO_AddrOf: {
163 return SubResult.takeError();
165 llvm::for_each(*SubResult, [](DeclPointerLevel &D) {
171 case clang::UO_Deref:
172 return translateDereferencePointer(E->
getSubExpr());
182 Expected<DeclPointerLevelVec> VisitCastExpr(
const CastExpr *E) {
190 Expected<DeclPointerLevelVec> VisitCallExpr(
const CallExpr *E) {
197 Expected<DeclPointerLevelVec>
198 VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
199 return translateDereferencePointer(E->
getBase());
203 Expected<DeclPointerLevelVec>
204 VisitAbstractConditionalOperator(
const AbstractConditionalOperator *E) {
209 ReT->insert(ReT->end(), ReF->begin(), ReF->end());
213 return llvm::joinErrors(ReT.takeError(), ReF.takeError());
215 return ReF.takeError();
216 return ReT.takeError();
219 Expected<DeclPointerLevelVec> VisitParenExpr(
const ParenExpr *E) {
224 Expected<DeclPointerLevelVec> VisitStringLiteral(
const StringLiteral *E) {
229 Expected<DeclPointerLevelVec> VisitPredefinedExpr(
const PredefinedExpr *E) {
234 Expected<DeclPointerLevelVec> VisitIntegerLiteral(
const IntegerLiteral *E) {
239 Expected<DeclPointerLevelVec> VisitDeclRefExpr(
const DeclRefExpr *E) {
245 Expected<DeclPointerLevelVec> VisitMemberExpr(
const MemberExpr *E) {
251 Expected<DeclPointerLevelVec>
252 VisitCXXDefaultArgExpr(
const CXXDefaultArgExpr *E) {
257 Expected<DeclPointerLevelVec> VisitOpaqueValueExpr(
const OpaqueValueExpr *S) {
262 Expected<DeclPointerLevelVec>
263 VisitExprWithCleanups(
const ExprWithCleanups *S) {
268 Expected<DeclPointerLevelVec>
269 VisitMaterializeTemporaryExpr(
const MaterializeTemporaryExpr *S) {
274 Expected<DeclPointerLevelVec>
275 VisitCXXDefaultInitExpr(
const CXXDefaultInitExpr *E) {
280 Expected<DeclPointerLevelVec>
281 VisitCXXNullPtrLiteralExpr(
const CXXNullPtrLiteralExpr *S) {
286 Expected<DeclPointerLevelVec> VisitCXXThisExpr(
const CXXThisExpr *S) {
291 Expected<DeclPointerLevelVec> VisitCXXNewExpr(
const CXXNewExpr *S) {
298 Expected<DeclPointerLevelVec>
299 VisitImplicitValueInitExpr(
const ImplicitValueInitExpr *S) {
305 Expected<DeclPointerLevelVec> VisitInitListExpr(
const InitListExpr *E) {
310 return llvm::createStringError(
311 "Cannot translate an InitListExpr to EntityPointerLevels if it is not "
312 "an empty or singleton list that initializes a pointer scalar");
320 Expected<DeclPointerLevelVec>
321 VisitCXXConstructExpr(
const CXXConstructExpr *E) {
329 Expected<DeclPointerLevelVec>
330 VisitCXXScalarValueInitExpr(
const CXXScalarValueInitExpr *E) {
337clang::ssaf::translateDeclPointerLevel(
const Expr *E,
ASTContext &Ctx,
341 return Translator.translate(E);
345clang::ssaf::translateEntityPointerLevel(
const Expr *E,
ASTContext &Ctx,
348 auto DPLs = Translator.translate(E);
350 return DPLs.takeError();
351 return toEntityPointerLevels(*DPLs, Ctx, Extractor);
356 return {ND, 1, IsFunRet};
364 return Translator.
translate(ND, IsFunRet);
373 if (
const auto *FD = dyn_cast<FunctionDecl>(DPL.
Decl))
375 }
else if (
const auto *VD = dyn_cast<ValueDecl>(DPL.
Decl)) {
376 T = VD->getType().getNonReferenceType();
382 unsigned MaxLevel = 0;
384 T =
T.getCanonicalType();
385 while (!
T.isNull() && (
T->isPointerType() ||
T->isArrayType())) {
386 if (
const auto *PT = dyn_cast<PointerType>(
T))
387 T = PT->getPointeeType();
392 assert(MaxLevel >= 0);
394 for (
unsigned Level = DPL.
PointerLevel + 1; Level <= MaxLevel; ++Level)
404 EntityPointerLevelSet
Result;
406 for (
const auto &DPL : DPLs) {
409 return EPL.takeError();
419 return Translator.toEntityPointerLevel(DPL);
424 return EntityPointerLevel({Id, PtrLv});
Defines the clang::ASTContext interface.
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
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".
Expr * getExpr()
Get the initialization expression that will be used.
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.
const Expr * getSubExpr() const
QualType getReturnType() const
unsigned getNumInits() const
const Expr * getInit(unsigned Init) const
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
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
A (possibly-)qualified type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Expected< DeclPointerLevelVec > Visit(PTR(Stmt) S, ParamTys... P)
Stmt - This represents one statement.
bool isPointerType() const
Expr * getSubExpr() const
Lightweight opaque handle representing an entity in an EntityIdTable.
Expected< EntityPointerLevel > toEntityPointerLevel(const DeclPointerLevel &D)
EntityPointerLevelTranslator(TUSummaryExtractor &Extractor, ASTContext &Ctx)
friend class StmtVisitorBase
Expected< DeclPointerLevelVec > translate(const Expr *E)
Expected< EntityPointerLevel > translate(const NamedDecl *D, bool IsRet)
EntityPointerLevel buildEntityPointerLevel(EntityId, unsigned)
An EntityPointerLevel is associated with a level of the declared pointer/array type of an entity.
bool hasPtrOrArrType(const Expr *E)
llvm::Error makeErrAtNode(clang::ASTContext &Ctx, const NodeTy *N, llvm::StringRef Fmt, const Ts &...Args)
DeclPointerLevel createDeclPointerLevel(const NamedDecl *ND, bool IsFunRet=false)
Create an DeclPointerLevel (DPL) from a NamedDecl of a pointer/array type.
DeclPointerLevelVec elaborateHigherDeclPointerLevels(const DeclPointerLevel &DPL)
llvm::Expected< EntityPointerLevel > createEntityPointerLevel(const NamedDecl *ND, TUSummaryExtractor &Extractor, bool IsFunRet=false)
Create an EntityPointerLevel (EPL) from a NamedDecl of a pointer/array type.
llvm::SmallVector< DeclPointerLevel, 2 > DeclPointerLevelVec
Top level wrappers for InstallAPI frontend operations.
@ Result
The result type of a method or function.
const FunctionProtoType * T
U cast(CodeGen::Address addr)