111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines/* 211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * Copyright 2012, The Android Open Source Project 311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * 411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * you may not use this file except in compliance with the License. 611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * You may obtain a copy of the License at 711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * 811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * http://www.apache.org/licenses/LICENSE-2.0 911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * 1011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * Unless required by applicable law or agreed to in writing, software 1111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 1211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * See the License for the specific language governing permissions and 1411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines * limitations under the License. 1511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines */ 1611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 1711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CHECK_AST_H_ // NOLINT 1811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CHECK_AST_H_ 1911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 2011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#include "slang_assert.h" 2148d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines#include "slang_rs_context.h" 2211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#include "clang/AST/ASTContext.h" 2311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#include "clang/AST/StmtVisitor.h" 2411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 2511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hinesnamespace slang { 2611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 2711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines// This class is designed to walk a Renderscript/Filterscript AST looking for 2811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines// violations. Examples of violations for FS are pointer declarations and 2911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines// casts (i.e. no pointers allowed in FS whatsoever). 3011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hinesclass RSCheckAST : public clang::StmtVisitor<RSCheckAST> { 3111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines private: 3248d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines slang::RSContext *Context; 3311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines clang::ASTContext &C; 3411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines clang::SourceManager &mSM; 3511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool mValid; 3611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines unsigned int mTargetAPI; 3711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool mIsFilterscript; 38089cde338148fbb75825aea4539ccdae8211ffefStephen Hines bool mInKernel; 3911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 40616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser /// @brief Emit warnings for inapproriate uses of rsSetElementAt 41616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser /// 42616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser /// We warn in case generic rsSetElementAt() is used even though the user 43616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser /// could have used a typed rsSetElementAt_<type>() call. Typed calls 44616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser /// allow more aggressive optimization (e.g. due to better alias analysis 45616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser /// results). Hence, we want to steer the users to use them. 46616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser void WarnOnSetElementAt(clang::CallExpr*); 47616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser 4811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines public: 4948d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines explicit RSCheckAST(RSContext *Con, unsigned int TargetAPI, 5011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool IsFilterscript) 51d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet : Context(Con), 52d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet C(Con->getASTContext()), 5348d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines mSM(C.getSourceManager()), 54d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet mValid(true), 55d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet mTargetAPI(TargetAPI), 56d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet mIsFilterscript(IsFilterscript), 57089cde338148fbb75825aea4539ccdae8211ffefStephen Hines mInKernel(false) { 5811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines } 5911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 6011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void VisitStmt(clang::Stmt *S); 6111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 62616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser void VisitCallExpr(clang::CallExpr *CE); 63616854341745b958e0c409cdb6e21abb6225aa21Tobias Grosser 64dbb6dc37c377f8dd183f2069a6e27610d1202d98Stephen Hines void VisitCastExpr(clang::CastExpr *CE); 65dbb6dc37c377f8dd183f2069a6e27610d1202d98Stephen Hines 6611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void VisitExpr(clang::Expr *E); 6711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 6811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void VisitDeclStmt(clang::DeclStmt *DS); 6911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 7011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void ValidateFunctionDecl(clang::FunctionDecl *FD); 7111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 7211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void ValidateVarDecl(clang::VarDecl *VD); 7311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 7411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool Validate(); 7511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines}; 7611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 7711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines} // namespace slang 7811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 7911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CHECK_AST_H_ NOLINT 80