blob: ec52b60b99aa4fe257e198dee2d94377192dd967 [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
Logan Chien311c26f2011-07-11 14:30:34 +0800175int Script::prepareExecutable(char const *cacheDir,
176 char const *cacheName,
177 unsigned long flags) {
Loganecf4cbd2011-01-06 05:34:11 +0800178 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800179 mErrorCode = BCC_INVALID_OPERATION;
Loganecf4cbd2011-01-06 05:34:11 +0800180 LOGE("Invalid operation: %s\n", __func__);
Logancf3e5212010-12-29 01:44:55 +0800181 return 1;
182 }
183
Logan35849002011-01-15 07:30:43 +0800184#if USE_CACHE
Logan Chien311c26f2011-07-11 14:30:34 +0800185 if (cacheDir && cacheName) {
186 // Set Cache Directory and File Name
187 mCacheDir = cacheDir;
188 mCacheName = cacheName;
189
190 if (!mCacheDir.empty() && *mCacheDir.rbegin() != '/') {
191 mCacheDir.push_back('/'); // Ensure mCacheDir is end with '/'
192 }
193
194 // Load Cache File
195 if (internalLoadCache() == 0) {
196 return 0;
197 }
Logan033f46e2011-01-06 05:51:24 +0800198 }
Logan35849002011-01-15 07:30:43 +0800199#endif
Loganecf4cbd2011-01-06 05:34:11 +0800200
Stephen Hines27b35102011-05-11 17:58:48 -0700201 int status = internalCompile();
202 if (status != 0) {
203 LOGE("LLVM error message: %s\n", getCompilerErrorMessage());
204 }
205 return status;
Logan033f46e2011-01-06 05:51:24 +0800206}
207
208
Logan35849002011-01-15 07:30:43 +0800209#if USE_CACHE
Logan033f46e2011-01-06 05:51:24 +0800210int Script::internalLoadCache() {
Joseph Wen76919072011-07-07 23:06:15 -0700211 if (getBooleanProp("debug.bcc.nocache")) {
Logan033f46e2011-01-06 05:51:24 +0800212 // Android system environment property disable the cache mechanism by
213 // setting "debug.bcc.nocache". So we will not load the cache file any
214 // way.
215 return 1;
216 }
217
Logan Chien311c26f2011-07-11 14:30:34 +0800218 if (mCacheDir.empty() || mCacheName.empty()) {
Loganf340bf72011-01-14 17:51:40 +0800219 // The application developer has not specify the cachePath, so
Logan04329712011-01-06 06:10:57 +0800220 // we don't know where to open the cache file.
221 return 1;
Logan033f46e2011-01-06 05:51:24 +0800222 }
Logan04329712011-01-06 06:10:57 +0800223
Logan Chien311c26f2011-07-11 14:30:34 +0800224#if USE_OLD_JIT
225 std::string objPath(mCacheDir + mCacheName + ".oBCC");
226#elif USE_MCJIT
227 std::string objPath(mCacheDir + mCacheName + ".o");
228 std::string infoPath(mCacheDir + mCacheName + ".info");
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700229#endif
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700230
Logan Chien311c26f2011-07-11 14:30:34 +0800231 FileHandle objFile;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700232 if (objFile.open(objPath.c_str(), OpenMode::Read) < 0) {
Logan04329712011-01-06 06:10:57 +0800233 // Unable to open the cache file in read mode.
234 return 1;
235 }
236
Logan Chien311c26f2011-07-11 14:30:34 +0800237#if !USE_OLD_JIT && USE_MCJIT
238 FileHandle infoFile;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700239 if (infoFile.open(infoPath.c_str(), OpenMode::Read) < 0) {
240 // Unable to open the cache file in read mode.
241 return 1;
242 }
Logan Chien311c26f2011-07-11 14:30:34 +0800243#endif
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700244
Logan Chien311c26f2011-07-11 14:30:34 +0800245#if USE_OLD_JIT
246 CacheReader reader;
247#elif USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700248 MCCacheReader reader;
249
250 // Register symbol lookup function
251 if (mpExtSymbolLookupFn) {
252 reader.registerSymbolCallback(mpExtSymbolLookupFn,
253 mpExtSymbolLookupFnContext);
254 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700255#endif
Logan04329712011-01-06 06:10:57 +0800256
Logan9a5f8682011-01-07 06:09:57 +0800257 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700258 reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700259 reader.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logan9a5f8682011-01-07 06:09:57 +0800260
Logan474cbd22011-01-31 01:47:44 +0800261 for (size_t i = 0; i < 2; ++i) {
262 if (mSourceList[i]) {
263 mSourceList[i]->introDependency(reader);
264 }
Logan9a5f8682011-01-07 06:09:57 +0800265 }
266
267 // Read cache file
Logan Chien311c26f2011-07-11 14:30:34 +0800268#if USE_OLD_JIT
269 ScriptCached *cached = reader.readCacheFile(&objFile, this);
270#elif USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700271 ScriptCached *cached = reader.readCacheFile(&objFile, &infoFile, this);
272#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700273
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700274
Logan04329712011-01-06 06:10:57 +0800275 if (!cached) {
Logan42598052011-01-26 22:41:13 +0800276 mIsContextSlotNotAvail = reader.isContextSlotNotAvail();
Logan04329712011-01-06 06:10:57 +0800277 return 1;
278 }
279
280 mCached = cached;
281 mStatus = ScriptStatus::Cached;
Logan033f46e2011-01-06 05:51:24 +0800282
Loganf3c83ce2011-01-07 06:36:33 +0800283 // Dirty hack for libRS.
284 // TODO(all): This dirty hack should be removed in the future.
Shih-wei Liao8eb5fe92011-02-01 04:17:38 -0800285 if (!cached->isLibRSThreadable() && mpExtSymbolLookupFn) {
Loganf3c83ce2011-01-07 06:36:33 +0800286 mpExtSymbolLookupFn(mpExtSymbolLookupFnContext, "__clearThreadable");
287 }
288
Loganf7f0ac52011-01-07 03:53:43 +0800289 return 0;
Logan033f46e2011-01-06 05:51:24 +0800290}
Logan35849002011-01-15 07:30:43 +0800291#endif
Logan033f46e2011-01-06 05:51:24 +0800292
Logan033f46e2011-01-06 05:51:24 +0800293int Script::internalCompile() {
294 // Create the ScriptCompiled object
Nowar Gu09b6c1c2011-05-24 23:49:07 +0800295 mCompiled = new (std::nothrow) ScriptCompiled(this);
Loganecf4cbd2011-01-06 05:34:11 +0800296
297 if (!mCompiled) {
298 mErrorCode = BCC_OUT_OF_MEMORY;
299 LOGE("Out of memory: %s %d\n", __FILE__, __LINE__);
300 return 1;
301 }
302
303 mStatus = ScriptStatus::Compiled;
304
Logan033f46e2011-01-06 05:51:24 +0800305 // Register symbol lookup function
Loganecf4cbd2011-01-06 05:34:11 +0800306 if (mpExtSymbolLookupFn) {
307 mCompiled->registerSymbolCallback(mpExtSymbolLookupFn,
308 mpExtSymbolLookupFnContext);
309 }
310
Logan474cbd22011-01-31 01:47:44 +0800311 // Parse Bitcode File (if necessary)
312 for (size_t i = 0; i < 2; ++i) {
313 if (mSourceList[i] && mSourceList[i]->prepareModule(mCompiled) != 0) {
314 LOGE("Unable to parse bitcode for source[%lu]\n", (unsigned long)i);
Logan033f46e2011-01-06 05:51:24 +0800315 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800316 }
Logan474cbd22011-01-31 01:47:44 +0800317 }
318
319 // Set the main source module
320 if (!mSourceList[0] || !mSourceList[0]->getModule()) {
321 LOGE("Source bitcode is not setted.\n");
322 return 1;
323 }
324
325 if (mCompiled->readModule(mSourceList[0]->takeModule()) != 0) {
326 LOGE("Unable to read source module\n");
327 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800328 }
329
Logan3133c412011-01-06 06:15:40 +0800330 // Link the source module with the library module
Logan474cbd22011-01-31 01:47:44 +0800331 if (mSourceList[1]) {
332 if (mCompiled->linkModule(mSourceList[1]->takeModule()) != 0) {
333 LOGE("Unable to link library module\n");
Logan04329712011-01-06 06:10:57 +0800334 return 1;
335 }
336 }
Loganecf4cbd2011-01-06 05:34:11 +0800337
Logan3133c412011-01-06 06:15:40 +0800338 // Compile and JIT the code
Logan04329712011-01-06 06:10:57 +0800339 if (mCompiled->compile() != 0) {
Logan65719812011-01-07 11:17:14 +0800340 LOGE("Unable to compile.\n");
Logan04329712011-01-06 06:10:57 +0800341 return 1;
342 }
343
Logan35849002011-01-15 07:30:43 +0800344#if USE_CACHE
Logan42598052011-01-26 22:41:13 +0800345 // Note: If we re-compile the script because the cached context slot not
346 // available, then we don't have to write the cache.
347
348 // Note: If the address of the context is not in the context slot, then
349 // we don't have to cache it.
350
Logan Chien311c26f2011-07-11 14:30:34 +0800351 if (!mCacheDir.empty() &&
352 !mCacheName.empty() &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700353#if USE_OLD_JIT
Logan1dc63142011-02-25 17:14:51 +0800354 !mIsContextSlotNotAvail &&
355 ContextManager::get().isManagingContext(getContext()) &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700356#endif
Logan42598052011-01-26 22:41:13 +0800357 !getBooleanProp("debug.bcc.nocache")) {
358
Logan Chien311c26f2011-07-11 14:30:34 +0800359 FileHandle objFile;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700360
Logan Chien311c26f2011-07-11 14:30:34 +0800361#if USE_OLD_JIT
362 std::string objPath(mCacheDir + mCacheName + ".oBCC");
363#elif USE_MCJIT
364 FileHandle infoFile;
365 std::string objPath(mCacheDir + mCacheName + ".o");
366 std::string infoPath(mCacheDir + mCacheName + ".info");
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700367#endif
Logan04329712011-01-06 06:10:57 +0800368
Logan Chien311c26f2011-07-11 14:30:34 +0800369
Jeff Brown937a0bc2011-01-26 23:20:14 -0800370 // Remove the file if it already exists before writing the new file.
371 // The old file may still be mapped elsewhere in memory and we do not want
372 // to modify its contents. (The same script may be running concurrently in
373 // the same process or a different process!)
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700374 ::unlink(objPath.c_str());
Logan Chien311c26f2011-07-11 14:30:34 +0800375#if !USE_OLD_JIT && USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700376 ::unlink(infoPath.c_str());
377#endif
Jeff Brown937a0bc2011-01-26 23:20:14 -0800378
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700379 if (objFile.open(objPath.c_str(), OpenMode::Write) >= 0
Logan Chien311c26f2011-07-11 14:30:34 +0800380#if !USE_OLD_JIT && USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700381 && infoFile.open(infoPath.c_str(), OpenMode::Write) >= 0
382#endif
Logan Chien311c26f2011-07-11 14:30:34 +0800383 ) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700384
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700385#if USE_OLD_JIT
Logan04329712011-01-06 06:10:57 +0800386 CacheWriter writer;
Logan Chien311c26f2011-07-11 14:30:34 +0800387#elif USE_MCJIT
388 MCCacheWriter writer;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700389#endif
Logana27a83f2011-01-07 10:25:48 +0800390
Joseph Wen2ca6e572011-06-24 14:12:23 -0700391#ifdef TARGET_BUILD
Logana2e15af2011-01-07 11:46:08 +0800392 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700393 writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700394 writer.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logane1323992011-01-12 04:47:13 +0800395#endif
Logana2e15af2011-01-07 11:46:08 +0800396
Logan474cbd22011-01-31 01:47:44 +0800397 for (size_t i = 0; i < 2; ++i) {
Logan825c3b22011-02-28 05:05:48 +0800398 if (mSourceList[i]) {
399 mSourceList[i]->introDependency(writer);
400 }
Logana2e15af2011-01-07 11:46:08 +0800401 }
402
Logana27a83f2011-01-07 10:25:48 +0800403 // libRS is threadable dirty hack
404 // TODO: This should be removed in the future
405 uint32_t libRS_threadable = 0;
406 if (mpExtSymbolLookupFn) {
Logan89eb47f2011-01-07 10:45:16 +0800407 libRS_threadable =
408 (uint32_t)mpExtSymbolLookupFn(mpExtSymbolLookupFnContext,
409 "__isThreadable");
Logana27a83f2011-01-07 10:25:48 +0800410 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700411
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700412#if USE_OLD_JIT
413 if (!writer.writeCacheFile(&objFile, this, libRS_threadable)) {
Logan Chien311c26f2011-07-11 14:30:34 +0800414#elif USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700415 if (!writer.writeCacheFile(&objFile, &infoFile, this, libRS_threadable)) {
416#endif
417 objFile.truncate();
418 objFile.close();
Logana27a83f2011-01-07 10:25:48 +0800419
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700420 if (unlink(objPath.c_str()) != 0) {
Logan89eb47f2011-01-07 10:45:16 +0800421 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700422 objPath.c_str(), strerror(errno));
Logan89eb47f2011-01-07 10:45:16 +0800423 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700424
Logan Chien311c26f2011-07-11 14:30:34 +0800425#if !USE_OLD_JIT && USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700426 infoFile.truncate();
427 infoFile.close();
428
429 if (unlink(infoPath.c_str()) != 0) {
430 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
431 infoPath.c_str(), strerror(errno));
432 }
433#endif
Logan89eb47f2011-01-07 10:45:16 +0800434 }
435 }
Logan04329712011-01-06 06:10:57 +0800436 }
Logan35849002011-01-15 07:30:43 +0800437#endif // USE_CACHE
Logan04329712011-01-06 06:10:57 +0800438
439 return 0;
Logancf3e5212010-12-29 01:44:55 +0800440}
441
442
443char const *Script::getCompilerErrorMessage() {
444 if (mStatus != ScriptStatus::Compiled) {
445 mErrorCode = BCC_INVALID_OPERATION;
446 return NULL;
447 }
448
449 return mCompiled->getCompilerErrorMessage();
450}
451
452
453void *Script::lookup(const char *name) {
Logan89eb47f2011-01-07 10:45:16 +0800454 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700455 case ScriptStatus::Compiled: {
456 return mCompiled->lookup(name);
457 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700458
Logan35849002011-01-15 07:30:43 +0800459#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700460 case ScriptStatus::Cached: {
461 return mCached->lookup(name);
462 }
Logan35849002011-01-15 07:30:43 +0800463#endif
Logan89eb47f2011-01-07 10:45:16 +0800464
Shih-wei Liaod50be322011-07-01 22:53:31 -0700465 default: {
466 mErrorCode = BCC_INVALID_OPERATION;
467 return NULL;
468 }
Logancf3e5212010-12-29 01:44:55 +0800469 }
Logancf3e5212010-12-29 01:44:55 +0800470}
471
472
Loganbe79ada2011-01-13 01:33:45 +0800473size_t Script::getExportVarCount() const {
Logan89eb47f2011-01-07 10:45:16 +0800474 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700475 case ScriptStatus::Compiled: {
476 return mCompiled->getExportVarCount();
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->getExportVarCount();
482 }
Logan35849002011-01-15 07:30:43 +0800483#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700484
Shih-wei Liaod50be322011-07-01 22:53:31 -0700485 default: {
486 return 0;
487 }
Loganbe79ada2011-01-13 01:33:45 +0800488 }
489}
490
491
492size_t Script::getExportFuncCount() const {
493 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700494 case ScriptStatus::Compiled: {
495 return mCompiled->getExportFuncCount();
496 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700497
Logan35849002011-01-15 07:30:43 +0800498#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700499 case ScriptStatus::Cached: {
500 return mCached->getExportFuncCount();
501 }
Logan35849002011-01-15 07:30:43 +0800502#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700503
Shih-wei Liaod50be322011-07-01 22:53:31 -0700504 default: {
505 return 0;
506 }
Loganbe79ada2011-01-13 01:33:45 +0800507 }
508}
509
510
511size_t Script::getPragmaCount() const {
512 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700513 case ScriptStatus::Compiled: {
514 return mCompiled->getPragmaCount();
515 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700516
Logan35849002011-01-15 07:30:43 +0800517#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700518 case ScriptStatus::Cached: {
519 return mCached->getPragmaCount();
520 }
Logan35849002011-01-15 07:30:43 +0800521#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700522
Shih-wei Liaod50be322011-07-01 22:53:31 -0700523 default: {
524 return 0;
525 }
Loganbe79ada2011-01-13 01:33:45 +0800526 }
527}
528
529
530size_t Script::getFuncCount() const {
531 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700532 case ScriptStatus::Compiled: {
533 return mCompiled->getFuncCount();
534 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700535
Logan35849002011-01-15 07:30:43 +0800536#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700537 case ScriptStatus::Cached: {
538 return mCached->getFuncCount();
539 }
Logan35849002011-01-15 07:30:43 +0800540#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700541
Shih-wei Liaod50be322011-07-01 22:53:31 -0700542 default: {
543 return 0;
544 }
Loganbe79ada2011-01-13 01:33:45 +0800545 }
546}
547
548
Stephen Hines071288a2011-01-27 14:38:26 -0800549size_t Script::getObjectSlotCount() const {
550 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700551 case ScriptStatus::Compiled: {
552 return mCompiled->getObjectSlotCount();
553 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700554
Stephen Hines071288a2011-01-27 14:38:26 -0800555#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700556 case ScriptStatus::Cached: {
557 return mCached->getObjectSlotCount();
558 }
Stephen Hines071288a2011-01-27 14:38:26 -0800559#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700560
Shih-wei Liaod50be322011-07-01 22:53:31 -0700561 default: {
562 return 0;
563 }
Stephen Hines071288a2011-01-27 14:38:26 -0800564 }
565}
566
567
Loganbe79ada2011-01-13 01:33:45 +0800568void Script::getExportVarList(size_t varListSize, void **varList) {
569 switch (mStatus) {
570#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700571 case ScriptStatus::STATUS: \
572 m##STATUS->getExportVarList(varListSize, varList); \
573 break;
Logancf3e5212010-12-29 01:44:55 +0800574
Logan35849002011-01-15 07:30:43 +0800575#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700576 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800577#endif
578
Shih-wei Liaod50be322011-07-01 22:53:31 -0700579 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800580#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800581
Shih-wei Liaod50be322011-07-01 22:53:31 -0700582 default: {
583 mErrorCode = BCC_INVALID_OPERATION;
584 }
Logan89eb47f2011-01-07 10:45:16 +0800585 }
Logancf3e5212010-12-29 01:44:55 +0800586}
587
Joseph Wenf36637f2011-07-06 18:27:12 -0700588void Script::getExportVarNameList(std::vector<std::string> &varList) {
589 switch (mStatus) {
590 case ScriptStatus::Compiled: {
591 return mCompiled->getExportVarNameList(varList);
592 }
593
594 default: {
595 mErrorCode = BCC_INVALID_OPERATION;
596 }
597 }
598}
599
Logancf3e5212010-12-29 01:44:55 +0800600
Loganbe79ada2011-01-13 01:33:45 +0800601void Script::getExportFuncList(size_t funcListSize, void **funcList) {
Logan89eb47f2011-01-07 10:45:16 +0800602 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800603#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700604 case ScriptStatus::STATUS: \
605 m##STATUS->getExportFuncList(funcListSize, funcList); \
606 break;
Logancf3e5212010-12-29 01:44:55 +0800607
Logan35849002011-01-15 07:30:43 +0800608#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700609 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800610#endif
611
Shih-wei Liaod50be322011-07-01 22:53:31 -0700612 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800613#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800614
Shih-wei Liaod50be322011-07-01 22:53:31 -0700615 default: {
616 mErrorCode = BCC_INVALID_OPERATION;
617 }
Logan89eb47f2011-01-07 10:45:16 +0800618 }
Logancf3e5212010-12-29 01:44:55 +0800619}
620
Joseph Wenf36637f2011-07-06 18:27:12 -0700621void Script::getExportFuncNameList(std::vector<std::string> &funcList) {
622 switch (mStatus) {
623 case ScriptStatus::Compiled: {
624 return mCompiled->getExportFuncNameList(funcList);
625 }
626
627 default: {
628 mErrorCode = BCC_INVALID_OPERATION;
629 }
630 }
631}
632
Logancf3e5212010-12-29 01:44:55 +0800633
Loganbe79ada2011-01-13 01:33:45 +0800634void Script::getPragmaList(size_t pragmaListSize,
635 char const **keyList,
636 char const **valueList) {
Logan89eb47f2011-01-07 10:45:16 +0800637 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800638#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700639 case ScriptStatus::STATUS: \
640 m##STATUS->getPragmaList(pragmaListSize, keyList, valueList); \
641 break;
Logancf3e5212010-12-29 01:44:55 +0800642
Logan35849002011-01-15 07:30:43 +0800643#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700644 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800645#endif
646
Shih-wei Liaod50be322011-07-01 22:53:31 -0700647 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800648#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800649
Shih-wei Liaod50be322011-07-01 22:53:31 -0700650 default: {
651 mErrorCode = BCC_INVALID_OPERATION;
652 }
Logan89eb47f2011-01-07 10:45:16 +0800653 }
Logancf3e5212010-12-29 01:44:55 +0800654}
655
656
Loganf340bf72011-01-14 17:51:40 +0800657void Script::getFuncInfoList(size_t funcInfoListSize,
658 FuncInfo *funcInfoList) {
Logan89eb47f2011-01-07 10:45:16 +0800659 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800660#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700661 case ScriptStatus::STATUS: \
662 m##STATUS->getFuncInfoList(funcInfoListSize, funcInfoList); \
663 break;
Logancf3e5212010-12-29 01:44:55 +0800664
Logan35849002011-01-15 07:30:43 +0800665#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700666 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800667#endif
668
Shih-wei Liaod50be322011-07-01 22:53:31 -0700669 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800670#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800671
Shih-wei Liaod50be322011-07-01 22:53:31 -0700672 default: {
673 mErrorCode = BCC_INVALID_OPERATION;
674 }
Logan89eb47f2011-01-07 10:45:16 +0800675 }
Logancf3e5212010-12-29 01:44:55 +0800676}
677
Stephen Hines071288a2011-01-27 14:38:26 -0800678
679void Script::getObjectSlotList(size_t objectSlotListSize,
680 uint32_t *objectSlotList) {
681 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700682#define DELEGATE(STATUS) \
683 case ScriptStatus::STATUS: \
684 m##STATUS->getObjectSlotList(objectSlotListSize, objectSlotList); \
685 break;
Stephen Hines071288a2011-01-27 14:38:26 -0800686
687#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700688 DELEGATE(Cached);
Stephen Hines071288a2011-01-27 14:38:26 -0800689#endif
690
Shih-wei Liaod50be322011-07-01 22:53:31 -0700691 DELEGATE(Compiled);
Stephen Hines071288a2011-01-27 14:38:26 -0800692#undef DELEGATE
693
Shih-wei Liaod50be322011-07-01 22:53:31 -0700694 default: {
695 mErrorCode = BCC_INVALID_OPERATION;
696 }
Stephen Hines071288a2011-01-27 14:38:26 -0800697 }
698}
699
700
Logana27a83f2011-01-07 10:25:48 +0800701char *Script::getContext() {
702 switch (mStatus) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700703
Logan35849002011-01-15 07:30:43 +0800704#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700705 case ScriptStatus::Cached: {
706 return mCached->getContext();
707 }
Logan35849002011-01-15 07:30:43 +0800708#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700709
Shih-wei Liaod50be322011-07-01 22:53:31 -0700710 case ScriptStatus::Compiled: {
711 return mCompiled->getContext();
712 }
Logana27a83f2011-01-07 10:25:48 +0800713
Shih-wei Liaod50be322011-07-01 22:53:31 -0700714 default: {
715 mErrorCode = BCC_INVALID_OPERATION;
716 return NULL;
717 }
Logan02286cb2011-01-07 00:30:47 +0800718 }
Logan02286cb2011-01-07 00:30:47 +0800719}
720
Logancf3e5212010-12-29 01:44:55 +0800721
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800722int Script::registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
Logancf3e5212010-12-29 01:44:55 +0800723 mpExtSymbolLookupFn = pFn;
724 mpExtSymbolLookupFnContext = pContext;
725
Logan7d2219f2011-01-06 06:19:25 +0800726 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800727 mErrorCode = BCC_INVALID_OPERATION;
Logan7d2219f2011-01-06 06:19:25 +0800728 LOGE("Invalid operation: %s\n", __func__);
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800729 return 1;
Logancf3e5212010-12-29 01:44:55 +0800730 }
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800731 return 0;
Logancf3e5212010-12-29 01:44:55 +0800732}
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700733
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700734#if USE_MCJIT
735size_t Script::getELFSize() const {
736 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700737 case ScriptStatus::Compiled: {
738 return mCompiled->getELFSize();
739 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700740
Shih-wei Liaod50be322011-07-01 22:53:31 -0700741 default: {
742 return 0;
743 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700744 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700745}
746
747const char *Script::getELF() const {
748 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700749 case ScriptStatus::Compiled: {
750 return mCompiled->getELF();
751 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700752
Shih-wei Liaod50be322011-07-01 22:53:31 -0700753 default: {
754 return NULL;
755 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700756 }
757}
758#endif
Logancf3e5212010-12-29 01:44:55 +0800759
760} // namespace bcc