blob: c59ae2ca552c70a7baee3c1ae35c64c455ba4f25 [file] [log] [blame]
Zonr Changa65ec162010-10-17 01:53:05 +08001/*
2 * Copyright 2010, 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
17#include <string>
18#include <cstring>
Stephen Hinesd30158d2010-10-18 16:01:44 -070019#include <cstdio>
Zonr Changa65ec162010-10-17 01:53:05 +080020
Zonr Chang0307eaa2010-10-22 02:29:53 +080021#include "slang_rs_type_spec.h"
Zonr Changa65ec162010-10-17 01:53:05 +080022
23enum {
24#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) x,
Zonr Changb1771ef2010-10-22 18:03:46 +080025#define PRIMITIVE_DATA_TYPE_RANGE(x, y) \
26 FirstPrimitiveType = x, \
27 LastPrimitiveType = y,
Zonr Changa65ec162010-10-17 01:53:05 +080028 PRIMITIVE_DATA_TYPE_ENUMS
29#undef ENUM_PRIMITIVE_DATA_TYPE
Zonr Changb1771ef2010-10-22 18:03:46 +080030#undef PRIMITIVE_DATA_TYPE_RANGE
31
32#define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) x,
33#define RS_MATRIX_DATA_TYPE_RANGE(x, y) \
34 FirstRSMatrixType = x, \
35 LastRSMatrixType = y,
36 RS_MATRIX_DATA_TYPE_ENUMS
37#undef ENUM_RS_MATRIX_DATA_TYPE
38#undef RS_MATRIX_DATA_TYPE_RANGE
39
Zonr Changa65ec162010-10-17 01:53:05 +080040#define ENUM_RS_OBJECT_DATA_TYPE(x, name) x,
Zonr Changb1771ef2010-10-22 18:03:46 +080041#define RS_OBJECT_DATA_TYPE_RANGE(x, y) \
42 FirstRSObjectType = x, \
43 LastRSObjectType = y,
Zonr Changa65ec162010-10-17 01:53:05 +080044 RS_OBJECT_DATA_TYPE_ENUMS
45#undef ENUM_RS_OBJECT_DATA_TYPE
Zonr Changb1771ef2010-10-22 18:03:46 +080046#undef RS_OBJECT_DATA_TYPE_RANGE
Zonr Changa65ec162010-10-17 01:53:05 +080047};
48
49enum {
50#define ENUM_RS_DATA_KIND(x) x,
51 RS_DATA_KIND_ENUMS
52#undef ENUM_RS_DATA_KIND
53};
54
55class RSDataTypeSpec {
56 private:
57 const char *mTypeName; // e.g. Float32
58 // FIXME: better name
59 const char *mTypePragmaName; // e.g. float
60 size_t mBits;
61
62 protected:
Zonr Changb1771ef2010-10-22 18:03:46 +080063 enum {
64 DT_PrimitiveClass,
65 DT_RSMatrixClass,
66 DT_RSObjectClass
67 } mClass;
Zonr Changa65ec162010-10-17 01:53:05 +080068
69 public:
70 RSDataTypeSpec(const char *TypeName,
71 const char *TypePragmaName,
72 size_t Bits)
73 : mTypeName(TypeName),
74 mTypePragmaName(TypePragmaName),
75 mBits(Bits),
Zonr Changb1771ef2010-10-22 18:03:46 +080076 mClass(DT_PrimitiveClass) {
Zonr Changa65ec162010-10-17 01:53:05 +080077 return;
78 }
79
80 inline const char *getTypeName() const { return mTypeName; }
81 inline const char *getTypePragmaName() const { return mTypePragmaName; }
82 inline size_t getSizeInBit() const { return mBits; }
Zonr Changb1771ef2010-10-22 18:03:46 +080083 inline bool isRSMatrix() const { return (mClass == DT_RSMatrixClass); }
84 inline bool isRSObject() const { return (mClass == DT_RSObjectClass); }
85};
86
87class RSMatrixDataTypeSpec : public RSDataTypeSpec {
88 private:
89 unsigned mDim;
90
91 public:
92 RSMatrixDataTypeSpec(const char *TypeName,
93 const char *TypePragmaName,
94 unsigned Dim)
95 : RSDataTypeSpec(TypeName, TypePragmaName, Dim * Dim * sizeof(float)),
96 mDim(Dim) {
97 mClass = DT_RSMatrixClass;
98 return;
99 }
100
101 inline unsigned getDim() const { return mDim; }
Zonr Changa65ec162010-10-17 01:53:05 +0800102};
103
104class RSObjectDataTypeSpec : public RSDataTypeSpec {
105 public:
106 RSObjectDataTypeSpec(const char *TypeName,
107 const char *TypePragmaName)
108 : RSDataTypeSpec(TypeName, TypePragmaName, 32 /* opaque pointer */) {
Zonr Changb1771ef2010-10-22 18:03:46 +0800109 mClass = DT_RSObjectClass;
Zonr Changa65ec162010-10-17 01:53:05 +0800110 return;
111 }
112};
113
114/////////////////////////////////////////////////////////////////////////////
115
116// clang::BuiltinType::Kind -> RSDataTypeSpec
117class ClangBuiltinTypeMap {
118 const char *mBuiltinTypeKind;
119 const RSDataTypeSpec *mDataType;
120
121 public:
122 ClangBuiltinTypeMap(const char *BuiltinTypeKind,
123 const RSDataTypeSpec *DataType)
124 : mBuiltinTypeKind(BuiltinTypeKind),
125 mDataType(DataType) {
126 return;
127 }
128
129 inline const char *getBuiltinTypeKind() const { return mBuiltinTypeKind; }
130 inline const RSDataTypeSpec *getDataType() const { return mDataType; }
131};
132
133/////////////////////////////////////////////////////////////////////////////
134
135class RSDataKindSpec {
136 private:
137 const char *mKindName;
138
139 public:
140 explicit RSDataKindSpec(const char *KindName) : mKindName(KindName) {
141 return;
142 }
143
144 inline const char *getKindName() const { return mKindName; }
145};
146
147/////////////////////////////////////////////////////////////////////////////
148
149class RSDataElementSpec {
150 private:
151 const char *mElementName;
152 const RSDataKindSpec *mDataKind;
153 const RSDataTypeSpec *mDataType;
154 bool mIsNormal;
155 unsigned mVectorSize;
156
157 public:
158 RSDataElementSpec(const char *ElementName,
159 const RSDataKindSpec *DataKind,
160 const RSDataTypeSpec *DataType,
161 bool IsNormal,
162 unsigned VectorSize)
163 : mElementName(ElementName),
164 mDataKind(DataKind),
165 mDataType(DataType),
166 mIsNormal(IsNormal),
167 mVectorSize(VectorSize) {
168 return;
169 }
170
171 inline const char *getElementName() const { return mElementName; }
172 inline const RSDataKindSpec *getDataKind() const { return mDataKind; }
173 inline const RSDataTypeSpec *getDataType() const { return mDataType; }
174 inline bool isNormal() const { return mIsNormal; }
175 inline unsigned getVectorSize() const { return mVectorSize; }
176};
177
178/////////////////////////////////////////////////////////////////////////////
179
180// -gen-rs-data-type-enums
181//
Zonr Changb1771ef2010-10-22 18:03:46 +0800182// ENUM_PRIMITIVE_DATA_TYPE(type, cname, bits)
183// ENUM_PRIMITIVE_DATA_TYPE_RANGE(begin_type, end_type)
184// ENUM_RS_MATRIX_DATA_TYPE(type, cname, bits)
185// ENUM_RS_MATRIX_DATA_TYPE_RANGE(begin_type, end_type)
186// ENUM_RS_OBJECT_DATA_TYPE(type, cname, bits)
187// ENUM_RS_OBJECT_DATA_TYPE_RANGE(begin_type, end_type)
188//
Zonr Changa65ec162010-10-17 01:53:05 +0800189// ENUM_RS_DATA_TYPE(type, cname, bits)
190// e.g., ENUM_RS_DATA_TYPE(Float32, "float", 256)
191static int GenRSDataTypeEnums(const RSDataTypeSpec *const DataTypes[],
192 unsigned NumDataTypes) {
Zonr Changb1771ef2010-10-22 18:03:46 +0800193 // Alias missing #define
194#define ALIAS_DEF(x, y) \
195 printf("#ifndef " #x "\n"); \
196 printf("#define " #x "(type, cname, bits) " #y "(type, cname, bits)\n"); \
197 printf("#endif\n\n")
198 ALIAS_DEF(ENUM_PRIMITIVE_DATA_TYPE, ENUM_RS_DATA_TYPE);
199 ALIAS_DEF(ENUM_RS_MATRIX_DATA_TYPE, ENUM_RS_DATA_TYPE);
200 ALIAS_DEF(ENUM_RS_OBJECT_DATA_TYPE, ENUM_RS_DATA_TYPE);
201#undef ALIAS_DEF
202
203#define ALIAS_DEF(x) \
204 printf("#ifndef " #x "\n"); \
205 printf("#define " #x "(begin_type, end_type)\n"); \
206 printf("#endif\n\n")
207 ALIAS_DEF(ENUM_PRIMITIVE_DATA_TYPE_RANGE);
208 ALIAS_DEF(ENUM_RS_MATRIX_DATA_TYPE_RANGE);
209 ALIAS_DEF(ENUM_RS_OBJECT_DATA_TYPE_RANGE);
210#undef ALIAS_DEF
211
212#define DEF(x) \
213 printf(#x "(%s, \"%s\", %lu)\n", \
214 DataTypes[i]->getTypeName(), \
215 DataTypes[i]->getTypePragmaName(), \
216 DataTypes[i]->getSizeInBit());
217#define DEF_RANGE(x, begin, end) \
218 printf(#x "(%s, %s)\n\n", \
219 DataTypes[begin]->getTypeName(), \
220 DataTypes[end]->getTypeName())
221 for (unsigned i = FirstPrimitiveType; i <= LastPrimitiveType; i++)
222 DEF(ENUM_PRIMITIVE_DATA_TYPE);
223 DEF_RANGE(ENUM_PRIMITIVE_DATA_TYPE_RANGE,
224 FirstPrimitiveType, LastPrimitiveType);
225 for (unsigned i = FirstRSMatrixType; i <= LastRSMatrixType; i++)
226 DEF(ENUM_RS_MATRIX_DATA_TYPE)
227 DEF_RANGE(ENUM_RS_MATRIX_DATA_TYPE_RANGE,
228 FirstRSMatrixType, LastRSMatrixType);
229 for (unsigned i = FirstRSObjectType; i <= LastRSObjectType; i++)
230 DEF(ENUM_RS_OBJECT_DATA_TYPE)
231 DEF_RANGE(ENUM_RS_OBJECT_DATA_TYPE_RANGE,
232 FirstRSObjectType, LastRSObjectType);
233#undef DEF
234#undef DEF_RANGE
235
236#define UNDEF(x) \
237 printf("#undef " #x "\n")
238 UNDEF(ENUM_PRIMITIVE_DATA_TYPE);
239 UNDEF(ENUM_RS_MATRIX_DATA_TYPE);
240 UNDEF(ENUM_RS_OBJECT_DATA_TYPE);
241 UNDEF(ENUM_PRIMITIVE_DATA_TYPE_RANGE);
242 UNDEF(ENUM_RS_MATRIX_DATA_TYPE_RANGE);
243 UNDEF(ENUM_RS_OBJECT_DATA_TYPE_RANGE);
244 UNDEF(ENUM_RS_DATA_TYPE);
Zonr Changa65ec162010-10-17 01:53:05 +0800245 return 0;
246}
247
248// -gen-clang-builtin-cnames
249//
250// ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname)
251// e.g., ENUM_SUPPORT_BUILTIN_TYPE(clang::BuiltinType::Float, Float32, "float")
252static int GenClangBuiltinEnum(
253 const ClangBuiltinTypeMap *const ClangBuilitinsMap[],
254 unsigned NumClangBuilitins) {
255 for (unsigned i = 0; i < NumClangBuilitins; i++)
256 printf("ENUM_SUPPORT_BUILTIN_TYPE(%s, %s, \"%s\")\n",
257 ClangBuilitinsMap[i]->getBuiltinTypeKind(),
258 ClangBuilitinsMap[i]->getDataType()->getTypeName(),
259 ClangBuilitinsMap[i]->getDataType()->getTypePragmaName());
Zonr Chang3cd3dd32010-10-22 02:11:35 +0800260 printf("#undef ENUM_SUPPORT_BUILTIN_TYPE");
Zonr Changa65ec162010-10-17 01:53:05 +0800261 return 0;
262}
263
Zonr Changb1771ef2010-10-22 18:03:46 +0800264// -gen-rs-matrix-type-enums
265//
266// ENUM_RS_MATRIX_TYPE(type, cname, dim)
267// e.g., ENUM_RS_MATRIX_TYPE(RSMatrix2x2, "rs_matrix2x2", 2)
268static int GenRSMatrixTypeEnums(const RSDataTypeSpec *const DataTypes[],
269 unsigned NumDataTypes) {
270 for (unsigned i = 0; i < NumDataTypes; i++)
271 if (DataTypes[i]->isRSMatrix()) {
272 const RSMatrixDataTypeSpec *const MatrixDataType =
273 static_cast<const RSMatrixDataTypeSpec *const>(DataTypes[i]);
274 printf("ENUM_RS_MATRIX_TYPE(%s, \"%s\", %u)\n",
275 MatrixDataType->getTypeName(),
276 MatrixDataType->getTypePragmaName(),
277 MatrixDataType->getDim());
278 }
279 printf("#undef ENUM_RS_MATRIX_TYPE");
280 return 0;
281}
282
Zonr Changa65ec162010-10-17 01:53:05 +0800283// -gen-rs-object-type-enums
284//
285// ENUM_RS_OBJECT_TYPE(type, cname)
Zonr Changb1771ef2010-10-22 18:03:46 +0800286// e.g., ENUM_RS_OBJECT_TYPE(RSElement, "rs_element")
Zonr Changa65ec162010-10-17 01:53:05 +0800287static int GenRSObjectTypeEnums(const RSDataTypeSpec *const DataTypes[],
288 unsigned NumDataTypes) {
289 for (unsigned i = 0; i < NumDataTypes; i++)
290 if (DataTypes[i]->isRSObject())
291 printf("ENUM_RS_OBJECT_TYPE(%s, \"%s\")\n",
292 DataTypes[i]->getTypeName(),
293 DataTypes[i]->getTypePragmaName());
Zonr Chang3cd3dd32010-10-22 02:11:35 +0800294 printf("#undef ENUM_RS_OBJECT_TYPE");
Zonr Changa65ec162010-10-17 01:53:05 +0800295 return 0;
296}
297
298// -gen-rs-data-kind-enums
299//
300// ENUM_RS_DATA_KIND(kind)
301// e.g., ENUM_RS_DATA_KIND(PixelRGB)
302int GenRSDataKindEnums(const RSDataKindSpec *const DataKinds[],
303 unsigned NumDataKinds) {
304 for (unsigned i = 0; i < NumDataKinds; i++)
305 printf("ENUM_RS_DATA_KIND(%s)\n", DataKinds[i]->getKindName());
Zonr Chang3cd3dd32010-10-22 02:11:35 +0800306 printf("#undef ENUM_RS_DATA_KIND");
Zonr Changa65ec162010-10-17 01:53:05 +0800307 return 0;
308}
309
310// -gen-rs-data-element-enums
311//
312// ENUM_RS_DATA_ELEMENT(name, dt, dk, normailized, vsize)
313// e.g., ENUM_RS_DATA_ELEMENT("rs_pixel_rgba", PixelRGB, Unsigned8, true, 4)
314int GenRSDataElementEnums(const RSDataElementSpec *const DataElements[],
315 unsigned NumDataElements) {
316 for (unsigned i = 0; i < NumDataElements; i++)
317 printf("ENUM_RS_DATA_ELEMENT(\"%s\", %s, %s, %s, %d)\n",
318 DataElements[i]->getElementName(),
319 DataElements[i]->getDataKind()->getKindName(),
320 DataElements[i]->getDataType()->getTypeName(),
321 ((DataElements[i]->isNormal()) ? "true" : "false"),
322 DataElements[i]->getVectorSize());
Zonr Chang3cd3dd32010-10-22 02:11:35 +0800323 printf("#undef ENUM_RS_DATA_ELEMENT");
Zonr Changa65ec162010-10-17 01:53:05 +0800324 return 0;
325}
326
327int main(int argc, char **argv) {
328 if (argc < 2) {
329 fprintf(stderr, "usage: %s [gen type]\n", argv[0]);
330 return 1;
331 }
332
333 RSDataTypeSpec *DataTypes[] = {
334#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) \
335 new RSDataTypeSpec(#x , name, bits),
Zonr Changb1771ef2010-10-22 18:03:46 +0800336#define PRIMITIVE_DATA_TYPE_RANGE(x, y)
Zonr Changa65ec162010-10-17 01:53:05 +0800337 PRIMITIVE_DATA_TYPE_ENUMS
338#undef ENUM_PRIMITIVE_DATA_TYPE
Zonr Changb1771ef2010-10-22 18:03:46 +0800339#undef PRIMITIVE_DATA_TYPE_RANGE
340
341#define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) \
342 new RSMatrixDataTypeSpec(#x , name, dim),
343#define RS_MATRIX_DATA_TYPE_RANGE(x, y)
344 RS_MATRIX_DATA_TYPE_ENUMS
345#undef ENUM_RS_MATRIX_DATA_TYPE
346#undef RS_MATRIX_DATA_TYPE_RANGE
347
Zonr Changa65ec162010-10-17 01:53:05 +0800348#define ENUM_RS_OBJECT_DATA_TYPE(x, name) \
349 new RSObjectDataTypeSpec(#x, name),
Zonr Changb1771ef2010-10-22 18:03:46 +0800350#define RS_OBJECT_DATA_TYPE_RANGE(x, y)
Zonr Changa65ec162010-10-17 01:53:05 +0800351 RS_OBJECT_DATA_TYPE_ENUMS
352#undef ENUM_RS_OBJECT_DATA_TYPE
Zonr Changb1771ef2010-10-22 18:03:46 +0800353#undef RS_OBJECT_DATA_TYPE_RANGE
Zonr Changa65ec162010-10-17 01:53:05 +0800354 };
355
356 unsigned NumDataTypes = sizeof(DataTypes) / sizeof(DataTypes[0]);
357 /////////////////////////////////////////////////////////////////////////////
358
359 ClangBuiltinTypeMap *ClangBuilitinsMap[] = {
360 new ClangBuiltinTypeMap("clang::BuiltinType::Bool", DataTypes[Boolean]),
361 new ClangBuiltinTypeMap("clang::BuiltinType::Char_U", DataTypes[Unsigned8]),
362 new ClangBuiltinTypeMap("clang::BuiltinType::UChar", DataTypes[Unsigned8]),
363 new ClangBuiltinTypeMap("clang::BuiltinType::Char16", DataTypes[Signed16]),
364 new ClangBuiltinTypeMap("clang::BuiltinType::Char32", DataTypes[Signed32]),
365 new ClangBuiltinTypeMap("clang::BuiltinType::UShort", DataTypes[Unsigned16]),
366 new ClangBuiltinTypeMap("clang::BuiltinType::UInt", DataTypes[Unsigned32]),
367 new ClangBuiltinTypeMap("clang::BuiltinType::ULong", DataTypes[Unsigned32]),
368 new ClangBuiltinTypeMap("clang::BuiltinType::ULongLong", DataTypes[Unsigned64]),
369
370 new ClangBuiltinTypeMap("clang::BuiltinType::Char_S", DataTypes[Signed8]),
371 new ClangBuiltinTypeMap("clang::BuiltinType::SChar", DataTypes[Signed8]),
372 new ClangBuiltinTypeMap("clang::BuiltinType::Short", DataTypes[Signed16]),
373 new ClangBuiltinTypeMap("clang::BuiltinType::Int", DataTypes[Signed32]),
374 new ClangBuiltinTypeMap("clang::BuiltinType::Long", DataTypes[Signed64]),
375 new ClangBuiltinTypeMap("clang::BuiltinType::LongLong", DataTypes[Signed64]),
376
377 new ClangBuiltinTypeMap("clang::BuiltinType::Float", DataTypes[Float32]),
378 new ClangBuiltinTypeMap("clang::BuiltinType::Double", DataTypes[Float64]),
379 };
380
381 unsigned NumClangBuilitins =
382 sizeof(ClangBuilitinsMap) / sizeof(ClangBuilitinsMap[0]);
383
384 /////////////////////////////////////////////////////////////////////////////
385
386 RSDataKindSpec *DataKinds[] = {
387#define ENUM_RS_DATA_KIND(x) \
388 new RSDataKindSpec(#x),
389 RS_DATA_KIND_ENUMS
390#undef ENUM_RS_DATA_KIND
391 };
392
393 unsigned NumDataKinds = sizeof(DataKinds) / sizeof(DataKinds[0]);
394 /////////////////////////////////////////////////////////////////////////////
395
396 RSDataElementSpec *DataElements[] = {
397 new RSDataElementSpec("rs_pixel_l",
398 DataKinds[PixelL],
399 DataTypes[Unsigned8],
400 /* IsNormal = */true, /* VectorSize = */1),
401 new RSDataElementSpec("rs_pixel_a",
402 DataKinds[PixelA],
403 DataTypes[Unsigned8],
404 true, 1),
405 new RSDataElementSpec("rs_pixel_la",
406 DataKinds[PixelLA],
407 DataTypes[Unsigned8],
408 true, 2),
409 new RSDataElementSpec("rs_pixel_rgb",
410 DataKinds[PixelRGB],
411 DataTypes[Unsigned8],
412 true, 3),
413 new RSDataElementSpec("rs_pixel_rgba",
414 DataKinds[PixelRGB],
415 DataTypes[Unsigned8],
416 true, 4),
417 new RSDataElementSpec("rs_pixel_rgb565",
418 DataKinds[PixelRGB],
419 DataTypes[Unsigned8],
420 true, 3),
421 new RSDataElementSpec("rs_pixel_rgb5551",
422 DataKinds[PixelRGBA],
423 DataTypes[Unsigned8],
424 true, 4),
425 new RSDataElementSpec("rs_pixel_rgb4444",
426 DataKinds[PixelRGBA],
427 DataTypes[Unsigned8],
428 true, 4),
429 };
430
431 unsigned NumDataElements = sizeof(DataElements) / sizeof(DataElements[0]);
432 /////////////////////////////////////////////////////////////////////////////
433 int Result = 1;
434
435 if (::strcmp(argv[1], "-gen-rs-data-type-enums") == 0)
436 Result = GenRSDataTypeEnums(DataTypes, NumDataTypes);
437 else if (::strcmp(argv[1], "-gen-clang-builtin-enums") == 0)
438 Result = GenClangBuiltinEnum(ClangBuilitinsMap, NumClangBuilitins);
Zonr Changb1771ef2010-10-22 18:03:46 +0800439 else if (::strcmp(argv[1], "-gen-rs-matrix-type-enums") == 0)
440 Result = GenRSMatrixTypeEnums(DataTypes, NumDataTypes);
Zonr Changa65ec162010-10-17 01:53:05 +0800441 else if (::strcmp(argv[1], "-gen-rs-object-type-enums") == 0)
442 Result = GenRSObjectTypeEnums(DataTypes, NumDataTypes);
443 else if (::strcmp(argv[1], "-gen-rs-data-kind-enums") == 0)
444 Result = GenRSDataKindEnums(DataKinds, NumDataKinds);
445 else if (::strcmp(argv[1], "-gen-rs-data-element-enums") == 0)
446 Result = GenRSDataElementEnums(DataElements, NumDataElements);
447 else
448 fprintf(stderr, "%s: Unknown table generation type '%s'\n",
449 argv[0], argv[1]);
450
451
452 /////////////////////////////////////////////////////////////////////////////
453 for (unsigned i = 0; i < NumDataTypes; i++)
454 delete DataTypes[i];
455 for (unsigned i = 0; i < NumClangBuilitins; i++)
456 delete ClangBuilitinsMap[i];
457 for (unsigned i = 0; i < NumDataKinds; i++)
458 delete DataKinds[i];
459 for (unsigned i = 0; i < NumDataElements; i++)
460 delete DataElements[i];
461
462 return Result;
463}