blob: f451ce6c72569bf8f4de2d03f25097fd52af0cbb [file] [log] [blame]
Jason Sams1b6a0882012-03-12 15:07:58 -07001/*
2 * Copyright 2012, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jean-Luc Brouilletefcff102014-06-03 16:13:51 -070017#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_CPP_H_ // NOLINT
Jason Sams1b6a0882012-03-12 15:07:58 -070018#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_CPP_H_
19
Jean-Luc Brouillet1f9d1212014-06-02 20:27:29 -070020#include "slang_rs_reflect_utils.h"
Jason Sams1b6a0882012-03-12 15:07:58 -070021
Stephen Hines003ac662013-08-21 00:37:51 -070022#include <set>
23#include <string>
24
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -070025#define RS_EXPORT_VAR_PREFIX "mExportVar_"
Stephen Hines80706832013-08-28 18:08:57 -070026
Jason Sams1b6a0882012-03-12 15:07:58 -070027namespace slang {
28
Jean-Luc Brouilletefcff102014-06-03 16:13:51 -070029class RSReflectionCpp {
30 public:
Jean-Luc Brouillet59f22c32014-06-04 14:53:48 -070031 RSReflectionCpp(const RSContext *Context, const std::string &OutputDirectory,
32 const std::string &RSSourceFileName,
33 const std::string &BitCodeFileName);
Stephen Hines02a98262012-11-14 12:40:26 -080034 virtual ~RSReflectionCpp();
35
Jean-Luc Brouillet59f22c32014-06-04 14:53:48 -070036 bool reflect();
Jason Sams1b6a0882012-03-12 15:07:58 -070037
Jean-Luc Brouilletefcff102014-06-03 16:13:51 -070038 private:
39 // List of of (type, name) pairs.
40 typedef std::vector<std::pair<std::string, std::string> > ArgumentList;
41
42 // Information coming from the compiler about the code we're reflecting.
43 const RSContext *mRSContext;
44
45 // Path to the *.rs file for which we're generating C++ code.
46 std::string mRSSourceFilePath;
47 // Path to the file that contains the byte code generated from the *.rs file.
48 std::string mBitCodeFilePath;
49 // The directory where we'll generate the C++ files.
50 std::string mOutputDirectory;
51 // A cleaned up version of the *.rs file name that can be used in generating
52 // C++ identifiers.
53 std::string mCleanedRSFileName;
54 // The name of the generated C++ class.
55 std::string mClassName;
56
57 // TODO document
Stephen Hines7dd6da22012-11-15 19:56:03 -080058 unsigned int mNextExportVarSlot;
59 unsigned int mNextExportFuncSlot;
60 unsigned int mNextExportForEachSlot;
61
Jean-Luc Brouilletefcff102014-06-03 16:13:51 -070062 // Generated RS Elements for type-checking code.
63 std::set<std::string> mTypesToCheck;
64
Stephen Hines7dd6da22012-11-15 19:56:03 -080065 inline void clear() {
66 mNextExportVarSlot = 0;
67 mNextExportFuncSlot = 0;
68 mNextExportForEachSlot = 0;
Stephen Hines003ac662013-08-21 00:37:51 -070069 mTypesToCheck.clear();
Stephen Hines7dd6da22012-11-15 19:56:03 -080070 }
71
Jean-Luc Brouillet1f9d1212014-06-02 20:27:29 -070072 // The file we are currently generating, either the header or the
73 // implementation file.
74 GeneratedFile mOut;
75
Jean-Luc Brouilletefcff102014-06-03 16:13:51 -070076 void genInitValue(const clang::APValue &Val, bool asBool = false);
77 static const char *getVectorAccessor(unsigned index);
78
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -070079 inline unsigned int getNextExportVarSlot() { return mNextExportVarSlot++; }
Stephen Hines7dd6da22012-11-15 19:56:03 -080080
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -070081 inline unsigned int getNextExportFuncSlot() { return mNextExportFuncSlot++; }
Stephen Hines7dd6da22012-11-15 19:56:03 -080082
83 inline unsigned int getNextExportForEachSlot() {
84 return mNextExportForEachSlot++;
85 }
86
Jean-Luc Brouilleteb8b99e2014-06-03 20:59:01 -070087 bool writeHeaderFile();
88 bool writeImplementationFile();
Jean-Luc Brouillet1f9d1212014-06-02 20:27:29 -070089 void makeFunctionSignature(bool isDefinition, const RSExportFunc *ef);
Jean-Luc Brouilleteb8b99e2014-06-03 20:59:01 -070090 bool genEncodedBitCode();
Jean-Luc Brouillet1cea2712014-06-05 13:54:11 -070091 void genFieldsToStoreExportVariableValues();
92 void genTypeInstancesUsedInForEach();
93 void genFieldsForAllocationTypeVerification();
94 void genExportVariablesGetterAndSetter();
95 void genForEachDeclarations();
96 void genExportFunctionDeclarations();
Jason Sams1b6a0882012-03-12 15:07:58 -070097
Stephen Hines02a98262012-11-14 12:40:26 -080098 bool startScriptHeader();
Stephen Hines7dd6da22012-11-15 19:56:03 -080099
Stephen Hines80706832013-08-28 18:08:57 -0700100 // Write out code for an export variable initialization.
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -0700101 void genInitExportVariable(const RSExportType *ET, const std::string &VarName,
Stephen Hines80706832013-08-28 18:08:57 -0700102 const clang::APValue &Val);
103 void genZeroInitExportVariable(const std::string &VarName);
104 void genInitBoolExportVariable(const std::string &VarName,
105 const clang::APValue &Val);
106 void genInitPrimitiveExportVariable(const std::string &VarName,
107 const clang::APValue &Val);
108
Stephen Hines7dd6da22012-11-15 19:56:03 -0800109 // Produce an argument string of the form "T1 t, T2 u, T3 v".
Jean-Luc Brouilleteb8b99e2014-06-03 20:59:01 -0700110 void genArguments(const ArgumentList &Args, int Offset);
Stephen Hines7dd6da22012-11-15 19:56:03 -0800111
Stephen Hines7dd6da22012-11-15 19:56:03 -0800112 void genPointerTypeExportVariable(const RSExportVar *EV);
Stephen Hines7dd6da22012-11-15 19:56:03 -0800113 void genMatrixTypeExportVariable(const RSExportVar *EV);
Stephen Hines7dd6da22012-11-15 19:56:03 -0800114 void genRecordTypeExportVariable(const RSExportVar *EV);
115
Jean-Luc Brouillet1cea2712014-06-05 13:54:11 -0700116 void genGetterAndSetter(const RSExportPrimitiveType *EPT, const RSExportVar* EV);
117 void genGetterAndSetter(const RSExportVectorType *EVT, const RSExportVar* EV);
118 void genGetterAndSetter(const RSExportConstantArrayType *AT, const RSExportVar* EV);
119 void genGetterAndSetter(const RSExportRecordType *ERT, const RSExportVar *EV);
120
Stephen Hines7dd6da22012-11-15 19:56:03 -0800121 // Write out a local FieldPacker (if necessary).
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -0700122 bool genCreateFieldPacker(const RSExportType *T, const char *FieldPackerName);
Stephen Hines7dd6da22012-11-15 19:56:03 -0800123
124 // Populate (write) the FieldPacker with add() operations.
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -0700125 void genPackVarOfType(const RSExportType *ET, const char *VarName,
Stephen Hines7dd6da22012-11-15 19:56:03 -0800126 const char *FieldPackerName);
Stephen Hines003ac662013-08-21 00:37:51 -0700127
128 // Generate a runtime type check for VarName.
129 void genTypeCheck(const RSExportType *ET, const char *VarName);
130
131 // Generate a type instance for a given forEach argument type.
132 void genTypeInstanceFromPointer(const RSExportType *ET);
133 void genTypeInstance(const RSExportType *ET);
134
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -0700135}; // class RSReflectionCpp
Jason Sams1b6a0882012-03-12 15:07:58 -0700136
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -0700137} // namespace slang
Jason Sams1b6a0882012-03-12 15:07:58 -0700138
Jean-Luc Brouillet2ce118e2014-05-27 17:41:22 -0700139#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_CPP_H_ NOLINT