slang_rs_context.h revision a41ce1d98094da84643995d40d71c529905123fc
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#ifndef _SLANG_COMPILER_RS_CONTEXT_H 26315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#define _SLANG_COMPILER_RS_CONTEXT_H 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <map> 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list> 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string> 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdio> 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 99ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringSet.h" 109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringMap.h" 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Preprocessor.h" 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm { 156315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class LLVMContext; 166315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class TargetData; 179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace llvm 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang { 206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class VarDecl; 216315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class ASTContext; 226315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class TargetInfo; 236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class FunctionDecl; 246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class SourceManager; 259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace clang 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 28a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportable; 29a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportVar; 30a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportFunc; 31a41ce1d98094da84643995d40d71c529905123fcZonr Chang class RSExportType; 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext { 349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportVarSet; 359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportFuncSet; 369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringSet<> NeedExportTypeSet; 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 39a41ce1d98094da84643995d40d71c529905123fcZonr Chang typedef std::list<RSExportable*> ExportableList; 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::list<RSExportVar*> ExportVarList; 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::list<RSExportFunc*> ExportFuncList; 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef llvm::StringMap<RSExportType*> ExportTypeMap; 439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Preprocessor *mPP; 469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::ASTContext *mCtx; 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetInfo *mTarget; 489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::TargetData *mTargetData; 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::LLVMContext &mLLVMContext; 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 52a41ce1d98094da84643995d40d71c529905123fcZonr Chang ExportableList mExportables; 53a41ce1d98094da84643995d40d71c529905123fcZonr Chang 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(); 123a41ce1d98094da84643995d40d71c529905123fcZonr Chang inline void newExportable(RSExportable *E) { 124a41ce1d98094da84643995d40d71c529905123fcZonr Chang if (E != NULL) 125a41ce1d98094da84643995d40d71c529905123fcZonr Chang mExportables.push_back(E); 126a41ce1d98094da84643995d40d71c529905123fcZonr Chang } 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportVarList::const_iterator const_export_var_iterator; 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_var_iterator export_vars_begin() const { 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportVars.begin(); 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_var_iterator export_vars_end() const { 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportVars.end(); 1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline bool hasExportVar() const { 1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return !mExportVars.empty(); 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportFuncList::const_iterator const_export_func_iterator; 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_func_iterator export_funcs_begin() const { 1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportFuncs.begin(); 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_func_iterator export_funcs_end() const { 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportFuncs.end(); 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline bool hasExportFunc() const { return !mExportFuncs.empty(); } 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportTypeMap::iterator export_type_iterator; 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef ExportTypeMap::const_iterator const_export_type_iterator; 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao export_type_iterator export_types_begin() { return mExportTypes.begin(); } 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao export_type_iterator export_types_end() { return mExportTypes.end(); } 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_type_iterator export_types_begin() const { 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.begin(); 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_type_iterator export_types_end() const { 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.end(); 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline bool hasExportType() const { return !mExportTypes.empty(); } 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao export_type_iterator findExportType(const llvm::StringRef &TypeName) { 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.find(TypeName); 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const_export_type_iterator findExportType(const llvm::StringRef &TypeName) 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const { 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mExportTypes.find(TypeName); 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Insert the specified Typename/Type pair into the map. If the key already 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // exists in the map, return false and ignore the request, otherwise insert it 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // and return true. 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type); 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool reflectToJava(const char *OutputPackageName, 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName, 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao char realPackageName[], 1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int bSize); 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool reflectToJavaPath(const char *OutputPathName); 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ~RSContext(); 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace slang 183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1846315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif // _SLANG_COMPILER_RS_CONTEXT_H 185