blob: fd79e9449a8a1b063ba4c9191cab2ae0f24881fc [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
Logan39a2ca52010-11-27 01:03:06 +080033namespace llvm {
34 class Module;
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080035}
36
Loganf340bf72011-01-14 17:51:40 +080037extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080038 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080039 return wrap(new bcc::Script());
Logan3f3d31f2010-11-27 13:52:03 +080040}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070041
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080042
Loganf340bf72011-01-14 17:51:40 +080043extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080044 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080045 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080046}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070047
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080048
Shih-wei Liaoce82d492011-01-20 12:34:03 -080049extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
50 BCCSymbolLookupFn pFn,
51 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080052 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080053 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080054}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070055
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080056
Loganf340bf72011-01-14 17:51:40 +080057extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080058 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080059 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080060}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070061
Loganf340bf72011-01-14 17:51:40 +080062extern "C" int bccReadBC(BCCScriptRef script,
63 char const *resName,
64 char const *bitcode,
65 size_t bitcodeSize,
66 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080067 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080068 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080069}
Zonr Chang932648d2010-10-13 22:23:56 +080070
Loganf340bf72011-01-14 17:51:40 +080071
72extern "C" int bccReadModule(BCCScriptRef script,
Logan474cbd22011-01-31 01:47:44 +080073 char const *resName /* deprecated */,
Loganf340bf72011-01-14 17:51:40 +080074 LLVMModuleRef module,
75 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080076 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080077 return unwrap(script)->addSourceModule(0, unwrap(module), flags);
78}
79
80
81extern "C" int bccReadFile(BCCScriptRef script,
82 char const *path,
83 unsigned long flags) {
84 BCC_FUNC_LOGGER();
85 return unwrap(script)->addSourceFile(0, path, flags);
Logan3f3d31f2010-11-27 13:52:03 +080086}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070087
Loganf340bf72011-01-14 17:51:40 +080088
89extern "C" int bccLinkBC(BCCScriptRef script,
90 char const *resName,
91 char const *bitcode,
92 size_t bitcodeSize,
93 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080094 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080095 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags);
96}
97
98
99extern "C" int bccLinkFile(BCCScriptRef script,
100 char const *path,
101 unsigned long flags) {
102 BCC_FUNC_LOGGER();
103 return unwrap(script)->addSourceFile(1, path, flags);
Loganf340bf72011-01-14 17:51:40 +0800104}
105
106
107extern "C" int bccPrepareExecutable(BCCScriptRef script,
108 char const *cachePath,
109 unsigned long flags) {
110 BCC_FUNC_LOGGER();
111
Logan3f3d31f2010-11-27 13:52:03 +0800112#if defined(__arm__)
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800113 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logan3f3d31f2010-11-27 13:52:03 +0800114#endif
Logand80e65b2010-12-03 21:28:04 +0800115
Loganf340bf72011-01-14 17:51:40 +0800116 return unwrap(script)->prepareExecutable(cachePath, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800117}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800118
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700119
Loganf340bf72011-01-14 17:51:40 +0800120extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800121 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800122
123 void *addr = unwrap(script)->lookup(funcname);
124
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700125#if DEBUG_BCC_REFLECT
Logan Chien2d37d302011-06-13 23:19:50 +0800126 LOGD("Function Address: %s --> %p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800127#endif
Loganf340bf72011-01-14 17:51:40 +0800128
129 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800130}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700131
Loganbe79ada2011-01-13 01:33:45 +0800132
Loganf340bf72011-01-14 17:51:40 +0800133extern "C" size_t bccGetExportVarCount(BCCScriptRef script) {
134 BCC_FUNC_LOGGER();
135 return unwrap(script)->getExportVarCount();
136}
137
138
139extern "C" void bccGetExportVarList(BCCScriptRef script,
140 size_t varListSize,
141 void **varList) {
142 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800143
144 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800145 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800146
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700147#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800148 size_t count = unwrap(script)->getExportVarCount();
Loganbe79ada2011-01-13 01:33:45 +0800149 LOGD("ExportVarCount = %lu\n", (unsigned long)count);
150
151 if (count > varListSize) {
152 count = varListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800153 }
Loganbe79ada2011-01-13 01:33:45 +0800154
155 for (size_t i = 0; i < count; ++i) {
Logan Chien2d37d302011-06-13 23:19:50 +0800156 LOGD("ExportVarList[%lu] = %p\n", (unsigned long)i, varList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800157 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800158#endif
Loganbe79ada2011-01-13 01:33:45 +0800159 }
Logan3f3d31f2010-11-27 13:52:03 +0800160}
Shih-wei Liaoabd1e3d2010-04-28 01:47:00 -0700161
Loganf340bf72011-01-14 17:51:40 +0800162
163extern "C" size_t bccGetExportFuncCount(BCCScriptRef script) {
164 BCC_FUNC_LOGGER();
165 return unwrap(script)->getExportFuncCount();
166}
167
168
169extern "C" void bccGetExportFuncList(BCCScriptRef script,
170 size_t funcListSize,
171 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800172 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800173
Loganbe79ada2011-01-13 01:33:45 +0800174 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800175 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800176
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700177#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800178 size_t count = unwrap(script)->getExportFuncCount();
Loganbe79ada2011-01-13 01:33:45 +0800179 LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
180
181 if (count > funcListSize) {
182 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800183 }
Loganbe79ada2011-01-13 01:33:45 +0800184
185 for (size_t i = 0; i < count; ++i) {
Logan Chien2d37d302011-06-13 23:19:50 +0800186 LOGD("ExportFuncList[%lu] = %p\n", (unsigned long)i, funcList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800187 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800188#endif
Loganbe79ada2011-01-13 01:33:45 +0800189 }
Logan3f3d31f2010-11-27 13:52:03 +0800190}
Shih-wei Liao6bfd5422010-05-07 05:20:22 -0700191
Loganf340bf72011-01-14 17:51:40 +0800192
193extern "C" size_t bccGetPragmaCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800194 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800195 return unwrap(script)->getPragmaCount();
196}
Loganbe79ada2011-01-13 01:33:45 +0800197
Loganbe79ada2011-01-13 01:33:45 +0800198
Loganf340bf72011-01-14 17:51:40 +0800199extern "C" void bccGetPragmaList(BCCScriptRef script,
200 size_t pragmaListSize,
201 const char **keyList,
202 const char **valueList) {
203 BCC_FUNC_LOGGER();
204 unwrap(script)->getPragmaList(pragmaListSize, keyList, valueList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800205
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700206#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800207 if (keyList && valueList) {
Logan35849002011-01-15 07:30:43 +0800208 size_t count = unwrap(script)->getPragmaCount();
209 LOGD("PragmaCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800210
211 if (count > pragmaListSize) {
212 count = pragmaListSize;
213 }
214
215 for (size_t i = 0; i < count; ++i) {
216 LOGD("Pragma[%lu] = (%s , %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800217 (unsigned long)i, keyList[i], valueList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800218 }
Loganf340bf72011-01-14 17:51:40 +0800219 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800220#endif
Logan3f3d31f2010-11-27 13:52:03 +0800221}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700222
Loganf340bf72011-01-14 17:51:40 +0800223
224extern "C" size_t bccGetFuncCount(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +0800225 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800226 return unwrap(script)->getFuncCount();
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" void bccGetFuncInfoList(BCCScriptRef script,
231 size_t funcInfoListSize,
232 BCCFuncInfo *funcInfoList) {
Logan3c01aaa2011-01-01 01:40:39 +0800233 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800234
Loganf340bf72011-01-14 17:51:40 +0800235 if (funcInfoList) {
236 unwrap(script)->getFuncInfoList(funcInfoListSize, funcInfoList);
Loganbe79ada2011-01-13 01:33:45 +0800237 }
Logan3f3d31f2010-11-27 13:52:03 +0800238}
Stephen Hines071288a2011-01-27 14:38:26 -0800239
240
241extern "C" size_t bccGetObjectSlotCount(BCCScriptRef script) {
242 BCC_FUNC_LOGGER();
243 return unwrap(script)->getObjectSlotCount();
244}
245
246
247extern "C" void bccGetObjectSlotList(BCCScriptRef script,
248 size_t objectSlotListSize,
249 uint32_t *objectSlotList) {
250 BCC_FUNC_LOGGER();
251
252 if (objectSlotList) {
253 unwrap(script)->getObjectSlotList(objectSlotListSize, objectSlotList);
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700254#if DEBUG_BCC_REFLECT
Stephen Hines071288a2011-01-27 14:38:26 -0800255 size_t count = unwrap(script)->getObjectSlotCount();
256 LOGD("ObjectSlotCount = %lu\n", (unsigned long)count);
257
258 if (count > objectSlotListSize) {
259 count = objectSlotListSize;
260 }
261
262 for (size_t i = 0; i < count; ++i) {
263 LOGD("ObjectSlotList[%lu] = %d\n", (unsigned long)i, objectSlotList[i]);
264 }
265#endif
266 }
267}