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