1a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang/*
2a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * Copyright 2010, The Android Open Source Project
3a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang *
4a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * you may not use this file except in compliance with the License.
6a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * You may obtain a copy of the License at
7a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang *
8a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang *
10a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * Unless required by applicable law or agreed to in writing, software
11a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * See the License for the specific language governing permissions and
14a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang * limitations under the License.
15a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang */
16a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
17d30158df95b37bc758df37addcc4ed19a3a92615Stephen Hines#include <cstdio>
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <cstring>
19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string>
21a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
220307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#include "slang_rs_type_spec.h"
23a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
24a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changenum {
25a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) x,
26b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define PRIMITIVE_DATA_TYPE_RANGE(x, y) \
27b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    FirstPrimitiveType = x, \
28b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    LastPrimitiveType = y,
29a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  PRIMITIVE_DATA_TYPE_ENUMS
30a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#undef ENUM_PRIMITIVE_DATA_TYPE
31b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef PRIMITIVE_DATA_TYPE_RANGE
32b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
33b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) x,
34b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define RS_MATRIX_DATA_TYPE_RANGE(x, y)  \
35b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    FirstRSMatrixType = x,  \
36b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    LastRSMatrixType = y,
37b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  RS_MATRIX_DATA_TYPE_ENUMS
38b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef ENUM_RS_MATRIX_DATA_TYPE
39b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef RS_MATRIX_DATA_TYPE_RANGE
40b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
41a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_RS_OBJECT_DATA_TYPE(x, name) x,
42b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define RS_OBJECT_DATA_TYPE_RANGE(x, y) \
43b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    FirstRSObjectType = x,  \
44b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    LastRSObjectType = y,
45a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RS_OBJECT_DATA_TYPE_ENUMS
46a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#undef ENUM_RS_OBJECT_DATA_TYPE
47b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef RS_OBJECT_DATA_TYPE_RANGE
48a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang};
49a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
50a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changenum {
51a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_RS_DATA_KIND(x) x,
52a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RS_DATA_KIND_ENUMS
53a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#undef ENUM_RS_DATA_KIND
54a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang};
55a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
56a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changclass RSDataTypeSpec {
57a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang private:
58a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const char *mTypeName;        // e.g. Float32
59a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  // FIXME: better name
60a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const char *mTypePragmaName;  // e.g. float
61a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  size_t mBits;
62a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
63a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang protected:
64b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  enum {
65b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    DT_PrimitiveClass,
66b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    DT_RSMatrixClass,
67b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    DT_RSObjectClass
68b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  } mClass;
69a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
70a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang public:
71a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RSDataTypeSpec(const char *TypeName,
72a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                 const char *TypePragmaName,
73a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                 size_t Bits)
74a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang      : mTypeName(TypeName),
75a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang        mTypePragmaName(TypePragmaName),
76a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang        mBits(Bits),
77b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang        mClass(DT_PrimitiveClass) {
78a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    return;
79a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  }
80a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
81a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const char *getTypeName() const { return mTypeName; }
82a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const char *getTypePragmaName() const { return mTypePragmaName; }
83a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline size_t getSizeInBit() const { return mBits; }
84b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  inline bool isRSMatrix() const { return (mClass == DT_RSMatrixClass); }
85b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  inline bool isRSObject() const { return (mClass == DT_RSObjectClass); }
86b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang};
87b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
88b1771ef128b10c4d4575634828006bfba20b1d9cZonr Changclass RSMatrixDataTypeSpec : public RSDataTypeSpec {
89b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang private:
90b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  unsigned mDim;
91e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  static float ignore;
92b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
93b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang public:
94b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  RSMatrixDataTypeSpec(const char *TypeName,
95b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang                       const char *TypePragmaName,
96b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang                       unsigned Dim)
97e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines      : RSDataTypeSpec(TypeName, TypePragmaName, Dim * Dim * sizeof(ignore)),
98b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang        mDim(Dim) {
99b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    mClass = DT_RSMatrixClass;
100b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    return;
101b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  }
102b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
103b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  inline unsigned getDim() const { return mDim; }
104a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang};
105a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
106a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changclass RSObjectDataTypeSpec : public RSDataTypeSpec {
107a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang public:
108a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RSObjectDataTypeSpec(const char *TypeName,
109a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                       const char *TypePragmaName)
110a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang      : RSDataTypeSpec(TypeName, TypePragmaName, 32 /* opaque pointer */) {
111b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    mClass = DT_RSObjectClass;
112a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    return;
113a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  }
114a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang};
115a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
116a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang/////////////////////////////////////////////////////////////////////////////
117a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
118a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// clang::BuiltinType::Kind -> RSDataTypeSpec
119a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changclass ClangBuiltinTypeMap {
120a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const char *mBuiltinTypeKind;
121a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const RSDataTypeSpec *mDataType;
122a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
123a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang public:
124a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  ClangBuiltinTypeMap(const char *BuiltinTypeKind,
125a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                      const RSDataTypeSpec *DataType)
126a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang      : mBuiltinTypeKind(BuiltinTypeKind),
127a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang        mDataType(DataType) {
128a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    return;
129a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  }
130a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
131a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const char *getBuiltinTypeKind() const { return mBuiltinTypeKind; }
132a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const RSDataTypeSpec *getDataType() const { return mDataType; }
133a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang};
134a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
135a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang/////////////////////////////////////////////////////////////////////////////
136a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
137a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changclass RSDataKindSpec {
138a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang private:
139a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const char *mKindName;
140a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
141a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang public:
142a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  explicit RSDataKindSpec(const char *KindName) : mKindName(KindName) {
143a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    return;
144a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  }
145a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
146a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const char *getKindName() const { return mKindName; }
147a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang};
148a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
149a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang/////////////////////////////////////////////////////////////////////////////
150a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
151a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changclass RSDataElementSpec {
152a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang private:
153a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const char *mElementName;
154a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const RSDataKindSpec *mDataKind;
155a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  const RSDataTypeSpec *mDataType;
156a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  bool mIsNormal;
157a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  unsigned mVectorSize;
158a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
159a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang public:
160a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RSDataElementSpec(const char *ElementName,
161a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                    const RSDataKindSpec *DataKind,
162a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                    const RSDataTypeSpec *DataType,
163a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                    bool IsNormal,
164a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                    unsigned VectorSize)
165a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang      : mElementName(ElementName),
166a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang        mDataKind(DataKind),
167a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang        mDataType(DataType),
168a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang        mIsNormal(IsNormal),
169a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang        mVectorSize(VectorSize) {
170a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    return;
171a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  }
172a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
173a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const char *getElementName() const { return mElementName; }
174a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const RSDataKindSpec *getDataKind() const { return mDataKind; }
175a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline const RSDataTypeSpec *getDataType() const { return mDataType; }
176a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline bool isNormal() const { return mIsNormal; }
177a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  inline unsigned getVectorSize() const { return mVectorSize; }
178a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang};
179a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
180a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang/////////////////////////////////////////////////////////////////////////////
181a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
182a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// -gen-rs-data-type-enums
183a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang//
184b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// ENUM_PRIMITIVE_DATA_TYPE(type, cname, bits)
185b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// ENUM_PRIMITIVE_DATA_TYPE_RANGE(begin_type, end_type)
186b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// ENUM_RS_MATRIX_DATA_TYPE(type, cname, bits)
187b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// ENUM_RS_MATRIX_DATA_TYPE_RANGE(begin_type, end_type)
188b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// ENUM_RS_OBJECT_DATA_TYPE(type, cname, bits)
189b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// ENUM_RS_OBJECT_DATA_TYPE_RANGE(begin_type, end_type)
190b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang//
191a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// ENUM_RS_DATA_TYPE(type, cname, bits)
192a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// e.g., ENUM_RS_DATA_TYPE(Float32, "float", 256)
193a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changstatic int GenRSDataTypeEnums(const RSDataTypeSpec *const DataTypes[],
194a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                              unsigned NumDataTypes) {
195b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  // Alias missing #define
196b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define ALIAS_DEF(x, y) \
197b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf("#ifndef " #x "\n");  \
198b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf("#define " #x "(type, cname, bits) " #y "(type, cname, bits)\n");  \
199b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf("#endif\n\n")
200b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  ALIAS_DEF(ENUM_PRIMITIVE_DATA_TYPE, ENUM_RS_DATA_TYPE);
201b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  ALIAS_DEF(ENUM_RS_MATRIX_DATA_TYPE, ENUM_RS_DATA_TYPE);
202b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  ALIAS_DEF(ENUM_RS_OBJECT_DATA_TYPE, ENUM_RS_DATA_TYPE);
203b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef ALIAS_DEF
204b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
205b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define ALIAS_DEF(x) \
206b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf("#ifndef " #x "\n");  \
207b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf("#define " #x "(begin_type, end_type)\n");  \
208b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf("#endif\n\n")
209b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  ALIAS_DEF(ENUM_PRIMITIVE_DATA_TYPE_RANGE);
210b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  ALIAS_DEF(ENUM_RS_MATRIX_DATA_TYPE_RANGE);
211b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  ALIAS_DEF(ENUM_RS_OBJECT_DATA_TYPE_RANGE);
212b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef ALIAS_DEF
213b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
214b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define DEF(x) \
215b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf(#x "(%s, \"%s\", %lu)\n",  \
216b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang         DataTypes[i]->getTypeName(), \
217b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang         DataTypes[i]->getTypePragmaName(), \
218e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines         (unsigned long) DataTypes[i]->getSizeInBit());  // NOLINT(runtime/int)
219b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define DEF_RANGE(x, begin, end)  \
220b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf(#x "(%s, %s)\n\n", \
221b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang         DataTypes[begin]->getTypeName(), \
222b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang         DataTypes[end]->getTypeName())
223b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  for (unsigned i = FirstPrimitiveType; i <= LastPrimitiveType; i++)
224b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    DEF(ENUM_PRIMITIVE_DATA_TYPE);
225b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  DEF_RANGE(ENUM_PRIMITIVE_DATA_TYPE_RANGE,
226b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            FirstPrimitiveType, LastPrimitiveType);
227b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  for (unsigned i = FirstRSMatrixType; i <= LastRSMatrixType; i++)
228b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    DEF(ENUM_RS_MATRIX_DATA_TYPE)
229b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  DEF_RANGE(ENUM_RS_MATRIX_DATA_TYPE_RANGE,
230b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            FirstRSMatrixType, LastRSMatrixType);
231b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  for (unsigned i = FirstRSObjectType; i <= LastRSObjectType; i++)
232b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    DEF(ENUM_RS_OBJECT_DATA_TYPE)
233b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  DEF_RANGE(ENUM_RS_OBJECT_DATA_TYPE_RANGE,
234b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang            FirstRSObjectType, LastRSObjectType);
235b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef DEF
236b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef DEF_RANGE
237b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
238b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define UNDEF(x)  \
239b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  printf("#undef " #x "\n")
240b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  UNDEF(ENUM_PRIMITIVE_DATA_TYPE);
241b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  UNDEF(ENUM_RS_MATRIX_DATA_TYPE);
242b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  UNDEF(ENUM_RS_OBJECT_DATA_TYPE);
243b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  UNDEF(ENUM_PRIMITIVE_DATA_TYPE_RANGE);
244b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  UNDEF(ENUM_RS_MATRIX_DATA_TYPE_RANGE);
245b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  UNDEF(ENUM_RS_OBJECT_DATA_TYPE_RANGE);
246b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  UNDEF(ENUM_RS_DATA_TYPE);
247a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  return 0;
248a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang}
249a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
250a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// -gen-clang-builtin-cnames
251a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang//
252a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname)
253a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// e.g., ENUM_SUPPORT_BUILTIN_TYPE(clang::BuiltinType::Float, Float32, "float")
254a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changstatic int GenClangBuiltinEnum(
255a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    const ClangBuiltinTypeMap *const ClangBuilitinsMap[],
256a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    unsigned NumClangBuilitins) {
257a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumClangBuilitins; i++)
258a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    printf("ENUM_SUPPORT_BUILTIN_TYPE(%s, %s, \"%s\")\n",
259a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           ClangBuilitinsMap[i]->getBuiltinTypeKind(),
260a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           ClangBuilitinsMap[i]->getDataType()->getTypeName(),
261a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           ClangBuilitinsMap[i]->getDataType()->getTypePragmaName());
262b85033587194aed2b7f37059f66142d84576d9e8Shih-wei Liao  printf("#undef ENUM_SUPPORT_BUILTIN_TYPE\n");
263a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  return 0;
264a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang}
265a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
266b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// -gen-rs-matrix-type-enums
267b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang//
268b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// ENUM_RS_MATRIX_TYPE(type, cname, dim)
269b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// e.g., ENUM_RS_MATRIX_TYPE(RSMatrix2x2, "rs_matrix2x2", 2)
270b1771ef128b10c4d4575634828006bfba20b1d9cZonr Changstatic int GenRSMatrixTypeEnums(const RSDataTypeSpec *const DataTypes[],
271b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang                                unsigned NumDataTypes) {
272b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  for (unsigned i = 0; i < NumDataTypes; i++)
273b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    if (DataTypes[i]->isRSMatrix()) {
274b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang      const RSMatrixDataTypeSpec *const MatrixDataType =
275b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang          static_cast<const RSMatrixDataTypeSpec *const>(DataTypes[i]);
276b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang      printf("ENUM_RS_MATRIX_TYPE(%s, \"%s\", %u)\n",
277b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang             MatrixDataType->getTypeName(),
278b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang             MatrixDataType->getTypePragmaName(),
279b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang             MatrixDataType->getDim());
280b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    }
281b85033587194aed2b7f37059f66142d84576d9e8Shih-wei Liao  printf("#undef ENUM_RS_MATRIX_TYPE\n");
282b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  return 0;
283b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang}
284b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
285a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// -gen-rs-object-type-enums
286a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang//
287a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// ENUM_RS_OBJECT_TYPE(type, cname)
288b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang// e.g., ENUM_RS_OBJECT_TYPE(RSElement, "rs_element")
289a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changstatic int GenRSObjectTypeEnums(const RSDataTypeSpec *const DataTypes[],
290a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                                unsigned NumDataTypes) {
291a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumDataTypes; i++)
292a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    if (DataTypes[i]->isRSObject())
293a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang      printf("ENUM_RS_OBJECT_TYPE(%s, \"%s\")\n",
294a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang             DataTypes[i]->getTypeName(),
295a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang             DataTypes[i]->getTypePragmaName());
296b85033587194aed2b7f37059f66142d84576d9e8Shih-wei Liao  printf("#undef ENUM_RS_OBJECT_TYPE\n");
297a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  return 0;
298a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang}
299a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
300a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// -gen-rs-data-kind-enums
301a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang//
302a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// ENUM_RS_DATA_KIND(kind)
303a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// e.g., ENUM_RS_DATA_KIND(PixelRGB)
304a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changint GenRSDataKindEnums(const RSDataKindSpec *const DataKinds[],
305a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                       unsigned NumDataKinds) {
306a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumDataKinds; i++)
307a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    printf("ENUM_RS_DATA_KIND(%s)\n", DataKinds[i]->getKindName());
308b85033587194aed2b7f37059f66142d84576d9e8Shih-wei Liao  printf("#undef ENUM_RS_DATA_KIND\n");
309a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  return 0;
310a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang}
311a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
312a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// -gen-rs-data-element-enums
313a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang//
314a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// ENUM_RS_DATA_ELEMENT(name, dt, dk, normailized, vsize)
315a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang// e.g., ENUM_RS_DATA_ELEMENT("rs_pixel_rgba", PixelRGB, Unsigned8, true, 4)
316a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changint GenRSDataElementEnums(const RSDataElementSpec *const DataElements[],
317a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          unsigned NumDataElements) {
318a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumDataElements; i++)
319a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    printf("ENUM_RS_DATA_ELEMENT(\"%s\", %s, %s, %s, %d)\n",
320a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           DataElements[i]->getElementName(),
321a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           DataElements[i]->getDataKind()->getKindName(),
322a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           DataElements[i]->getDataType()->getTypeName(),
323a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           ((DataElements[i]->isNormal()) ? "true" : "false"),
324a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang           DataElements[i]->getVectorSize());
325b85033587194aed2b7f37059f66142d84576d9e8Shih-wei Liao  printf("#undef ENUM_RS_DATA_ELEMENT\n");
326a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  return 0;
327a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang}
328a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
329a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changint main(int argc, char **argv) {
330a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  if (argc < 2) {
331a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    fprintf(stderr, "usage: %s [gen type]\n", argv[0]);
332a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    return 1;
333a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  }
334a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
335a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RSDataTypeSpec *DataTypes[] = {
336a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) \
337a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  new RSDataTypeSpec(#x , name, bits),
338b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define PRIMITIVE_DATA_TYPE_RANGE(x, y)
339a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  PRIMITIVE_DATA_TYPE_ENUMS
340a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#undef ENUM_PRIMITIVE_DATA_TYPE
341b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef PRIMITIVE_DATA_TYPE_RANGE
342b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
343b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) \
344b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  new RSMatrixDataTypeSpec(#x , name, dim),
345b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define RS_MATRIX_DATA_TYPE_RANGE(x, y)
346b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  RS_MATRIX_DATA_TYPE_ENUMS
347b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef ENUM_RS_MATRIX_DATA_TYPE
348b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef RS_MATRIX_DATA_TYPE_RANGE
349b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
350a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_RS_OBJECT_DATA_TYPE(x, name)  \
351a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  new RSObjectDataTypeSpec(#x, name),
352b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define RS_OBJECT_DATA_TYPE_RANGE(x, y)
353a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RS_OBJECT_DATA_TYPE_ENUMS
354a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#undef ENUM_RS_OBJECT_DATA_TYPE
355b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef RS_OBJECT_DATA_TYPE_RANGE
356a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  };
357a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
358a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  unsigned NumDataTypes = sizeof(DataTypes) / sizeof(DataTypes[0]);
359a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  /////////////////////////////////////////////////////////////////////////////
360a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
361a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  ClangBuiltinTypeMap *ClangBuilitinsMap[] = {
362a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Bool",   DataTypes[Boolean]),
363a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Char_U", DataTypes[Unsigned8]),
364a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::UChar",  DataTypes[Unsigned8]),
365a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Char16", DataTypes[Signed16]),
366a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Char32", DataTypes[Signed32]),
367e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    new ClangBuiltinTypeMap(
368e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines      "clang::BuiltinType::UShort", DataTypes[Unsigned16]),
369e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    new ClangBuiltinTypeMap(
370e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines      "clang::BuiltinType::UInt", DataTypes[Unsigned32]),
371e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    new ClangBuiltinTypeMap(
372e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines      "clang::BuiltinType::ULong",  DataTypes[Unsigned32]),
373e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    new ClangBuiltinTypeMap(
374e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines      "clang::BuiltinType::ULongLong", DataTypes[Unsigned64]),
375a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
376a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Char_S", DataTypes[Signed8]),
377a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::SChar",  DataTypes[Signed8]),
378a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Short",  DataTypes[Signed16]),
379a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Int",    DataTypes[Signed32]),
380a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Long",   DataTypes[Signed64]),
381e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    new ClangBuiltinTypeMap(
382e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines      "clang::BuiltinType::LongLong", DataTypes[Signed64]),
383a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
384a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new ClangBuiltinTypeMap("clang::BuiltinType::Float",  DataTypes[Float32]),
385e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    new ClangBuiltinTypeMap("clang::BuiltinType::Double", DataTypes[Float64])
386a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  };
387a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
388a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  unsigned NumClangBuilitins =
389a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang      sizeof(ClangBuilitinsMap) / sizeof(ClangBuilitinsMap[0]);
390a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
391a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  /////////////////////////////////////////////////////////////////////////////
392a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
393a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RSDataKindSpec *DataKinds[] = {
394a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_RS_DATA_KIND(x)  \
395a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataKindSpec(#x),
396a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    RS_DATA_KIND_ENUMS
397a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#undef ENUM_RS_DATA_KIND
398a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  };
399a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
400a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  unsigned NumDataKinds = sizeof(DataKinds) / sizeof(DataKinds[0]);
401a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  /////////////////////////////////////////////////////////////////////////////
402a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
403a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  RSDataElementSpec *DataElements[] = {
404a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_l",
405a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelL],
406a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
407a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          /* IsNormal = */true, /* VectorSize = */1),
408a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_a",
409a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelA],
410a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
411a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          true, 1),
412a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_la",
413a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelLA],
414a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
415a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          true, 2),
416a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_rgb",
417a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelRGB],
418a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
419a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          true, 3),
420a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_rgba",
421a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelRGB],
422a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
423a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          true, 4),
424a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_rgb565",
425a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelRGB],
426a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
427a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          true, 3),
428a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_rgb5551",
429a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelRGBA],
430a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
431a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          true, 4),
432a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    new RSDataElementSpec("rs_pixel_rgb4444",
433a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataKinds[PixelRGBA],
434a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          DataTypes[Unsigned8],
435a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                          true, 4),
436a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  };
437a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
438a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  unsigned NumDataElements = sizeof(DataElements) / sizeof(DataElements[0]);
439a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  /////////////////////////////////////////////////////////////////////////////
440a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  int Result = 1;
441a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
442a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  if (::strcmp(argv[1], "-gen-rs-data-type-enums") == 0)
443a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    Result = GenRSDataTypeEnums(DataTypes, NumDataTypes);
444a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  else if (::strcmp(argv[1], "-gen-clang-builtin-enums") == 0)
445a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    Result = GenClangBuiltinEnum(ClangBuilitinsMap, NumClangBuilitins);
446b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  else if (::strcmp(argv[1], "-gen-rs-matrix-type-enums") == 0)
447b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    Result = GenRSMatrixTypeEnums(DataTypes, NumDataTypes);
448a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  else if (::strcmp(argv[1], "-gen-rs-object-type-enums") == 0)
449a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    Result = GenRSObjectTypeEnums(DataTypes, NumDataTypes);
450a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  else if (::strcmp(argv[1], "-gen-rs-data-kind-enums") == 0)
451a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    Result = GenRSDataKindEnums(DataKinds, NumDataKinds);
452a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  else if (::strcmp(argv[1], "-gen-rs-data-element-enums") == 0)
453a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    Result = GenRSDataElementEnums(DataElements, NumDataElements);
454a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  else
455a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    fprintf(stderr, "%s: Unknown table generation type '%s'\n",
456a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang                    argv[0], argv[1]);
457a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
458a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
459a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  /////////////////////////////////////////////////////////////////////////////
460a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumDataTypes; i++)
461a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    delete DataTypes[i];
462a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumClangBuilitins; i++)
463a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    delete ClangBuilitinsMap[i];
464a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumDataKinds; i++)
465a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    delete DataKinds[i];
466a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  for (unsigned i = 0; i < NumDataElements; i++)
467a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    delete DataElements[i];
468a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
469a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang  return Result;
470a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang}
471