slang_rs_export_foreach.h revision 593a894650e81be54173106ec266f0311cebebd3
15baf6324a97430016026419deaef246ad75430fcStephen Hines/* 25baf6324a97430016026419deaef246ad75430fcStephen Hines * Copyright 2011, The Android Open Source Project 35baf6324a97430016026419deaef246ad75430fcStephen Hines * 45baf6324a97430016026419deaef246ad75430fcStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 55baf6324a97430016026419deaef246ad75430fcStephen Hines * you may not use this file except in compliance with the License. 65baf6324a97430016026419deaef246ad75430fcStephen Hines * You may obtain a copy of the License at 75baf6324a97430016026419deaef246ad75430fcStephen Hines * 85baf6324a97430016026419deaef246ad75430fcStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 95baf6324a97430016026419deaef246ad75430fcStephen Hines * 105baf6324a97430016026419deaef246ad75430fcStephen Hines * Unless required by applicable law or agreed to in writing, software 115baf6324a97430016026419deaef246ad75430fcStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 125baf6324a97430016026419deaef246ad75430fcStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135baf6324a97430016026419deaef246ad75430fcStephen Hines * See the License for the specific language governing permissions and 145baf6324a97430016026419deaef246ad75430fcStephen Hines * limitations under the License. 155baf6324a97430016026419deaef246ad75430fcStephen Hines */ 165baf6324a97430016026419deaef246ad75430fcStephen Hines 17593a894650e81be54173106ec266f0311cebebd3Stephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_ // NOLINT 18593a894650e81be54173106ec266f0311cebebd3Stephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_ 195baf6324a97430016026419deaef246ad75430fcStephen Hines 205baf6324a97430016026419deaef246ad75430fcStephen Hines#include "llvm/ADT/StringRef.h" 215baf6324a97430016026419deaef246ad75430fcStephen Hines#include "llvm/Support/raw_ostream.h" 225baf6324a97430016026419deaef246ad75430fcStephen Hines 235baf6324a97430016026419deaef246ad75430fcStephen Hines#include "clang/AST/Decl.h" 245baf6324a97430016026419deaef246ad75430fcStephen Hines 255baf6324a97430016026419deaef246ad75430fcStephen Hines#include "slang_assert.h" 265baf6324a97430016026419deaef246ad75430fcStephen Hines#include "slang_rs_context.h" 27593a894650e81be54173106ec266f0311cebebd3Stephen Hines#include "slang_rs_exportable.h" 28593a894650e81be54173106ec266f0311cebebd3Stephen Hines#include "slang_rs_export_type.h" 295baf6324a97430016026419deaef246ad75430fcStephen Hines 305baf6324a97430016026419deaef246ad75430fcStephen Hinesnamespace clang { 315baf6324a97430016026419deaef246ad75430fcStephen Hines class FunctionDecl; 325baf6324a97430016026419deaef246ad75430fcStephen Hines} // namespace clang 335baf6324a97430016026419deaef246ad75430fcStephen Hines 345baf6324a97430016026419deaef246ad75430fcStephen Hinesnamespace slang { 355baf6324a97430016026419deaef246ad75430fcStephen Hines 36593a894650e81be54173106ec266f0311cebebd3Stephen Hines// Base class for reflecting control-side forEach (currently for root() 37593a894650e81be54173106ec266f0311cebebd3Stephen Hines// functions that fit appropriate criteria) 38593a894650e81be54173106ec266f0311cebebd3Stephen Hinesclass RSExportForEach : public RSExportable { 395baf6324a97430016026419deaef246ad75430fcStephen Hines private: 405baf6324a97430016026419deaef246ad75430fcStephen Hines std::string mName; 41593a894650e81be54173106ec266f0311cebebd3Stephen Hines RSExportRecordType *mParamPacketType; 42593a894650e81be54173106ec266f0311cebebd3Stephen Hines size_t numParams; 435baf6324a97430016026419deaef246ad75430fcStephen Hines 44593a894650e81be54173106ec266f0311cebebd3Stephen Hines RSExportForEach(RSContext *Context, const llvm::StringRef &Name, 455baf6324a97430016026419deaef246ad75430fcStephen Hines const clang::FunctionDecl *FD) 46593a894650e81be54173106ec266f0311cebebd3Stephen Hines : RSExportable(Context, RSExportable::EX_FOREACH), 47593a894650e81be54173106ec266f0311cebebd3Stephen Hines mName(Name.data(), Name.size()), 48593a894650e81be54173106ec266f0311cebebd3Stephen Hines mParamPacketType(NULL), 49593a894650e81be54173106ec266f0311cebebd3Stephen Hines numParams(0) { 505baf6324a97430016026419deaef246ad75430fcStephen Hines return; 515baf6324a97430016026419deaef246ad75430fcStephen Hines } 525baf6324a97430016026419deaef246ad75430fcStephen Hines 535baf6324a97430016026419deaef246ad75430fcStephen Hines public: 54593a894650e81be54173106ec266f0311cebebd3Stephen Hines static RSExportForEach *Create(RSContext *Context, 55593a894650e81be54173106ec266f0311cebebd3Stephen Hines const clang::FunctionDecl *FD); 56593a894650e81be54173106ec266f0311cebebd3Stephen Hines 57593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline const std::string &getName() const { 58593a894650e81be54173106ec266f0311cebebd3Stephen Hines return mName; 59593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 60593a894650e81be54173106ec266f0311cebebd3Stephen Hines 61593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline size_t getNumParameters() const { 62593a894650e81be54173106ec266f0311cebebd3Stephen Hines return numParams; 63593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 64593a894650e81be54173106ec266f0311cebebd3Stephen Hines 65593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline const RSExportRecordType *getParamPacketType() const 66593a894650e81be54173106ec266f0311cebebd3Stephen Hines { return mParamPacketType; } 67593a894650e81be54173106ec266f0311cebebd3Stephen Hines 68593a894650e81be54173106ec266f0311cebebd3Stephen Hines typedef RSExportRecordType::const_field_iterator const_param_iterator; 695baf6324a97430016026419deaef246ad75430fcStephen Hines 70593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline const_param_iterator params_begin() const { 71593a894650e81be54173106ec266f0311cebebd3Stephen Hines slangAssert((mParamPacketType != NULL) && 72593a894650e81be54173106ec266f0311cebebd3Stephen Hines "Get parameter from export foreach having no parameter!"); 73593a894650e81be54173106ec266f0311cebebd3Stephen Hines return mParamPacketType->fields_begin(); 74593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 75593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline const_param_iterator params_end() const { 76593a894650e81be54173106ec266f0311cebebd3Stephen Hines slangAssert((mParamPacketType != NULL) && 77593a894650e81be54173106ec266f0311cebebd3Stephen Hines "Get parameter from export foreach having no parameter!"); 78593a894650e81be54173106ec266f0311cebebd3Stephen Hines return mParamPacketType->fields_end(); 795baf6324a97430016026419deaef246ad75430fcStephen Hines } 805baf6324a97430016026419deaef246ad75430fcStephen Hines 815baf6324a97430016026419deaef246ad75430fcStephen Hines inline static bool isInitRSFunc(const clang::FunctionDecl *FD) { 825baf6324a97430016026419deaef246ad75430fcStephen Hines if (!FD) { 835baf6324a97430016026419deaef246ad75430fcStephen Hines return false; 845baf6324a97430016026419deaef246ad75430fcStephen Hines } 855baf6324a97430016026419deaef246ad75430fcStephen Hines const llvm::StringRef Name = FD->getName(); 865baf6324a97430016026419deaef246ad75430fcStephen Hines static llvm::StringRef FuncInit("init"); 875baf6324a97430016026419deaef246ad75430fcStephen Hines return Name.equals(FuncInit); 885baf6324a97430016026419deaef246ad75430fcStephen Hines } 895baf6324a97430016026419deaef246ad75430fcStephen Hines 905baf6324a97430016026419deaef246ad75430fcStephen Hines inline static bool isRootRSFunc(const clang::FunctionDecl *FD) { 915baf6324a97430016026419deaef246ad75430fcStephen Hines if (!FD) { 925baf6324a97430016026419deaef246ad75430fcStephen Hines return false; 935baf6324a97430016026419deaef246ad75430fcStephen Hines } 945baf6324a97430016026419deaef246ad75430fcStephen Hines const llvm::StringRef Name = FD->getName(); 955baf6324a97430016026419deaef246ad75430fcStephen Hines static llvm::StringRef FuncRoot("root"); 965baf6324a97430016026419deaef246ad75430fcStephen Hines return Name.equals(FuncRoot); 975baf6324a97430016026419deaef246ad75430fcStephen Hines } 985baf6324a97430016026419deaef246ad75430fcStephen Hines 99593a894650e81be54173106ec266f0311cebebd3Stephen Hines static bool isRSForEachFunc(const clang::FunctionDecl *FD); 100593a894650e81be54173106ec266f0311cebebd3Stephen Hines 1015baf6324a97430016026419deaef246ad75430fcStephen Hines inline static bool isSpecialRSFunc(const clang::FunctionDecl *FD) { 1025baf6324a97430016026419deaef246ad75430fcStephen Hines return isRootRSFunc(FD) || isInitRSFunc(FD); 1035baf6324a97430016026419deaef246ad75430fcStephen Hines } 1045baf6324a97430016026419deaef246ad75430fcStephen Hines 1055baf6324a97430016026419deaef246ad75430fcStephen Hines static bool validateSpecialFuncDecl(clang::Diagnostic *Diags, 1065baf6324a97430016026419deaef246ad75430fcStephen Hines const clang::FunctionDecl *FD); 107593a894650e81be54173106ec266f0311cebebd3Stephen Hines}; // RSExportForEach 1085baf6324a97430016026419deaef246ad75430fcStephen Hines 1095baf6324a97430016026419deaef246ad75430fcStephen Hines} // namespace slang 1105baf6324a97430016026419deaef246ad75430fcStephen Hines 111593a894650e81be54173106ec266f0311cebebd3Stephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_ NOLINT 112