blob: e6972fe73501409c7a5ed4b9308fc0caa41b1f12 [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
Shih-wei Liao77ed6142010-04-07 12:21:42 -070020#define LOG_TAG "bcc"
21#include <cutils/log.h>
22
Loganf340bf72011-01-14 17:51:40 +080023#include <bcc/bcc.h>
24#include "bcc_internal.h"
25
Logan35849002011-01-15 07:30:43 +080026#include "Config.h"
27
Loganc4395232010-11-27 18:54:17 +080028#include "Compiler.h"
29#include "Script.h"
Shih-wei Liao77ed6142010-04-07 12:21:42 -070030
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
Logane1323992011-01-12 04:47:13 +080035char const libbcc_build_time[24] = __DATE__ " " __TIME__;
36
Logan3c01aaa2011-01-01 01:40:39 +080037namespace bcc {
38 class FuncLogger {
39 private:
40 char const *mFuncName;
41
42 public:
43 FuncLogger(char const *name) : mFuncName(name) {
Shih-wei Liao707a2942011-01-03 23:08:20 +080044 // LOGI("---> BEGIN: libbcc [ %s ]\n", name);
Logan3c01aaa2011-01-01 01:40:39 +080045 }
46
47 ~FuncLogger() {
Shih-wei Liao707a2942011-01-03 23:08:20 +080048 // LOGI("---> END: libbcc [ %s ]\n", mFuncName);
Logan3c01aaa2011-01-01 01:40:39 +080049 }
50 };
51
52#define BCC_FUNC_LOGGER() bcc::FuncLogger XX__funcLogger(__FUNCTION__)
53} // namespace bcc
54
Shih-wei Liao77ed6142010-04-07 12:21:42 -070055
Logan39a2ca52010-11-27 01:03:06 +080056namespace llvm {
57 class Module;
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080058}
59
Logan39a2ca52010-11-27 01:03:06 +080060
Loganf340bf72011-01-14 17:51:40 +080061extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080062 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080063 return wrap(new bcc::Script());
Logan3f3d31f2010-11-27 13:52:03 +080064}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070065
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080066
Loganf340bf72011-01-14 17:51:40 +080067extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080068 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080069 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080070}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070071
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080072
Shih-wei Liaoce82d492011-01-20 12:34:03 -080073extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
74 BCCSymbolLookupFn pFn,
75 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080076 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080077 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080078}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070079
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080080
Loganf340bf72011-01-14 17:51:40 +080081extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080082 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080083 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080084}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070085
Loganf340bf72011-01-14 17:51:40 +080086extern "C" int bccReadBC(BCCScriptRef script,
87 char const *resName,
88 char const *bitcode,
89 size_t bitcodeSize,
90 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080091 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080092 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080093}
Zonr Chang932648d2010-10-13 22:23:56 +080094
Loganf340bf72011-01-14 17:51:40 +080095
96extern "C" int bccReadModule(BCCScriptRef script,
Logan474cbd22011-01-31 01:47:44 +080097 char const *resName /* deprecated */,
Loganf340bf72011-01-14 17:51:40 +080098 LLVMModuleRef module,
99 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +0800100 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +0800101 return unwrap(script)->addSourceModule(0, unwrap(module), flags);
102}
103
104
105extern "C" int bccReadFile(BCCScriptRef script,
106 char const *path,
107 unsigned long flags) {
108 BCC_FUNC_LOGGER();
109 return unwrap(script)->addSourceFile(0, path, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800110}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700111
Loganf340bf72011-01-14 17:51:40 +0800112
113extern "C" int bccLinkBC(BCCScriptRef script,
114 char const *resName,
115 char const *bitcode,
116 size_t bitcodeSize,
117 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +0800118 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +0800119 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags);
120}
121
122
123extern "C" int bccLinkFile(BCCScriptRef script,
124 char const *path,
125 unsigned long flags) {
126 BCC_FUNC_LOGGER();
127 return unwrap(script)->addSourceFile(1, path, flags);
Loganf340bf72011-01-14 17:51:40 +0800128}
129
130
131extern "C" int bccPrepareExecutable(BCCScriptRef script,
132 char const *cachePath,
133 unsigned long flags) {
134 BCC_FUNC_LOGGER();
135
Logan3f3d31f2010-11-27 13:52:03 +0800136#if defined(__arm__)
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800137 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logan3f3d31f2010-11-27 13:52:03 +0800138#endif
Logand80e65b2010-12-03 21:28:04 +0800139
Loganf340bf72011-01-14 17:51:40 +0800140 return unwrap(script)->prepareExecutable(cachePath, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800141}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800142
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700143
Loganf340bf72011-01-14 17:51:40 +0800144extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800145 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800146
147 void *addr = unwrap(script)->lookup(funcname);
148
Logan35849002011-01-15 07:30:43 +0800149#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800150 LOGD("Function Address: %s --> 0x%p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800151#endif
Loganf340bf72011-01-14 17:51:40 +0800152
153 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800154}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700155
Loganbe79ada2011-01-13 01:33:45 +0800156
Loganf340bf72011-01-14 17:51:40 +0800157extern "C" size_t bccGetExportVarCount(BCCScriptRef script) {
158 BCC_FUNC_LOGGER();
159 return unwrap(script)->getExportVarCount();
160}
161
162
163extern "C" void bccGetExportVarList(BCCScriptRef script,
164 size_t varListSize,
165 void **varList) {
166 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800167
168 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800169 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800170
Logan35849002011-01-15 07:30:43 +0800171#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800172 size_t count = unwrap(script)->getExportVarCount();
Loganbe79ada2011-01-13 01:33:45 +0800173 LOGD("ExportVarCount = %lu\n", (unsigned long)count);
174
175 if (count > varListSize) {
176 count = varListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800177 }
Loganbe79ada2011-01-13 01:33:45 +0800178
179 for (size_t i = 0; i < count; ++i) {
180 LOGD("ExportVarList[%lu] = 0x%p\n", (unsigned long)i, varList[i]);
181 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800182#endif
Loganbe79ada2011-01-13 01:33:45 +0800183 }
Logan3f3d31f2010-11-27 13:52:03 +0800184}
Shih-wei Liaoabd1e3d2010-04-28 01:47:00 -0700185
Loganf340bf72011-01-14 17:51:40 +0800186
187extern "C" size_t bccGetExportFuncCount(BCCScriptRef script) {
188 BCC_FUNC_LOGGER();
189 return unwrap(script)->getExportFuncCount();
190}
191
192
193extern "C" void bccGetExportFuncList(BCCScriptRef script,
194 size_t funcListSize,
195 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800196 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800197
Loganbe79ada2011-01-13 01:33:45 +0800198 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800199 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800200
Logan35849002011-01-15 07:30:43 +0800201#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800202 size_t count = unwrap(script)->getExportFuncCount();
Loganbe79ada2011-01-13 01:33:45 +0800203 LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
204
205 if (count > funcListSize) {
206 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800207 }
Loganbe79ada2011-01-13 01:33:45 +0800208
209 for (size_t i = 0; i < count; ++i) {
210 LOGD("ExportFuncList[%lu] = 0x%p\n", (unsigned long)i, funcList[i]);
211 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800212#endif
Loganbe79ada2011-01-13 01:33:45 +0800213 }
Logan3f3d31f2010-11-27 13:52:03 +0800214}
Shih-wei Liao6bfd5422010-05-07 05:20:22 -0700215
Loganf340bf72011-01-14 17:51:40 +0800216
217extern "C" size_t bccGetPragmaCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800218 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800219 return unwrap(script)->getPragmaCount();
220}
Loganbe79ada2011-01-13 01:33:45 +0800221
Loganbe79ada2011-01-13 01:33:45 +0800222
Loganf340bf72011-01-14 17:51:40 +0800223extern "C" void bccGetPragmaList(BCCScriptRef script,
224 size_t pragmaListSize,
225 const char **keyList,
226 const char **valueList) {
227 BCC_FUNC_LOGGER();
228 unwrap(script)->getPragmaList(pragmaListSize, keyList, valueList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800229
Logan35849002011-01-15 07:30:43 +0800230#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800231 if (keyList && valueList) {
Logan35849002011-01-15 07:30:43 +0800232 size_t count = unwrap(script)->getPragmaCount();
233 LOGD("PragmaCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800234
235 if (count > pragmaListSize) {
236 count = pragmaListSize;
237 }
238
239 for (size_t i = 0; i < count; ++i) {
240 LOGD("Pragma[%lu] = (%s , %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800241 (unsigned long)i, keyList[i], valueList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800242 }
Loganf340bf72011-01-14 17:51:40 +0800243 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800244#endif
Logan3f3d31f2010-11-27 13:52:03 +0800245}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700246
Loganf340bf72011-01-14 17:51:40 +0800247
248extern "C" size_t bccGetFuncCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800249 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800250 return unwrap(script)->getFuncCount();
Logan3f3d31f2010-11-27 13:52:03 +0800251}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700252
Loganf340bf72011-01-14 17:51:40 +0800253
254extern "C" void bccGetFuncInfoList(BCCScriptRef script,
255 size_t funcInfoListSize,
256 BCCFuncInfo *funcInfoList) {
Logan3c01aaa2011-01-01 01:40:39 +0800257 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800258
Loganf340bf72011-01-14 17:51:40 +0800259 if (funcInfoList) {
260 unwrap(script)->getFuncInfoList(funcInfoListSize, funcInfoList);
Loganbe79ada2011-01-13 01:33:45 +0800261 }
Logan3f3d31f2010-11-27 13:52:03 +0800262}
Stephen Hines071288a2011-01-27 14:38:26 -0800263
264
265extern "C" size_t bccGetObjectSlotCount(BCCScriptRef script) {
266 BCC_FUNC_LOGGER();
267 return unwrap(script)->getObjectSlotCount();
268}
269
270
271extern "C" void bccGetObjectSlotList(BCCScriptRef script,
272 size_t objectSlotListSize,
273 uint32_t *objectSlotList) {
274 BCC_FUNC_LOGGER();
275
276 if (objectSlotList) {
277 unwrap(script)->getObjectSlotList(objectSlotListSize, objectSlotList);
278#if USE_DISASSEMBLER_FILE
279 size_t count = unwrap(script)->getObjectSlotCount();
280 LOGD("ObjectSlotCount = %lu\n", (unsigned long)count);
281
282 if (count > objectSlotListSize) {
283 count = objectSlotListSize;
284 }
285
286 for (size_t i = 0; i < count; ++i) {
287 LOGD("ObjectSlotList[%lu] = %d\n", (unsigned long)i, objectSlotList[i]);
288 }
289#endif
290 }
291}