slang_rs_foreach_lowering.h revision 9319dfc974a82794d46e9f474f316590f480b976
1fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni/*
2fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * Copyright 2015, The Android Open Source Project
3fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni *
4fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * Licensed under the Apache License, Version 2.0 (the "License");
5fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * you may not use this file except in compliance with the License.
6fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * You may obtain a copy of the License at
7fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni *
8fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni *     http://www.apache.org/licenses/LICENSE-2.0
9fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni *
10fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * Unless required by applicable law or agreed to in writing, software
11fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * distributed under the License is distributed on an "AS IS" BASIS,
12fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * See the License for the specific language governing permissions and
14fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni * limitations under the License.
15fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni */
16fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
17fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni#ifndef _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H
18fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni#define _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H
19fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
20fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni#include "clang/AST/StmtVisitor.h"
21fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
22fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ninamespace clang {
23fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class ASTContext;
24fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class CallExpr;
25fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class Expr;
26fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class FunctionDecl;
27fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni}
28fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
29fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ninamespace slang {
30fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
31fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Niclass RSContext;
32fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
33fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Niclass RSForEachLowering : public clang::StmtVisitor<RSForEachLowering> {
34fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni public:
35fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  RSForEachLowering(RSContext* ctxt);
36fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
379319dfc974a82794d46e9f474f316590f480b976Yang Ni  // Given a FunctionDecl FD and the target API level, either translates all
389319dfc974a82794d46e9f474f316590f480b976Yang Ni  // rsForEach() and rsForEachWithOptions() calls inside FD into calls to the
399319dfc974a82794d46e9f474f316590f480b976Yang Ni  // low-level rsForEachInternal() API, if FD is not a kernel function itself;
409319dfc974a82794d46e9f474f316590f480b976Yang Ni  // or, in the case where FD is a kernel function, reports a compiler error on
419319dfc974a82794d46e9f474f316590f480b976Yang Ni  // any calls to either kernel launching API function.
429319dfc974a82794d46e9f474f316590f480b976Yang Ni  void handleForEachCalls(clang::FunctionDecl* FD, unsigned int targetAPI);
439319dfc974a82794d46e9f474f316590f480b976Yang Ni
44fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  void VisitCallExpr(clang::CallExpr *CE);
45fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  void VisitStmt(clang::Stmt *S);
46fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
47fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni private:
48fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  RSContext* mCtxt;
49fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  clang::ASTContext& mASTCtxt;
509319dfc974a82794d46e9f474f316590f480b976Yang Ni  // A flag, if true, indicating that the visitor is walking inside a kernel
519319dfc974a82794d46e9f474f316590f480b976Yang Ni  // function, in which case any call to rsForEach() or rsForEachWithOptions()
529319dfc974a82794d46e9f474f316590f480b976Yang Ni  // is a compiler error.
539319dfc974a82794d46e9f474f316590f480b976Yang Ni  bool mInsideKernel;
54fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
55fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  const clang::FunctionDecl* matchFunctionDesignator(clang::Expr* expr);
561946749cebf4a64341d8210890688fef7d958c22Yang Ni  const clang::FunctionDecl* matchKernelLaunchCall(clang::CallExpr* CE,
571946749cebf4a64341d8210890688fef7d958c22Yang Ni                                                   int* slot,
581946749cebf4a64341d8210890688fef7d958c22Yang Ni                                                   bool* hasOptions);
59fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  clang::FunctionDecl* CreateForEachInternalFunctionDecl();
60fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  clang::Expr* CreateCalleeExprForInternalForEach();
61fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni};  // RSForEachLowering
62fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
63fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni}  // namespace slang
64fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
65fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni#endif  // _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H
66