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