slang_rs_context.h revision 9ef2f785e0cc490af678dfd685995dec787321ff
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#ifndef _SLANG_COMPILER_RS_CONTEXT_HPP 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define _SLANG_COMPILER_RS_CONTEXT_HPP 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_element.hpp" 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <map> 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list> 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string> 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdio> 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringSet.h" 129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringMap.h" 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Preprocessor.h" 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm { 179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass LLVMContext; 189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass TargetData; 199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace llvm 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang { 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass VarDecl; 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass ASTContext; 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass TargetInfo; 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass FunctionDecl; 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass SourceManager; 279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace clang 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportVar; 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunc; 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportType; 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSPragmaHandler; 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext { 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportVarSet; 389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportFuncSet; 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportTypeSet; 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::list<RSExportVar*> ExportVarList; 439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::list<RSExportFunc*> ExportFuncList; 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringMap<RSExportType*> ExportTypeMap; 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Preprocessor *mPP; 489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::ASTContext *mCtx; 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetInfo *mTarget; 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::TargetData *mTargetData; 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::LLVMContext &mLLVMContext; 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Record the variables/types/elements annotated in #pragma to be exported 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportVarSet mNeedExportVars; 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportFuncSet mNeedExportFuncs; 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportTypeSet mNeedExportTypes; 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mExportAllNonStaticVars; 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mExportAllNonStaticFuncs; 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string *mLicenseNote; 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mReflectJavaPackageName; 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mReflectJavaPathName; 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool processExportVar(const clang::VarDecl *VD); 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool processExportFunc(const clang::FunctionDecl *FD); 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool processExportType(const llvm::StringRef &Name); 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportVarList mExportVars; 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportFuncList mExportFuncs; 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportTypeMap mExportTypes; 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSContext(clang::Preprocessor *PP, 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::ASTContext *Ctx, 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetInfo *Target); 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline clang::Preprocessor *getPreprocessor() const { return mPP; } 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline clang::ASTContext *getASTContext() const { return mCtx; } 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const llvm::TargetData *getTargetData() const { return mTargetData; } 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; } 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const clang::SourceManager *getSourceManager() const { 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return &mPP->getSourceManager(); 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setLicenseNote(const std::string &S) { 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mLicenseNote = new std::string(S); 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string *getLicenseNote() const { return mLicenseNote; } 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addExportVar(const std::string &S) { 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportVars.insert(S); 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addExportFunc(const std::string &S) { 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportFuncs.insert(S); 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addExportType(const std::string &S) { 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportTypes.insert(S); 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setExportAllNonStaticVars(bool flag) { 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportAllNonStaticVars = flag; 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setExportAllNonStaticFuncs(bool flag) { 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportAllNonStaticFuncs = flag; 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setReflectJavaPackageName(const std::string &S) { 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mReflectJavaPackageName = S; 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setReflectJavaPathName(const std::string &S) { 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mReflectJavaPathName = S; 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline std::string getReflectJavaPathName() const { 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mReflectJavaPathName; 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void processExport(); 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportVarList::const_iterator const_export_var_iterator; 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_var_iterator export_vars_begin() const { 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportVars.begin(); 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_var_iterator export_vars_end() const { 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportVars.end(); 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline bool hasExportVar() const { 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return !mExportVars.empty(); 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportFuncList::const_iterator const_export_func_iterator; 1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_func_iterator export_funcs_begin() const { 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportFuncs.begin(); 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_func_iterator export_funcs_end() const { 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportFuncs.end(); 1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline bool hasExportFunc() const { return !mExportFuncs.empty(); } 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportTypeMap::iterator export_type_iterator; 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportTypeMap::const_iterator const_export_type_iterator; 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao export_type_iterator export_types_begin() { return mExportTypes.begin(); } 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao export_type_iterator export_types_end() { return mExportTypes.end(); } 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_type_iterator export_types_begin() const { 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.begin(); 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_type_iterator export_types_end() const { 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.end(); 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline bool hasExportType() const { return !mExportTypes.empty(); } 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao export_type_iterator findExportType(const llvm::StringRef &TypeName) { 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.find(TypeName); 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_type_iterator findExportType(const llvm::StringRef &TypeName) 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const { 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.find(TypeName); 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Insert the specified Typename/Type pair into the map. If the key already 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // exists in the map, return false and ignore the request, otherwise insert it 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // and return true. 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type); 1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool reflectToJava(const char *OutputPackageName, 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName, 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao char realPackageName[], 1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int bSize); 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool reflectToJavaPath(const char *OutputPathName); 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ~RSContext(); 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace slang 179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif // _SLANG_COMPILER_RS_CONTEXT_HPP 181