slang_rs_context.cpp revision 9ef2f785e0cc490af678dfd685995dec787321ff
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang.hpp"
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp"
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_reflection.hpp"
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_var.hpp"
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_func.hpp"
6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type.hpp"
7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_pragma_handler.hpp"
8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
99ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TargetInfo.h"
109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/Linkage.h"
119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Type.h"
129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Decl.h"
139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/DeclBase.h"
149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/ASTContext.h"
159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Index/ASTLocation.h"
169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/LLVMContext.h"
189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/Target/TargetData.h"
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaousing namespace slang;
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSContext::RSContext(clang::Preprocessor *PP,
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     clang::ASTContext *Ctx,
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     const clang::TargetInfo *Target) :
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mPP(PP),
26001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liao    mCtx(Ctx),
27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mTarget(Target),
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mTargetData(NULL),
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mLLVMContext(llvm::getGlobalContext()),
30a50704238e06bc72a7ea3e8282fb5d350f88fd08Victor Hsieh    mExportAllNonStaticVars(false),
314c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao    mExportAllNonStaticFuncs(false),
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mLicenseNote(NULL) {
339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_var
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportVarHandler(this));
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_var_all
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportVarAllHandler(this));
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_func
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportFuncHandler(this));
44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_func_all
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportFuncAllHandler(this));
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_type
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportTypeHandler(this));
52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs java_package_name
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaJavaPackageNameHandler(this));
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs set_reflect_license
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaReflectLicenseHandler(this));
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Prepare target data
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mTargetData = new llvm::TargetData(Slang::TargetDescription);
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportVar(const clang::VarDecl *VD) {
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  assert(!VD->getName().empty() && "Variable name should not be empty");
69537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // TODO: some check on variable
71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportType *ET = RSExportType::CreateFromDecl(this, VD);
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!ET)
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportVar *EV = new RSExportVar(this, VD, ET);
779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (EV == NULL)
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mExportVars.push_back(EV);
81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportFunc(const clang::FunctionDecl* FD) {
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  assert(!FD->getName().empty() && "Function name should not be empty");
87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!FD->isThisDeclarationADefinition())
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (FD->getStorageClass() != clang::SC_None) {
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "RSContext::processExportFunc : cannot export extern or "
939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "static function '%s'\n", FD->getName().str().c_str());
949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportFunc *EF = RSExportFunc::Create(this, FD);
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (EF == NULL)
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mExportFuncs.push_back(EF);
102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportType(const llvm::StringRef &Name) {
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl();
109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  assert(TUDecl != NULL && "Translation unit declaration (top-level "
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                           "declaration) is null object");
112f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const clang::IdentifierInfo *II = mPP->getIdentifierInfo(Name);
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (II == NULL)
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // TODO: error: identifier @Name mark as an exportable type cannot be found
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
117f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::DeclContext::lookup_const_result R = TUDecl->lookup(II);
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportType *ET = NULL;
120f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportPointerType::IntegerType = mCtx->IntTy.getTypePtr();
122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (clang::DeclContext::lookup_const_iterator I = R.first, E = R.second;
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I != E;
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I++) {
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::NamedDecl *const ND = *I;
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const clang::Type *T = NULL;
128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    switch (ND->getKind()) {
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      case clang::Decl::Typedef: {
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        T = static_cast<const clang::TypedefDecl*>(
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            ND)->getCanonicalDecl()->getUnderlyingType().getTypePtr();
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      case clang::Decl::Record: {
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        T = static_cast<const clang::RecordDecl*>(ND)->getTypeForDecl();
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      default: {
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // unsupported, skip
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
144ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao      }
145ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao    }
146537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (T != NULL)
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      ET = RSExportType::Create(this, T);
1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportPointerType::IntegerType = NULL;
152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return (ET != NULL);
154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSContext::processExport() {
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mNeedExportVars.empty() &&
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mNeedExportFuncs.empty() &&
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      !mExportAllNonStaticVars && !mExportAllNonStaticFuncs) {
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "note: No reflection because there are no #pragma "
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "rs export_var(...), #pragma rs export_func(...), "
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "#pragma rs export_var_all, or #pragma rs export_func_all\n"
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            );
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //mExportAllNonStaticVars = true;
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //mExportAllNonStaticFuncs = true;
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Export variable
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl();
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (clang::DeclContext::decl_iterator DI = TUDecl->decls_begin(),
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           DE = TUDecl->decls_end();
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       DI != TUDecl->decls_end();
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       DI++) {
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (DI->getKind() == clang::Decl::Var) {
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      clang::VarDecl *VD = (clang::VarDecl*) (*DI);
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (mExportAllNonStaticVars &&
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          (VD->getLinkage() == clang::ExternalLinkage)) {
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!processExportVar(VD)) {
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          fprintf(stderr, "RSContext::processExport : failed to export var "
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                          "'%s'\n", VD->getNameAsString().c_str());
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      } else {
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        NeedExportVarSet::iterator EI = mNeedExportVars.find(VD->getName());
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (EI != mNeedExportVars.end() && processExportVar(VD)) {
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mNeedExportVars.erase(EI);
1863f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang        }
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else if (DI->getKind() == clang::Decl::Function) {
1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Export functions
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      clang::FunctionDecl *FD = (clang::FunctionDecl*) (*DI);
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (mExportAllNonStaticFuncs &&
1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          (FD->getLinkage() == clang::ExternalLinkage)) {
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!processExportFunc(FD)) {
1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          fprintf(stderr, "RSContext::processExport : failed to export func "
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                          "'%s'\n", FD->getNameAsString().c_str());
1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      } else {
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        NeedExportFuncSet::iterator EI = mNeedExportFuncs.find(FD->getName());
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (EI != mNeedExportFuncs.end() && processExportFunc(FD))
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mNeedExportFuncs.erase(EI);
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
2023f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    }
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Finally, export type forcely set to be exported by user
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (NeedExportTypeSet::const_iterator EI = mNeedExportTypes.begin(),
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           EE = mNeedExportTypes.end();
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       EI != EE;
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       EI++) {
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (!processExportType(EI->getKey())) {
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      fprintf(stderr, "RSContext::processExport : failed to export type "
2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao              "'%s'\n", EI->getKey().str().c_str());
2133f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    }
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
218537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::insertExportType(const llvm::StringRef &TypeName,
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                 RSExportType *ET) {
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportTypeMap::value_type *NewItem =
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      ExportTypeMap::value_type::Create(TypeName.begin(),
2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        TypeName.end(),
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        mExportTypes.getAllocator(),
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        ET);
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mExportTypes.insert(NewItem)) {
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return true;
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } else {
2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    free(NewItem);
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::reflectToJava(const char *OutputPackageName,
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const std::string &InputFileName,
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const std::string &OutputBCFileName,
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              char realPackageName[],
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              int bSize) {
2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (realPackageName != NULL) {
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    *realPackageName = 0;
2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (OutputPackageName == NULL) {
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (!mReflectJavaPackageName.empty()) {
2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      OutputPackageName = mReflectJavaPackageName.c_str();
2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else {
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // no package name, just return
2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return true;
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Copy back the really applied package name
2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (realPackageName != NULL) {
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    strncpy(realPackageName, OutputPackageName, bSize - 1);
2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSReflection *R = new RSReflection(this);
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool ret = R->reflect(OutputPackageName, InputFileName, OutputBCFileName);
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if(!ret)
2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "RSContext::reflectToJava : failed to do reflection "
2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "(%s)\n", R->getLastError());
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  delete R;
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return ret;
2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
2666de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::reflectToJavaPath(const char *OutputPathName) {
2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (OutputPathName == NULL)
2699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // no path name, just return
2706de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    return true;
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  setReflectJavaPathName(std::string(OutputPathName));
2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
2746de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao}
2756de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSContext::~RSContext() {
277f83d3c396d5d7eacd97cf0a5d3b6a01d75535b67Shih-wei Liao  /*    delete mRSExportVarPragma;  // These are deleted by mPP.reset() that was invoked at the end of Slang::compile(). Doing it again in ~RSContext here will cause seg-faults
2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        delete mRSExportFuncPragma;
2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        delete mRSExportTypePragma;
2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        delete mRSJavaPackageNamePragma;
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        delete mRSReflectLicensePragma;
282f83d3c396d5d7eacd97cf0a5d3b6a01d75535b67Shih-wei Liao  */
2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  delete mLicenseNote;
2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  delete mTargetData;
285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
286