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