slang_rs_context.cpp revision a41ce1d98094da84643995d40d71c529905123fc
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h"
26315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
36315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/LLVMContext.h"
46315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/Target/TargetData.h"
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TargetInfo.h"
79ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/Linkage.h"
89ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Type.h"
99ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Decl.h"
109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/DeclBase.h"
119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/ASTContext.h"
129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Index/ASTLocation.h"
139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang.h"
156315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflection.h"
16a41ce1d98094da84643995d40d71c529905123fcZonr Chang#include "slang_rs_exportable.h"
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_var.h"
186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_func.h"
196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h"
206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_pragma_handler.h"
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaousing namespace slang;
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSContext::RSContext(clang::Preprocessor *PP,
259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     clang::ASTContext *Ctx,
266315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                     const clang::TargetInfo *Target)
276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    : mPP(PP),
286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mCtx(Ctx),
296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mTarget(Target),
306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mTargetData(NULL),
316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mLLVMContext(llvm::getGlobalContext()),
326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mExportAllNonStaticVars(false),
336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mExportAllNonStaticFuncs(false),
346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mLicenseNote(NULL) {
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_var
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportVarHandler(this));
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_var_all
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportVarAllHandler(this));
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_func
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportFuncHandler(this));
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_func_all
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportFuncAllHandler(this));
50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs export_type
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaExportTypeHandler(this));
54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs java_package_name
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaJavaPackageNameHandler(this));
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // For #pragma rs set_reflect_license
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP->AddPragmaHandler(
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "rs", RSPragmaHandler::CreatePragmaReflectLicenseHandler(this));
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Prepare target data
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mTargetData = new llvm::TargetData(Slang::TargetDescription);
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportVar(const clang::VarDecl *VD) {
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  assert(!VD->getName().empty() && "Variable name should not be empty");
71537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
726315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  // TODO(zonr): some check on variable
73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportType *ET = RSExportType::CreateFromDecl(this, VD);
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!ET)
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportVar *EV = new RSExportVar(this, VD, ET);
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (EV == NULL)
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mExportVars.push_back(EV);
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
876315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrbool RSContext::processExportFunc(const clang::FunctionDecl *FD) {
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  assert(!FD->getName().empty() && "Function name should not be empty");
89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!FD->isThisDeclarationADefinition())
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (FD->getStorageClass() != clang::SC_None) {
949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "RSContext::processExportFunc : cannot export extern or "
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "static function '%s'\n", FD->getName().str().c_str());
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportFunc *EF = RSExportFunc::Create(this, FD);
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (EF == NULL)
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mExportFuncs.push_back(EF);
104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportType(const llvm::StringRef &Name) {
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl();
111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  assert(TUDecl != NULL && "Translation unit declaration (top-level "
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                           "declaration) is null object");
114f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const clang::IdentifierInfo *II = mPP->getIdentifierInfo(Name);
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (II == NULL)
1176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    // TODO(zonr): alert identifier @Name mark as an exportable type cannot be
1186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    //             found
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
120f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::DeclContext::lookup_const_result R = TUDecl->lookup(II);
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportType *ET = NULL;
123f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportPointerType::IntegerType = mCtx->IntTy.getTypePtr();
125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (clang::DeclContext::lookup_const_iterator I = R.first, E = R.second;
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I != E;
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I++) {
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::NamedDecl *const ND = *I;
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const clang::Type *T = NULL;
131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    switch (ND->getKind()) {
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      case clang::Decl::Typedef: {
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        T = static_cast<const clang::TypedefDecl*>(
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            ND)->getCanonicalDecl()->getUnderlyingType().getTypePtr();
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      case clang::Decl::Record: {
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        T = static_cast<const clang::RecordDecl*>(ND)->getTypeForDecl();
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      default: {
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // unsupported, skip
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
145ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao      }
146ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao    }
147537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (T != NULL)
1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      ET = RSExportType::Create(this, T);
1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportPointerType::IntegerType = NULL;
153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return (ET != NULL);
155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSContext::processExport() {
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mNeedExportVars.empty() &&
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mNeedExportFuncs.empty() &&
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      !mExportAllNonStaticVars && !mExportAllNonStaticFuncs) {
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "note: No reflection because there are no #pragma "
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "rs export_var(...), #pragma rs export_func(...), "
1636315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    "#pragma rs export_var_all, or #pragma rs "
1646315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    "export_func_all\n");
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Export variable
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl();
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (clang::DeclContext::decl_iterator DI = TUDecl->decls_begin(),
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           DE = TUDecl->decls_end();
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       DI != TUDecl->decls_end();
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       DI++) {
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (DI->getKind() == clang::Decl::Var) {
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      clang::VarDecl *VD = (clang::VarDecl*) (*DI);
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (mExportAllNonStaticVars &&
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          (VD->getLinkage() == clang::ExternalLinkage)) {
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!processExportVar(VD)) {
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          fprintf(stderr, "RSContext::processExport : failed to export var "
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                          "'%s'\n", VD->getNameAsString().c_str());
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      } else {
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        NeedExportVarSet::iterator EI = mNeedExportVars.find(VD->getName());
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (EI != mNeedExportVars.end() && processExportVar(VD)) {
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mNeedExportVars.erase(EI);
1853f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang        }
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else if (DI->getKind() == clang::Decl::Function) {
1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Export functions
1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      clang::FunctionDecl *FD = (clang::FunctionDecl*) (*DI);
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (mExportAllNonStaticFuncs &&
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          (FD->getLinkage() == clang::ExternalLinkage)) {
1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!processExportFunc(FD)) {
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          fprintf(stderr, "RSContext::processExport : failed to export func "
1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                          "'%s'\n", FD->getNameAsString().c_str());
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      } else {
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        NeedExportFuncSet::iterator EI = mNeedExportFuncs.find(FD->getName());
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (EI != mNeedExportFuncs.end() && processExportFunc(FD))
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mNeedExportFuncs.erase(EI);
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
2013f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    }
2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Finally, export type forcely set to be exported by user
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (NeedExportTypeSet::const_iterator EI = mNeedExportTypes.begin(),
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           EE = mNeedExportTypes.end();
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       EI != EE;
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       EI++) {
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (!processExportType(EI->getKey())) {
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      fprintf(stderr, "RSContext::processExport : failed to export type "
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao              "'%s'\n", EI->getKey().str().c_str());
2123f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    }
2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
217537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::insertExportType(const llvm::StringRef &TypeName,
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                 RSExportType *ET) {
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportTypeMap::value_type *NewItem =
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      ExportTypeMap::value_type::Create(TypeName.begin(),
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        TypeName.end(),
2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        mExportTypes.getAllocator(),
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        ET);
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mExportTypes.insert(NewItem)) {
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return true;
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } else {
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    free(NewItem);
2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::reflectToJava(const char *OutputPackageName,
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const std::string &InputFileName,
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const std::string &OutputBCFileName,
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              char realPackageName[],
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              int bSize) {
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (realPackageName != NULL) {
2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    *realPackageName = 0;
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (OutputPackageName == NULL) {
2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (!mReflectJavaPackageName.empty()) {
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      OutputPackageName = mReflectJavaPackageName.c_str();
2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else {
2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // no package name, just return
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return true;
2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Copy back the really applied package name
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (realPackageName != NULL) {
2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    strncpy(realPackageName, OutputPackageName, bSize - 1);
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSReflection *R = new RSReflection(this);
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool ret = R->reflect(OutputPackageName, InputFileName, OutputBCFileName);
2596315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  if (!ret)
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "RSContext::reflectToJava : failed to do reflection "
2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "(%s)\n", R->getLastError());
2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  delete R;
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return ret;
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
2656de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::reflectToJavaPath(const char *OutputPathName) {
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (OutputPathName == NULL)
2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // no path name, just return
2696de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    return true;
2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  setReflectJavaPathName(std::string(OutputPathName));
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
2736de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao}
2746de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSContext::~RSContext() {
2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  delete mLicenseNote;
2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  delete mTargetData;
278a41ce1d98094da84643995d40d71c529905123fcZonr Chang  for (ExportableList::iterator I = mExportables.begin(),
279a41ce1d98094da84643995d40d71c529905123fcZonr Chang          E = mExportables.end();
280a41ce1d98094da84643995d40d71c529905123fcZonr Chang       I != E;
281a41ce1d98094da84643995d40d71c529905123fcZonr Chang       I++) {
282a41ce1d98094da84643995d40d71c529905123fcZonr Chang    delete *I;
283a41ce1d98094da84643995d40d71c529905123fcZonr Chang  }
284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
285