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