slang_rs_context.h revision f2174cfd6a556b51aadf2b8765e50df080e8f18e
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_CONTEXT_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <cstdio>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list>
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <map>
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Lex/Preprocessor.h"
263fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao#include "Mangle.h"
27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringSet.h"
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringMap.h"
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
313fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines#include "slang_pragma_recorder.h"
323fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm {
346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class LLVMContext;
356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class TargetData;
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace llvm
37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
396315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class VarDecl;
406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class ASTContext;
416315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class TargetInfo;
426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class SourceManager;
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
47a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportable;
48a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportVar;
49a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportFunc;
50a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportType;
51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext {
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportVarSet;
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportFuncSet;
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportTypeSet;
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
58a41ce1d98094da84643995d40d71c529905123fcZonr Chang  typedef std::list<RSExportable*> ExportableList;
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportVar*> ExportVarList;
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportFunc*> ExportFuncList;
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringMap<RSExportType*> ExportTypeMap;
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
649e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::Preprocessor &mPP;
659e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::ASTContext &mCtx;
669e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  const clang::TargetInfo &mTarget;
673fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  PragmaList *mPragmas;
684cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  std::vector<std::string> *mGeneratedFileNames;
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  llvm::TargetData *mTargetData;
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  llvm::LLVMContext &mLLVMContext;
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
73a41ce1d98094da84643995d40d71c529905123fcZonr Chang  ExportableList mExportables;
74a41ce1d98094da84643995d40d71c529905123fcZonr Chang
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  NeedExportTypeSet mNeedExportTypes;
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string *mLicenseNote;
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPackageName;
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPathName;
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int version;
823fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao  clang::CodeGen::MangleContext &mMangleCtx;
8396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportVar(const clang::VarDecl *VD);
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportFunc(const clang::FunctionDecl *FD);
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportType(const llvm::StringRef &Name);
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportVarList mExportVars;
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportFuncList mExportFuncs;
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportTypeMap mExportTypes;
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
939e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  RSContext(clang::Preprocessor &PP,
949e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines            clang::ASTContext &Ctx,
953fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines            const clang::TargetInfo &Target,
964cc67fce91f43215d61b2695746eab102a3db516Stephen Hines            PragmaList *Pragmas,
974cc67fce91f43215d61b2695746eab102a3db516Stephen Hines            std::vector<std::string> *GeneratedFileNames);
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
999e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::Preprocessor &getPreprocessor() const { return mPP; }
1009e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::ASTContext &getASTContext() const { return mCtx; }
101f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines  inline clang::CodeGen::MangleContext &getMangleContext() const {
102f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines    return mMangleCtx;
103f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines  }
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const llvm::TargetData *getTargetData() const { return mTargetData; }
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const clang::SourceManager *getSourceManager() const {
1079e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines    return &mPP.getSourceManager();
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1092ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines  inline clang::Diagnostic *getDiagnostics() const {
1102ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines    return &mPP.getDiagnostics();
1112ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines  }
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setLicenseNote(const std::string &S) {
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mLicenseNote = new std::string(S);
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const std::string *getLicenseNote() const { return mLicenseNote; }
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void addExportType(const std::string &S) {
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mNeedExportTypes.insert(S);
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setReflectJavaPackageName(const std::string &S) {
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mReflectJavaPackageName = S;
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1274cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  inline const std::string &getReflectJavaPackageName() {
1284cc67fce91f43215d61b2695746eab102a3db516Stephen Hines    return mReflectJavaPackageName;
1294cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  }
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
131c808a99831115928b4648f4c8b86dc682594217aStephen Hines  bool processExport();
132a41ce1d98094da84643995d40d71c529905123fcZonr Chang  inline void newExportable(RSExportable *E) {
133a41ce1d98094da84643995d40d71c529905123fcZonr Chang    if (E != NULL)
134a41ce1d98094da84643995d40d71c529905123fcZonr Chang      mExportables.push_back(E);
135a41ce1d98094da84643995d40d71c529905123fcZonr Chang  }
136641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  typedef ExportableList::iterator exportable_iterator;
137641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_begin() {
138641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.begin();
139641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
140641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_end() {
141641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.end();
142641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportVarList::const_iterator const_export_var_iterator;
1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_begin() const {
1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.begin();
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_end() const {
1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.end();
1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportVar() const {
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return !mExportVars.empty();
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportFuncList::const_iterator const_export_func_iterator;
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_begin() const {
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.begin();
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_end() const {
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.end();
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportFunc() const { return !mExportFuncs.empty(); }
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::iterator export_type_iterator;
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::const_iterator const_export_type_iterator;
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_begin() { return mExportTypes.begin(); }
1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_end() { return mExportTypes.end(); }
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_begin() const {
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.begin();
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_end() const {
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.end();
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportType() const { return !mExportTypes.empty(); }
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator findExportType(const llvm::StringRef &TypeName) {
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator findExportType(const llvm::StringRef &TypeName)
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const {
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Insert the specified Typename/Type pair into the map. If the key already
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // exists in the map, return false and ignore the request, otherwise insert it
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // and return true.
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type);
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
188b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  bool reflectToJava(const std::string &OutputPathBase,
189b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                     const std::string &OutputPackageName,
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     const std::string &InputFileName,
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     const std::string &OutputBCFileName,
192b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                     std::string *RealPackageName);
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
19496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int getVersion() const { return version; }
19596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  void setVersion(int v) {
19696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines    version = v;
19796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines    return;
19896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  }
19996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
2003fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  void addPragma(const std::string &T, const std::string &V) {
2013fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines    mPragmas->push_back(make_pair(T, V));
2023fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  }
2033fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ~RSContext();
205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
209e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  NOLINT
210