blob: e02ddc5bd15fe6d4d0ee1610f52e5807895e0538 [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
Loganf340bf72011-01-14 17:51:40 +080039extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080040 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080041 return wrap(new bcc::Script());
Logan3f3d31f2010-11-27 13:52:03 +080042}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070043
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080044
Loganf340bf72011-01-14 17:51:40 +080045extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080046 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080047 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080048}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070049
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080050
Shih-wei Liaoce82d492011-01-20 12:34:03 -080051extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
52 BCCSymbolLookupFn pFn,
53 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080054 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080055 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080056}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070057
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080058
Loganf340bf72011-01-14 17:51:40 +080059extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080060 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080061 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080062}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070063
Loganf340bf72011-01-14 17:51:40 +080064extern "C" int bccReadBC(BCCScriptRef script,
65 char const *resName,
66 char const *bitcode,
67 size_t bitcodeSize,
68 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080069 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080070 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080071}
Zonr Chang932648d2010-10-13 22:23:56 +080072
Loganf340bf72011-01-14 17:51:40 +080073
74extern "C" int bccReadModule(BCCScriptRef script,
Logan474cbd22011-01-31 01:47:44 +080075 char const *resName /* deprecated */,
Loganf340bf72011-01-14 17:51:40 +080076 LLVMModuleRef module,
77 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080078 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080079 return unwrap(script)->addSourceModule(0, unwrap(module), flags);
80}
81
82
83extern "C" int bccReadFile(BCCScriptRef script,
84 char const *path,
85 unsigned long flags) {
86 BCC_FUNC_LOGGER();
87 return unwrap(script)->addSourceFile(0, path, flags);
Logan3f3d31f2010-11-27 13:52:03 +080088}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070089
Loganf340bf72011-01-14 17:51:40 +080090
91extern "C" int bccLinkBC(BCCScriptRef script,
92 char const *resName,
93 char const *bitcode,
94 size_t bitcodeSize,
95 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080096 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080097 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags);
98}
99
100
101extern "C" int bccLinkFile(BCCScriptRef script,
102 char const *path,
103 unsigned long flags) {
104 BCC_FUNC_LOGGER();
105 return unwrap(script)->addSourceFile(1, path, flags);
Loganf340bf72011-01-14 17:51:40 +0800106}
107
108
Logan Chien311c26f2011-07-11 14:30:34 +0800109inline static bool parseOldStyleCachePath(std::string &cacheDir,
110 std::string &cacheName,
111 std::string const &path) {
112 size_t found0 = path.find("@");
113 size_t found1 = path.rfind("@");
114 size_t found2 = std::string::npos;
115
116 if (found0 == found1 ||
117 found0 == std::string::npos ||
118 found1 == std::string::npos) {
119 LOGE("Ill formatted resource name '%s'. The name should contain 2 @s",
120 path.c_str());
121 return false;
122 }
123
124 std::string ext(".oBCC");
125
126 if (path.size() > ext.size() &&
127 path.compare(path.size() - ext.size(), ext.size(), ext) == 0) {
128 found2 = path.size() - ext.size();
129 }
130
131 cacheDir = path.substr(0, found0);
132 cacheName = path.substr(found1 + 1, found2 - found1 - 1);
133
134 LOGD("cacheDir = %s\n", cacheDir.c_str());
135 LOGD("cacheName = %s\n", cacheName.c_str());
136 return true;
137}
138
139
Loganf340bf72011-01-14 17:51:40 +0800140extern "C" int bccPrepareExecutable(BCCScriptRef script,
141 char const *cachePath,
142 unsigned long flags) {
143 BCC_FUNC_LOGGER();
144
Logan Chien311c26f2011-07-11 14:30:34 +0800145 std::string cacheDir, cacheName;
146 if (!parseOldStyleCachePath(cacheDir, cacheName, cachePath)) {
147 return 1;
148 }
149
150 return bccPrepareExecutableEx(script,
151 cacheDir.c_str(),
152 cacheName.c_str(),
153 flags);
154}
155
156
157extern "C" int bccPrepareExecutableEx(BCCScriptRef script,
158 char const *cacheDir,
159 char const *cacheName,
160 unsigned long flags) {
161 BCC_FUNC_LOGGER();
162
Logan3f3d31f2010-11-27 13:52:03 +0800163#if defined(__arm__)
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800164 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logan3f3d31f2010-11-27 13:52:03 +0800165#endif
Logand80e65b2010-12-03 21:28:04 +0800166
Logan Chien311c26f2011-07-11 14:30:34 +0800167 return unwrap(script)->prepareExecutable(cacheDir, cacheName, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800168}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800169
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700170
Loganf340bf72011-01-14 17:51:40 +0800171extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800172 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800173
174 void *addr = unwrap(script)->lookup(funcname);
175
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700176#if DEBUG_BCC_REFLECT
Logan Chien2d37d302011-06-13 23:19:50 +0800177 LOGD("Function Address: %s --> %p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800178#endif
Loganf340bf72011-01-14 17:51:40 +0800179
180 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800181}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700182
Loganbe79ada2011-01-13 01:33:45 +0800183
Loganf340bf72011-01-14 17:51:40 +0800184extern "C" size_t bccGetExportVarCount(BCCScriptRef script) {
185 BCC_FUNC_LOGGER();
186 return unwrap(script)->getExportVarCount();
187}
188
189
190extern "C" void bccGetExportVarList(BCCScriptRef script,
191 size_t varListSize,
192 void **varList) {
193 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800194
195 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800196 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800197
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700198#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800199 size_t count = unwrap(script)->getExportVarCount();
Loganbe79ada2011-01-13 01:33:45 +0800200 LOGD("ExportVarCount = %lu\n", (unsigned long)count);
201
202 if (count > varListSize) {
203 count = varListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800204 }
Loganbe79ada2011-01-13 01:33:45 +0800205
206 for (size_t i = 0; i < count; ++i) {
Logan Chien2d37d302011-06-13 23:19:50 +0800207 LOGD("ExportVarList[%lu] = %p\n", (unsigned long)i, varList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800208 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800209#endif
Loganbe79ada2011-01-13 01:33:45 +0800210 }
Logan3f3d31f2010-11-27 13:52:03 +0800211}
Shih-wei Liaoabd1e3d2010-04-28 01:47:00 -0700212
Loganf340bf72011-01-14 17:51:40 +0800213
214extern "C" size_t bccGetExportFuncCount(BCCScriptRef script) {
215 BCC_FUNC_LOGGER();
216 return unwrap(script)->getExportFuncCount();
217}
218
219
220extern "C" void bccGetExportFuncList(BCCScriptRef script,
221 size_t funcListSize,
222 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800223 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800224
Loganbe79ada2011-01-13 01:33:45 +0800225 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800226 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800227
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700228#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800229 size_t count = unwrap(script)->getExportFuncCount();
Loganbe79ada2011-01-13 01:33:45 +0800230 LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
231
232 if (count > funcListSize) {
233 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800234 }
Loganbe79ada2011-01-13 01:33:45 +0800235
236 for (size_t i = 0; i < count; ++i) {
Logan Chien2d37d302011-06-13 23:19:50 +0800237 LOGD("ExportFuncList[%lu] = %p\n", (unsigned long)i, funcList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800238 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800239#endif
Loganbe79ada2011-01-13 01:33:45 +0800240 }
Logan3f3d31f2010-11-27 13:52:03 +0800241}
Shih-wei Liao6bfd5422010-05-07 05:20:22 -0700242
Loganf340bf72011-01-14 17:51:40 +0800243
244extern "C" size_t bccGetPragmaCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800245 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800246 return unwrap(script)->getPragmaCount();
247}
Loganbe79ada2011-01-13 01:33:45 +0800248
Loganbe79ada2011-01-13 01:33:45 +0800249
Loganf340bf72011-01-14 17:51:40 +0800250extern "C" void bccGetPragmaList(BCCScriptRef script,
251 size_t pragmaListSize,
252 const char **keyList,
253 const char **valueList) {
254 BCC_FUNC_LOGGER();
255 unwrap(script)->getPragmaList(pragmaListSize, keyList, valueList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800256
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700257#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800258 if (keyList && valueList) {
Logan35849002011-01-15 07:30:43 +0800259 size_t count = unwrap(script)->getPragmaCount();
260 LOGD("PragmaCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800261
262 if (count > pragmaListSize) {
263 count = pragmaListSize;
264 }
265
266 for (size_t i = 0; i < count; ++i) {
267 LOGD("Pragma[%lu] = (%s , %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800268 (unsigned long)i, keyList[i], valueList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800269 }
Loganf340bf72011-01-14 17:51:40 +0800270 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800271#endif
Logan3f3d31f2010-11-27 13:52:03 +0800272}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700273
Loganf340bf72011-01-14 17:51:40 +0800274
275extern "C" size_t bccGetFuncCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800276 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800277 return unwrap(script)->getFuncCount();
Logan3f3d31f2010-11-27 13:52:03 +0800278}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700279
Loganf340bf72011-01-14 17:51:40 +0800280
281extern "C" void bccGetFuncInfoList(BCCScriptRef script,
282 size_t funcInfoListSize,
283 BCCFuncInfo *funcInfoList) {
Logan3c01aaa2011-01-01 01:40:39 +0800284 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800285
Loganf340bf72011-01-14 17:51:40 +0800286 if (funcInfoList) {
287 unwrap(script)->getFuncInfoList(funcInfoListSize, funcInfoList);
Loganbe79ada2011-01-13 01:33:45 +0800288 }
Logan3f3d31f2010-11-27 13:52:03 +0800289}
Stephen Hines071288a2011-01-27 14:38:26 -0800290
291
292extern "C" size_t bccGetObjectSlotCount(BCCScriptRef script) {
293 BCC_FUNC_LOGGER();
294 return unwrap(script)->getObjectSlotCount();
295}
296
297
298extern "C" void bccGetObjectSlotList(BCCScriptRef script,
299 size_t objectSlotListSize,
300 uint32_t *objectSlotList) {
301 BCC_FUNC_LOGGER();
302
303 if (objectSlotList) {
304 unwrap(script)->getObjectSlotList(objectSlotListSize, objectSlotList);
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700305#if DEBUG_BCC_REFLECT
Stephen Hines071288a2011-01-27 14:38:26 -0800306 size_t count = unwrap(script)->getObjectSlotCount();
307 LOGD("ObjectSlotCount = %lu\n", (unsigned long)count);
308
309 if (count > objectSlotListSize) {
310 count = objectSlotListSize;
311 }
312
313 for (size_t i = 0; i < count; ++i) {
314 LOGD("ObjectSlotList[%lu] = %d\n", (unsigned long)i, objectSlotList[i]);
315 }
316#endif
317 }
318}