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