blob: 26929fd8e0a7ec605a768e737f1b133b6a246a3c [file] [log] [blame]
Logancf3e5212010-12-29 01:44:55 +08001/*
2 * copyright 2010, the android open source project
3 *
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
Logancf3e5212010-12-29 01:44:55 +080017#include "Script.h"
18
Logan35849002011-01-15 07:30:43 +080019#include "Config.h"
20
Logan Chiend2a5f302011-07-19 20:32:25 +080021#if USE_OLD_JIT
22#include "OldJIT/CacheReader.h"
23#include "OldJIT/CacheWriter.h"
24#endif
25
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -070026#include "MCCacheReader.h"
27#include "MCCacheWriter.h"
Logan Chiend2a5f302011-07-19 20:32:25 +080028
29#if USE_OLD_JIT
30#include "OldJIT/ContextManager.h"
31#endif
32
Logan4dcd6792011-02-28 05:12:00 +080033#include "DebugHelper.h"
Logan04329712011-01-06 06:10:57 +080034#include "FileHandle.h"
Logancf3e5212010-12-29 01:44:55 +080035#include "ScriptCompiled.h"
Logan9a5f8682011-01-07 06:09:57 +080036#include "ScriptCached.h"
37#include "Sha1Helper.h"
Logan474cbd22011-01-31 01:47:44 +080038#include "SourceInfo.h"
Logancf3e5212010-12-29 01:44:55 +080039
Logan89eb47f2011-01-07 10:45:16 +080040#include <errno.h>
Logan474cbd22011-01-31 01:47:44 +080041#include <sys/stat.h>
42#include <sys/types.h>
Logancf3e5212010-12-29 01:44:55 +080043
Logan89eb47f2011-01-07 10:45:16 +080044#include <new>
45#include <string.h>
Logan033f46e2011-01-06 05:51:24 +080046#include <cutils/properties.h>
47
Logan89eb47f2011-01-07 10:45:16 +080048
Loganecf4cbd2011-01-06 05:34:11 +080049namespace {
50
Logan033f46e2011-01-06 05:51:24 +080051bool getBooleanProp(const char *str) {
Loganf340bf72011-01-14 17:51:40 +080052 char buf[PROPERTY_VALUE_MAX];
53 property_get(str, buf, "0");
54 return strcmp(buf, "0") != 0;
Logan033f46e2011-01-06 05:51:24 +080055}
56
Loganecf4cbd2011-01-06 05:34:11 +080057} // namespace anonymous
58
Logancf3e5212010-12-29 01:44:55 +080059namespace bcc {
60
61Script::~Script() {
Logan35849002011-01-15 07:30:43 +080062 switch (mStatus) {
63 case ScriptStatus::Compiled:
Logancf3e5212010-12-29 01:44:55 +080064 delete mCompiled;
Logan35849002011-01-15 07:30:43 +080065 break;
66
67#if USE_CACHE
68 case ScriptStatus::Cached:
Shih-wei Liaoc4cf6542011-01-13 01:43:01 -080069 delete mCached;
Logan35849002011-01-15 07:30:43 +080070 break;
71#endif
72
73 default:
74 break;
Logancf3e5212010-12-29 01:44:55 +080075 }
Logan474cbd22011-01-31 01:47:44 +080076
77 for (size_t i = 0; i < 2; ++i) {
78 delete mSourceList[i];
79 }
Logancf3e5212010-12-29 01:44:55 +080080}
81
82
Logan474cbd22011-01-31 01:47:44 +080083int Script::addSourceBC(size_t idx,
84 char const *resName,
85 const char *bitcode,
86 size_t bitcodeSize,
87 unsigned long flags) {
Shih-wei Liao898c5a92011-05-18 07:02:39 -070088
89 if (!resName) {
90 mErrorCode = BCC_INVALID_VALUE;
91 LOGE("Invalid argument: resName = NULL\n");
92 return 1;
93 }
94
Loganecf4cbd2011-01-06 05:34:11 +080095 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +080096 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +080097 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +080098 return 1;
99 }
100
Logan474cbd22011-01-31 01:47:44 +0800101 if (!bitcode) {
102 mErrorCode = BCC_INVALID_VALUE;
103 LOGE("Invalid argument: bitcode = NULL\n");
104 return 1;
105 }
106
107 mSourceList[idx] = SourceInfo::createFromBuffer(resName,
108 bitcode, bitcodeSize,
109 flags);
110
111 if (!mSourceList[idx]) {
112 mErrorCode = BCC_OUT_OF_MEMORY;
113 LOGE("Out of memory while adding source bitcode\n");
114 return 1;
115 }
116
Loganecf4cbd2011-01-06 05:34:11 +0800117 return 0;
Logancf3e5212010-12-29 01:44:55 +0800118}
119
120
Logan474cbd22011-01-31 01:47:44 +0800121int Script::addSourceModule(size_t idx,
122 llvm::Module *module,
123 unsigned long flags) {
Logancf3e5212010-12-29 01:44:55 +0800124 if (mStatus != ScriptStatus::Unknown) {
125 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800126 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800127 return 1;
128 }
129
Logan474cbd22011-01-31 01:47:44 +0800130 if (!module) {
131 mErrorCode = BCC_INVALID_VALUE;
132 LOGE("Invalid argument: module = NULL\n");
133 return 1;
134 }
135
136 mSourceList[idx] = SourceInfo::createFromModule(module, flags);
137
138 if (!mSourceList[idx]) {
139 mErrorCode = BCC_OUT_OF_MEMORY;
140 LOGE("Out of memory when add source module\n");
141 return 1;
142 }
143
Loganecf4cbd2011-01-06 05:34:11 +0800144 return 0;
Logancf3e5212010-12-29 01:44:55 +0800145}
146
147
Logan474cbd22011-01-31 01:47:44 +0800148int Script::addSourceFile(size_t idx,
149 char const *path,
150 unsigned long flags) {
Logan3133c412011-01-06 06:15:40 +0800151 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800152 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800153 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800154 return 1;
155 }
156
Logan474cbd22011-01-31 01:47:44 +0800157 if (!path) {
158 mErrorCode = BCC_INVALID_VALUE;
159 LOGE("Invalid argument: path = NULL\n");
160 return 1;
161 }
162
163 struct stat sb;
164 if (stat(path, &sb) != 0) {
165 mErrorCode = BCC_INVALID_VALUE;
166 LOGE("File not found: %s\n", path);
167 return 1;
168 }
169
170 mSourceList[idx] = SourceInfo::createFromFile(path, flags);
171
172 if (!mSourceList[idx]) {
173 mErrorCode = BCC_OUT_OF_MEMORY;
174 LOGE("Out of memory while adding source file\n");
175 return 1;
176 }
177
Logan3133c412011-01-06 06:15:40 +0800178 return 0;
Logancf3e5212010-12-29 01:44:55 +0800179}
180
181
Logan Chien311c26f2011-07-11 14:30:34 +0800182int Script::prepareExecutable(char const *cacheDir,
183 char const *cacheName,
184 unsigned long flags) {
Loganecf4cbd2011-01-06 05:34:11 +0800185 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800186 mErrorCode = BCC_INVALID_OPERATION;
Loganecf4cbd2011-01-06 05:34:11 +0800187 LOGE("Invalid operation: %s\n", __func__);
Logancf3e5212010-12-29 01:44:55 +0800188 return 1;
189 }
190
Logan35849002011-01-15 07:30:43 +0800191#if USE_CACHE
Logan Chien311c26f2011-07-11 14:30:34 +0800192 if (cacheDir && cacheName) {
193 // Set Cache Directory and File Name
194 mCacheDir = cacheDir;
195 mCacheName = cacheName;
196
197 if (!mCacheDir.empty() && *mCacheDir.rbegin() != '/') {
198 mCacheDir.push_back('/'); // Ensure mCacheDir is end with '/'
199 }
200
201 // Load Cache File
202 if (internalLoadCache() == 0) {
203 return 0;
204 }
Logan033f46e2011-01-06 05:51:24 +0800205 }
Logan35849002011-01-15 07:30:43 +0800206#endif
Loganecf4cbd2011-01-06 05:34:11 +0800207
Stephen Hines27b35102011-05-11 17:58:48 -0700208 int status = internalCompile();
209 if (status != 0) {
210 LOGE("LLVM error message: %s\n", getCompilerErrorMessage());
211 }
212 return status;
Logan033f46e2011-01-06 05:51:24 +0800213}
214
215
Logan35849002011-01-15 07:30:43 +0800216#if USE_CACHE
Logan033f46e2011-01-06 05:51:24 +0800217int Script::internalLoadCache() {
Joseph Wen76919072011-07-07 23:06:15 -0700218 if (getBooleanProp("debug.bcc.nocache")) {
Logan033f46e2011-01-06 05:51:24 +0800219 // Android system environment property disable the cache mechanism by
220 // setting "debug.bcc.nocache". So we will not load the cache file any
221 // way.
222 return 1;
223 }
224
Logan Chien311c26f2011-07-11 14:30:34 +0800225 if (mCacheDir.empty() || mCacheName.empty()) {
Loganf340bf72011-01-14 17:51:40 +0800226 // The application developer has not specify the cachePath, so
Logan04329712011-01-06 06:10:57 +0800227 // we don't know where to open the cache file.
228 return 1;
Logan033f46e2011-01-06 05:51:24 +0800229 }
Logan04329712011-01-06 06:10:57 +0800230
Logan Chien311c26f2011-07-11 14:30:34 +0800231#if USE_OLD_JIT
Logan Chien03a2e302011-07-13 21:46:32 +0800232 std::string objPath(mCacheDir + mCacheName + ".jit-image");
233 std::string infoPath(mCacheDir + mCacheName + ".oBCC"); // TODO: .info instead
Logan Chien311c26f2011-07-11 14:30:34 +0800234#elif USE_MCJIT
235 std::string objPath(mCacheDir + mCacheName + ".o");
236 std::string infoPath(mCacheDir + mCacheName + ".info");
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700237#endif
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700238
Logan Chien311c26f2011-07-11 14:30:34 +0800239 FileHandle objFile;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700240 if (objFile.open(objPath.c_str(), OpenMode::Read) < 0) {
Logan Chien03a2e302011-07-13 21:46:32 +0800241 // Unable to open the executable file in read mode.
Logan04329712011-01-06 06:10:57 +0800242 return 1;
243 }
244
Logan Chien311c26f2011-07-11 14:30:34 +0800245 FileHandle infoFile;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700246 if (infoFile.open(infoPath.c_str(), OpenMode::Read) < 0) {
Logan Chien03a2e302011-07-13 21:46:32 +0800247 // Unable to open the metadata information file in read mode.
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700248 return 1;
249 }
250
Logan Chien311c26f2011-07-11 14:30:34 +0800251#if USE_OLD_JIT
252 CacheReader reader;
253#elif USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700254 MCCacheReader reader;
255
256 // Register symbol lookup function
257 if (mpExtSymbolLookupFn) {
258 reader.registerSymbolCallback(mpExtSymbolLookupFn,
259 mpExtSymbolLookupFnContext);
260 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700261#endif
Logan04329712011-01-06 06:10:57 +0800262
Logan9a5f8682011-01-07 06:09:57 +0800263 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700264 reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700265 reader.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logan9a5f8682011-01-07 06:09:57 +0800266
Logan474cbd22011-01-31 01:47:44 +0800267 for (size_t i = 0; i < 2; ++i) {
268 if (mSourceList[i]) {
269 mSourceList[i]->introDependency(reader);
270 }
Logan9a5f8682011-01-07 06:09:57 +0800271 }
272
273 // Read cache file
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700274 ScriptCached *cached = reader.readCacheFile(&objFile, &infoFile, this);
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700275
Logan04329712011-01-06 06:10:57 +0800276 if (!cached) {
Logan42598052011-01-26 22:41:13 +0800277 mIsContextSlotNotAvail = reader.isContextSlotNotAvail();
Logan04329712011-01-06 06:10:57 +0800278 return 1;
279 }
280
281 mCached = cached;
282 mStatus = ScriptStatus::Cached;
Logan033f46e2011-01-06 05:51:24 +0800283
Loganf3c83ce2011-01-07 06:36:33 +0800284 // Dirty hack for libRS.
285 // TODO(all): This dirty hack should be removed in the future.
Shih-wei Liao8eb5fe92011-02-01 04:17:38 -0800286 if (!cached->isLibRSThreadable() && mpExtSymbolLookupFn) {
Loganf3c83ce2011-01-07 06:36:33 +0800287 mpExtSymbolLookupFn(mpExtSymbolLookupFnContext, "__clearThreadable");
288 }
289
Loganf7f0ac52011-01-07 03:53:43 +0800290 return 0;
Logan033f46e2011-01-06 05:51:24 +0800291}
Logan35849002011-01-15 07:30:43 +0800292#endif
Logan033f46e2011-01-06 05:51:24 +0800293
Logan033f46e2011-01-06 05:51:24 +0800294int Script::internalCompile() {
295 // Create the ScriptCompiled object
Nowar Gu09b6c1c2011-05-24 23:49:07 +0800296 mCompiled = new (std::nothrow) ScriptCompiled(this);
Loganecf4cbd2011-01-06 05:34:11 +0800297
298 if (!mCompiled) {
299 mErrorCode = BCC_OUT_OF_MEMORY;
300 LOGE("Out of memory: %s %d\n", __FILE__, __LINE__);
301 return 1;
302 }
303
304 mStatus = ScriptStatus::Compiled;
305
Logan033f46e2011-01-06 05:51:24 +0800306 // Register symbol lookup function
Loganecf4cbd2011-01-06 05:34:11 +0800307 if (mpExtSymbolLookupFn) {
308 mCompiled->registerSymbolCallback(mpExtSymbolLookupFn,
309 mpExtSymbolLookupFnContext);
310 }
311
Logan474cbd22011-01-31 01:47:44 +0800312 // Parse Bitcode File (if necessary)
313 for (size_t i = 0; i < 2; ++i) {
314 if (mSourceList[i] && mSourceList[i]->prepareModule(mCompiled) != 0) {
315 LOGE("Unable to parse bitcode for source[%lu]\n", (unsigned long)i);
Logan033f46e2011-01-06 05:51:24 +0800316 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800317 }
Logan474cbd22011-01-31 01:47:44 +0800318 }
319
320 // Set the main source module
321 if (!mSourceList[0] || !mSourceList[0]->getModule()) {
322 LOGE("Source bitcode is not setted.\n");
323 return 1;
324 }
325
326 if (mCompiled->readModule(mSourceList[0]->takeModule()) != 0) {
327 LOGE("Unable to read source module\n");
328 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800329 }
330
Logan3133c412011-01-06 06:15:40 +0800331 // Link the source module with the library module
Logan474cbd22011-01-31 01:47:44 +0800332 if (mSourceList[1]) {
333 if (mCompiled->linkModule(mSourceList[1]->takeModule()) != 0) {
334 LOGE("Unable to link library module\n");
Logan04329712011-01-06 06:10:57 +0800335 return 1;
336 }
337 }
Loganecf4cbd2011-01-06 05:34:11 +0800338
Logan3133c412011-01-06 06:15:40 +0800339 // Compile and JIT the code
Logan04329712011-01-06 06:10:57 +0800340 if (mCompiled->compile() != 0) {
Logan65719812011-01-07 11:17:14 +0800341 LOGE("Unable to compile.\n");
Logan04329712011-01-06 06:10:57 +0800342 return 1;
343 }
344
Logan35849002011-01-15 07:30:43 +0800345#if USE_CACHE
Logan42598052011-01-26 22:41:13 +0800346 // Note: If we re-compile the script because the cached context slot not
347 // available, then we don't have to write the cache.
348
349 // Note: If the address of the context is not in the context slot, then
350 // we don't have to cache it.
351
Logan Chien311c26f2011-07-11 14:30:34 +0800352 if (!mCacheDir.empty() &&
353 !mCacheName.empty() &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700354#if USE_OLD_JIT
Logan1dc63142011-02-25 17:14:51 +0800355 !mIsContextSlotNotAvail &&
356 ContextManager::get().isManagingContext(getContext()) &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700357#endif
Logan42598052011-01-26 22:41:13 +0800358 !getBooleanProp("debug.bcc.nocache")) {
359
Logan Chien311c26f2011-07-11 14:30:34 +0800360#if USE_OLD_JIT
Logan Chien03a2e302011-07-13 21:46:32 +0800361 std::string objPath(mCacheDir + mCacheName + ".jit-image");
362 std::string infoPath(mCacheDir + mCacheName + ".oBCC");
Logan Chien311c26f2011-07-11 14:30:34 +0800363#elif USE_MCJIT
Logan Chien311c26f2011-07-11 14:30:34 +0800364 std::string objPath(mCacheDir + mCacheName + ".o");
365 std::string infoPath(mCacheDir + mCacheName + ".info");
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700366#endif
Logan04329712011-01-06 06:10:57 +0800367
Logan Chien311c26f2011-07-11 14:30:34 +0800368
Jeff Brown937a0bc2011-01-26 23:20:14 -0800369 // Remove the file if it already exists before writing the new file.
370 // The old file may still be mapped elsewhere in memory and we do not want
371 // to modify its contents. (The same script may be running concurrently in
372 // the same process or a different process!)
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700373 ::unlink(objPath.c_str());
Logan Chien311c26f2011-07-11 14:30:34 +0800374#if !USE_OLD_JIT && USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700375 ::unlink(infoPath.c_str());
376#endif
Jeff Brown937a0bc2011-01-26 23:20:14 -0800377
Logan Chien03a2e302011-07-13 21:46:32 +0800378 FileHandle objFile;
379 FileHandle infoFile;
380
381 if (objFile.open(objPath.c_str(), OpenMode::Write) >= 0 &&
382 infoFile.open(infoPath.c_str(), OpenMode::Write) >= 0) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700383
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700384#if USE_OLD_JIT
Logan04329712011-01-06 06:10:57 +0800385 CacheWriter writer;
Logan Chien311c26f2011-07-11 14:30:34 +0800386#elif USE_MCJIT
387 MCCacheWriter writer;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700388#endif
Logana27a83f2011-01-07 10:25:48 +0800389
Joseph Wen2ca6e572011-06-24 14:12:23 -0700390#ifdef TARGET_BUILD
Logana2e15af2011-01-07 11:46:08 +0800391 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700392 writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700393 writer.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logane1323992011-01-12 04:47:13 +0800394#endif
Logana2e15af2011-01-07 11:46:08 +0800395
Logan474cbd22011-01-31 01:47:44 +0800396 for (size_t i = 0; i < 2; ++i) {
Logan825c3b22011-02-28 05:05:48 +0800397 if (mSourceList[i]) {
398 mSourceList[i]->introDependency(writer);
399 }
Logana2e15af2011-01-07 11:46:08 +0800400 }
401
Logana27a83f2011-01-07 10:25:48 +0800402 // libRS is threadable dirty hack
403 // TODO: This should be removed in the future
404 uint32_t libRS_threadable = 0;
405 if (mpExtSymbolLookupFn) {
Logan89eb47f2011-01-07 10:45:16 +0800406 libRS_threadable =
407 (uint32_t)mpExtSymbolLookupFn(mpExtSymbolLookupFnContext,
408 "__isThreadable");
Logana27a83f2011-01-07 10:25:48 +0800409 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700410
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700411 if (!writer.writeCacheFile(&objFile, &infoFile, this, libRS_threadable)) {
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700412 objFile.truncate();
413 objFile.close();
Logana27a83f2011-01-07 10:25:48 +0800414
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700415 if (unlink(objPath.c_str()) != 0) {
Logan89eb47f2011-01-07 10:45:16 +0800416 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700417 objPath.c_str(), strerror(errno));
Logan89eb47f2011-01-07 10:45:16 +0800418 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700419
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700420 infoFile.truncate();
421 infoFile.close();
422
423 if (unlink(infoPath.c_str()) != 0) {
424 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
425 infoPath.c_str(), strerror(errno));
426 }
Logan89eb47f2011-01-07 10:45:16 +0800427 }
428 }
Logan04329712011-01-06 06:10:57 +0800429 }
Logan35849002011-01-15 07:30:43 +0800430#endif // USE_CACHE
Logan04329712011-01-06 06:10:57 +0800431
432 return 0;
Logancf3e5212010-12-29 01:44:55 +0800433}
434
435
436char const *Script::getCompilerErrorMessage() {
437 if (mStatus != ScriptStatus::Compiled) {
438 mErrorCode = BCC_INVALID_OPERATION;
439 return NULL;
440 }
441
442 return mCompiled->getCompilerErrorMessage();
443}
444
445
446void *Script::lookup(const char *name) {
Logan89eb47f2011-01-07 10:45:16 +0800447 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700448 case ScriptStatus::Compiled: {
449 return mCompiled->lookup(name);
450 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700451
Logan35849002011-01-15 07:30:43 +0800452#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700453 case ScriptStatus::Cached: {
454 return mCached->lookup(name);
455 }
Logan35849002011-01-15 07:30:43 +0800456#endif
Logan89eb47f2011-01-07 10:45:16 +0800457
Shih-wei Liaod50be322011-07-01 22:53:31 -0700458 default: {
459 mErrorCode = BCC_INVALID_OPERATION;
460 return NULL;
461 }
Logancf3e5212010-12-29 01:44:55 +0800462 }
Logancf3e5212010-12-29 01:44:55 +0800463}
464
465
Loganbe79ada2011-01-13 01:33:45 +0800466size_t Script::getExportVarCount() const {
Logan89eb47f2011-01-07 10:45:16 +0800467 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700468 case ScriptStatus::Compiled: {
469 return mCompiled->getExportVarCount();
470 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700471
Logan35849002011-01-15 07:30:43 +0800472#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700473 case ScriptStatus::Cached: {
474 return mCached->getExportVarCount();
475 }
Logan35849002011-01-15 07:30:43 +0800476#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700477
Shih-wei Liaod50be322011-07-01 22:53:31 -0700478 default: {
479 return 0;
480 }
Loganbe79ada2011-01-13 01:33:45 +0800481 }
482}
483
484
485size_t Script::getExportFuncCount() const {
486 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700487 case ScriptStatus::Compiled: {
488 return mCompiled->getExportFuncCount();
489 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700490
Logan35849002011-01-15 07:30:43 +0800491#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700492 case ScriptStatus::Cached: {
493 return mCached->getExportFuncCount();
494 }
Logan35849002011-01-15 07:30:43 +0800495#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700496
Shih-wei Liaod50be322011-07-01 22:53:31 -0700497 default: {
498 return 0;
499 }
Loganbe79ada2011-01-13 01:33:45 +0800500 }
501}
502
503
504size_t Script::getPragmaCount() const {
505 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700506 case ScriptStatus::Compiled: {
507 return mCompiled->getPragmaCount();
508 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700509
Logan35849002011-01-15 07:30:43 +0800510#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700511 case ScriptStatus::Cached: {
512 return mCached->getPragmaCount();
513 }
Logan35849002011-01-15 07:30:43 +0800514#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700515
Shih-wei Liaod50be322011-07-01 22:53:31 -0700516 default: {
517 return 0;
518 }
Loganbe79ada2011-01-13 01:33:45 +0800519 }
520}
521
522
523size_t Script::getFuncCount() const {
524 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700525 case ScriptStatus::Compiled: {
526 return mCompiled->getFuncCount();
527 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700528
Logan35849002011-01-15 07:30:43 +0800529#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700530 case ScriptStatus::Cached: {
531 return mCached->getFuncCount();
532 }
Logan35849002011-01-15 07:30:43 +0800533#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700534
Shih-wei Liaod50be322011-07-01 22:53:31 -0700535 default: {
536 return 0;
537 }
Loganbe79ada2011-01-13 01:33:45 +0800538 }
539}
540
541
Stephen Hines071288a2011-01-27 14:38:26 -0800542size_t Script::getObjectSlotCount() const {
543 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700544 case ScriptStatus::Compiled: {
545 return mCompiled->getObjectSlotCount();
546 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700547
Stephen Hines071288a2011-01-27 14:38:26 -0800548#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700549 case ScriptStatus::Cached: {
550 return mCached->getObjectSlotCount();
551 }
Stephen Hines071288a2011-01-27 14:38:26 -0800552#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700553
Shih-wei Liaod50be322011-07-01 22:53:31 -0700554 default: {
555 return 0;
556 }
Stephen Hines071288a2011-01-27 14:38:26 -0800557 }
558}
559
560
Loganbe79ada2011-01-13 01:33:45 +0800561void Script::getExportVarList(size_t varListSize, void **varList) {
562 switch (mStatus) {
563#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700564 case ScriptStatus::STATUS: \
565 m##STATUS->getExportVarList(varListSize, varList); \
566 break;
Logancf3e5212010-12-29 01:44:55 +0800567
Logan35849002011-01-15 07:30:43 +0800568#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700569 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800570#endif
571
Shih-wei Liaod50be322011-07-01 22:53:31 -0700572 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800573#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800574
Shih-wei Liaod50be322011-07-01 22:53:31 -0700575 default: {
576 mErrorCode = BCC_INVALID_OPERATION;
577 }
Logan89eb47f2011-01-07 10:45:16 +0800578 }
Logancf3e5212010-12-29 01:44:55 +0800579}
580
Joseph Wenf36637f2011-07-06 18:27:12 -0700581void Script::getExportVarNameList(std::vector<std::string> &varList) {
582 switch (mStatus) {
583 case ScriptStatus::Compiled: {
584 return mCompiled->getExportVarNameList(varList);
585 }
586
587 default: {
588 mErrorCode = BCC_INVALID_OPERATION;
589 }
590 }
591}
592
Logancf3e5212010-12-29 01:44:55 +0800593
Loganbe79ada2011-01-13 01:33:45 +0800594void Script::getExportFuncList(size_t funcListSize, void **funcList) {
Logan89eb47f2011-01-07 10:45:16 +0800595 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800596#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700597 case ScriptStatus::STATUS: \
598 m##STATUS->getExportFuncList(funcListSize, funcList); \
599 break;
Logancf3e5212010-12-29 01:44:55 +0800600
Logan35849002011-01-15 07:30:43 +0800601#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700602 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800603#endif
604
Shih-wei Liaod50be322011-07-01 22:53:31 -0700605 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800606#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800607
Shih-wei Liaod50be322011-07-01 22:53:31 -0700608 default: {
609 mErrorCode = BCC_INVALID_OPERATION;
610 }
Logan89eb47f2011-01-07 10:45:16 +0800611 }
Logancf3e5212010-12-29 01:44:55 +0800612}
613
Joseph Wenf36637f2011-07-06 18:27:12 -0700614void Script::getExportFuncNameList(std::vector<std::string> &funcList) {
615 switch (mStatus) {
616 case ScriptStatus::Compiled: {
617 return mCompiled->getExportFuncNameList(funcList);
618 }
619
620 default: {
621 mErrorCode = BCC_INVALID_OPERATION;
622 }
623 }
624}
625
Logancf3e5212010-12-29 01:44:55 +0800626
Loganbe79ada2011-01-13 01:33:45 +0800627void Script::getPragmaList(size_t pragmaListSize,
628 char const **keyList,
629 char const **valueList) {
Logan89eb47f2011-01-07 10:45:16 +0800630 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800631#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700632 case ScriptStatus::STATUS: \
633 m##STATUS->getPragmaList(pragmaListSize, keyList, valueList); \
634 break;
Logancf3e5212010-12-29 01:44:55 +0800635
Logan35849002011-01-15 07:30:43 +0800636#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700637 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800638#endif
639
Shih-wei Liaod50be322011-07-01 22:53:31 -0700640 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800641#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800642
Shih-wei Liaod50be322011-07-01 22:53:31 -0700643 default: {
644 mErrorCode = BCC_INVALID_OPERATION;
645 }
Logan89eb47f2011-01-07 10:45:16 +0800646 }
Logancf3e5212010-12-29 01:44:55 +0800647}
648
649
Loganf340bf72011-01-14 17:51:40 +0800650void Script::getFuncInfoList(size_t funcInfoListSize,
651 FuncInfo *funcInfoList) {
Logan89eb47f2011-01-07 10:45:16 +0800652 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800653#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700654 case ScriptStatus::STATUS: \
655 m##STATUS->getFuncInfoList(funcInfoListSize, funcInfoList); \
656 break;
Logancf3e5212010-12-29 01:44:55 +0800657
Logan35849002011-01-15 07:30:43 +0800658#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700659 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800660#endif
661
Shih-wei Liaod50be322011-07-01 22:53:31 -0700662 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800663#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800664
Shih-wei Liaod50be322011-07-01 22:53:31 -0700665 default: {
666 mErrorCode = BCC_INVALID_OPERATION;
667 }
Logan89eb47f2011-01-07 10:45:16 +0800668 }
Logancf3e5212010-12-29 01:44:55 +0800669}
670
Stephen Hines071288a2011-01-27 14:38:26 -0800671
672void Script::getObjectSlotList(size_t objectSlotListSize,
673 uint32_t *objectSlotList) {
674 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700675#define DELEGATE(STATUS) \
676 case ScriptStatus::STATUS: \
677 m##STATUS->getObjectSlotList(objectSlotListSize, objectSlotList); \
678 break;
Stephen Hines071288a2011-01-27 14:38:26 -0800679
680#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700681 DELEGATE(Cached);
Stephen Hines071288a2011-01-27 14:38:26 -0800682#endif
683
Shih-wei Liaod50be322011-07-01 22:53:31 -0700684 DELEGATE(Compiled);
Stephen Hines071288a2011-01-27 14:38:26 -0800685#undef DELEGATE
686
Shih-wei Liaod50be322011-07-01 22:53:31 -0700687 default: {
688 mErrorCode = BCC_INVALID_OPERATION;
689 }
Stephen Hines071288a2011-01-27 14:38:26 -0800690 }
691}
692
693
Logan Chiend2a5f302011-07-19 20:32:25 +0800694#if USE_OLD_JIT
Logana27a83f2011-01-07 10:25:48 +0800695char *Script::getContext() {
696 switch (mStatus) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700697
Logan35849002011-01-15 07:30:43 +0800698#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700699 case ScriptStatus::Cached: {
700 return mCached->getContext();
701 }
Logan35849002011-01-15 07:30:43 +0800702#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700703
Shih-wei Liaod50be322011-07-01 22:53:31 -0700704 case ScriptStatus::Compiled: {
705 return mCompiled->getContext();
706 }
Logana27a83f2011-01-07 10:25:48 +0800707
Shih-wei Liaod50be322011-07-01 22:53:31 -0700708 default: {
709 mErrorCode = BCC_INVALID_OPERATION;
710 return NULL;
711 }
Logan02286cb2011-01-07 00:30:47 +0800712 }
Logan02286cb2011-01-07 00:30:47 +0800713}
Logan Chiend2a5f302011-07-19 20:32:25 +0800714#endif
Logan02286cb2011-01-07 00:30:47 +0800715
Logancf3e5212010-12-29 01:44:55 +0800716
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800717int Script::registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
Logancf3e5212010-12-29 01:44:55 +0800718 mpExtSymbolLookupFn = pFn;
719 mpExtSymbolLookupFnContext = pContext;
720
Logan7d2219f2011-01-06 06:19:25 +0800721 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800722 mErrorCode = BCC_INVALID_OPERATION;
Logan7d2219f2011-01-06 06:19:25 +0800723 LOGE("Invalid operation: %s\n", __func__);
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800724 return 1;
Logancf3e5212010-12-29 01:44:55 +0800725 }
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800726 return 0;
Logancf3e5212010-12-29 01:44:55 +0800727}
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700728
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700729#if USE_MCJIT
730size_t Script::getELFSize() const {
731 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700732 case ScriptStatus::Compiled: {
733 return mCompiled->getELFSize();
734 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700735
Shih-wei Liaod50be322011-07-01 22:53:31 -0700736 default: {
737 return 0;
738 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700739 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700740}
741
742const char *Script::getELF() const {
743 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700744 case ScriptStatus::Compiled: {
745 return mCompiled->getELF();
746 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700747
Shih-wei Liaod50be322011-07-01 22:53:31 -0700748 default: {
749 return NULL;
750 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700751 }
752}
753#endif
Logancf3e5212010-12-29 01:44:55 +0800754
755} // namespace bcc