slang_rs_context.cpp revision 641558f02fe6ce0ee3ae5076eb366c25e2ad5903
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/LLVMContext.h" 206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/Target/TargetData.h" 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TargetInfo.h" 239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/Linkage.h" 249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Type.h" 259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Decl.h" 269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/DeclBase.h" 279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/ASTContext.h" 289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Index/ASTLocation.h" 299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang.h" 316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflection.h" 32a41ce1d98094da84643995d40d71c529905123fcZonr Chang#include "slang_rs_exportable.h" 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_var.h" 346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_func.h" 356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h" 366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_pragma_handler.h" 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaousing namespace slang; 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSContext::RSContext(clang::Preprocessor *PP, 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::ASTContext *Ctx, 426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const clang::TargetInfo *Target) 436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : mPP(PP), 446315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mCtx(Ctx), 456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mTarget(Target), 466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mTargetData(NULL), 476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mLLVMContext(llvm::getGlobalContext()), 482df25dbc3b09764b7bed9f02aee7cbd3d9720ef2Stephen Hines mExportAllNonStaticVars(true), 496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mExportAllNonStaticFuncs(false), 506315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mLicenseNote(NULL) { 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_var 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportVarHandler(this)); 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_var_all 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportVarAllHandler(this)); 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_func 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportFuncHandler(this)); 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_func_all 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportFuncAllHandler(this)); 66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_type 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportTypeHandler(this)); 70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs java_package_name 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaJavaPackageNameHandler(this)); 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs set_reflect_license 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaReflectLicenseHandler(this)); 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Prepare target data 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetData = new llvm::TargetData(Slang::TargetDescription); 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportVar(const clang::VarDecl *VD) { 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(!VD->getName().empty() && "Variable name should not be empty"); 87537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 886315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): some check on variable 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET = RSExportType::CreateFromDecl(this, VD); 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!ET) 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportVar *EV = new RSExportVar(this, VD, ET); 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EV == NULL) 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportVars.push_back(EV); 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1036315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrbool RSContext::processExportFunc(const clang::FunctionDecl *FD) { 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(!FD->getName().empty() && "Function name should not be empty"); 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FD->isThisDeclarationADefinition()) 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FD->getStorageClass() != clang::SC_None) { 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExportFunc : cannot export extern or " 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "static function '%s'\n", FD->getName().str().c_str()); 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportFunc *EF = RSExportFunc::Create(this, FD); 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EF == NULL) 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportFuncs.push_back(EF); 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportType(const llvm::StringRef &Name) { 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl(); 127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(TUDecl != NULL && "Translation unit declaration (top-level " 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "declaration) is null object"); 130f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::IdentifierInfo *II = mPP->getIdentifierInfo(Name); 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (II == NULL) 1336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): alert identifier @Name mark as an exportable type cannot be 1346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // found 1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 136f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::DeclContext::lookup_const_result R = TUDecl->lookup(II); 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET = NULL; 139f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportPointerType::IntegerType = mCtx->IntTy.getTypePtr(); 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::DeclContext::lookup_const_iterator I = R.first, E = R.second; 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::NamedDecl *const ND = *I; 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *T = NULL; 147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ND->getKind()) { 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Decl::Typedef: { 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T = static_cast<const clang::TypedefDecl*>( 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ND)->getCanonicalDecl()->getUnderlyingType().getTypePtr(); 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Decl::Record: { 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T = static_cast<const clang::RecordDecl*>(ND)->getTypeForDecl(); 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // unsupported, skip 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 161ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao } 162ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao } 163537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (T != NULL) 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportType::Create(this, T); 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportPointerType::IntegerType = NULL; 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return (ET != NULL); 171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSContext::processExport() { 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mNeedExportVars.empty() && 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportFuncs.empty() && 1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao !mExportAllNonStaticVars && !mExportAllNonStaticFuncs) { 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "note: No reflection because there are no #pragma " 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs export_var(...), #pragma rs export_func(...), " 1796315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "#pragma rs export_var_all, or #pragma rs " 1806315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "export_func_all\n"); 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Export variable 1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl(); 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::DeclContext::decl_iterator DI = TUDecl->decls_begin(), 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DE = TUDecl->decls_end(); 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DI != TUDecl->decls_end(); 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DI++) { 1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (DI->getKind() == clang::Decl::Var) { 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::VarDecl *VD = (clang::VarDecl*) (*DI); 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mExportAllNonStaticVars && 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (VD->getLinkage() == clang::ExternalLinkage)) { 1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportVar(VD)) { 1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export var " 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", VD->getNameAsString().c_str()); 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportVarSet::iterator EI = mNeedExportVars.find(VD->getName()); 1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EI != mNeedExportVars.end() && processExportVar(VD)) { 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportVars.erase(EI); 2013f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (DI->getKind() == clang::Decl::Function) { 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Export functions 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::FunctionDecl *FD = (clang::FunctionDecl*) (*DI); 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mExportAllNonStaticFuncs && 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (FD->getLinkage() == clang::ExternalLinkage)) { 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportFunc(FD)) { 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export func " 2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", FD->getNameAsString().c_str()); 2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportFuncSet::iterator EI = mNeedExportFuncs.find(FD->getName()); 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EI != mNeedExportFuncs.end() && processExportFunc(FD)) 2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportFuncs.erase(EI); 2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2173f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Finally, export type forcely set to be exported by user 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (NeedExportTypeSet::const_iterator EI = mNeedExportTypes.begin(), 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EE = mNeedExportTypes.end(); 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EI != EE; 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EI++) { 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportType(EI->getKey())) { 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export type " 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", EI->getKey().str().c_str()); 2283f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 233537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::insertExportType(const llvm::StringRef &TypeName, 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET) { 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportTypeMap::value_type *NewItem = 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportTypeMap::value_type::Create(TypeName.begin(), 2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName.end(), 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportTypes.getAllocator(), 2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET); 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mExportTypes.insert(NewItem)) { 2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao free(NewItem); 2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 249462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 250b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaobool RSContext::reflectToJava(const std::string &OutputPathBase, 251b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::string &OutputPackageName, 2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName, 254b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string *RealPackageName) { 255b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (RealPackageName != NULL) 256b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RealPackageName->clear(); 257b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 258b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::string &PackageName = 259b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ((OutputPackageName.empty()) ? mReflectJavaPackageName : 260b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputPackageName); 261b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (PackageName.empty()) 262b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // no package name, just return 263b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return true; 2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Copy back the really applied package name 266b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RealPackageName->assign(PackageName); 2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSReflection *R = new RSReflection(this); 269b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao bool ret = R->reflect(OutputPathBase, PackageName, 270b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao InputFileName, OutputBCFileName); 2716315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr if (!ret) 2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::reflectToJava : failed to do reflection " 2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "(%s)\n", R->getLastError()); 2749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete R; 2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ret; 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2776de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSContext::~RSContext() { 2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete mLicenseNote; 2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete mTargetData; 281a41ce1d98094da84643995d40d71c529905123fcZonr Chang for (ExportableList::iterator I = mExportables.begin(), 282a41ce1d98094da84643995d40d71c529905123fcZonr Chang E = mExportables.end(); 283a41ce1d98094da84643995d40d71c529905123fcZonr Chang I != E; 284a41ce1d98094da84643995d40d71c529905123fcZonr Chang I++) { 285641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (!(*I)->isKeep()) 286641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang delete *I; 287a41ce1d98094da84643995d40d71c529905123fcZonr Chang } 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 289