slang_rs_context.h revision 462aefd62cc646d2ff753c1d003ef3cd7bbea26
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 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/StringSet.h" /* for class llvm::StringSet */ 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/StringMap.h" /* for class llvm::StringMap */ 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/Lex/Preprocessor.h" /* for class clang::Preprocessor */ 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm { 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao class LLVMContext; 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao class TargetData; 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace llvm */ 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang { 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass VarDecl; 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass ASTContext; 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass TargetInfo; 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass FunctionDecl; 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass SourceManager; 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace clang */ 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing namespace clang; 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportVar; 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunc; 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportType; 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSPragmaHandler; 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext { 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef llvm::StringSet<> NeedExportVarSet; 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef llvm::StringSet<> NeedExportFuncSet; 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef llvm::StringSet<> NeedExportTypeSet; 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef std::list<RSExportVar*> ExportVarList; 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef std::list<RSExportFunc*> ExportFuncList; 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef llvm::StringMap<RSExportType*> ExportTypeMap; 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprivate: 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Preprocessor* mPP; 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const TargetInfo* mTarget; 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::TargetData* mTargetData; 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::LLVMContext& mLLVMContext; 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSPragmaHandler* mRSExportVarPragma; 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSPragmaHandler* mRSExportFuncPragma; 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSPragmaHandler* mRSExportTypePragma; 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Remember the variables/types/elements annotated in #pragma to be exported */ 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NeedExportVarSet mNeedExportVars; 63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NeedExportFuncSet mNeedExportFuncs; 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NeedExportTypeSet mNeedExportTypes; 65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool processExportVar(const VarDecl* VD); 67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool processExportFunc(const FunctionDecl* FD); 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool processExportType(ASTContext& Ctx, const llvm::StringRef& Name); 69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportVarList mExportVars; 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportFuncList mExportFuncs; 72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportTypeMap mExportTypes; 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSContext(Preprocessor* PP, const TargetInfo* Target); 76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline Preprocessor* getPreprocessor() const { return mPP; } 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const llvm::TargetData* getTargetData() const { return mTargetData; } 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline llvm::LLVMContext& getLLVMContext() const { return mLLVMContext; } 80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const SourceManager* getSourceManager() const { return &mPP->getSourceManager(); } 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline void addExportVar(const std::string& S) { mNeedExportVars.insert(S); return; } 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline void addExportFunc(const std::string& S) { mNeedExportFuncs.insert(S); return; } 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline void addExportType(const std::string& S) { mNeedExportTypes.insert(S); return; } 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao void processExport(ASTContext& Ctx); 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef ExportVarList::const_iterator const_export_var_iterator; 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const_export_var_iterator export_vars_begin() const { return mExportVars.begin(); } 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const_export_var_iterator export_vars_end() const { return mExportVars.end(); } 91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline bool hasExportVar() const { return !mExportVars.empty(); } 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef ExportFuncList::const_iterator const_export_func_iterator; 94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const_export_func_iterator export_funcs_begin() const { return mExportFuncs.begin(); } 95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const_export_func_iterator export_funcs_end() const { return mExportFuncs.end(); } 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline bool hasExportFunc() const { return !mExportFuncs.empty(); } 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef ExportTypeMap::iterator export_type_iterator; 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef ExportTypeMap::const_iterator const_export_type_iterator; 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao export_type_iterator export_types_begin() { return mExportTypes.begin(); } 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao export_type_iterator export_types_end() { return mExportTypes.end(); } 102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const_export_type_iterator export_types_begin() const { return mExportTypes.begin(); } 103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const_export_type_iterator export_types_end() const { return mExportTypes.end(); } 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline bool hasExportType() const { return !mExportTypes.empty(); } 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao export_type_iterator findExportType(const llvm::StringRef& TypeName) { return mExportTypes.find(TypeName); } 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const_export_type_iterator findExportType(const llvm::StringRef& TypeName) const { return mExportTypes.find(TypeName); } 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * Insert the specified Typename/Type pair into the map. If the key 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * already exists in the map, return false and ignore the request, otherwise 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * insert it and return true. 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool insertExportType(const llvm::StringRef& TypeName, RSExportType* Type); 113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool reflectToJava(const char* OutputClassPath, const std::string& InputFileName, const std::string& OutputBCFileName); 115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ~RSContext(); 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif /* _SLANG_COMPILER_RS_CONTEXT_HPP */ 122