1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_ELEMENT_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_ELEMENT_H_
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include <string>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Lex/Token.h"
23e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/StringMap.h"
256315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/StringRef.h"
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h"
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace clang {
306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class Type;
316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class DeclaratorDecl;
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSContext;
376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSExportType;
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportElement {
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // This is a utility class for handling the RS_ELEMENT_ADD* marker
41796e7b1400d3f3f7c07496d88bb48129ea925bb9Jean-Luc Brouillet  RSExportElement() { }
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef struct {
44cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet    DataType type;
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool normalized;
466e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines    unsigned vsize;
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } ElementInfo;
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringMap<const ElementInfo*> ElementInfoMapTy;
50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Macro name <-> ElementInfo
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static ElementInfoMapTy ElementInfoMap;
54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static bool Initialized;
56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportType *Create(RSContext *Context,
586315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                              const clang::Type *T,
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const ElementInfo *EI);
60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static const ElementInfo *GetElementInfo(const llvm::StringRef &Name);
62ecddee364d731c09c77b4c3fa647fa4f50e26756Stephen Hines
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static void Init();
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
666315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  static RSExportType *CreateFromDecl(RSContext *Context,
676315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                                      const clang::DeclaratorDecl *DD);
68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
72e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_ELEMENT_H_  NOLINT
73