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