12a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan/* 22a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * Copyright 2010, The Android Open Source Project 32a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * 42a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * Licensed under the Apache License, Version 2.0 (the "License"); 52a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * you may not use this file except in compliance with the License. 62a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * You may obtain a copy of the License at 72a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * 82a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * http://www.apache.org/licenses/LICENSE-2.0 92a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * 102a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * Unless required by applicable law or agreed to in writing, software 112a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * distributed under the License is distributed on an "AS IS" BASIS, 122a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * See the License for the specific language governing permissions and 142a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * limitations under the License. 152a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan */ 162a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 172a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#include "ScriptCompiled.h" 182a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 19f340bf71ff377979d279132dcf5a801d76747d1fLogan#include "bcc_internal.h" 20d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#if USE_OLD_JIT 21d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#include "OldJIT/ContextManager.h" 22d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#endif 234dcd6798f3db374a056ea6acc6b425f544c5207cLogan#include "DebugHelper.h" 247dcaac9898741e701098537808296f4e2f2fb422Logan 252a6dc82a465631f82fc589c6bc68c15ed264f7ebLogannamespace bcc { 262a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 277dcaac9898741e701098537808296f4e2f2fb422LoganScriptCompiled::~ScriptCompiled() { 28d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#if USE_OLD_JIT 2902286cbd7505ed355cb9b301326db51639789049Logan // Deallocate the BCC context 3002286cbd7505ed355cb9b301326db51639789049Logan if (mContext) { 311dc6314a03b320f9ba5431834c2deeba13f5f065Logan ContextManager::get().deallocateContext(mContext); 3202286cbd7505ed355cb9b301326db51639789049Logan } 3302286cbd7505ed355cb9b301326db51639789049Logan 3402286cbd7505ed355cb9b301326db51639789049Logan // Delete the emitted function information 35f340bf71ff377979d279132dcf5a801d76747d1fLogan for (FuncInfoMap::iterator I = mEmittedFunctions.begin(), 367dcaac9898741e701098537808296f4e2f2fb422Logan E = mEmittedFunctions.end(); I != E; I++) { 377dcaac9898741e701098537808296f4e2f2fb422Logan if (I->second != NULL) { 387dcaac9898741e701098537808296f4e2f2fb422Logan delete I->second; 397dcaac9898741e701098537808296f4e2f2fb422Logan } 407dcaac9898741e701098537808296f4e2f2fb422Logan } 41d2a5f305f48c47b9e98a0d7ccdd0cf027bdcfe18Logan Chien#endif 427dcaac9898741e701098537808296f4e2f2fb422Logan} 437dcaac9898741e701098537808296f4e2f2fb422Logan 44be79ada39b5e77b638940d2e157a45904ee09275Loganvoid ScriptCompiled::getExportVarList(size_t varListSize, void **varList) { 45be79ada39b5e77b638940d2e157a45904ee09275Logan if (varList) { 46be79ada39b5e77b638940d2e157a45904ee09275Logan size_t varCount = getExportVarCount(); 47be79ada39b5e77b638940d2e157a45904ee09275Logan 48be79ada39b5e77b638940d2e157a45904ee09275Logan if (varCount > varListSize) { 49be79ada39b5e77b638940d2e157a45904ee09275Logan varCount = varListSize; 50be79ada39b5e77b638940d2e157a45904ee09275Logan } 51be79ada39b5e77b638940d2e157a45904ee09275Logan 522a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (ExportVarList::const_iterator 53be79ada39b5e77b638940d2e157a45904ee09275Logan I = mExportVars.begin(), E = mExportVars.end(); 54be79ada39b5e77b638940d2e157a45904ee09275Logan I != E && varCount > 0; ++I, --varCount) { 55be79ada39b5e77b638940d2e157a45904ee09275Logan *varList++ = *I; 562a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 572a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 582a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 592a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 60f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wenvoid ScriptCompiled::getExportVarNameList(std::vector<std::string> &varList) { 61f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen varList = mExportVarsName; 62f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen} 63f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 64f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 65f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wenvoid ScriptCompiled::getExportFuncNameList(std::vector<std::string> &funcList) { 66f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen funcList = mExportFuncsName; 67f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen} 68f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 692a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 70be79ada39b5e77b638940d2e157a45904ee09275Loganvoid ScriptCompiled::getExportFuncList(size_t funcListSize, void **funcList) { 71be79ada39b5e77b638940d2e157a45904ee09275Logan if (funcList) { 72be79ada39b5e77b638940d2e157a45904ee09275Logan size_t funcCount = getExportFuncCount(); 73be79ada39b5e77b638940d2e157a45904ee09275Logan 74be79ada39b5e77b638940d2e157a45904ee09275Logan if (funcCount > funcListSize) { 75be79ada39b5e77b638940d2e157a45904ee09275Logan funcCount = funcListSize; 76be79ada39b5e77b638940d2e157a45904ee09275Logan } 77be79ada39b5e77b638940d2e157a45904ee09275Logan 782a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (ExportFuncList::const_iterator 79be79ada39b5e77b638940d2e157a45904ee09275Logan I = mExportFuncs.begin(), E = mExportFuncs.end(); 80be79ada39b5e77b638940d2e157a45904ee09275Logan I != E && funcCount > 0; ++I, --funcCount) { 81be79ada39b5e77b638940d2e157a45904ee09275Logan *funcList++ = *I; 822a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 832a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 842a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 852a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 862a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 87be79ada39b5e77b638940d2e157a45904ee09275Loganvoid ScriptCompiled::getPragmaList(size_t pragmaListSize, 88be79ada39b5e77b638940d2e157a45904ee09275Logan char const **keyList, 89be79ada39b5e77b638940d2e157a45904ee09275Logan char const **valueList) { 90be79ada39b5e77b638940d2e157a45904ee09275Logan size_t pragmaCount = getPragmaCount(); 91be79ada39b5e77b638940d2e157a45904ee09275Logan 92be79ada39b5e77b638940d2e157a45904ee09275Logan if (pragmaCount > pragmaListSize) { 93be79ada39b5e77b638940d2e157a45904ee09275Logan pragmaCount = pragmaListSize; 94be79ada39b5e77b638940d2e157a45904ee09275Logan } 95be79ada39b5e77b638940d2e157a45904ee09275Logan 96be79ada39b5e77b638940d2e157a45904ee09275Logan for (PragmaList::const_iterator 97be79ada39b5e77b638940d2e157a45904ee09275Logan I = mPragmas.begin(), E = mPragmas.end(); 98be79ada39b5e77b638940d2e157a45904ee09275Logan I != E && pragmaCount > 0; ++I, --pragmaCount) { 99be79ada39b5e77b638940d2e157a45904ee09275Logan if (keyList) { *keyList++ = I->first.c_str(); } 100be79ada39b5e77b638940d2e157a45904ee09275Logan if (valueList) { *valueList++ = I->second.c_str(); } 1012a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1022a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 1032a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1047dcaac9898741e701098537808296f4e2f2fb422Logan 1057dcaac9898741e701098537808296f4e2f2fb422Loganvoid *ScriptCompiled::lookup(const char *name) { 106da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien#if USE_OLD_JIT 107f340bf71ff377979d279132dcf5a801d76747d1fLogan FuncInfoMap::const_iterator I = mEmittedFunctions.find(name); 108f340bf71ff377979d279132dcf5a801d76747d1fLogan return (I == mEmittedFunctions.end()) ? NULL : I->second->addr; 109da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien#endif 110da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien 111da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien#if USE_MCJIT 112da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien return mCompiler.getSymbolAddress(name); 113da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien#endif 114da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien 115da5e0c369ad20bf70556c7e7cf86807cf171730dLogan Chien return NULL; 1167dcaac9898741e701098537808296f4e2f2fb422Logan} 1177dcaac9898741e701098537808296f4e2f2fb422Logan 1187dcaac9898741e701098537808296f4e2f2fb422Logan 119f340bf71ff377979d279132dcf5a801d76747d1fLoganvoid ScriptCompiled::getFuncInfoList(size_t funcInfoListSize, 120f340bf71ff377979d279132dcf5a801d76747d1fLogan FuncInfo *funcInfoList) { 121f340bf71ff377979d279132dcf5a801d76747d1fLogan if (funcInfoList) { 122be79ada39b5e77b638940d2e157a45904ee09275Logan size_t funcCount = getFuncCount(); 1237dcaac9898741e701098537808296f4e2f2fb422Logan 124f340bf71ff377979d279132dcf5a801d76747d1fLogan if (funcCount > funcInfoListSize) { 125f340bf71ff377979d279132dcf5a801d76747d1fLogan funcCount = funcInfoListSize; 126be79ada39b5e77b638940d2e157a45904ee09275Logan } 1277dcaac9898741e701098537808296f4e2f2fb422Logan 128f340bf71ff377979d279132dcf5a801d76747d1fLogan FuncInfo *info = funcInfoList; 129f340bf71ff377979d279132dcf5a801d76747d1fLogan for (FuncInfoMap::const_iterator 1307dcaac9898741e701098537808296f4e2f2fb422Logan I = mEmittedFunctions.begin(), E = mEmittedFunctions.end(); 131f340bf71ff377979d279132dcf5a801d76747d1fLogan I != E && funcCount > 0; ++I, ++info, --funcCount) { 132f340bf71ff377979d279132dcf5a801d76747d1fLogan info->name = I->first.c_str(); 133f340bf71ff377979d279132dcf5a801d76747d1fLogan info->addr = I->second->addr; 134f340bf71ff377979d279132dcf5a801d76747d1fLogan info->size = I->second->size; 1357dcaac9898741e701098537808296f4e2f2fb422Logan } 1367dcaac9898741e701098537808296f4e2f2fb422Logan } 1377dcaac9898741e701098537808296f4e2f2fb422Logan} 1387dcaac9898741e701098537808296f4e2f2fb422Logan 139071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hinesvoid ScriptCompiled::getObjectSlotList(size_t objectSlotListSize, 140071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines uint32_t *objectSlotList) { 141071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines if (objectSlotList) { 142071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines size_t objectSlotCount = getObjectSlotCount(); 143071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines 144071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines if (objectSlotCount > objectSlotListSize) { 145071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines objectSlotCount = objectSlotListSize; 146071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines } 147071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines 148071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines for (ObjectSlotList::const_iterator 149071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines I = mObjectSlots.begin(), E = mObjectSlots.end(); 150071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines I != E && objectSlotCount > 0; ++I, --objectSlotCount) { 151071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines *objectSlotList++ = *I; 152071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines } 153071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines } 154071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines 155071288a0a3bbc3c4a6e161ea7474a5c06bd15ae0Stephen Hines} 1567dcaac9898741e701098537808296f4e2f2fb422Logan 1572a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} // namespace bcc 158