ScriptCompiled.cpp revision 7dcaac9898741e701098537808296f4e2f2fb422
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#define LOG_TAG "bcc" 182a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#include <cutils/log.h> 192a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 202a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#include "ScriptCompiled.h" 212a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 227dcaac9898741e701098537808296f4e2f2fb422Logan#include "EmittedFuncInfo.h" 237dcaac9898741e701098537808296f4e2f2fb422Logan 242a6dc82a465631f82fc589c6bc68c15ed264f7ebLogannamespace bcc { 252a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 267dcaac9898741e701098537808296f4e2f2fb422LoganScriptCompiled::~ScriptCompiled() { 277dcaac9898741e701098537808296f4e2f2fb422Logan for (EmittedFunctionsMapTy::iterator I = mEmittedFunctions.begin(), 287dcaac9898741e701098537808296f4e2f2fb422Logan E = mEmittedFunctions.end(); I != E; I++) { 297dcaac9898741e701098537808296f4e2f2fb422Logan if (I->second != NULL) { 307dcaac9898741e701098537808296f4e2f2fb422Logan delete I->second; 317dcaac9898741e701098537808296f4e2f2fb422Logan } 327dcaac9898741e701098537808296f4e2f2fb422Logan } 337dcaac9898741e701098537808296f4e2f2fb422Logan 347dcaac9898741e701098537808296f4e2f2fb422Logan mEmittedFunctions.clear(); 357dcaac9898741e701098537808296f4e2f2fb422Logan} 367dcaac9898741e701098537808296f4e2f2fb422Logan 372a6dc82a465631f82fc589c6bc68c15ed264f7ebLoganvoid ScriptCompiled::getExportVars(BCCsizei *actualVarCount, 382a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCsizei maxVarCount, 392a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCvoid **vars) { 402a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan int varCount; 412a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 422a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#if 0 432a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (mUseCache && mCacheFd >= 0 && !mCacheNew) { 442a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = static_cast<int>(mCacheHdr->exportVarsCount); 452a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualVarCount) 462a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualVarCount = varCount; 472a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (varCount > maxVarCount) 482a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = maxVarCount; 492a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (vars) { 502a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan uint32_t *cachedVars = (uint32_t *)(mCacheMapAddr + 512a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan mCacheHdr->exportVarsOffset); 522a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 532a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (int i = 0; i < varCount; i++) { 542a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *vars = (BCCvoid *)((char *)(*cachedVars) + mCacheDiff); 552a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan vars++; 562a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan cachedVars++; 572a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 582a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 592a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan return; 602a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 612a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#endif 622a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 632a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = mExportVars.size(); 642a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualVarCount) 652a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualVarCount = varCount; 662a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (varCount > maxVarCount) 672a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = maxVarCount; 682a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (vars) { 692a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (ExportVarList::const_iterator 702a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan I = mExportVars.begin(), E = mExportVars.end(); I != E; I++) { 712a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *vars++ = *I; 722a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 732a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 742a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 752a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 762a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 772a6dc82a465631f82fc589c6bc68c15ed264f7ebLoganvoid ScriptCompiled::getExportFuncs(BCCsizei *actualFuncCount, 782a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCsizei maxFuncCount, 792a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCvoid **funcs) { 802a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan int funcCount; 812a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 822a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#if 0 832a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (mUseCache && mCacheFd >= 0 && !mCacheNew) { 842a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = static_cast<int>(mCacheHdr->exportFuncsCount); 852a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualFuncCount) 862a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualFuncCount = funcCount; 872a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcCount > maxFuncCount) 882a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = maxFuncCount; 892a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcs) { 902a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan uint32_t *cachedFuncs = (uint32_t *)(mCacheMapAddr + 912a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan mCacheHdr->exportFuncsOffset); 922a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 932a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (int i = 0; i < funcCount; i++) { 942a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *funcs = (BCCvoid *)((char *)(*cachedFuncs) + mCacheDiff); 952a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcs++; 962a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan cachedFuncs++; 972a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 982a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 992a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan return; 1002a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1012a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#endif 1022a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1032a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = mExportFuncs.size(); 1042a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualFuncCount) 1052a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualFuncCount = funcCount; 1062a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcCount > maxFuncCount) 1072a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = maxFuncCount; 1082a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcs) { 1092a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (ExportFuncList::const_iterator 1102a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan I = mExportFuncs.begin(), E = mExportFuncs.end(); I != E; I++) { 1112a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *funcs++ = *I; 1122a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1132a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1142a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 1152a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1162a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1172a6dc82a465631f82fc589c6bc68c15ed264f7ebLoganvoid ScriptCompiled::getPragmas(BCCsizei *actualStringCount, 1182a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCsizei maxStringCount, 1192a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCchar **strings) { 1202a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan int stringCount; 1212a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1222a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#if 0 1232a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (mUseCache && mCacheFd >= 0 && !mCacheNew) { 1242a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = static_cast<int>(mCacheHdr->exportPragmasCount) * 2; 1252a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1262a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualStringCount) 1272a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualStringCount = stringCount; 1282a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1292a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (stringCount > maxStringCount) 1302a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = maxStringCount; 1312a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1322a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (strings) { 1332a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan char *pragmaTab = mCacheMapAddr + mCacheHdr->exportPragmasOffset; 1342a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1352a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan oBCCPragmaEntry *cachedPragmaEntries = (oBCCPragmaEntry *)pragmaTab; 1362a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1372a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (int i = 0; stringCount >= 2; stringCount -= 2, i++) { 1382a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = pragmaTab + cachedPragmaEntries[i].pragmaNameOffset; 1392a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = pragmaTab + cachedPragmaEntries[i].pragmaValueOffset; 1402a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1412a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1422a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1432a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan return; 1442a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1452a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#endif 1462a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1472a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = mPragmas.size() * 2; 1482a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1492a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualStringCount) 1502a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualStringCount = stringCount; 1512a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (stringCount > maxStringCount) 1522a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = maxStringCount; 1532a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (strings) { 1542a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan size_t i = 0; 1552a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (PragmaList::const_iterator it = mPragmas.begin(); 1562a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount >= 2; stringCount -= 2, it++, ++i) { 1572a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = const_cast<BCCchar*>(it->first.c_str()); 1582a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = const_cast<BCCchar*>(it->second.c_str()); 1592a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1602a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1612a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 1622a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1637dcaac9898741e701098537808296f4e2f2fb422Logan 1647dcaac9898741e701098537808296f4e2f2fb422Loganvoid *ScriptCompiled::lookup(const char *name) { 1657dcaac9898741e701098537808296f4e2f2fb422Logan#if 0 1667dcaac9898741e701098537808296f4e2f2fb422Logan if (mUseCache && mCacheFd >= 0 && !mCacheNew) { 1677dcaac9898741e701098537808296f4e2f2fb422Logan if (!strcmp(name, "root")) { 1687dcaac9898741e701098537808296f4e2f2fb422Logan addr = reinterpret_cast<void *>(mCacheHdr->rootAddr); 1697dcaac9898741e701098537808296f4e2f2fb422Logan } else if (!strcmp(name, "init")) { 1707dcaac9898741e701098537808296f4e2f2fb422Logan addr = reinterpret_cast<void *>(mCacheHdr->initAddr); 1717dcaac9898741e701098537808296f4e2f2fb422Logan } 1727dcaac9898741e701098537808296f4e2f2fb422Logan return addr; 1737dcaac9898741e701098537808296f4e2f2fb422Logan } 1747dcaac9898741e701098537808296f4e2f2fb422Logan#endif 1757dcaac9898741e701098537808296f4e2f2fb422Logan 1767dcaac9898741e701098537808296f4e2f2fb422Logan EmittedFunctionsMapTy::const_iterator I = mEmittedFunctions.find(name); 1777dcaac9898741e701098537808296f4e2f2fb422Logan return (I == mEmittedFunctions.end()) ? NULL : I->second->Code; 1787dcaac9898741e701098537808296f4e2f2fb422Logan} 1797dcaac9898741e701098537808296f4e2f2fb422Logan 1807dcaac9898741e701098537808296f4e2f2fb422Logan 1817dcaac9898741e701098537808296f4e2f2fb422Loganvoid ScriptCompiled::getFunctions(BCCsizei *actualFunctionCount, 1827dcaac9898741e701098537808296f4e2f2fb422Logan BCCsizei maxFunctionCount, 1837dcaac9898741e701098537808296f4e2f2fb422Logan BCCchar **functions) { 1847dcaac9898741e701098537808296f4e2f2fb422Logan 1857dcaac9898741e701098537808296f4e2f2fb422Logan int functionCount = mEmittedFunctions.size(); 1867dcaac9898741e701098537808296f4e2f2fb422Logan 1877dcaac9898741e701098537808296f4e2f2fb422Logan if (actualFunctionCount) 1887dcaac9898741e701098537808296f4e2f2fb422Logan *actualFunctionCount = functionCount; 1897dcaac9898741e701098537808296f4e2f2fb422Logan if (functionCount > maxFunctionCount) 1907dcaac9898741e701098537808296f4e2f2fb422Logan functionCount = maxFunctionCount; 1917dcaac9898741e701098537808296f4e2f2fb422Logan if (functions) { 1927dcaac9898741e701098537808296f4e2f2fb422Logan for (EmittedFunctionsMapTy::const_iterator 1937dcaac9898741e701098537808296f4e2f2fb422Logan I = mEmittedFunctions.begin(), E = mEmittedFunctions.end(); 1947dcaac9898741e701098537808296f4e2f2fb422Logan I != E && (functionCount > 0); I++, functionCount--) { 1957dcaac9898741e701098537808296f4e2f2fb422Logan *functions++ = const_cast<BCCchar*>(I->first.c_str()); 1967dcaac9898741e701098537808296f4e2f2fb422Logan } 1977dcaac9898741e701098537808296f4e2f2fb422Logan } 1987dcaac9898741e701098537808296f4e2f2fb422Logan} 1997dcaac9898741e701098537808296f4e2f2fb422Logan 2007dcaac9898741e701098537808296f4e2f2fb422Logan 2017dcaac9898741e701098537808296f4e2f2fb422Loganvoid ScriptCompiled::getFunctionBinary(BCCchar *funcname, 2027dcaac9898741e701098537808296f4e2f2fb422Logan BCCvoid **base, 2037dcaac9898741e701098537808296f4e2f2fb422Logan BCCsizei *length) { 2047dcaac9898741e701098537808296f4e2f2fb422Logan EmittedFunctionsMapTy::const_iterator I = mEmittedFunctions.find(funcname); 2057dcaac9898741e701098537808296f4e2f2fb422Logan if (I == mEmittedFunctions.end()) { 2067dcaac9898741e701098537808296f4e2f2fb422Logan *base = NULL; 2077dcaac9898741e701098537808296f4e2f2fb422Logan *length = 0; 2087dcaac9898741e701098537808296f4e2f2fb422Logan } else { 2097dcaac9898741e701098537808296f4e2f2fb422Logan *base = I->second->Code; 2107dcaac9898741e701098537808296f4e2f2fb422Logan *length = I->second->Size; 2117dcaac9898741e701098537808296f4e2f2fb422Logan } 2127dcaac9898741e701098537808296f4e2f2fb422Logan} 2137dcaac9898741e701098537808296f4e2f2fb422Logan 2147dcaac9898741e701098537808296f4e2f2fb422Logan 2152a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} // namespace bcc 216