blob: 03a4f7a0e936f33ee95b1e272875da0a6ea9afdc [file] [log] [blame]
Loganf7f0ac52011-01-07 03:53:43 +08001/*
Stephen Hinescc366e52012-02-21 17:22:04 -08002 * Copyright 2010-2012, The Android Open Source Project
Loganf7f0ac52011-01-07 03:53:43 +08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shih-wei Liao3cafd222011-06-21 11:58:27 -070017#include "Config.h"
18
Loganf7f0ac52011-01-07 03:53:43 +080019#include "ScriptCached.h"
20
21#include <bcc/bcc_cache.h>
22
Logan4dcd6792011-02-28 05:12:00 +080023#include "DebugHelper.h"
Loganf7f0ac52011-01-07 03:53:43 +080024
Logan856ceb22011-01-07 05:21:26 +080025#include <stdlib.h>
26
Loganf7f0ac52011-01-07 03:53:43 +080027namespace bcc {
28
29ScriptCached::~ScriptCached() {
Loganf7f0ac52011-01-07 03:53:43 +080030 // Deallocate string pool, exported var list, exported func list
31 if (mpStringPoolRaw) { free(mpStringPoolRaw); }
32 if (mpExportVars) { free(mpExportVars); }
33 if (mpExportFuncs) { free(mpExportFuncs); }
Stephen Hinescc366e52012-02-21 17:22:04 -080034 if (mpExportForEach) { free(mpExportForEach); }
Stephen Hines071288a2011-01-27 14:38:26 -080035 if (mpObjectSlotList) { free(mpObjectSlotList); }
Loganf7f0ac52011-01-07 03:53:43 +080036}
37
Loganbe79ada2011-01-13 01:33:45 +080038void ScriptCached::getExportVarList(size_t varListSize, void **varList) {
39 if (varList) {
40 size_t varCount = getExportVarCount();
Loganf7f0ac52011-01-07 03:53:43 +080041
Loganbe79ada2011-01-13 01:33:45 +080042 if (varCount > varListSize) {
43 varCount = varListSize;
Loganf7f0ac52011-01-07 03:53:43 +080044 }
Loganbe79ada2011-01-13 01:33:45 +080045
46 memcpy(varList, mpExportVars->cached_addr_list, sizeof(void *) * varCount);
Loganf7f0ac52011-01-07 03:53:43 +080047 }
48}
49
50
Loganbe79ada2011-01-13 01:33:45 +080051void ScriptCached::getExportFuncList(size_t funcListSize, void **funcList) {
52 if (funcList) {
53 size_t funcCount = getExportFuncCount();
Loganf7f0ac52011-01-07 03:53:43 +080054
Loganbe79ada2011-01-13 01:33:45 +080055 if (funcCount > funcListSize) {
56 funcCount = funcListSize;
Loganf7f0ac52011-01-07 03:53:43 +080057 }
Loganbe79ada2011-01-13 01:33:45 +080058
59 memcpy(funcList, mpExportFuncs->cached_addr_list,
60 sizeof(void *) * funcCount);
Loganf7f0ac52011-01-07 03:53:43 +080061 }
62}
63
64
Stephen Hinescc366e52012-02-21 17:22:04 -080065void ScriptCached::getExportForEachList(size_t forEachListSize,
66 void **forEachList) {
67 if (forEachList) {
68 size_t forEachCount = getExportForEachCount();
69
70 if (forEachCount > forEachListSize) {
71 forEachCount = forEachListSize;
72 }
73
74 memcpy(forEachList, mpExportForEach->cached_addr_list,
75 sizeof(void *) * forEachCount);
76 }
77}
78
79
Loganbe79ada2011-01-13 01:33:45 +080080void ScriptCached::getPragmaList(size_t pragmaListSize,
81 char const **keyList,
82 char const **valueList) {
83 size_t pragmaCount = getPragmaCount();
Loganf7f0ac52011-01-07 03:53:43 +080084
Loganbe79ada2011-01-13 01:33:45 +080085 if (pragmaCount > pragmaListSize) {
86 pragmaCount = pragmaListSize;
87 }
Loganf7f0ac52011-01-07 03:53:43 +080088
Loganbe79ada2011-01-13 01:33:45 +080089 if (keyList) {
90 for (size_t i = 0; i < pragmaCount; ++i) {
91 *keyList++ = mPragmas[i].first;
92 }
93 }
Loganf7f0ac52011-01-07 03:53:43 +080094
Loganbe79ada2011-01-13 01:33:45 +080095 if (valueList) {
96 for (size_t i = 0; i < pragmaCount; ++i) {
97 *valueList++ = mPragmas[i].second;
Loganf7f0ac52011-01-07 03:53:43 +080098 }
99 }
100}
101
102
Stephen Hines071288a2011-01-27 14:38:26 -0800103void ScriptCached::getObjectSlotList(size_t objectSlotListSize,
104 uint32_t *objectSlotList) {
105 if (objectSlotList) {
106 size_t objectSlotCount = getObjectSlotCount();
107
108 if (objectSlotCount > objectSlotListSize) {
109 objectSlotCount = objectSlotListSize;
110 }
111
112 memcpy(objectSlotList, mpObjectSlotList->object_slot_list,
113 sizeof(uint32_t) * objectSlotCount);
114 }
115}
116
117
Loganf7f0ac52011-01-07 03:53:43 +0800118void *ScriptCached::lookup(const char *name) {
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700119#if USE_MCJIT
120 return rsloaderGetSymbolAddress(mRSExecutable, name);
121#endif
Logan216ec712011-01-07 12:12:31 +0800122 FuncTable::const_iterator I = mFunctions.find(name);
123 return (I == mFunctions.end()) ? NULL : I->second.first;
Loganf7f0ac52011-01-07 03:53:43 +0800124}
125
Loganf340bf72011-01-14 17:51:40 +0800126void ScriptCached::getFuncInfoList(size_t funcInfoListSize,
127 FuncInfo *funcInfoList) {
128 if (funcInfoList) {
Loganbe79ada2011-01-13 01:33:45 +0800129 size_t funcCount = getFuncCount();
Loganf7f0ac52011-01-07 03:53:43 +0800130
Loganf340bf72011-01-14 17:51:40 +0800131 if (funcCount > funcInfoListSize) {
132 funcCount = funcInfoListSize;
Loganbe79ada2011-01-13 01:33:45 +0800133 }
134
Loganf340bf72011-01-14 17:51:40 +0800135 FuncInfo *info = funcInfoList;
Logan216ec712011-01-07 12:12:31 +0800136 for (FuncTable::const_iterator
137 I = mFunctions.begin(), E = mFunctions.end();
Loganf340bf72011-01-14 17:51:40 +0800138 I != E && funcCount > 0; ++I, ++info, --funcCount) {
139 info->name = I->first.c_str();
140 info->addr = I->second.first;
141 info->size = I->second.second;
Logan216ec712011-01-07 12:12:31 +0800142 }
Loganf7f0ac52011-01-07 03:53:43 +0800143 }
144}
145
146
Loganf7f0ac52011-01-07 03:53:43 +0800147} // namespace bcc