slang_rs_context.h revision 641558f02fe6ce0ee3ae5076eb366c25e2ad5903
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 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#ifndef _SLANG_COMPILER_RS_CONTEXT_H 186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#define _SLANG_COMPILER_RS_CONTEXT_H 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <map> 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list> 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string> 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdio> 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringSet.h" 269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringMap.h" 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Preprocessor.h" 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm { 316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class LLVMContext; 326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class TargetData; 339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace llvm 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang { 366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class VarDecl; 376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class ASTContext; 386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class TargetInfo; 396315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class FunctionDecl; 406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class SourceManager; 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace clang 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 44a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportable; 45a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportVar; 46a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportFunc; 47a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportType; 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext { 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportVarSet; 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportFuncSet; 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportTypeSet; 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 55a41ce1d98094da84643995d40d71c529905123fcZonr Chang typedef std::list<RSExportable*> ExportableList; 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::list<RSExportVar*> ExportVarList; 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::list<RSExportFunc*> ExportFuncList; 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringMap<RSExportType*> ExportTypeMap; 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Preprocessor *mPP; 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::ASTContext *mCtx; 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetInfo *mTarget; 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::TargetData *mTargetData; 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::LLVMContext &mLLVMContext; 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 68a41ce1d98094da84643995d40d71c529905123fcZonr Chang ExportableList mExportables; 69a41ce1d98094da84643995d40d71c529905123fcZonr Chang 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Record the variables/types/elements annotated in #pragma to be exported 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportVarSet mNeedExportVars; 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportFuncSet mNeedExportFuncs; 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportTypeSet mNeedExportTypes; 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mExportAllNonStaticVars; 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mExportAllNonStaticFuncs; 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string *mLicenseNote; 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mReflectJavaPackageName; 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mReflectJavaPathName; 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool processExportVar(const clang::VarDecl *VD); 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool processExportFunc(const clang::FunctionDecl *FD); 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool processExportType(const llvm::StringRef &Name); 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportVarList mExportVars; 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportFuncList mExportFuncs; 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportTypeMap mExportTypes; 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSContext(clang::Preprocessor *PP, 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::ASTContext *Ctx, 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetInfo *Target); 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline clang::Preprocessor *getPreprocessor() const { return mPP; } 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline clang::ASTContext *getASTContext() const { return mCtx; } 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const llvm::TargetData *getTargetData() const { return mTargetData; } 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; } 989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const clang::SourceManager *getSourceManager() const { 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return &mPP->getSourceManager(); 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setLicenseNote(const std::string &S) { 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mLicenseNote = new std::string(S); 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string *getLicenseNote() const { return mLicenseNote; } 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addExportVar(const std::string &S) { 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportVars.insert(S); 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addExportFunc(const std::string &S) { 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportFuncs.insert(S); 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addExportType(const std::string &S) { 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportTypes.insert(S); 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setExportAllNonStaticVars(bool flag) { 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportAllNonStaticVars = flag; 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setExportAllNonStaticFuncs(bool flag) { 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportAllNonStaticFuncs = flag; 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setReflectJavaPackageName(const std::string &S) { 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mReflectJavaPackageName = S; 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void 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 1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ~RSContext(); 195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace slang 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1996315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif // _SLANG_COMPILER_RS_CONTEXT_H 200