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