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