blob: ce7d7d0297ba41b21e147df11b285291887bc892 [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
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
Shih-wei Liao77ed6142010-04-07 12:21:42 -070035
Logan39a2ca52010-11-27 01:03:06 +080036namespace llvm {
37 class Module;
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080038}
39
Logan39a2ca52010-11-27 01:03:06 +080040
Loganf340bf72011-01-14 17:51:40 +080041extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080042 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080043 return wrap(new bcc::Script());
Logan3f3d31f2010-11-27 13:52:03 +080044}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070045
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080046
Loganf340bf72011-01-14 17:51:40 +080047extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080048 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080049 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080050}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070051
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080052
Shih-wei Liaoce82d492011-01-20 12:34:03 -080053extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
54 BCCSymbolLookupFn pFn,
55 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080056 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080057 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080058}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070059
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080060
Loganf340bf72011-01-14 17:51:40 +080061extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080062 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080063 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080064}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070065
Loganf340bf72011-01-14 17:51:40 +080066extern "C" int bccReadBC(BCCScriptRef script,
67 char const *resName,
68 char const *bitcode,
69 size_t bitcodeSize,
70 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080071 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080072 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080073}
Zonr Chang932648d2010-10-13 22:23:56 +080074
Loganf340bf72011-01-14 17:51:40 +080075
76extern "C" int bccReadModule(BCCScriptRef script,
Logan474cbd22011-01-31 01:47:44 +080077 char const *resName /* deprecated */,
Loganf340bf72011-01-14 17:51:40 +080078 LLVMModuleRef module,
79 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080080 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080081 return unwrap(script)->addSourceModule(0, unwrap(module), flags);
82}
83
84
85extern "C" int bccReadFile(BCCScriptRef script,
86 char const *path,
87 unsigned long flags) {
88 BCC_FUNC_LOGGER();
89 return unwrap(script)->addSourceFile(0, path, flags);
Logan3f3d31f2010-11-27 13:52:03 +080090}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070091
Loganf340bf72011-01-14 17:51:40 +080092
93extern "C" int bccLinkBC(BCCScriptRef script,
94 char const *resName,
95 char const *bitcode,
96 size_t bitcodeSize,
97 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080098 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080099 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags);
100}
101
102
103extern "C" int bccLinkFile(BCCScriptRef script,
104 char const *path,
105 unsigned long flags) {
106 BCC_FUNC_LOGGER();
107 return unwrap(script)->addSourceFile(1, path, flags);
Loganf340bf72011-01-14 17:51:40 +0800108}
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
Logan35849002011-01-15 07:30:43 +0800129#if 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
Logan35849002011-01-15 07:30:43 +0800151#if 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
Logan35849002011-01-15 07:30:43 +0800181#if 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
Logan35849002011-01-15 07:30:43 +0800210#if USE_DISASSEMBLER_FILE
Loganf340bf72011-01-14 17:51:40 +0800211 if (keyList && valueList) {
Logan35849002011-01-15 07:30:43 +0800212 size_t count = unwrap(script)->getPragmaCount();
213 LOGD("PragmaCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800214
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}
Stephen Hines071288a2011-01-27 14:38:26 -0800243
244
245extern "C" size_t bccGetObjectSlotCount(BCCScriptRef script) {
246 BCC_FUNC_LOGGER();
247 return unwrap(script)->getObjectSlotCount();
248}
249
250
251extern "C" void bccGetObjectSlotList(BCCScriptRef script,
252 size_t objectSlotListSize,
253 uint32_t *objectSlotList) {
254 BCC_FUNC_LOGGER();
255
256 if (objectSlotList) {
257 unwrap(script)->getObjectSlotList(objectSlotListSize, objectSlotList);
258#if USE_DISASSEMBLER_FILE
259 size_t count = unwrap(script)->getObjectSlotCount();
260 LOGD("ObjectSlotCount = %lu\n", (unsigned long)count);
261
262 if (count > objectSlotListSize) {
263 count = objectSlotListSize;
264 }
265
266 for (size_t i = 0; i < count; ++i) {
267 LOGD("ObjectSlotList[%lu] = %d\n", (unsigned long)i, objectSlotList[i]);
268 }
269#endif
270 }
271}