blob: 11e3a9550d6999e7d135895ef37f702925c8ea98 [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
Loganf340bf72011-01-14 17:51:40 +080066extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080067 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080068 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080069}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070070
Shih-wei Liaoce82d492011-01-20 12:34:03 -080071extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
72 BCCSymbolLookupFn pFn,
73 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080074 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080075 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080076}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070077
Loganf340bf72011-01-14 17:51:40 +080078extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080079 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080080 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080081}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070082
Loganf340bf72011-01-14 17:51:40 +080083
84extern "C" int bccReadBC(BCCScriptRef script,
85 char const *resName,
86 char const *bitcode,
87 size_t bitcodeSize,
88 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080089 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080090 return unwrap(script)->readBC(resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080091}
Zonr Chang932648d2010-10-13 22:23:56 +080092
Loganf340bf72011-01-14 17:51:40 +080093
94extern "C" int bccReadModule(BCCScriptRef script,
95 char const *resName,
96 LLVMModuleRef module,
97 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080098 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080099 return unwrap(script)->readModule(resName, unwrap(module), flags);
Logan3f3d31f2010-11-27 13:52:03 +0800100}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700101
Loganf340bf72011-01-14 17:51:40 +0800102
103extern "C" int bccLinkBC(BCCScriptRef script,
104 char const *resName,
105 char const *bitcode,
106 size_t bitcodeSize,
107 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +0800108 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800109 return unwrap(script)->linkBC(resName, bitcode, bitcodeSize, flags);
110}
111
112
113extern "C" int bccPrepareExecutable(BCCScriptRef script,
114 char const *cachePath,
115 unsigned long flags) {
116 BCC_FUNC_LOGGER();
117
Logan3f3d31f2010-11-27 13:52:03 +0800118#if defined(__arm__)
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800119 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logan3f3d31f2010-11-27 13:52:03 +0800120#endif
Logand80e65b2010-12-03 21:28:04 +0800121
Loganf340bf72011-01-14 17:51:40 +0800122 return unwrap(script)->prepareExecutable(cachePath, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800123}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800124
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700125
Loganf340bf72011-01-14 17:51:40 +0800126extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800127 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800128
129 void *addr = unwrap(script)->lookup(funcname);
130
Logan35849002011-01-15 07:30:43 +0800131#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800132 LOGD("Function Address: %s --> 0x%p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800133#endif
Loganf340bf72011-01-14 17:51:40 +0800134
135 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800136}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700137
Loganbe79ada2011-01-13 01:33:45 +0800138
Loganf340bf72011-01-14 17:51:40 +0800139extern "C" size_t bccGetExportVarCount(BCCScriptRef script) {
140 BCC_FUNC_LOGGER();
141 return unwrap(script)->getExportVarCount();
142}
143
144
145extern "C" void bccGetExportVarList(BCCScriptRef script,
146 size_t varListSize,
147 void **varList) {
148 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800149
150 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800151 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800152
Logan35849002011-01-15 07:30:43 +0800153#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800154 size_t count = unwrap(script)->getExportVarCount();
Loganbe79ada2011-01-13 01:33:45 +0800155 LOGD("ExportVarCount = %lu\n", (unsigned long)count);
156
157 if (count > varListSize) {
158 count = varListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800159 }
Loganbe79ada2011-01-13 01:33:45 +0800160
161 for (size_t i = 0; i < count; ++i) {
162 LOGD("ExportVarList[%lu] = 0x%p\n", (unsigned long)i, varList[i]);
163 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800164#endif
Loganbe79ada2011-01-13 01:33:45 +0800165 }
Logan3f3d31f2010-11-27 13:52:03 +0800166}
Shih-wei Liaoabd1e3d2010-04-28 01:47:00 -0700167
Loganf340bf72011-01-14 17:51:40 +0800168
169extern "C" size_t bccGetExportFuncCount(BCCScriptRef script) {
170 BCC_FUNC_LOGGER();
171 return unwrap(script)->getExportFuncCount();
172}
173
174
175extern "C" void bccGetExportFuncList(BCCScriptRef script,
176 size_t funcListSize,
177 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800178 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800179
Loganbe79ada2011-01-13 01:33:45 +0800180 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800181 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800182
Logan35849002011-01-15 07:30:43 +0800183#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800184 size_t count = unwrap(script)->getExportFuncCount();
Loganbe79ada2011-01-13 01:33:45 +0800185 LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
186
187 if (count > funcListSize) {
188 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800189 }
Loganbe79ada2011-01-13 01:33:45 +0800190
191 for (size_t i = 0; i < count; ++i) {
192 LOGD("ExportFuncList[%lu] = 0x%p\n", (unsigned long)i, funcList[i]);
193 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800194#endif
Loganbe79ada2011-01-13 01:33:45 +0800195 }
Logan3f3d31f2010-11-27 13:52:03 +0800196}
Shih-wei Liao6bfd5422010-05-07 05:20:22 -0700197
Loganf340bf72011-01-14 17:51:40 +0800198
199extern "C" size_t bccGetPragmaCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800200 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800201 return unwrap(script)->getPragmaCount();
202}
Loganbe79ada2011-01-13 01:33:45 +0800203
Loganbe79ada2011-01-13 01:33:45 +0800204
Loganf340bf72011-01-14 17:51:40 +0800205extern "C" void bccGetPragmaList(BCCScriptRef script,
206 size_t pragmaListSize,
207 const char **keyList,
208 const char **valueList) {
209 BCC_FUNC_LOGGER();
210 unwrap(script)->getPragmaList(pragmaListSize, keyList, valueList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800211
Logan35849002011-01-15 07:30:43 +0800212#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800213 if (keyList && valueList) {
Logan35849002011-01-15 07:30:43 +0800214 size_t count = unwrap(script)->getPragmaCount();
215 LOGD("PragmaCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800216
217 if (count > pragmaListSize) {
218 count = pragmaListSize;
219 }
220
221 for (size_t i = 0; i < count; ++i) {
222 LOGD("Pragma[%lu] = (%s , %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800223 (unsigned long)i, keyList[i], valueList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800224 }
Loganf340bf72011-01-14 17:51:40 +0800225 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800226#endif
Logan3f3d31f2010-11-27 13:52:03 +0800227}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700228
Loganf340bf72011-01-14 17:51:40 +0800229
230extern "C" size_t bccGetFuncCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800231 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800232 return unwrap(script)->getFuncCount();
Logan3f3d31f2010-11-27 13:52:03 +0800233}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700234
Loganf340bf72011-01-14 17:51:40 +0800235
236extern "C" void bccGetFuncInfoList(BCCScriptRef script,
237 size_t funcInfoListSize,
238 BCCFuncInfo *funcInfoList) {
Logan3c01aaa2011-01-01 01:40:39 +0800239 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800240
Loganf340bf72011-01-14 17:51:40 +0800241 if (funcInfoList) {
242 unwrap(script)->getFuncInfoList(funcInfoListSize, funcInfoList);
Loganbe79ada2011-01-13 01:33:45 +0800243 }
Logan3f3d31f2010-11-27 13:52:03 +0800244}
Stephen Hines071288a2011-01-27 14:38:26 -0800245
246
247extern "C" size_t bccGetObjectSlotCount(BCCScriptRef script) {
248 BCC_FUNC_LOGGER();
249 return unwrap(script)->getObjectSlotCount();
250}
251
252
253extern "C" void bccGetObjectSlotList(BCCScriptRef script,
254 size_t objectSlotListSize,
255 uint32_t *objectSlotList) {
256 BCC_FUNC_LOGGER();
257
258 if (objectSlotList) {
259 unwrap(script)->getObjectSlotList(objectSlotListSize, objectSlotList);
260#if USE_DISASSEMBLER_FILE
261 size_t count = unwrap(script)->getObjectSlotCount();
262 LOGD("ObjectSlotCount = %lu\n", (unsigned long)count);
263
264 if (count > objectSlotListSize) {
265 count = objectSlotListSize;
266 }
267
268 for (size_t i = 0; i < count; ++i) {
269 LOGD("ObjectSlotList[%lu] = %d\n", (unsigned long)i, objectSlotList[i]);
270 }
271#endif
272 }
273}
274