slang_rs_reflection_cpp.h revision 1c6b927b4c59fabf44db846855ff5c4cfd48aa53
11b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams/* 21b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * Copyright 2012, The Android Open Source Project 31b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * 41b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 51b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * you may not use this file except in compliance with the License. 61b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * You may obtain a copy of the License at 71b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * 81b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * http://www.apache.org/licenses/LICENSE-2.0 91b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * 101b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * Unless required by applicable law or agreed to in writing, software 111b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 121b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * See the License for the specific language governing permissions and 141b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams * limitations under the License. 151b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams */ 161b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 17efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_CPP_H_ // NOLINT 181b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_CPP_H_ 191b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 201f9d1217da29911dcd216b1b196da0ed170c166aJean-Luc Brouillet#include "slang_rs_reflect_utils.h" 211b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 22003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines#include <set> 23003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines#include <string> 24003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines 252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_PREFIX "mExportVar_" 2680706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines 271b6a0883cd6984e11e59b0c847fb334df1f41afcJason Samsnamespace slang { 281b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 29efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouilletclass RSReflectionCpp { 30efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet public: 3159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet RSReflectionCpp(const RSContext *Context, const std::string &OutputDirectory, 3259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet const std::string &RSSourceFileName, 3359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet const std::string &BitCodeFileName); 3402a9826b586f765a95e3c75bd6080c4ee8e2e911Stephen Hines virtual ~RSReflectionCpp(); 351b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 3659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet bool reflect(); 371b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 38efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet private: 391c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala struct Argument { 401c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala std::string Type; 411c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala std::string Name; 421c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala std::string DefaultValue; 431c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala Argument(std::string Type, std::string Name, std::string DefaultValue = "") 441c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala : Type(Type), Name(Name), DefaultValue(DefaultValue) {} 451c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala }; 461c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala typedef std::vector<Argument> ArgumentList; 47efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 48efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // Information coming from the compiler about the code we're reflecting. 49efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet const RSContext *mRSContext; 50efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 51efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // Path to the *.rs file for which we're generating C++ code. 52efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet std::string mRSSourceFilePath; 53efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // Path to the file that contains the byte code generated from the *.rs file. 54efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet std::string mBitCodeFilePath; 55efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // The directory where we'll generate the C++ files. 56efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet std::string mOutputDirectory; 57efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // A cleaned up version of the *.rs file name that can be used in generating 58efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // C++ identifiers. 59efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet std::string mCleanedRSFileName; 60efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // The name of the generated C++ class. 61efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet std::string mClassName; 62efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 63efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // TODO document 647dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines unsigned int mNextExportVarSlot; 657dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines unsigned int mNextExportFuncSlot; 667dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines unsigned int mNextExportForEachSlot; 671c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala unsigned int mNextExportReduceSlot; 687dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 69efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // Generated RS Elements for type-checking code. 70efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet std::set<std::string> mTypesToCheck; 71efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 727dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines inline void clear() { 737dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines mNextExportVarSlot = 0; 747dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines mNextExportFuncSlot = 0; 757dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines mNextExportForEachSlot = 0; 761c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala mNextExportReduceSlot = 0; 77003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines mTypesToCheck.clear(); 787dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines } 797dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 801f9d1217da29911dcd216b1b196da0ed170c166aJean-Luc Brouillet // The file we are currently generating, either the header or the 811f9d1217da29911dcd216b1b196da0ed170c166aJean-Luc Brouillet // implementation file. 821f9d1217da29911dcd216b1b196da0ed170c166aJean-Luc Brouillet GeneratedFile mOut; 831f9d1217da29911dcd216b1b196da0ed170c166aJean-Luc Brouillet 84efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet void genInitValue(const clang::APValue &Val, bool asBool = false); 85efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet static const char *getVectorAccessor(unsigned index); 86efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet inline unsigned int getNextExportVarSlot() { return mNextExportVarSlot++; } 887dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet inline unsigned int getNextExportFuncSlot() { return mNextExportFuncSlot++; } 907dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 917dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines inline unsigned int getNextExportForEachSlot() { 927dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines return mNextExportForEachSlot++; 937dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines } 947dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 951c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala inline unsigned int getNextExportReduceSlot() { 961c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala return mNextExportReduceSlot++; 971c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala } 981c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 99eb8b99eb6a25284017169ed91e1a3520b375ef03Jean-Luc Brouillet bool writeHeaderFile(); 100eb8b99eb6a25284017169ed91e1a3520b375ef03Jean-Luc Brouillet bool writeImplementationFile(); 1011c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 1021c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Write out signatures both in the header and implementation. 1031f9d1217da29911dcd216b1b196da0ed170c166aJean-Luc Brouillet void makeFunctionSignature(bool isDefinition, const RSExportFunc *ef); 1041c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void makeReduceSignatureAllocationVariant(bool isDefinition, const RSExportReduce *er); 1051c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void makeReduceSignatureArrayVariant(bool isDefinition, const RSExportReduce *er); 1061c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 107eb8b99eb6a25284017169ed91e1a3520b375ef03Jean-Luc Brouillet bool genEncodedBitCode(); 1081cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genFieldsToStoreExportVariableValues(); 1091cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genTypeInstancesUsedInForEach(); 1101c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void genTypeInstancesUsedInReduce(); 1111cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genFieldsForAllocationTypeVerification(); 1121c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 1131c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Write out the code for the getters and setters. 1141cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genExportVariablesGetterAndSetter(); 1151c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 1161c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Write out the code for the declaration of the kernel entry points. 1171cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genForEachDeclarations(); 1181c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void genReduceDeclarations(); 1191cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genExportFunctionDeclarations(); 1201b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 1211c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Write out code for the definitions of the kernel entry points. 1221c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void genExportForEachBodies(); 1231c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void genExportReduceBodies(); 1241c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void genExportFunctionBodies(); 1251c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 12602a9826b586f765a95e3c75bd6080c4ee8e2e911Stephen Hines bool startScriptHeader(); 1277dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 12880706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines // Write out code for an export variable initialization. 1292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet void genInitExportVariable(const RSExportType *ET, const std::string &VarName, 13080706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines const clang::APValue &Val); 13180706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines void genZeroInitExportVariable(const std::string &VarName); 13280706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines void genInitBoolExportVariable(const std::string &VarName, 13380706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines const clang::APValue &Val); 13480706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines void genInitPrimitiveExportVariable(const std::string &VarName, 13580706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines const clang::APValue &Val); 13680706836b18127b5733d790613a5d1b9f97cbb1dStephen Hines 1377dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines // Produce an argument string of the form "T1 t, T2 u, T3 v". 138eb8b99eb6a25284017169ed91e1a3520b375ef03Jean-Luc Brouillet void genArguments(const ArgumentList &Args, int Offset); 1397dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 1407dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines void genPointerTypeExportVariable(const RSExportVar *EV); 1417dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines void genMatrixTypeExportVariable(const RSExportVar *EV); 1427dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines void genRecordTypeExportVariable(const RSExportVar *EV); 1437dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 1441cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genGetterAndSetter(const RSExportPrimitiveType *EPT, const RSExportVar* EV); 1451cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genGetterAndSetter(const RSExportVectorType *EVT, const RSExportVar* EV); 1461cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genGetterAndSetter(const RSExportConstantArrayType *AT, const RSExportVar* EV); 1471cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet void genGetterAndSetter(const RSExportRecordType *ERT, const RSExportVar *EV); 1481cea27191515a15bbec86e259be622865e34d63eJean-Luc Brouillet 1497dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines // Write out a local FieldPacker (if necessary). 1502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet bool genCreateFieldPacker(const RSExportType *T, const char *FieldPackerName); 1517dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines 1527dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines // Populate (write) the FieldPacker with add() operations. 1532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet void genPackVarOfType(const RSExportType *ET, const char *VarName, 1547dd6da2077ad17ea59f4239f5275074bf5642859Stephen Hines const char *FieldPackerName); 155003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines 156003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines // Generate a runtime type check for VarName. 157003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines void genTypeCheck(const RSExportType *ET, const char *VarName); 158003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines 1591c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Generate a runtime check that VarName is 1-dimensional. 1601c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void gen1DCheck(const std::string &VarName); 1611c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 1621c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Generate a runtime check that VarName is non-null. 1631c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void genNullOrEmptyArrayCheck(const std::string &ArrayName, const std::string &Length, 1641c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala const std::string &ValueToReturn); 1651c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 1661c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Generate a runtime check that ArrayName's length is a multiple of 1671c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // a vector size. 1681c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala void genVectorLengthCompatibilityCheck(const std::string &Length, unsigned VecSize, 1691c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala const std::string &ValueToReturn, 1701c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala unsigned IndentLevels = 1); 1711c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala 1721c6b927b4c59fabf44db846855ff5c4cfd48aa53Matt Wala // Generate a type instance for a given type. 173003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines void genTypeInstanceFromPointer(const RSExportType *ET); 174003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines void genTypeInstance(const RSExportType *ET); 175003ac666e57669d4312b5792068c3db302ee7b84Stephen Hines 1762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet}; // class RSReflectionCpp 1771b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 1782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang 1791b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 1802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_CPP_H_ NOLINT 181