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