blob: 72d826ccd9375c0d06840b5cc6e2c4ccd000f8a4 [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
Loganf7f0ac52011-01-07 03:53:43 +080021#include "CacheReader.h"
Logan89eb47f2011-01-07 10:45:16 +080022#include "CacheWriter.h"
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -070023#include "MCCacheReader.h"
24#include "MCCacheWriter.h"
Logan42598052011-01-26 22:41:13 +080025#include "ContextManager.h"
Logan4dcd6792011-02-28 05:12:00 +080026#include "DebugHelper.h"
Logan04329712011-01-06 06:10:57 +080027#include "FileHandle.h"
Logancf3e5212010-12-29 01:44:55 +080028#include "ScriptCompiled.h"
Logan9a5f8682011-01-07 06:09:57 +080029#include "ScriptCached.h"
30#include "Sha1Helper.h"
Logan474cbd22011-01-31 01:47:44 +080031#include "SourceInfo.h"
Logancf3e5212010-12-29 01:44:55 +080032
Logan89eb47f2011-01-07 10:45:16 +080033#include <errno.h>
Logan474cbd22011-01-31 01:47:44 +080034#include <sys/stat.h>
35#include <sys/types.h>
Logancf3e5212010-12-29 01:44:55 +080036
Logan89eb47f2011-01-07 10:45:16 +080037#include <new>
38#include <string.h>
Logan033f46e2011-01-06 05:51:24 +080039#include <cutils/properties.h>
40
Logan89eb47f2011-01-07 10:45:16 +080041
Loganecf4cbd2011-01-06 05:34:11 +080042namespace {
43
Logan033f46e2011-01-06 05:51:24 +080044bool getBooleanProp(const char *str) {
Loganf340bf72011-01-14 17:51:40 +080045 char buf[PROPERTY_VALUE_MAX];
46 property_get(str, buf, "0");
47 return strcmp(buf, "0") != 0;
Logan033f46e2011-01-06 05:51:24 +080048}
49
Loganecf4cbd2011-01-06 05:34:11 +080050} // namespace anonymous
51
Logancf3e5212010-12-29 01:44:55 +080052namespace bcc {
53
54Script::~Script() {
Logan35849002011-01-15 07:30:43 +080055 switch (mStatus) {
56 case ScriptStatus::Compiled:
Logancf3e5212010-12-29 01:44:55 +080057 delete mCompiled;
Logan35849002011-01-15 07:30:43 +080058 break;
59
60#if USE_CACHE
61 case ScriptStatus::Cached:
Shih-wei Liaoc4cf6542011-01-13 01:43:01 -080062 delete mCached;
Logan35849002011-01-15 07:30:43 +080063 break;
64#endif
65
66 default:
67 break;
Logancf3e5212010-12-29 01:44:55 +080068 }
Logan474cbd22011-01-31 01:47:44 +080069
70 for (size_t i = 0; i < 2; ++i) {
71 delete mSourceList[i];
72 }
Logancf3e5212010-12-29 01:44:55 +080073}
74
75
Logan474cbd22011-01-31 01:47:44 +080076int Script::addSourceBC(size_t idx,
77 char const *resName,
78 const char *bitcode,
79 size_t bitcodeSize,
80 unsigned long flags) {
Shih-wei Liao898c5a92011-05-18 07:02:39 -070081
82 if (!resName) {
83 mErrorCode = BCC_INVALID_VALUE;
84 LOGE("Invalid argument: resName = NULL\n");
85 return 1;
86 }
87
Loganecf4cbd2011-01-06 05:34:11 +080088 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +080089 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +080090 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +080091 return 1;
92 }
93
Logan474cbd22011-01-31 01:47:44 +080094 if (!bitcode) {
95 mErrorCode = BCC_INVALID_VALUE;
96 LOGE("Invalid argument: bitcode = NULL\n");
97 return 1;
98 }
99
100 mSourceList[idx] = SourceInfo::createFromBuffer(resName,
101 bitcode, bitcodeSize,
102 flags);
103
104 if (!mSourceList[idx]) {
105 mErrorCode = BCC_OUT_OF_MEMORY;
106 LOGE("Out of memory while adding source bitcode\n");
107 return 1;
108 }
109
Loganecf4cbd2011-01-06 05:34:11 +0800110 return 0;
Logancf3e5212010-12-29 01:44:55 +0800111}
112
113
Logan474cbd22011-01-31 01:47:44 +0800114int Script::addSourceModule(size_t idx,
115 llvm::Module *module,
116 unsigned long flags) {
Logancf3e5212010-12-29 01:44:55 +0800117 if (mStatus != ScriptStatus::Unknown) {
118 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800119 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800120 return 1;
121 }
122
Logan474cbd22011-01-31 01:47:44 +0800123 if (!module) {
124 mErrorCode = BCC_INVALID_VALUE;
125 LOGE("Invalid argument: module = NULL\n");
126 return 1;
127 }
128
129 mSourceList[idx] = SourceInfo::createFromModule(module, flags);
130
131 if (!mSourceList[idx]) {
132 mErrorCode = BCC_OUT_OF_MEMORY;
133 LOGE("Out of memory when add source module\n");
134 return 1;
135 }
136
Loganecf4cbd2011-01-06 05:34:11 +0800137 return 0;
Logancf3e5212010-12-29 01:44:55 +0800138}
139
140
Logan474cbd22011-01-31 01:47:44 +0800141int Script::addSourceFile(size_t idx,
142 char const *path,
143 unsigned long flags) {
Logan3133c412011-01-06 06:15:40 +0800144 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800145 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800146 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800147 return 1;
148 }
149
Logan474cbd22011-01-31 01:47:44 +0800150 if (!path) {
151 mErrorCode = BCC_INVALID_VALUE;
152 LOGE("Invalid argument: path = NULL\n");
153 return 1;
154 }
155
156 struct stat sb;
157 if (stat(path, &sb) != 0) {
158 mErrorCode = BCC_INVALID_VALUE;
159 LOGE("File not found: %s\n", path);
160 return 1;
161 }
162
163 mSourceList[idx] = SourceInfo::createFromFile(path, flags);
164
165 if (!mSourceList[idx]) {
166 mErrorCode = BCC_OUT_OF_MEMORY;
167 LOGE("Out of memory while adding source file\n");
168 return 1;
169 }
170
Logan3133c412011-01-06 06:15:40 +0800171 return 0;
Logancf3e5212010-12-29 01:44:55 +0800172}
173
174
Loganf340bf72011-01-14 17:51:40 +0800175int Script::prepareExecutable(char const *cachePath, unsigned long flags) {
Loganecf4cbd2011-01-06 05:34:11 +0800176 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800177 mErrorCode = BCC_INVALID_OPERATION;
Loganecf4cbd2011-01-06 05:34:11 +0800178 LOGE("Invalid operation: %s\n", __func__);
Logancf3e5212010-12-29 01:44:55 +0800179 return 1;
180 }
181
Logan35849002011-01-15 07:30:43 +0800182#if USE_CACHE
Loganecf4cbd2011-01-06 05:34:11 +0800183 // Load Cache File
Loganf340bf72011-01-14 17:51:40 +0800184 mCachePath = cachePath;
185 if (cachePath && internalLoadCache() == 0) {
Logan033f46e2011-01-06 05:51:24 +0800186 return 0;
187 }
Logan35849002011-01-15 07:30:43 +0800188#endif
Loganecf4cbd2011-01-06 05:34:11 +0800189
Stephen Hines27b35102011-05-11 17:58:48 -0700190 int status = internalCompile();
191 if (status != 0) {
192 LOGE("LLVM error message: %s\n", getCompilerErrorMessage());
193 }
194 return status;
Logan033f46e2011-01-06 05:51:24 +0800195}
196
197
Logan35849002011-01-15 07:30:43 +0800198#if USE_CACHE
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700199bool getObjPath(std::string &objPath) {
200 size_t found0 = objPath.find("@");
201 size_t found1 = objPath.rfind("@");
202
203 if (found0 == found1 ||
204 found0 == std::string::npos ||
205 found1 == std::string::npos) {
206 LOGE("Ill formatted resource name '%s'. The name should contain 2 @s",
207 objPath.c_str());
208 return false;
209 }
210
211 objPath.replace(found0, found1 - found0 + 1, "", 0);
212 objPath.resize(objPath.length() - 3);
213
214 LOGV("objPath = %s", objPath.c_str());
215 return true;
216}
217
218bool getInfoPath(std::string &infoPath) {
219 getObjPath(infoPath);
220 infoPath.erase(infoPath.size() - 1, 1);
221 infoPath.append("info");
222
223 LOGV("infoPath = %s", infoPath.c_str());
224 return true;
225}
226
Logan033f46e2011-01-06 05:51:24 +0800227int Script::internalLoadCache() {
Joseph Wen76919072011-07-07 23:06:15 -0700228 if (getBooleanProp("debug.bcc.nocache")) {
Logan033f46e2011-01-06 05:51:24 +0800229 // Android system environment property disable the cache mechanism by
230 // setting "debug.bcc.nocache". So we will not load the cache file any
231 // way.
232 return 1;
233 }
234
Loganf340bf72011-01-14 17:51:40 +0800235 if (!mCachePath) {
236 // The application developer has not specify the cachePath, so
Logan04329712011-01-06 06:10:57 +0800237 // we don't know where to open the cache file.
238 return 1;
Logan033f46e2011-01-06 05:51:24 +0800239 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700240 FileHandle objFile, infoFile;
Logan04329712011-01-06 06:10:57 +0800241
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700242 std::string objPath(mCachePath);
243 std::string infoPath(mCachePath);
Logan04329712011-01-06 06:10:57 +0800244
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700245#if USE_MCJIT
246 getObjPath(objPath);
247 getInfoPath(infoPath);
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700248#endif
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700249
250 if (objFile.open(objPath.c_str(), OpenMode::Read) < 0) {
Logan04329712011-01-06 06:10:57 +0800251 // Unable to open the cache file in read mode.
252 return 1;
253 }
254
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700255#if USE_OLD_JIT
Logane7eb7732011-01-07 07:11:56 +0800256 CacheReader reader;
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700257#endif
258
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700259#if USE_MCJIT
260 if (infoFile.open(infoPath.c_str(), OpenMode::Read) < 0) {
261 // Unable to open the cache file in read mode.
262 return 1;
263 }
264
265 MCCacheReader reader;
266
267 // Register symbol lookup function
268 if (mpExtSymbolLookupFn) {
269 reader.registerSymbolCallback(mpExtSymbolLookupFn,
270 mpExtSymbolLookupFnContext);
271 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700272#endif
Logan04329712011-01-06 06:10:57 +0800273
Logan9a5f8682011-01-07 06:09:57 +0800274 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700275 reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700276 reader.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logan9a5f8682011-01-07 06:09:57 +0800277
Logan474cbd22011-01-31 01:47:44 +0800278 for (size_t i = 0; i < 2; ++i) {
279 if (mSourceList[i]) {
280 mSourceList[i]->introDependency(reader);
281 }
Logan9a5f8682011-01-07 06:09:57 +0800282 }
283
284 // Read cache file
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700285#if USE_MCJIT
286 ScriptCached *cached = reader.readCacheFile(&objFile, &infoFile, this);
287#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700288
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700289#if USE_OLD_JIT
290 ScriptCached *cached = reader.readCacheFile(&objFile, this);
291#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700292
Logan04329712011-01-06 06:10:57 +0800293 if (!cached) {
Logan42598052011-01-26 22:41:13 +0800294 mIsContextSlotNotAvail = reader.isContextSlotNotAvail();
Logan04329712011-01-06 06:10:57 +0800295 return 1;
296 }
297
298 mCached = cached;
299 mStatus = ScriptStatus::Cached;
Logan033f46e2011-01-06 05:51:24 +0800300
Loganf3c83ce2011-01-07 06:36:33 +0800301 // Dirty hack for libRS.
302 // TODO(all): This dirty hack should be removed in the future.
Shih-wei Liao8eb5fe92011-02-01 04:17:38 -0800303 if (!cached->isLibRSThreadable() && mpExtSymbolLookupFn) {
Loganf3c83ce2011-01-07 06:36:33 +0800304 mpExtSymbolLookupFn(mpExtSymbolLookupFnContext, "__clearThreadable");
305 }
306
Loganf7f0ac52011-01-07 03:53:43 +0800307 return 0;
Logan033f46e2011-01-06 05:51:24 +0800308}
Logan35849002011-01-15 07:30:43 +0800309#endif
Logan033f46e2011-01-06 05:51:24 +0800310
Logan033f46e2011-01-06 05:51:24 +0800311int Script::internalCompile() {
312 // Create the ScriptCompiled object
Nowar Gu09b6c1c2011-05-24 23:49:07 +0800313 mCompiled = new (std::nothrow) ScriptCompiled(this);
Loganecf4cbd2011-01-06 05:34:11 +0800314
315 if (!mCompiled) {
316 mErrorCode = BCC_OUT_OF_MEMORY;
317 LOGE("Out of memory: %s %d\n", __FILE__, __LINE__);
318 return 1;
319 }
320
321 mStatus = ScriptStatus::Compiled;
322
Logan033f46e2011-01-06 05:51:24 +0800323 // Register symbol lookup function
Loganecf4cbd2011-01-06 05:34:11 +0800324 if (mpExtSymbolLookupFn) {
325 mCompiled->registerSymbolCallback(mpExtSymbolLookupFn,
326 mpExtSymbolLookupFnContext);
327 }
328
Logan474cbd22011-01-31 01:47:44 +0800329 // Parse Bitcode File (if necessary)
330 for (size_t i = 0; i < 2; ++i) {
331 if (mSourceList[i] && mSourceList[i]->prepareModule(mCompiled) != 0) {
332 LOGE("Unable to parse bitcode for source[%lu]\n", (unsigned long)i);
Logan033f46e2011-01-06 05:51:24 +0800333 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800334 }
Logan474cbd22011-01-31 01:47:44 +0800335 }
336
337 // Set the main source module
338 if (!mSourceList[0] || !mSourceList[0]->getModule()) {
339 LOGE("Source bitcode is not setted.\n");
340 return 1;
341 }
342
343 if (mCompiled->readModule(mSourceList[0]->takeModule()) != 0) {
344 LOGE("Unable to read source module\n");
345 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800346 }
347
Logan3133c412011-01-06 06:15:40 +0800348 // Link the source module with the library module
Logan474cbd22011-01-31 01:47:44 +0800349 if (mSourceList[1]) {
350 if (mCompiled->linkModule(mSourceList[1]->takeModule()) != 0) {
351 LOGE("Unable to link library module\n");
Logan04329712011-01-06 06:10:57 +0800352 return 1;
353 }
354 }
Loganecf4cbd2011-01-06 05:34:11 +0800355
Shih-wei Liao5c00f4f2011-05-20 04:14:54 -0700356 mCompiled->setCachePath(mCachePath);
Shih-wei Liao898c5a92011-05-18 07:02:39 -0700357
Logan3133c412011-01-06 06:15:40 +0800358 // Compile and JIT the code
Logan04329712011-01-06 06:10:57 +0800359 if (mCompiled->compile() != 0) {
Logan65719812011-01-07 11:17:14 +0800360 LOGE("Unable to compile.\n");
Logan04329712011-01-06 06:10:57 +0800361 return 1;
362 }
363
Logan35849002011-01-15 07:30:43 +0800364#if USE_CACHE
Logan42598052011-01-26 22:41:13 +0800365 // Note: If we re-compile the script because the cached context slot not
366 // available, then we don't have to write the cache.
367
368 // Note: If the address of the context is not in the context slot, then
369 // we don't have to cache it.
370
Logan42598052011-01-26 22:41:13 +0800371 if (mCachePath &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700372#if USE_OLD_JIT
Logan1dc63142011-02-25 17:14:51 +0800373 !mIsContextSlotNotAvail &&
374 ContextManager::get().isManagingContext(getContext()) &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700375#endif
Logan42598052011-01-26 22:41:13 +0800376 !getBooleanProp("debug.bcc.nocache")) {
377
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700378 FileHandle infoFile, objFile;
379
380 std::string objPath(mCachePath);
381 std::string infoPath(mCachePath);
382
383#if USE_MCJIT
384 getObjPath(objPath);
385 getInfoPath(infoPath);
386#endif
Logan04329712011-01-06 06:10:57 +0800387
Jeff Brown937a0bc2011-01-26 23:20:14 -0800388 // Remove the file if it already exists before writing the new file.
389 // The old file may still be mapped elsewhere in memory and we do not want
390 // to modify its contents. (The same script may be running concurrently in
391 // the same process or a different process!)
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700392 ::unlink(objPath.c_str());
393#if USE_MCJIT
394 ::unlink(infoPath.c_str());
395#endif
Jeff Brown937a0bc2011-01-26 23:20:14 -0800396
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700397 if (objFile.open(objPath.c_str(), OpenMode::Write) >= 0
398#if USE_MCJIT
399 && infoFile.open(infoPath.c_str(), OpenMode::Write) >= 0
400#endif
401 ) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700402
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700403#if USE_MCJIT
404 MCCacheWriter writer;
405#endif
406#if USE_OLD_JIT
Logan04329712011-01-06 06:10:57 +0800407 CacheWriter writer;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700408#endif
Logana27a83f2011-01-07 10:25:48 +0800409
Joseph Wen2ca6e572011-06-24 14:12:23 -0700410#ifdef TARGET_BUILD
Logana2e15af2011-01-07 11:46:08 +0800411 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700412 writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700413 writer.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logane1323992011-01-12 04:47:13 +0800414#endif
Logana2e15af2011-01-07 11:46:08 +0800415
Logan474cbd22011-01-31 01:47:44 +0800416 for (size_t i = 0; i < 2; ++i) {
Logan825c3b22011-02-28 05:05:48 +0800417 if (mSourceList[i]) {
418 mSourceList[i]->introDependency(writer);
419 }
Logana2e15af2011-01-07 11:46:08 +0800420 }
421
Logana27a83f2011-01-07 10:25:48 +0800422 // libRS is threadable dirty hack
423 // TODO: This should be removed in the future
424 uint32_t libRS_threadable = 0;
425 if (mpExtSymbolLookupFn) {
Logan89eb47f2011-01-07 10:45:16 +0800426 libRS_threadable =
427 (uint32_t)mpExtSymbolLookupFn(mpExtSymbolLookupFnContext,
428 "__isThreadable");
Logana27a83f2011-01-07 10:25:48 +0800429 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700430
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700431#if USE_OLD_JIT
432 if (!writer.writeCacheFile(&objFile, this, libRS_threadable)) {
433#endif
434#if USE_MCJIT
435 if (!writer.writeCacheFile(&objFile, &infoFile, this, libRS_threadable)) {
436#endif
437 objFile.truncate();
438 objFile.close();
Logana27a83f2011-01-07 10:25:48 +0800439
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700440 if (unlink(objPath.c_str()) != 0) {
Logan89eb47f2011-01-07 10:45:16 +0800441 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700442 objPath.c_str(), strerror(errno));
Logan89eb47f2011-01-07 10:45:16 +0800443 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700444
445#if USE_MCJIT
446 infoFile.truncate();
447 infoFile.close();
448
449 if (unlink(infoPath.c_str()) != 0) {
450 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
451 infoPath.c_str(), strerror(errno));
452 }
453#endif
Logan89eb47f2011-01-07 10:45:16 +0800454 }
455 }
Logan04329712011-01-06 06:10:57 +0800456 }
Logan35849002011-01-15 07:30:43 +0800457#endif // USE_CACHE
Logan04329712011-01-06 06:10:57 +0800458
459 return 0;
Logancf3e5212010-12-29 01:44:55 +0800460}
461
462
463char const *Script::getCompilerErrorMessage() {
464 if (mStatus != ScriptStatus::Compiled) {
465 mErrorCode = BCC_INVALID_OPERATION;
466 return NULL;
467 }
468
469 return mCompiled->getCompilerErrorMessage();
470}
471
472
473void *Script::lookup(const char *name) {
Logan89eb47f2011-01-07 10:45:16 +0800474 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700475 case ScriptStatus::Compiled: {
476 return mCompiled->lookup(name);
477 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700478
Logan35849002011-01-15 07:30:43 +0800479#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700480 case ScriptStatus::Cached: {
481 return mCached->lookup(name);
482 }
Logan35849002011-01-15 07:30:43 +0800483#endif
Logan89eb47f2011-01-07 10:45:16 +0800484
Shih-wei Liaod50be322011-07-01 22:53:31 -0700485 default: {
486 mErrorCode = BCC_INVALID_OPERATION;
487 return NULL;
488 }
Logancf3e5212010-12-29 01:44:55 +0800489 }
Logancf3e5212010-12-29 01:44:55 +0800490}
491
492
Loganbe79ada2011-01-13 01:33:45 +0800493size_t Script::getExportVarCount() const {
Logan89eb47f2011-01-07 10:45:16 +0800494 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700495 case ScriptStatus::Compiled: {
496 return mCompiled->getExportVarCount();
497 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700498
Logan35849002011-01-15 07:30:43 +0800499#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700500 case ScriptStatus::Cached: {
501 return mCached->getExportVarCount();
502 }
Logan35849002011-01-15 07:30:43 +0800503#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700504
Shih-wei Liaod50be322011-07-01 22:53:31 -0700505 default: {
506 return 0;
507 }
Loganbe79ada2011-01-13 01:33:45 +0800508 }
509}
510
511
512size_t Script::getExportFuncCount() const {
513 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700514 case ScriptStatus::Compiled: {
515 return mCompiled->getExportFuncCount();
516 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700517
Logan35849002011-01-15 07:30:43 +0800518#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700519 case ScriptStatus::Cached: {
520 return mCached->getExportFuncCount();
521 }
Logan35849002011-01-15 07:30:43 +0800522#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700523
Shih-wei Liaod50be322011-07-01 22:53:31 -0700524 default: {
525 return 0;
526 }
Loganbe79ada2011-01-13 01:33:45 +0800527 }
528}
529
530
531size_t Script::getPragmaCount() const {
532 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700533 case ScriptStatus::Compiled: {
534 return mCompiled->getPragmaCount();
535 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700536
Logan35849002011-01-15 07:30:43 +0800537#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700538 case ScriptStatus::Cached: {
539 return mCached->getPragmaCount();
540 }
Logan35849002011-01-15 07:30:43 +0800541#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700542
Shih-wei Liaod50be322011-07-01 22:53:31 -0700543 default: {
544 return 0;
545 }
Loganbe79ada2011-01-13 01:33:45 +0800546 }
547}
548
549
550size_t Script::getFuncCount() const {
551 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700552 case ScriptStatus::Compiled: {
553 return mCompiled->getFuncCount();
554 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700555
Logan35849002011-01-15 07:30:43 +0800556#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700557 case ScriptStatus::Cached: {
558 return mCached->getFuncCount();
559 }
Logan35849002011-01-15 07:30:43 +0800560#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700561
Shih-wei Liaod50be322011-07-01 22:53:31 -0700562 default: {
563 return 0;
564 }
Loganbe79ada2011-01-13 01:33:45 +0800565 }
566}
567
568
Stephen Hines071288a2011-01-27 14:38:26 -0800569size_t Script::getObjectSlotCount() const {
570 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700571 case ScriptStatus::Compiled: {
572 return mCompiled->getObjectSlotCount();
573 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700574
Stephen Hines071288a2011-01-27 14:38:26 -0800575#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700576 case ScriptStatus::Cached: {
577 return mCached->getObjectSlotCount();
578 }
Stephen Hines071288a2011-01-27 14:38:26 -0800579#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700580
Shih-wei Liaod50be322011-07-01 22:53:31 -0700581 default: {
582 return 0;
583 }
Stephen Hines071288a2011-01-27 14:38:26 -0800584 }
585}
586
587
Loganbe79ada2011-01-13 01:33:45 +0800588void Script::getExportVarList(size_t varListSize, void **varList) {
589 switch (mStatus) {
590#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700591 case ScriptStatus::STATUS: \
592 m##STATUS->getExportVarList(varListSize, varList); \
593 break;
Logancf3e5212010-12-29 01:44:55 +0800594
Logan35849002011-01-15 07:30:43 +0800595#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700596 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800597#endif
598
Shih-wei Liaod50be322011-07-01 22:53:31 -0700599 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800600#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800601
Shih-wei Liaod50be322011-07-01 22:53:31 -0700602 default: {
603 mErrorCode = BCC_INVALID_OPERATION;
604 }
Logan89eb47f2011-01-07 10:45:16 +0800605 }
Logancf3e5212010-12-29 01:44:55 +0800606}
607
Joseph Wenf36637f2011-07-06 18:27:12 -0700608void Script::getExportVarNameList(std::vector<std::string> &varList) {
609 switch (mStatus) {
610 case ScriptStatus::Compiled: {
611 return mCompiled->getExportVarNameList(varList);
612 }
613
614 default: {
615 mErrorCode = BCC_INVALID_OPERATION;
616 }
617 }
618}
619
Logancf3e5212010-12-29 01:44:55 +0800620
Loganbe79ada2011-01-13 01:33:45 +0800621void Script::getExportFuncList(size_t funcListSize, void **funcList) {
Logan89eb47f2011-01-07 10:45:16 +0800622 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800623#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700624 case ScriptStatus::STATUS: \
625 m##STATUS->getExportFuncList(funcListSize, funcList); \
626 break;
Logancf3e5212010-12-29 01:44:55 +0800627
Logan35849002011-01-15 07:30:43 +0800628#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700629 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800630#endif
631
Shih-wei Liaod50be322011-07-01 22:53:31 -0700632 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800633#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800634
Shih-wei Liaod50be322011-07-01 22:53:31 -0700635 default: {
636 mErrorCode = BCC_INVALID_OPERATION;
637 }
Logan89eb47f2011-01-07 10:45:16 +0800638 }
Logancf3e5212010-12-29 01:44:55 +0800639}
640
Joseph Wenf36637f2011-07-06 18:27:12 -0700641void Script::getExportFuncNameList(std::vector<std::string> &funcList) {
642 switch (mStatus) {
643 case ScriptStatus::Compiled: {
644 return mCompiled->getExportFuncNameList(funcList);
645 }
646
647 default: {
648 mErrorCode = BCC_INVALID_OPERATION;
649 }
650 }
651}
652
Logancf3e5212010-12-29 01:44:55 +0800653
Loganbe79ada2011-01-13 01:33:45 +0800654void Script::getPragmaList(size_t pragmaListSize,
655 char const **keyList,
656 char const **valueList) {
Logan89eb47f2011-01-07 10:45:16 +0800657 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800658#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700659 case ScriptStatus::STATUS: \
660 m##STATUS->getPragmaList(pragmaListSize, keyList, valueList); \
661 break;
Logancf3e5212010-12-29 01:44:55 +0800662
Logan35849002011-01-15 07:30:43 +0800663#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700664 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800665#endif
666
Shih-wei Liaod50be322011-07-01 22:53:31 -0700667 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800668#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800669
Shih-wei Liaod50be322011-07-01 22:53:31 -0700670 default: {
671 mErrorCode = BCC_INVALID_OPERATION;
672 }
Logan89eb47f2011-01-07 10:45:16 +0800673 }
Logancf3e5212010-12-29 01:44:55 +0800674}
675
676
Loganf340bf72011-01-14 17:51:40 +0800677void Script::getFuncInfoList(size_t funcInfoListSize,
678 FuncInfo *funcInfoList) {
Logan89eb47f2011-01-07 10:45:16 +0800679 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800680#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700681 case ScriptStatus::STATUS: \
682 m##STATUS->getFuncInfoList(funcInfoListSize, funcInfoList); \
683 break;
Logancf3e5212010-12-29 01:44:55 +0800684
Logan35849002011-01-15 07:30:43 +0800685#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700686 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800687#endif
688
Shih-wei Liaod50be322011-07-01 22:53:31 -0700689 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800690#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800691
Shih-wei Liaod50be322011-07-01 22:53:31 -0700692 default: {
693 mErrorCode = BCC_INVALID_OPERATION;
694 }
Logan89eb47f2011-01-07 10:45:16 +0800695 }
Logancf3e5212010-12-29 01:44:55 +0800696}
697
Stephen Hines071288a2011-01-27 14:38:26 -0800698
699void Script::getObjectSlotList(size_t objectSlotListSize,
700 uint32_t *objectSlotList) {
701 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700702#define DELEGATE(STATUS) \
703 case ScriptStatus::STATUS: \
704 m##STATUS->getObjectSlotList(objectSlotListSize, objectSlotList); \
705 break;
Stephen Hines071288a2011-01-27 14:38:26 -0800706
707#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700708 DELEGATE(Cached);
Stephen Hines071288a2011-01-27 14:38:26 -0800709#endif
710
Shih-wei Liaod50be322011-07-01 22:53:31 -0700711 DELEGATE(Compiled);
Stephen Hines071288a2011-01-27 14:38:26 -0800712#undef DELEGATE
713
Shih-wei Liaod50be322011-07-01 22:53:31 -0700714 default: {
715 mErrorCode = BCC_INVALID_OPERATION;
716 }
Stephen Hines071288a2011-01-27 14:38:26 -0800717 }
718}
719
720
Logana27a83f2011-01-07 10:25:48 +0800721char *Script::getContext() {
722 switch (mStatus) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700723
Logan35849002011-01-15 07:30:43 +0800724#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700725 case ScriptStatus::Cached: {
726 return mCached->getContext();
727 }
Logan35849002011-01-15 07:30:43 +0800728#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700729
Shih-wei Liaod50be322011-07-01 22:53:31 -0700730 case ScriptStatus::Compiled: {
731 return mCompiled->getContext();
732 }
Logana27a83f2011-01-07 10:25:48 +0800733
Shih-wei Liaod50be322011-07-01 22:53:31 -0700734 default: {
735 mErrorCode = BCC_INVALID_OPERATION;
736 return NULL;
737 }
Logan02286cb2011-01-07 00:30:47 +0800738 }
Logan02286cb2011-01-07 00:30:47 +0800739}
740
Logancf3e5212010-12-29 01:44:55 +0800741
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800742int Script::registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
Logancf3e5212010-12-29 01:44:55 +0800743 mpExtSymbolLookupFn = pFn;
744 mpExtSymbolLookupFnContext = pContext;
745
Logan7d2219f2011-01-06 06:19:25 +0800746 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800747 mErrorCode = BCC_INVALID_OPERATION;
Logan7d2219f2011-01-06 06:19:25 +0800748 LOGE("Invalid operation: %s\n", __func__);
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800749 return 1;
Logancf3e5212010-12-29 01:44:55 +0800750 }
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800751 return 0;
Logancf3e5212010-12-29 01:44:55 +0800752}
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700753
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700754#if USE_MCJIT
755size_t Script::getELFSize() const {
756 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700757 case ScriptStatus::Compiled: {
758 return mCompiled->getELFSize();
759 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700760
Shih-wei Liaod50be322011-07-01 22:53:31 -0700761 default: {
762 return 0;
763 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700764 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700765}
766
767const char *Script::getELF() const {
768 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700769 case ScriptStatus::Compiled: {
770 return mCompiled->getELF();
771 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700772
Shih-wei Liaod50be322011-07-01 22:53:31 -0700773 default: {
774 return NULL;
775 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700776 }
777}
778#endif
Logancf3e5212010-12-29 01:44:55 +0800779
780} // namespace bcc