blob: cc2fa511561f5e1fff4c7e87d1dab821e55c188d [file] [log] [blame]
Shih-wei Liao77ed6142010-04-07 12:21:42 -07001/*
Zonr Chang932648d2010-10-13 22:23:56 +08002 * Copyright 2010, The Android Open Source Project
Shih-wei Liao77ed6142010-04-07 12:21:42 -07003 *
Zonr Chang932648d2010-10-13 22:23:56 +08004 * 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.
Shih-wei Liao77ed6142010-04-07 12:21:42 -070015 */
16
Zonr Chang932648d2010-10-13 22:23:56 +080017// Bitcode compiler (bcc) for Android:
18// This is an eager-compilation JIT running on Android.
19
Loganf340bf72011-01-14 17:51:40 +080020#include <bcc/bcc.h>
21#include "bcc_internal.h"
22
Logan35849002011-01-15 07:30:43 +080023#include "Config.h"
24
Loganc4395232010-11-27 18:54:17 +080025#include "Compiler.h"
Logan4dcd6792011-02-28 05:12:00 +080026#include "DebugHelper.h"
Loganc4395232010-11-27 18:54:17 +080027#include "Script.h"
Shih-wei Liao77ed6142010-04-07 12:21:42 -070028
Logan Chien311c26f2011-07-11 14:30:34 +080029#include <string>
30
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080031#include <utils/StopWatch.h>
Shih-wei Liao77ed6142010-04-07 12:21:42 -070032
Loganf340bf72011-01-14 17:51:40 +080033using namespace bcc;
34
Logan39a2ca52010-11-27 01:03:06 +080035namespace llvm {
36 class Module;
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080037}
38
Logan Chien3378a022011-07-13 19:44:37 +080039static bool bccBuildStampPrinted = false;
40
41static void bccPrintBuildStamp() {
42 if (!bccBuildStampPrinted) {
43 LOGI("LIBBCC build time: %s", bccGetBuildTime());
44 LOGI("LIBBCC build revision: %s", bccGetBuildRev());
45 bccBuildStampPrinted = true;
46 }
47}
48
Loganf340bf72011-01-14 17:51:40 +080049extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080050 BCC_FUNC_LOGGER();
Logan Chien3378a022011-07-13 19:44:37 +080051 bccPrintBuildStamp();
Loganf340bf72011-01-14 17:51:40 +080052 return wrap(new bcc::Script());
Logan3f3d31f2010-11-27 13:52:03 +080053}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070054
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080055
Loganf340bf72011-01-14 17:51:40 +080056extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080057 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080058 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080059}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070060
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080061
Shih-wei Liaoce82d492011-01-20 12:34:03 -080062extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
63 BCCSymbolLookupFn pFn,
64 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080065 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080066 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080067}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070068
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080069
Loganf340bf72011-01-14 17:51:40 +080070extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080071 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080072 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080073}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070074
Loganf340bf72011-01-14 17:51:40 +080075extern "C" int bccReadBC(BCCScriptRef script,
76 char const *resName,
77 char const *bitcode,
78 size_t bitcodeSize,
79 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080080 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080081 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080082}
Zonr Chang932648d2010-10-13 22:23:56 +080083
Loganf340bf72011-01-14 17:51:40 +080084
85extern "C" int bccReadModule(BCCScriptRef script,
Logan474cbd22011-01-31 01:47:44 +080086 char const *resName /* deprecated */,
Loganf340bf72011-01-14 17:51:40 +080087 LLVMModuleRef module,
88 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080089 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080090 return unwrap(script)->addSourceModule(0, unwrap(module), flags);
91}
92
93
94extern "C" int bccReadFile(BCCScriptRef script,
95 char const *path,
96 unsigned long flags) {
97 BCC_FUNC_LOGGER();
98 return unwrap(script)->addSourceFile(0, path, flags);
Logan3f3d31f2010-11-27 13:52:03 +080099}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700100
Loganf340bf72011-01-14 17:51:40 +0800101
102extern "C" int bccLinkBC(BCCScriptRef script,
103 char const *resName,
104 char const *bitcode,
105 size_t bitcodeSize,
106 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +0800107 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +0800108 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags);
109}
110
111
112extern "C" int bccLinkFile(BCCScriptRef script,
113 char const *path,
114 unsigned long flags) {
115 BCC_FUNC_LOGGER();
116 return unwrap(script)->addSourceFile(1, path, flags);
Loganf340bf72011-01-14 17:51:40 +0800117}
118
119
Logan Chien311c26f2011-07-11 14:30:34 +0800120inline static bool parseOldStyleCachePath(std::string &cacheDir,
121 std::string &cacheName,
122 std::string const &path) {
123 size_t found0 = path.find("@");
124 size_t found1 = path.rfind("@");
125 size_t found2 = std::string::npos;
126
127 if (found0 == found1 ||
128 found0 == std::string::npos ||
129 found1 == std::string::npos) {
130 LOGE("Ill formatted resource name '%s'. The name should contain 2 @s",
131 path.c_str());
132 return false;
133 }
134
135 std::string ext(".oBCC");
136
137 if (path.size() > ext.size() &&
138 path.compare(path.size() - ext.size(), ext.size(), ext) == 0) {
139 found2 = path.size() - ext.size();
140 }
141
142 cacheDir = path.substr(0, found0);
143 cacheName = path.substr(found1 + 1, found2 - found1 - 1);
144
145 LOGD("cacheDir = %s\n", cacheDir.c_str());
146 LOGD("cacheName = %s\n", cacheName.c_str());
147 return true;
148}
149
150
Loganf340bf72011-01-14 17:51:40 +0800151extern "C" int bccPrepareExecutable(BCCScriptRef script,
152 char const *cachePath,
153 unsigned long flags) {
154 BCC_FUNC_LOGGER();
155
Logan Chien311c26f2011-07-11 14:30:34 +0800156 std::string cacheDir, cacheName;
157 if (!parseOldStyleCachePath(cacheDir, cacheName, cachePath)) {
158 return 1;
159 }
160
161 return bccPrepareExecutableEx(script,
162 cacheDir.c_str(),
163 cacheName.c_str(),
164 flags);
165}
166
167
168extern "C" int bccPrepareExecutableEx(BCCScriptRef script,
169 char const *cacheDir,
170 char const *cacheName,
171 unsigned long flags) {
172 BCC_FUNC_LOGGER();
173
Logan3f3d31f2010-11-27 13:52:03 +0800174#if defined(__arm__)
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800175 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logan3f3d31f2010-11-27 13:52:03 +0800176#endif
Logand80e65b2010-12-03 21:28:04 +0800177
Logan Chien311c26f2011-07-11 14:30:34 +0800178 return unwrap(script)->prepareExecutable(cacheDir, cacheName, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800179}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800180
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700181
Loganf340bf72011-01-14 17:51:40 +0800182extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800183 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800184
185 void *addr = unwrap(script)->lookup(funcname);
186
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700187#if DEBUG_BCC_REFLECT
Logan Chien2d37d302011-06-13 23:19:50 +0800188 LOGD("Function Address: %s --> %p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800189#endif
Loganf340bf72011-01-14 17:51:40 +0800190
191 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800192}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700193
Loganbe79ada2011-01-13 01:33:45 +0800194
Loganf340bf72011-01-14 17:51:40 +0800195extern "C" size_t bccGetExportVarCount(BCCScriptRef script) {
196 BCC_FUNC_LOGGER();
197 return unwrap(script)->getExportVarCount();
198}
199
200
201extern "C" void bccGetExportVarList(BCCScriptRef script,
202 size_t varListSize,
203 void **varList) {
204 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800205
206 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800207 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800208
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700209#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800210 size_t count = unwrap(script)->getExportVarCount();
Loganbe79ada2011-01-13 01:33:45 +0800211 LOGD("ExportVarCount = %lu\n", (unsigned long)count);
212
213 if (count > varListSize) {
214 count = varListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800215 }
Loganbe79ada2011-01-13 01:33:45 +0800216
217 for (size_t i = 0; i < count; ++i) {
Logan Chien2d37d302011-06-13 23:19:50 +0800218 LOGD("ExportVarList[%lu] = %p\n", (unsigned long)i, varList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800219 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800220#endif
Loganbe79ada2011-01-13 01:33:45 +0800221 }
Logan3f3d31f2010-11-27 13:52:03 +0800222}
Shih-wei Liaoabd1e3d2010-04-28 01:47:00 -0700223
Loganf340bf72011-01-14 17:51:40 +0800224
225extern "C" size_t bccGetExportFuncCount(BCCScriptRef script) {
226 BCC_FUNC_LOGGER();
227 return unwrap(script)->getExportFuncCount();
228}
229
230
231extern "C" void bccGetExportFuncList(BCCScriptRef script,
232 size_t funcListSize,
233 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800234 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800235
Loganbe79ada2011-01-13 01:33:45 +0800236 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800237 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800238
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700239#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800240 size_t count = unwrap(script)->getExportFuncCount();
Loganbe79ada2011-01-13 01:33:45 +0800241 LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
242
243 if (count > funcListSize) {
244 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800245 }
Loganbe79ada2011-01-13 01:33:45 +0800246
247 for (size_t i = 0; i < count; ++i) {
Logan Chien2d37d302011-06-13 23:19:50 +0800248 LOGD("ExportFuncList[%lu] = %p\n", (unsigned long)i, funcList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800249 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800250#endif
Loganbe79ada2011-01-13 01:33:45 +0800251 }
Logan3f3d31f2010-11-27 13:52:03 +0800252}
Shih-wei Liao6bfd5422010-05-07 05:20:22 -0700253
Loganf340bf72011-01-14 17:51:40 +0800254
255extern "C" size_t bccGetPragmaCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800256 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800257 return unwrap(script)->getPragmaCount();
258}
Loganbe79ada2011-01-13 01:33:45 +0800259
Loganbe79ada2011-01-13 01:33:45 +0800260
Loganf340bf72011-01-14 17:51:40 +0800261extern "C" void bccGetPragmaList(BCCScriptRef script,
262 size_t pragmaListSize,
263 const char **keyList,
264 const char **valueList) {
265 BCC_FUNC_LOGGER();
266 unwrap(script)->getPragmaList(pragmaListSize, keyList, valueList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800267
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700268#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800269 if (keyList && valueList) {
Logan35849002011-01-15 07:30:43 +0800270 size_t count = unwrap(script)->getPragmaCount();
271 LOGD("PragmaCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800272
273 if (count > pragmaListSize) {
274 count = pragmaListSize;
275 }
276
277 for (size_t i = 0; i < count; ++i) {
278 LOGD("Pragma[%lu] = (%s , %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800279 (unsigned long)i, keyList[i], valueList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800280 }
Loganf340bf72011-01-14 17:51:40 +0800281 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800282#endif
Logan3f3d31f2010-11-27 13:52:03 +0800283}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700284
Loganf340bf72011-01-14 17:51:40 +0800285
286extern "C" size_t bccGetFuncCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800287 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800288 return unwrap(script)->getFuncCount();
Logan3f3d31f2010-11-27 13:52:03 +0800289}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700290
Loganf340bf72011-01-14 17:51:40 +0800291
292extern "C" void bccGetFuncInfoList(BCCScriptRef script,
293 size_t funcInfoListSize,
294 BCCFuncInfo *funcInfoList) {
Logan3c01aaa2011-01-01 01:40:39 +0800295 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800296
Loganf340bf72011-01-14 17:51:40 +0800297 if (funcInfoList) {
298 unwrap(script)->getFuncInfoList(funcInfoListSize, funcInfoList);
Loganbe79ada2011-01-13 01:33:45 +0800299 }
Logan3f3d31f2010-11-27 13:52:03 +0800300}
Stephen Hines071288a2011-01-27 14:38:26 -0800301
302
303extern "C" size_t bccGetObjectSlotCount(BCCScriptRef script) {
304 BCC_FUNC_LOGGER();
305 return unwrap(script)->getObjectSlotCount();
306}
307
308
309extern "C" void bccGetObjectSlotList(BCCScriptRef script,
310 size_t objectSlotListSize,
311 uint32_t *objectSlotList) {
312 BCC_FUNC_LOGGER();
313
314 if (objectSlotList) {
315 unwrap(script)->getObjectSlotList(objectSlotListSize, objectSlotList);
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700316#if DEBUG_BCC_REFLECT
Stephen Hines071288a2011-01-27 14:38:26 -0800317 size_t count = unwrap(script)->getObjectSlotCount();
318 LOGD("ObjectSlotCount = %lu\n", (unsigned long)count);
319
320 if (count > objectSlotListSize) {
321 count = objectSlotListSize;
322 }
323
324 for (size_t i = 0; i < count; ++i) {
325 LOGD("ObjectSlotList[%lu] = %d\n", (unsigned long)i, objectSlotList[i]);
326 }
327#endif
328 }
329}