blob: e67fd611d4937536f73af3a171a3f6bf5469a91c [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
Joseph Wen34c600a2011-07-25 17:59:17 -0700181int Script::prepareSharedObject(char const *cacheDir,
182 char const *cacheName,
183 unsigned long flags) {
184#if USE_CACHE
185 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 // Check Cache File
195 if (internalLoadCache(true) == 0) {
196 return 0;
197 }
198 }
199#endif
200 int status = internalCompile(true);
201 if (status != 0) {
202 LOGE("LLVM error message: %s\n", getCompilerErrorMessage());
203 }
204 return status;
205}
206
Logancf3e5212010-12-29 01:44:55 +0800207
Logan Chien311c26f2011-07-11 14:30:34 +0800208int Script::prepareExecutable(char const *cacheDir,
209 char const *cacheName,
210 unsigned long flags) {
Loganecf4cbd2011-01-06 05:34:11 +0800211 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800212 mErrorCode = BCC_INVALID_OPERATION;
Loganecf4cbd2011-01-06 05:34:11 +0800213 LOGE("Invalid operation: %s\n", __func__);
Logancf3e5212010-12-29 01:44:55 +0800214 return 1;
215 }
216
Logan35849002011-01-15 07:30:43 +0800217#if USE_CACHE
Logan Chien311c26f2011-07-11 14:30:34 +0800218 if (cacheDir && cacheName) {
219 // Set Cache Directory and File Name
220 mCacheDir = cacheDir;
221 mCacheName = cacheName;
222
223 if (!mCacheDir.empty() && *mCacheDir.rbegin() != '/') {
224 mCacheDir.push_back('/'); // Ensure mCacheDir is end with '/'
225 }
226
227 // Load Cache File
Joseph Wen34c600a2011-07-25 17:59:17 -0700228 if (internalLoadCache(false) == 0) {
Logan Chien311c26f2011-07-11 14:30:34 +0800229 return 0;
230 }
Logan033f46e2011-01-06 05:51:24 +0800231 }
Logan35849002011-01-15 07:30:43 +0800232#endif
Loganecf4cbd2011-01-06 05:34:11 +0800233
Joseph Wen34c600a2011-07-25 17:59:17 -0700234 int status = internalCompile(false);
Stephen Hines27b35102011-05-11 17:58:48 -0700235 if (status != 0) {
236 LOGE("LLVM error message: %s\n", getCompilerErrorMessage());
237 }
238 return status;
Logan033f46e2011-01-06 05:51:24 +0800239}
240
241
Logan35849002011-01-15 07:30:43 +0800242#if USE_CACHE
Joseph Wen34c600a2011-07-25 17:59:17 -0700243int Script::internalLoadCache(bool checkOnly) {
Joseph Wen76919072011-07-07 23:06:15 -0700244 if (getBooleanProp("debug.bcc.nocache")) {
Logan033f46e2011-01-06 05:51:24 +0800245 // Android system environment property disable the cache mechanism by
246 // setting "debug.bcc.nocache". So we will not load the cache file any
247 // way.
248 return 1;
249 }
250
Logan Chien311c26f2011-07-11 14:30:34 +0800251 if (mCacheDir.empty() || mCacheName.empty()) {
Loganf340bf72011-01-14 17:51:40 +0800252 // The application developer has not specify the cachePath, so
Logan04329712011-01-06 06:10:57 +0800253 // we don't know where to open the cache file.
254 return 1;
Logan033f46e2011-01-06 05:51:24 +0800255 }
Logan04329712011-01-06 06:10:57 +0800256
Logan Chien311c26f2011-07-11 14:30:34 +0800257#if USE_OLD_JIT
Logan Chien03a2e302011-07-13 21:46:32 +0800258 std::string objPath(mCacheDir + mCacheName + ".jit-image");
259 std::string infoPath(mCacheDir + mCacheName + ".oBCC"); // TODO: .info instead
Logan Chien311c26f2011-07-11 14:30:34 +0800260#elif USE_MCJIT
261 std::string objPath(mCacheDir + mCacheName + ".o");
262 std::string infoPath(mCacheDir + mCacheName + ".info");
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700263#endif
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700264
Logan Chien311c26f2011-07-11 14:30:34 +0800265 FileHandle objFile;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700266 if (objFile.open(objPath.c_str(), OpenMode::Read) < 0) {
Logan Chien03a2e302011-07-13 21:46:32 +0800267 // Unable to open the executable file in read mode.
Logan04329712011-01-06 06:10:57 +0800268 return 1;
269 }
270
Logan Chien311c26f2011-07-11 14:30:34 +0800271 FileHandle infoFile;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700272 if (infoFile.open(infoPath.c_str(), OpenMode::Read) < 0) {
Logan Chien03a2e302011-07-13 21:46:32 +0800273 // Unable to open the metadata information file in read mode.
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700274 return 1;
275 }
276
Logan Chien311c26f2011-07-11 14:30:34 +0800277#if USE_OLD_JIT
278 CacheReader reader;
279#elif USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700280 MCCacheReader reader;
281
282 // Register symbol lookup function
283 if (mpExtSymbolLookupFn) {
284 reader.registerSymbolCallback(mpExtSymbolLookupFn,
285 mpExtSymbolLookupFnContext);
286 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700287#endif
Logan04329712011-01-06 06:10:57 +0800288
Logan9a5f8682011-01-07 06:09:57 +0800289 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700290 reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700291 reader.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logan9a5f8682011-01-07 06:09:57 +0800292
Logan474cbd22011-01-31 01:47:44 +0800293 for (size_t i = 0; i < 2; ++i) {
294 if (mSourceList[i]) {
295 mSourceList[i]->introDependency(reader);
296 }
Logan9a5f8682011-01-07 06:09:57 +0800297 }
298
Joseph Wen34c600a2011-07-25 17:59:17 -0700299 if (checkOnly)
300 return reader.checkCacheFile(&objFile, &infoFile, this);
301
Logan9a5f8682011-01-07 06:09:57 +0800302 // Read cache file
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700303 ScriptCached *cached = reader.readCacheFile(&objFile, &infoFile, this);
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700304
Logan04329712011-01-06 06:10:57 +0800305 if (!cached) {
Logan42598052011-01-26 22:41:13 +0800306 mIsContextSlotNotAvail = reader.isContextSlotNotAvail();
Logan04329712011-01-06 06:10:57 +0800307 return 1;
308 }
309
310 mCached = cached;
311 mStatus = ScriptStatus::Cached;
Logan033f46e2011-01-06 05:51:24 +0800312
Loganf3c83ce2011-01-07 06:36:33 +0800313 // Dirty hack for libRS.
314 // TODO(all): This dirty hack should be removed in the future.
Shih-wei Liao8eb5fe92011-02-01 04:17:38 -0800315 if (!cached->isLibRSThreadable() && mpExtSymbolLookupFn) {
Loganf3c83ce2011-01-07 06:36:33 +0800316 mpExtSymbolLookupFn(mpExtSymbolLookupFnContext, "__clearThreadable");
317 }
318
Loganf7f0ac52011-01-07 03:53:43 +0800319 return 0;
Logan033f46e2011-01-06 05:51:24 +0800320}
Logan35849002011-01-15 07:30:43 +0800321#endif
Logan033f46e2011-01-06 05:51:24 +0800322
Joseph Wen34c600a2011-07-25 17:59:17 -0700323int Script::internalCompile(bool compileOnly) {
Logan033f46e2011-01-06 05:51:24 +0800324 // Create the ScriptCompiled object
Nowar Gu09b6c1c2011-05-24 23:49:07 +0800325 mCompiled = new (std::nothrow) ScriptCompiled(this);
Loganecf4cbd2011-01-06 05:34:11 +0800326
327 if (!mCompiled) {
328 mErrorCode = BCC_OUT_OF_MEMORY;
329 LOGE("Out of memory: %s %d\n", __FILE__, __LINE__);
330 return 1;
331 }
332
333 mStatus = ScriptStatus::Compiled;
334
Logan033f46e2011-01-06 05:51:24 +0800335 // Register symbol lookup function
Loganecf4cbd2011-01-06 05:34:11 +0800336 if (mpExtSymbolLookupFn) {
337 mCompiled->registerSymbolCallback(mpExtSymbolLookupFn,
338 mpExtSymbolLookupFnContext);
339 }
340
Logan474cbd22011-01-31 01:47:44 +0800341 // Parse Bitcode File (if necessary)
342 for (size_t i = 0; i < 2; ++i) {
343 if (mSourceList[i] && mSourceList[i]->prepareModule(mCompiled) != 0) {
344 LOGE("Unable to parse bitcode for source[%lu]\n", (unsigned long)i);
Logan033f46e2011-01-06 05:51:24 +0800345 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800346 }
Logan474cbd22011-01-31 01:47:44 +0800347 }
348
349 // Set the main source module
350 if (!mSourceList[0] || !mSourceList[0]->getModule()) {
351 LOGE("Source bitcode is not setted.\n");
352 return 1;
353 }
354
355 if (mCompiled->readModule(mSourceList[0]->takeModule()) != 0) {
356 LOGE("Unable to read source module\n");
357 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800358 }
359
Logan3133c412011-01-06 06:15:40 +0800360 // Link the source module with the library module
Logan474cbd22011-01-31 01:47:44 +0800361 if (mSourceList[1]) {
362 if (mCompiled->linkModule(mSourceList[1]->takeModule()) != 0) {
363 LOGE("Unable to link library module\n");
Logan04329712011-01-06 06:10:57 +0800364 return 1;
365 }
366 }
Loganecf4cbd2011-01-06 05:34:11 +0800367
Logan3133c412011-01-06 06:15:40 +0800368 // Compile and JIT the code
Joseph Wen34c600a2011-07-25 17:59:17 -0700369 if (mCompiled->compile(compileOnly) != 0) {
Logan65719812011-01-07 11:17:14 +0800370 LOGE("Unable to compile.\n");
Logan04329712011-01-06 06:10:57 +0800371 return 1;
372 }
373
Logan35849002011-01-15 07:30:43 +0800374#if USE_CACHE
Logan42598052011-01-26 22:41:13 +0800375 // Note: If we re-compile the script because the cached context slot not
376 // available, then we don't have to write the cache.
377
378 // Note: If the address of the context is not in the context slot, then
379 // we don't have to cache it.
380
Logan Chien311c26f2011-07-11 14:30:34 +0800381 if (!mCacheDir.empty() &&
382 !mCacheName.empty() &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700383#if USE_OLD_JIT
Logan1dc63142011-02-25 17:14:51 +0800384 !mIsContextSlotNotAvail &&
385 ContextManager::get().isManagingContext(getContext()) &&
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700386#endif
Logan42598052011-01-26 22:41:13 +0800387 !getBooleanProp("debug.bcc.nocache")) {
388
Logan Chien311c26f2011-07-11 14:30:34 +0800389#if USE_OLD_JIT
Logan Chien03a2e302011-07-13 21:46:32 +0800390 std::string objPath(mCacheDir + mCacheName + ".jit-image");
391 std::string infoPath(mCacheDir + mCacheName + ".oBCC");
Logan Chien311c26f2011-07-11 14:30:34 +0800392#elif USE_MCJIT
Logan Chien311c26f2011-07-11 14:30:34 +0800393 std::string objPath(mCacheDir + mCacheName + ".o");
394 std::string infoPath(mCacheDir + mCacheName + ".info");
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700395#endif
Logan04329712011-01-06 06:10:57 +0800396
Logan Chien311c26f2011-07-11 14:30:34 +0800397
Jeff Brown937a0bc2011-01-26 23:20:14 -0800398 // Remove the file if it already exists before writing the new file.
399 // The old file may still be mapped elsewhere in memory and we do not want
400 // to modify its contents. (The same script may be running concurrently in
401 // the same process or a different process!)
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700402 ::unlink(objPath.c_str());
Logan Chien311c26f2011-07-11 14:30:34 +0800403#if !USE_OLD_JIT && USE_MCJIT
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700404 ::unlink(infoPath.c_str());
405#endif
Jeff Brown937a0bc2011-01-26 23:20:14 -0800406
Logan Chien03a2e302011-07-13 21:46:32 +0800407 FileHandle objFile;
408 FileHandle infoFile;
409
410 if (objFile.open(objPath.c_str(), OpenMode::Write) >= 0 &&
411 infoFile.open(infoPath.c_str(), OpenMode::Write) >= 0) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700412
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700413#if USE_OLD_JIT
Logan04329712011-01-06 06:10:57 +0800414 CacheWriter writer;
Logan Chien311c26f2011-07-11 14:30:34 +0800415#elif USE_MCJIT
416 MCCacheWriter writer;
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700417#endif
Logana27a83f2011-01-07 10:25:48 +0800418
Joseph Wen2ca6e572011-06-24 14:12:23 -0700419#ifdef TARGET_BUILD
Logana2e15af2011-01-07 11:46:08 +0800420 // Dependencies
Joseph Wen2ca6e572011-06-24 14:12:23 -0700421 writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
Joseph Wen76919072011-07-07 23:06:15 -0700422 writer.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
Logane1323992011-01-12 04:47:13 +0800423#endif
Logana2e15af2011-01-07 11:46:08 +0800424
Logan474cbd22011-01-31 01:47:44 +0800425 for (size_t i = 0; i < 2; ++i) {
Logan825c3b22011-02-28 05:05:48 +0800426 if (mSourceList[i]) {
427 mSourceList[i]->introDependency(writer);
428 }
Logana2e15af2011-01-07 11:46:08 +0800429 }
430
Logana27a83f2011-01-07 10:25:48 +0800431 // libRS is threadable dirty hack
432 // TODO: This should be removed in the future
433 uint32_t libRS_threadable = 0;
434 if (mpExtSymbolLookupFn) {
Logan89eb47f2011-01-07 10:45:16 +0800435 libRS_threadable =
436 (uint32_t)mpExtSymbolLookupFn(mpExtSymbolLookupFnContext,
437 "__isThreadable");
Logana27a83f2011-01-07 10:25:48 +0800438 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700439
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700440 if (!writer.writeCacheFile(&objFile, &infoFile, this, libRS_threadable)) {
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700441 objFile.truncate();
442 objFile.close();
Logana27a83f2011-01-07 10:25:48 +0800443
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700444 if (unlink(objPath.c_str()) != 0) {
Logan89eb47f2011-01-07 10:45:16 +0800445 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700446 objPath.c_str(), strerror(errno));
Logan89eb47f2011-01-07 10:45:16 +0800447 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700448
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700449 infoFile.truncate();
450 infoFile.close();
451
452 if (unlink(infoPath.c_str()) != 0) {
453 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
454 infoPath.c_str(), strerror(errno));
455 }
Logan89eb47f2011-01-07 10:45:16 +0800456 }
457 }
Logan04329712011-01-06 06:10:57 +0800458 }
Logan35849002011-01-15 07:30:43 +0800459#endif // USE_CACHE
Logan04329712011-01-06 06:10:57 +0800460
461 return 0;
Logancf3e5212010-12-29 01:44:55 +0800462}
463
464
465char const *Script::getCompilerErrorMessage() {
466 if (mStatus != ScriptStatus::Compiled) {
467 mErrorCode = BCC_INVALID_OPERATION;
468 return NULL;
469 }
470
471 return mCompiled->getCompilerErrorMessage();
472}
473
474
475void *Script::lookup(const char *name) {
Logan89eb47f2011-01-07 10:45:16 +0800476 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700477 case ScriptStatus::Compiled: {
478 return mCompiled->lookup(name);
479 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700480
Logan35849002011-01-15 07:30:43 +0800481#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700482 case ScriptStatus::Cached: {
483 return mCached->lookup(name);
484 }
Logan35849002011-01-15 07:30:43 +0800485#endif
Logan89eb47f2011-01-07 10:45:16 +0800486
Shih-wei Liaod50be322011-07-01 22:53:31 -0700487 default: {
488 mErrorCode = BCC_INVALID_OPERATION;
489 return NULL;
490 }
Logancf3e5212010-12-29 01:44:55 +0800491 }
Logancf3e5212010-12-29 01:44:55 +0800492}
493
494
Loganbe79ada2011-01-13 01:33:45 +0800495size_t Script::getExportVarCount() const {
Logan89eb47f2011-01-07 10:45:16 +0800496 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700497 case ScriptStatus::Compiled: {
498 return mCompiled->getExportVarCount();
499 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700500
Logan35849002011-01-15 07:30:43 +0800501#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700502 case ScriptStatus::Cached: {
503 return mCached->getExportVarCount();
504 }
Logan35849002011-01-15 07:30:43 +0800505#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700506
Shih-wei Liaod50be322011-07-01 22:53:31 -0700507 default: {
508 return 0;
509 }
Loganbe79ada2011-01-13 01:33:45 +0800510 }
511}
512
513
514size_t Script::getExportFuncCount() const {
515 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700516 case ScriptStatus::Compiled: {
517 return mCompiled->getExportFuncCount();
518 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700519
Logan35849002011-01-15 07:30:43 +0800520#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700521 case ScriptStatus::Cached: {
522 return mCached->getExportFuncCount();
523 }
Logan35849002011-01-15 07:30:43 +0800524#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700525
Shih-wei Liaod50be322011-07-01 22:53:31 -0700526 default: {
527 return 0;
528 }
Loganbe79ada2011-01-13 01:33:45 +0800529 }
530}
531
532
533size_t Script::getPragmaCount() const {
534 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700535 case ScriptStatus::Compiled: {
536 return mCompiled->getPragmaCount();
537 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700538
Logan35849002011-01-15 07:30:43 +0800539#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700540 case ScriptStatus::Cached: {
541 return mCached->getPragmaCount();
542 }
Logan35849002011-01-15 07:30:43 +0800543#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700544
Shih-wei Liaod50be322011-07-01 22:53:31 -0700545 default: {
546 return 0;
547 }
Loganbe79ada2011-01-13 01:33:45 +0800548 }
549}
550
551
552size_t Script::getFuncCount() const {
553 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700554 case ScriptStatus::Compiled: {
555 return mCompiled->getFuncCount();
556 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700557
Logan35849002011-01-15 07:30:43 +0800558#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700559 case ScriptStatus::Cached: {
560 return mCached->getFuncCount();
561 }
Logan35849002011-01-15 07:30:43 +0800562#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700563
Shih-wei Liaod50be322011-07-01 22:53:31 -0700564 default: {
565 return 0;
566 }
Loganbe79ada2011-01-13 01:33:45 +0800567 }
568}
569
570
Stephen Hines071288a2011-01-27 14:38:26 -0800571size_t Script::getObjectSlotCount() const {
572 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700573 case ScriptStatus::Compiled: {
574 return mCompiled->getObjectSlotCount();
575 }
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700576
Stephen Hines071288a2011-01-27 14:38:26 -0800577#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700578 case ScriptStatus::Cached: {
579 return mCached->getObjectSlotCount();
580 }
Stephen Hines071288a2011-01-27 14:38:26 -0800581#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700582
Shih-wei Liaod50be322011-07-01 22:53:31 -0700583 default: {
584 return 0;
585 }
Stephen Hines071288a2011-01-27 14:38:26 -0800586 }
587}
588
589
Loganbe79ada2011-01-13 01:33:45 +0800590void Script::getExportVarList(size_t varListSize, void **varList) {
591 switch (mStatus) {
592#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700593 case ScriptStatus::STATUS: \
594 m##STATUS->getExportVarList(varListSize, varList); \
595 break;
Logancf3e5212010-12-29 01:44:55 +0800596
Logan35849002011-01-15 07:30:43 +0800597#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700598 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800599#endif
600
Shih-wei Liaod50be322011-07-01 22:53:31 -0700601 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800602#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800603
Shih-wei Liaod50be322011-07-01 22:53:31 -0700604 default: {
605 mErrorCode = BCC_INVALID_OPERATION;
606 }
Logan89eb47f2011-01-07 10:45:16 +0800607 }
Logancf3e5212010-12-29 01:44:55 +0800608}
609
Joseph Wenf36637f2011-07-06 18:27:12 -0700610void Script::getExportVarNameList(std::vector<std::string> &varList) {
611 switch (mStatus) {
612 case ScriptStatus::Compiled: {
613 return mCompiled->getExportVarNameList(varList);
614 }
615
616 default: {
617 mErrorCode = BCC_INVALID_OPERATION;
618 }
619 }
620}
621
Logancf3e5212010-12-29 01:44:55 +0800622
Loganbe79ada2011-01-13 01:33:45 +0800623void Script::getExportFuncList(size_t funcListSize, void **funcList) {
Logan89eb47f2011-01-07 10:45:16 +0800624 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800625#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700626 case ScriptStatus::STATUS: \
627 m##STATUS->getExportFuncList(funcListSize, funcList); \
628 break;
Logancf3e5212010-12-29 01:44:55 +0800629
Logan35849002011-01-15 07:30:43 +0800630#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700631 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800632#endif
633
Shih-wei Liaod50be322011-07-01 22:53:31 -0700634 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800635#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800636
Shih-wei Liaod50be322011-07-01 22:53:31 -0700637 default: {
638 mErrorCode = BCC_INVALID_OPERATION;
639 }
Logan89eb47f2011-01-07 10:45:16 +0800640 }
Logancf3e5212010-12-29 01:44:55 +0800641}
642
Joseph Wenf36637f2011-07-06 18:27:12 -0700643void Script::getExportFuncNameList(std::vector<std::string> &funcList) {
644 switch (mStatus) {
645 case ScriptStatus::Compiled: {
646 return mCompiled->getExportFuncNameList(funcList);
647 }
648
649 default: {
650 mErrorCode = BCC_INVALID_OPERATION;
651 }
652 }
653}
654
Logancf3e5212010-12-29 01:44:55 +0800655
Loganbe79ada2011-01-13 01:33:45 +0800656void Script::getPragmaList(size_t pragmaListSize,
657 char const **keyList,
658 char const **valueList) {
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->getPragmaList(pragmaListSize, keyList, valueList); \
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
678
Loganf340bf72011-01-14 17:51:40 +0800679void Script::getFuncInfoList(size_t funcInfoListSize,
680 FuncInfo *funcInfoList) {
Logan89eb47f2011-01-07 10:45:16 +0800681 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800682#define DELEGATE(STATUS) \
Shih-wei Liaod50be322011-07-01 22:53:31 -0700683 case ScriptStatus::STATUS: \
684 m##STATUS->getFuncInfoList(funcInfoListSize, funcInfoList); \
685 break;
Logancf3e5212010-12-29 01:44:55 +0800686
Logan35849002011-01-15 07:30:43 +0800687#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700688 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800689#endif
690
Shih-wei Liaod50be322011-07-01 22:53:31 -0700691 DELEGATE(Compiled);
Loganbe79ada2011-01-13 01:33:45 +0800692#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800693
Shih-wei Liaod50be322011-07-01 22:53:31 -0700694 default: {
695 mErrorCode = BCC_INVALID_OPERATION;
696 }
Logan89eb47f2011-01-07 10:45:16 +0800697 }
Logancf3e5212010-12-29 01:44:55 +0800698}
699
Stephen Hines071288a2011-01-27 14:38:26 -0800700
701void Script::getObjectSlotList(size_t objectSlotListSize,
702 uint32_t *objectSlotList) {
703 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700704#define DELEGATE(STATUS) \
705 case ScriptStatus::STATUS: \
706 m##STATUS->getObjectSlotList(objectSlotListSize, objectSlotList); \
707 break;
Stephen Hines071288a2011-01-27 14:38:26 -0800708
709#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700710 DELEGATE(Cached);
Stephen Hines071288a2011-01-27 14:38:26 -0800711#endif
712
Shih-wei Liaod50be322011-07-01 22:53:31 -0700713 DELEGATE(Compiled);
Stephen Hines071288a2011-01-27 14:38:26 -0800714#undef DELEGATE
715
Shih-wei Liaod50be322011-07-01 22:53:31 -0700716 default: {
717 mErrorCode = BCC_INVALID_OPERATION;
718 }
Stephen Hines071288a2011-01-27 14:38:26 -0800719 }
720}
721
722
Logan Chiend2a5f302011-07-19 20:32:25 +0800723#if USE_OLD_JIT
Logana27a83f2011-01-07 10:25:48 +0800724char *Script::getContext() {
725 switch (mStatus) {
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700726
Logan35849002011-01-15 07:30:43 +0800727#if USE_CACHE
Shih-wei Liaod50be322011-07-01 22:53:31 -0700728 case ScriptStatus::Cached: {
729 return mCached->getContext();
730 }
Logan35849002011-01-15 07:30:43 +0800731#endif
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700732
Shih-wei Liaod50be322011-07-01 22:53:31 -0700733 case ScriptStatus::Compiled: {
734 return mCompiled->getContext();
735 }
Logana27a83f2011-01-07 10:25:48 +0800736
Shih-wei Liaod50be322011-07-01 22:53:31 -0700737 default: {
738 mErrorCode = BCC_INVALID_OPERATION;
739 return NULL;
740 }
Logan02286cb2011-01-07 00:30:47 +0800741 }
Logan02286cb2011-01-07 00:30:47 +0800742}
Logan Chiend2a5f302011-07-19 20:32:25 +0800743#endif
Logan02286cb2011-01-07 00:30:47 +0800744
Logancf3e5212010-12-29 01:44:55 +0800745
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800746int Script::registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
Logancf3e5212010-12-29 01:44:55 +0800747 mpExtSymbolLookupFn = pFn;
748 mpExtSymbolLookupFnContext = pContext;
749
Logan7d2219f2011-01-06 06:19:25 +0800750 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800751 mErrorCode = BCC_INVALID_OPERATION;
Logan7d2219f2011-01-06 06:19:25 +0800752 LOGE("Invalid operation: %s\n", __func__);
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800753 return 1;
Logancf3e5212010-12-29 01:44:55 +0800754 }
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800755 return 0;
Logancf3e5212010-12-29 01:44:55 +0800756}
Shih-wei Liaob65410d2011-06-19 11:11:48 -0700757
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700758#if USE_MCJIT
759size_t Script::getELFSize() const {
760 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700761 case ScriptStatus::Compiled: {
762 return mCompiled->getELFSize();
763 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700764
Shih-wei Liaod50be322011-07-01 22:53:31 -0700765 default: {
766 return 0;
767 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700768 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700769}
770
771const char *Script::getELF() const {
772 switch (mStatus) {
Shih-wei Liaod50be322011-07-01 22:53:31 -0700773 case ScriptStatus::Compiled: {
774 return mCompiled->getELF();
775 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700776
Shih-wei Liaod50be322011-07-01 22:53:31 -0700777 default: {
778 return NULL;
779 }
Shih-wei Liao5e3e0ce2011-06-17 13:59:46 -0700780 }
781}
782#endif
Logancf3e5212010-12-29 01:44:55 +0800783
784} // namespace bcc