blob: bc7f16d519f4aed1098a265cb85e5522b8732a19 [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
Loganc4395232010-11-27 18:54:17 +080026#include "Compiler.h"
27#include "Script.h"
Shih-wei Liao77ed6142010-04-07 12:21:42 -070028
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080029#include <utils/StopWatch.h>
Shih-wei Liao77ed6142010-04-07 12:21:42 -070030
Loganf340bf72011-01-14 17:51:40 +080031using namespace bcc;
32
Logane1323992011-01-12 04:47:13 +080033char const libbcc_build_time[24] = __DATE__ " " __TIME__;
34
Logan3c01aaa2011-01-01 01:40:39 +080035namespace bcc {
36 class FuncLogger {
37 private:
38 char const *mFuncName;
39
40 public:
41 FuncLogger(char const *name) : mFuncName(name) {
Shih-wei Liao707a2942011-01-03 23:08:20 +080042 // LOGI("---> BEGIN: libbcc [ %s ]\n", name);
Logan3c01aaa2011-01-01 01:40:39 +080043 }
44
45 ~FuncLogger() {
Shih-wei Liao707a2942011-01-03 23:08:20 +080046 // LOGI("---> END: libbcc [ %s ]\n", mFuncName);
Logan3c01aaa2011-01-01 01:40:39 +080047 }
48 };
49
50#define BCC_FUNC_LOGGER() bcc::FuncLogger XX__funcLogger(__FUNCTION__)
51} // namespace bcc
52
Shih-wei Liao77ed6142010-04-07 12:21:42 -070053
Logan39a2ca52010-11-27 01:03:06 +080054namespace llvm {
55 class Module;
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080056}
57
Logan39a2ca52010-11-27 01:03:06 +080058
Loganf340bf72011-01-14 17:51:40 +080059extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080060 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080061 return wrap(new bcc::Script());
Logan3f3d31f2010-11-27 13:52:03 +080062}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070063
Loganf340bf72011-01-14 17:51:40 +080064extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080065 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080066 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080067}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070068
Loganf340bf72011-01-14 17:51:40 +080069extern "C" void bccRegisterSymbolCallback(BCCScriptRef script,
Logan3f3d31f2010-11-27 13:52:03 +080070 BCCSymbolLookupFn pFn,
Loganf340bf72011-01-14 17:51:40 +080071 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080072 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080073 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080074}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070075
Loganf340bf72011-01-14 17:51:40 +080076extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080077 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080078 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080079}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070080
Loganf340bf72011-01-14 17:51:40 +080081
82extern "C" int bccReadBC(BCCScriptRef script,
83 char const *resName,
84 char const *bitcode,
85 size_t bitcodeSize,
86 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080087 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080088 return unwrap(script)->readBC(resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080089}
Zonr Chang932648d2010-10-13 22:23:56 +080090
Loganf340bf72011-01-14 17:51:40 +080091
92extern "C" int bccReadModule(BCCScriptRef script,
93 char const *resName,
94 LLVMModuleRef module,
95 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080096 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080097 return unwrap(script)->readModule(resName, unwrap(module), flags);
Logan3f3d31f2010-11-27 13:52:03 +080098}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070099
Loganf340bf72011-01-14 17:51:40 +0800100
101extern "C" int bccLinkBC(BCCScriptRef script,
102 char const *resName,
103 char const *bitcode,
104 size_t bitcodeSize,
105 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +0800106 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800107 return unwrap(script)->linkBC(resName, bitcode, bitcodeSize, flags);
108}
109
110
111extern "C" int bccPrepareExecutable(BCCScriptRef script,
112 char const *cachePath,
113 unsigned long flags) {
114 BCC_FUNC_LOGGER();
115
Logan3f3d31f2010-11-27 13:52:03 +0800116#if defined(__arm__)
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800117 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logan3f3d31f2010-11-27 13:52:03 +0800118#endif
Logand80e65b2010-12-03 21:28:04 +0800119
Loganf340bf72011-01-14 17:51:40 +0800120 return unwrap(script)->prepareExecutable(cachePath, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800121}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800122
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700123
Loganf340bf72011-01-14 17:51:40 +0800124extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800125 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800126
127 void *addr = unwrap(script)->lookup(funcname);
128
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800129#if defined(USE_DISASSEMBLER_FILE)
Loganf340bf72011-01-14 17:51:40 +0800130 LOGD("Function Address: %s --> 0x%p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800131#endif
Loganf340bf72011-01-14 17:51:40 +0800132
133 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800134}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700135
Loganbe79ada2011-01-13 01:33:45 +0800136
Loganf340bf72011-01-14 17:51:40 +0800137extern "C" size_t bccGetExportVarCount(BCCScriptRef script) {
138 BCC_FUNC_LOGGER();
139 return unwrap(script)->getExportVarCount();
140}
141
142
143extern "C" void bccGetExportVarList(BCCScriptRef script,
144 size_t varListSize,
145 void **varList) {
146 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800147
148 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800149 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800150
151#if defined(USE_DISASSEMBLER_FILE)
Loganf340bf72011-01-14 17:51:40 +0800152 size_t count = unwrap(script)->getExportVarCount();
Loganbe79ada2011-01-13 01:33:45 +0800153 LOGD("ExportVarCount = %lu\n", (unsigned long)count);
154
155 if (count > varListSize) {
156 count = varListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800157 }
Loganbe79ada2011-01-13 01:33:45 +0800158
159 for (size_t i = 0; i < count; ++i) {
160 LOGD("ExportVarList[%lu] = 0x%p\n", (unsigned long)i, varList[i]);
161 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800162#endif
Loganbe79ada2011-01-13 01:33:45 +0800163 }
Logan3f3d31f2010-11-27 13:52:03 +0800164}
Shih-wei Liaoabd1e3d2010-04-28 01:47:00 -0700165
Loganf340bf72011-01-14 17:51:40 +0800166
167extern "C" size_t bccGetExportFuncCount(BCCScriptRef script) {
168 BCC_FUNC_LOGGER();
169 return unwrap(script)->getExportFuncCount();
170}
171
172
173extern "C" void bccGetExportFuncList(BCCScriptRef script,
174 size_t funcListSize,
175 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800176 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800177
Loganbe79ada2011-01-13 01:33:45 +0800178 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800179 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800180
181#if defined(USE_DISASSEMBLER_FILE)
Loganf340bf72011-01-14 17:51:40 +0800182 size_t count = unwrap(script)->getExportFuncCount();
Loganbe79ada2011-01-13 01:33:45 +0800183 LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
184
185 if (count > funcListSize) {
186 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800187 }
Loganbe79ada2011-01-13 01:33:45 +0800188
189 for (size_t i = 0; i < count; ++i) {
190 LOGD("ExportFuncList[%lu] = 0x%p\n", (unsigned long)i, funcList[i]);
191 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800192#endif
Loganbe79ada2011-01-13 01:33:45 +0800193 }
Logan3f3d31f2010-11-27 13:52:03 +0800194}
Shih-wei Liao6bfd5422010-05-07 05:20:22 -0700195
Loganf340bf72011-01-14 17:51:40 +0800196
197extern "C" size_t bccGetPragmaCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800198 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800199 return unwrap(script)->getPragmaCount();
200}
Loganbe79ada2011-01-13 01:33:45 +0800201
Loganbe79ada2011-01-13 01:33:45 +0800202
Loganf340bf72011-01-14 17:51:40 +0800203extern "C" void bccGetPragmaList(BCCScriptRef script,
204 size_t pragmaListSize,
205 const char **keyList,
206 const char **valueList) {
207 BCC_FUNC_LOGGER();
208 unwrap(script)->getPragmaList(pragmaListSize, keyList, valueList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800209
210#if defined(USE_DISASSEMBLER_FILE)
Loganf340bf72011-01-14 17:51:40 +0800211 if (keyList && valueList) {
Loganbe79ada2011-01-13 01:33:45 +0800212 size_t count = script->getPragmaCount();
213 LOGD("PragmaCount = %lu\n", count);
214
215 if (count > pragmaListSize) {
216 count = pragmaListSize;
217 }
218
219 for (size_t i = 0; i < count; ++i) {
220 LOGD("Pragma[%lu] = (%s , %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800221 (unsigned long)i, keyList[i], valueList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800222 }
Loganf340bf72011-01-14 17:51:40 +0800223 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800224#endif
Logan3f3d31f2010-11-27 13:52:03 +0800225}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700226
Loganf340bf72011-01-14 17:51:40 +0800227
228extern "C" size_t bccGetFuncCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800229 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800230 return unwrap(script)->getFuncCount();
Logan3f3d31f2010-11-27 13:52:03 +0800231}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700232
Loganf340bf72011-01-14 17:51:40 +0800233
234extern "C" void bccGetFuncInfoList(BCCScriptRef script,
235 size_t funcInfoListSize,
236 BCCFuncInfo *funcInfoList) {
Logan3c01aaa2011-01-01 01:40:39 +0800237 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800238
Loganf340bf72011-01-14 17:51:40 +0800239 if (funcInfoList) {
240 unwrap(script)->getFuncInfoList(funcInfoListSize, funcInfoList);
Loganbe79ada2011-01-13 01:33:45 +0800241 }
Logan3f3d31f2010-11-27 13:52:03 +0800242}