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" 2111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#include "clang/AST/ASTContext.h" 2211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#include "clang/AST/StmtVisitor.h" 2311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 2411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hinesnamespace slang { 2511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 2611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines// This class is designed to walk a Renderscript/Filterscript AST looking for 2711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines// violations. Examples of violations for FS are pointer declarations and 2811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines// casts (i.e. no pointers allowed in FS whatsoever). 2911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hinesclass RSCheckAST : public clang::StmtVisitor<RSCheckAST> { 3011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines private: 3111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines clang::ASTContext &C; 3211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines clang::DiagnosticsEngine &mDiagEngine; 3311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines clang::SourceManager &mSM; 3411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool mValid; 3511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines unsigned int mTargetAPI; 3611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool mIsFilterscript; 37089cde338148fbb75825aea4539ccdae8211ffefStephen Hines bool mInKernel; 3811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 3911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines public: 4011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines explicit RSCheckAST(clang::ASTContext &Con, unsigned int TargetAPI, 4111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool IsFilterscript) 4211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines : C(Con), mDiagEngine(Con.getDiagnostics()), mSM(C.getSourceManager()), 43089cde338148fbb75825aea4539ccdae8211ffefStephen Hines mValid(true), mTargetAPI(TargetAPI), mIsFilterscript(IsFilterscript), 44089cde338148fbb75825aea4539ccdae8211ffefStephen Hines mInKernel(false) { 4511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines return; 4611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines } 4711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 4811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void VisitStmt(clang::Stmt *S); 4911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 5011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void VisitExpr(clang::Expr *E); 5111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 5211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void VisitDeclStmt(clang::DeclStmt *DS); 5311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 5411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void ValidateFunctionDecl(clang::FunctionDecl *FD); 5511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 5611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines void ValidateVarDecl(clang::VarDecl *VD); 5711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 5811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool Validate(); 5911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines}; 6011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 6111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines} // namespace slang 6211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 6311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CHECK_AST_H_ NOLINT 64