slang_rs_export_foreach.h revision 688e64b2d56e4218c680b9d6523c5de672f55757
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; 42b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines RSExportType *mInType; 43b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines RSExportType *mOutType; 44593a894650e81be54173106ec266f0311cebebd3Stephen Hines size_t numParams; 455baf6324a97430016026419deaef246ad75430fcStephen Hines 464ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines unsigned int mMetadataEncoding; 474ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines 48b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::ParmVarDecl *mIn; 49b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::ParmVarDecl *mOut; 50b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::ParmVarDecl *mUsrData; 51b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::ParmVarDecl *mX; 52b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::ParmVarDecl *mY; 53b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::ParmVarDecl *mZ; 54b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::ParmVarDecl *mAr; 55b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 56b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines // TODO(all): Add support for LOD/face when we have them 57593a894650e81be54173106ec266f0311cebebd3Stephen Hines RSExportForEach(RSContext *Context, const llvm::StringRef &Name, 585baf6324a97430016026419deaef246ad75430fcStephen Hines const clang::FunctionDecl *FD) 59593a894650e81be54173106ec266f0311cebebd3Stephen Hines : RSExportable(Context, RSExportable::EX_FOREACH), 60b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines mName(Name.data(), Name.size()), mParamPacketType(NULL), mInType(NULL), 614ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines mOutType(NULL), numParams(0), mMetadataEncoding(0), 624ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines mIn(NULL), mOut(NULL), mUsrData(NULL), 63b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines mX(NULL), mY(NULL), mZ(NULL), mAr(NULL) { 645baf6324a97430016026419deaef246ad75430fcStephen Hines return; 655baf6324a97430016026419deaef246ad75430fcStephen Hines } 665baf6324a97430016026419deaef246ad75430fcStephen Hines 67b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines bool validateAndConstructParams(RSContext *Context, 68b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const clang::FunctionDecl *FD); 69b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 705baf6324a97430016026419deaef246ad75430fcStephen Hines public: 71593a894650e81be54173106ec266f0311cebebd3Stephen Hines static RSExportForEach *Create(RSContext *Context, 72593a894650e81be54173106ec266f0311cebebd3Stephen Hines const clang::FunctionDecl *FD); 73593a894650e81be54173106ec266f0311cebebd3Stephen Hines 74593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline const std::string &getName() const { 75593a894650e81be54173106ec266f0311cebebd3Stephen Hines return mName; 76593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 77593a894650e81be54173106ec266f0311cebebd3Stephen Hines 78593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline size_t getNumParameters() const { 79593a894650e81be54173106ec266f0311cebebd3Stephen Hines return numParams; 80593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 81593a894650e81be54173106ec266f0311cebebd3Stephen Hines 82b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines inline bool hasIn() const { 83b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines return (mIn != NULL); 84b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 85b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 86b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines inline bool hasOut() const { 87b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines return (mOut != NULL); 88b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 89b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 90b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines inline bool hasUsrData() const { 91b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines return (mUsrData != NULL); 92b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 93b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 94b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines inline const RSExportType *getInType() const { 95b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines return mInType; 96b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 97b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 98b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines inline const RSExportType *getOutType() const { 99b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines return mOutType; 100b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 101b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 102b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines inline const RSExportRecordType *getParamPacketType() const { 103b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines return mParamPacketType; 104b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 105593a894650e81be54173106ec266f0311cebebd3Stephen Hines 1064ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines inline unsigned int getMetadataEncoding() const { 1074ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines return mMetadataEncoding; 1084ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines } 1094ccf75e55fe460a8daa49247d7e5a797329c71a6Stephen Hines 110593a894650e81be54173106ec266f0311cebebd3Stephen Hines typedef RSExportRecordType::const_field_iterator const_param_iterator; 1115baf6324a97430016026419deaef246ad75430fcStephen Hines 112593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline const_param_iterator params_begin() const { 113593a894650e81be54173106ec266f0311cebebd3Stephen Hines slangAssert((mParamPacketType != NULL) && 114593a894650e81be54173106ec266f0311cebebd3Stephen Hines "Get parameter from export foreach having no parameter!"); 115593a894650e81be54173106ec266f0311cebebd3Stephen Hines return mParamPacketType->fields_begin(); 116593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 117b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 118593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline const_param_iterator params_end() const { 119593a894650e81be54173106ec266f0311cebebd3Stephen Hines slangAssert((mParamPacketType != NULL) && 120593a894650e81be54173106ec266f0311cebebd3Stephen Hines "Get parameter from export foreach having no parameter!"); 121593a894650e81be54173106ec266f0311cebebd3Stephen Hines return mParamPacketType->fields_end(); 1225baf6324a97430016026419deaef246ad75430fcStephen Hines } 1235baf6324a97430016026419deaef246ad75430fcStephen Hines 1245baf6324a97430016026419deaef246ad75430fcStephen Hines inline static bool isInitRSFunc(const clang::FunctionDecl *FD) { 1255baf6324a97430016026419deaef246ad75430fcStephen Hines if (!FD) { 1265baf6324a97430016026419deaef246ad75430fcStephen Hines return false; 1275baf6324a97430016026419deaef246ad75430fcStephen Hines } 1285baf6324a97430016026419deaef246ad75430fcStephen Hines const llvm::StringRef Name = FD->getName(); 1295baf6324a97430016026419deaef246ad75430fcStephen Hines static llvm::StringRef FuncInit("init"); 1305baf6324a97430016026419deaef246ad75430fcStephen Hines return Name.equals(FuncInit); 1315baf6324a97430016026419deaef246ad75430fcStephen Hines } 1325baf6324a97430016026419deaef246ad75430fcStephen Hines 1335baf6324a97430016026419deaef246ad75430fcStephen Hines inline static bool isRootRSFunc(const clang::FunctionDecl *FD) { 1345baf6324a97430016026419deaef246ad75430fcStephen Hines if (!FD) { 1355baf6324a97430016026419deaef246ad75430fcStephen Hines return false; 1365baf6324a97430016026419deaef246ad75430fcStephen Hines } 1375baf6324a97430016026419deaef246ad75430fcStephen Hines const llvm::StringRef Name = FD->getName(); 1385baf6324a97430016026419deaef246ad75430fcStephen Hines static llvm::StringRef FuncRoot("root"); 1395baf6324a97430016026419deaef246ad75430fcStephen Hines return Name.equals(FuncRoot); 1405baf6324a97430016026419deaef246ad75430fcStephen Hines } 1415baf6324a97430016026419deaef246ad75430fcStephen Hines 142688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines inline static bool isDtorRSFunc(const clang::FunctionDecl *FD) { 143688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines if (!FD) { 144688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines return false; 145688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines } 146688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines const llvm::StringRef Name = FD->getName(); 147688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines static llvm::StringRef FuncDtor(".rs.dtor"); 148688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines return Name.equals(FuncDtor); 149688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines } 150688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines 151593a894650e81be54173106ec266f0311cebebd3Stephen Hines static bool isRSForEachFunc(const clang::FunctionDecl *FD); 152593a894650e81be54173106ec266f0311cebebd3Stephen Hines 1535baf6324a97430016026419deaef246ad75430fcStephen Hines inline static bool isSpecialRSFunc(const clang::FunctionDecl *FD) { 154688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines return isRootRSFunc(FD) || isInitRSFunc(FD) || isDtorRSFunc(FD); 1555baf6324a97430016026419deaef246ad75430fcStephen Hines } 1565baf6324a97430016026419deaef246ad75430fcStephen Hines 1575baf6324a97430016026419deaef246ad75430fcStephen Hines static bool validateSpecialFuncDecl(clang::Diagnostic *Diags, 1585baf6324a97430016026419deaef246ad75430fcStephen Hines const clang::FunctionDecl *FD); 159593a894650e81be54173106ec266f0311cebebd3Stephen Hines}; // RSExportForEach 1605baf6324a97430016026419deaef246ad75430fcStephen Hines 1615baf6324a97430016026419deaef246ad75430fcStephen Hines} // namespace slang 1625baf6324a97430016026419deaef246ad75430fcStephen Hines 163593a894650e81be54173106ec266f0311cebebd3Stephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_ NOLINT 164