aboutsummaryrefslogtreecommitdiff
path: root/slang_rs_foreach_lowering.h
blob: 42f476d9741137789c6185c51300fdd360b9e3c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Copyright 2015, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H
#define _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H

#include "clang/AST/StmtVisitor.h"

namespace clang {
  class ASTContext;
  class CallExpr;
  class Expr;
  class FunctionDecl;
}

namespace slang {

class RSContext;

class RSForEachLowering : public clang::StmtVisitor<RSForEachLowering> {
 public:
  explicit RSForEachLowering(RSContext* ctxt);

  // Given a FunctionDecl FD and the target API level, either translates all
  // rsForEach() and rsForEachWithOptions() calls inside FD into calls to the
  // low-level rsForEachInternal() API, if FD is not a kernel function itself;
  // or, in the case where FD is a kernel function, reports a compiler error on
  // any calls to either kernel launching API function.
  void handleForEachCalls(clang::FunctionDecl* FD, unsigned int targetAPI);

  void VisitCallExpr(clang::CallExpr *CE);
  void VisitStmt(clang::Stmt *S);

 private:
  RSContext* mCtxt;
  clang::ASTContext& mASTCtxt;
  // A flag, if true, indicating that the visitor is walking inside a kernel
  // function, in which case any call to rsForEach() or rsForEachWithOptions()
  // is a compiler error.
  bool mInsideKernel;

  const clang::FunctionDecl* matchFunctionDesignator(clang::Expr* expr);
  const clang::FunctionDecl* matchKernelLaunchCall(clang::CallExpr* CE,
                                                   int* slot,
                                                   bool* hasOptions);
  clang::FunctionDecl* CreateForEachInternalFunctionDecl();
  clang::Expr* CreateCalleeExprForInternalForEach();
};  // RSForEachLowering

}  // namespace slang

#endif  // _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H