14a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines/*
24a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * Copyright 2010-2012, The Android Open Source Project
34a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines *
44a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
54a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * you may not use this file except in compliance with the License.
64a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * You may obtain a copy of the License at
74a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines *
84a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
94a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines *
104a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * Unless required by applicable law or agreed to in writing, software
114a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
124a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * See the License for the specific language governing permissions and
144a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines * limitations under the License.
154a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines */
164a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
174a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines#include "ScriptCompiled.h"
184a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
194a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines#include "bcc_internal.h"
204a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines#include "DebugHelper.h"
214a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
224a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesnamespace bcc {
234a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
244a68b1cb89df9507584a51c3444aff99347afb74Stephen HinesScriptCompiled::~ScriptCompiled() {
254a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
264a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
274a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getExportVarList(size_t varListSize, void **varList) {
284a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  if (varList) {
294a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    size_t varCount = getExportVarCount();
304a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
314a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    if (varCount > varListSize) {
324a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      varCount = varListSize;
334a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
344a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
354a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    for (ExportVarList::const_iterator
364a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I = mExportVars.begin(), E = mExportVars.end();
374a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I != E && varCount > 0; ++I, --varCount) {
384a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      *varList++ = *I;
394a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
404a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  }
414a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
424a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
434a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getExportVarNameList(std::vector<std::string> &varList) {
444a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  varList = mExportVarsName;
454a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
464a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
474a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
484a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getExportFuncNameList(std::vector<std::string> &funcList) {
494a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  funcList = mExportFuncsName;
504a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
514a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
524a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
534a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getExportForEachNameList(std::vector<std::string> &forEachList) {
544a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  forEachList = mExportForEachName;
554a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
564a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
574a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
584a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getExportFuncList(size_t funcListSize, void **funcList) {
594a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  if (funcList) {
604a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    size_t funcCount = getExportFuncCount();
614a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
624a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    if (funcCount > funcListSize) {
634a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      funcCount = funcListSize;
644a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
654a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
664a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    for (ExportFuncList::const_iterator
674a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I = mExportFuncs.begin(), E = mExportFuncs.end();
684a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I != E && funcCount > 0; ++I, --funcCount) {
694a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      *funcList++ = *I;
704a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
714a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  }
724a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
734a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
744a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
754a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getExportForEachList(size_t forEachListSize,
764a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines                                          void **forEachList) {
774a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  if (forEachList) {
784a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    size_t forEachCount = getExportForEachCount();
794a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
804a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    if (forEachCount > forEachListSize) {
814a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      forEachCount = forEachListSize;
824a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
834a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
844a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    for (ExportForEachList::const_iterator
854a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I = mExportForEach.begin(), E = mExportForEach.end();
864a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I != E && forEachCount > 0; ++I, --forEachCount) {
874a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      *forEachList++ = *I;
884a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
894a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  }
904a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
914a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
924a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
934a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getPragmaList(size_t pragmaListSize,
944a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines                                   char const **keyList,
954a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines                                   char const **valueList) {
964a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  size_t pragmaCount = getPragmaCount();
974a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
984a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  if (pragmaCount > pragmaListSize) {
994a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    pragmaCount = pragmaListSize;
1004a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  }
1014a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1024a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  for (PragmaList::const_iterator
1034a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines       I = mPragmas.begin(), E = mPragmas.end();
1044a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines       I != E && pragmaCount > 0; ++I, --pragmaCount) {
1054a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    if (keyList) { *keyList++ = I->first.c_str(); }
1064a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    if (valueList) { *valueList++ = I->second.c_str(); }
1074a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  }
1084a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
1094a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1104a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1114a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid *ScriptCompiled::lookup(const char *name) {
1124a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  return mCompiler.getSymbolAddress(name);
1134a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
1144a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1154a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1164a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getFuncInfoList(size_t funcInfoListSize,
1174a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines                                     FuncInfo *funcInfoList) {
1184a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  if (funcInfoList) {
1194a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    size_t funcCount = getFuncCount();
1204a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1214a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    if (funcCount > funcInfoListSize) {
1224a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      funcCount = funcInfoListSize;
1234a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
1244a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1254a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    FuncInfo *info = funcInfoList;
1264a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    for (FuncInfoMap::const_iterator
1274a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I = mEmittedFunctions.begin(), E = mEmittedFunctions.end();
1284a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I != E && funcCount > 0; ++I, ++info, --funcCount) {
1294a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      info->name = I->first.c_str();
1304a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      info->addr = I->second->addr;
1314a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      info->size = I->second->size;
1324a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
1334a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  }
1344a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
1354a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1364a68b1cb89df9507584a51c3444aff99347afb74Stephen Hinesvoid ScriptCompiled::getObjectSlotList(size_t objectSlotListSize,
1374a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines                                       uint32_t *objectSlotList) {
1384a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  if (objectSlotList) {
1394a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    size_t objectSlotCount = getObjectSlotCount();
1404a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1414a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    if (objectSlotCount > objectSlotListSize) {
1424a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      objectSlotCount = objectSlotListSize;
1434a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
1444a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1454a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    for (ObjectSlotList::const_iterator
1464a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I = mObjectSlots.begin(), E = mObjectSlots.end();
1474a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines         I != E && objectSlotCount > 0; ++I, --objectSlotCount) {
1484a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines      *objectSlotList++ = *I;
1494a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines    }
1504a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines  }
1514a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1524a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines}
1534a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines
1544a68b1cb89df9507584a51c3444aff99347afb74Stephen Hines} // namespace bcc
155