blob: 6a201056bfe6bff9b176b35fa556ecaa7e6c9a7e [file] [log] [blame]
Shih-wei Liao77ed6142010-04-07 12:21:42 -07001/*
Stephen Hinescc366e52012-02-21 17:22:04 -08002 * Copyright 2010-2012, 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
Logan Chien311c26f2011-07-11 14:30:34 +080029#include <string>
30
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080031#include <utils/StopWatch.h>
Shih-wei Liao6a60f4e2012-01-17 02:58:40 -080032
Shih-wei Liao8afed382012-01-10 15:57:24 +080033#include <llvm/Support/CodeGen.h>
Shih-wei Liao77ed6142010-04-07 12:21:42 -070034
Loganf340bf72011-01-14 17:51:40 +080035using namespace bcc;
36
Logan39a2ca52010-11-27 01:03:06 +080037namespace llvm {
38 class Module;
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080039}
40
Logan Chien3378a022011-07-13 19:44:37 +080041static bool bccBuildStampPrinted = false;
42
43static void bccPrintBuildStamp() {
44 if (!bccBuildStampPrinted) {
Steve Block440e0312012-01-04 20:06:16 +000045 ALOGI("LIBBCC build time: %s", bccGetBuildTime());
46 ALOGI("LIBBCC build revision: %s", bccGetBuildRev());
Logan Chien3378a022011-07-13 19:44:37 +080047 bccBuildStampPrinted = true;
48 }
49}
50
Loganf340bf72011-01-14 17:51:40 +080051extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080052 BCC_FUNC_LOGGER();
Logan Chien3378a022011-07-13 19:44:37 +080053 bccPrintBuildStamp();
Loganf340bf72011-01-14 17:51:40 +080054 return wrap(new bcc::Script());
Logan3f3d31f2010-11-27 13:52:03 +080055}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070056
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080057
Loganf340bf72011-01-14 17:51:40 +080058extern "C" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080059 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080060 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080061}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070062
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080063
Shih-wei Liaoce82d492011-01-20 12:34:03 -080064extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
65 BCCSymbolLookupFn pFn,
66 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080067 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080068 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080069}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070070
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080071
Loganf340bf72011-01-14 17:51:40 +080072extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080073 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080074 return unwrap(script)->getError();
Logan3f3d31f2010-11-27 13:52:03 +080075}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070076
Loganf340bf72011-01-14 17:51:40 +080077extern "C" int bccReadBC(BCCScriptRef script,
78 char const *resName,
79 char const *bitcode,
80 size_t bitcodeSize,
81 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080082 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080083 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080084}
Zonr Chang932648d2010-10-13 22:23:56 +080085
Loganf340bf72011-01-14 17:51:40 +080086
87extern "C" int bccReadModule(BCCScriptRef script,
Logan474cbd22011-01-31 01:47:44 +080088 char const *resName /* deprecated */,
Loganf340bf72011-01-14 17:51:40 +080089 LLVMModuleRef module,
90 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080091 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080092 return unwrap(script)->addSourceModule(0, unwrap(module), flags);
93}
94
95
96extern "C" int bccReadFile(BCCScriptRef script,
97 char const *path,
98 unsigned long flags) {
99 BCC_FUNC_LOGGER();
100 return unwrap(script)->addSourceFile(0, path, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800101}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700102
Loganf340bf72011-01-14 17:51:40 +0800103
104extern "C" int bccLinkBC(BCCScriptRef script,
105 char const *resName,
106 char const *bitcode,
107 size_t bitcodeSize,
108 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +0800109 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +0800110 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags);
111}
112
113
114extern "C" int bccLinkFile(BCCScriptRef script,
115 char const *path,
116 unsigned long flags) {
117 BCC_FUNC_LOGGER();
118 return unwrap(script)->addSourceFile(1, path, flags);
Loganf340bf72011-01-14 17:51:40 +0800119}
120
121
Logan Chien7890d432011-08-03 14:55:17 +0800122extern "C" void bccMarkExternalSymbol(BCCScriptRef script, char const *name) {
123 BCC_FUNC_LOGGER();
124 unwrap(script)->markExternalSymbol(name);
125}
126
127
Shih-wei Liao6a60f4e2012-01-17 02:58:40 -0800128extern "C" int bccPrepareRelocatable(BCCScriptRef script,
129 char const *cacheDir,
130 char const *cacheName,
131 bccRelocModelEnum RelocModel,
132 unsigned long flags) {
Shih-wei Liao8afed382012-01-10 15:57:24 +0800133 BCC_FUNC_LOGGER();
134 llvm::Reloc::Model RM;
135
136 switch (RelocModel) {
Shih-wei Liao6a60f4e2012-01-17 02:58:40 -0800137 case bccRelocDefault: {
138 RM = llvm::Reloc::Default;
139 break;
140 }
141 case bccRelocStatic: {
142 RM = llvm::Reloc::Static;
143 break;
144 }
145 case bccRelocPIC: {
146 RM = llvm::Reloc::PIC_;
147 break;
148 }
149 case bccRelocDynamicNoPIC: {
150 RM = llvm::Reloc::DynamicNoPIC;
151 break;
152 }
Shih-wei Liao8afed382012-01-10 15:57:24 +0800153 default: {
154 ALOGE("Unrecognized relocation model for bccPrepareObject!");
155 return BCC_INVALID_VALUE;
156 }
157 }
158
Shih-wei Liao6a60f4e2012-01-17 02:58:40 -0800159 return unwrap(script)->prepareRelocatable(cacheDir, cacheName, RM, flags);
Joseph Wen34c600a2011-07-25 17:59:17 -0700160}
161
162
Shih-wei Liaoa471ebb2012-02-05 00:49:58 -0800163extern "C" int bccPrepareSharedObject(BCCScriptRef script,
164 char const *cacheDir,
165 char const *cacheName,
166 char const *objPath,
167 char const *dsoPath,
168 unsigned long flags) {
169 BCC_FUNC_LOGGER();
170 return unwrap(script)->prepareSharedObject(cacheDir, cacheName,
171 objPath, dsoPath, flags);
172}
173
174
Loganf340bf72011-01-14 17:51:40 +0800175extern "C" int bccPrepareExecutable(BCCScriptRef script,
Logan Chienc2be0a12011-07-19 23:10:48 +0800176 char const *cacheDir,
177 char const *cacheName,
Loganf340bf72011-01-14 17:51:40 +0800178 unsigned long flags) {
Logan Chien311c26f2011-07-11 14:30:34 +0800179 BCC_FUNC_LOGGER();
180
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800181 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logand80e65b2010-12-03 21:28:04 +0800182
Logan Chien311c26f2011-07-11 14:30:34 +0800183 return unwrap(script)->prepareExecutable(cacheDir, cacheName, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800184}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800185
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700186
Loganf340bf72011-01-14 17:51:40 +0800187extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800188 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800189
190 void *addr = unwrap(script)->lookup(funcname);
191
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700192#if DEBUG_BCC_REFLECT
Steve Blockb20498e2011-12-20 16:24:20 +0000193 ALOGD("Function Address: %s --> %p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800194#endif
Loganf340bf72011-01-14 17:51:40 +0800195
196 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800197}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700198
Loganbe79ada2011-01-13 01:33:45 +0800199
Loganf340bf72011-01-14 17:51:40 +0800200extern "C" void bccGetExportVarList(BCCScriptRef script,
201 size_t varListSize,
202 void **varList) {
203 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800204
205 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800206 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800207
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700208#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800209 size_t count = unwrap(script)->getExportVarCount();
Steve Blockb20498e2011-12-20 16:24:20 +0000210 ALOGD("ExportVarCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800211
212 if (count > varListSize) {
213 count = varListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800214 }
Loganbe79ada2011-01-13 01:33:45 +0800215
216 for (size_t i = 0; i < count; ++i) {
Steve Blockb20498e2011-12-20 16:24:20 +0000217 ALOGD("ExportVarList[%lu] = %p\n", (unsigned long)i, varList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800218 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800219#endif
Loganbe79ada2011-01-13 01:33:45 +0800220 }
Logan3f3d31f2010-11-27 13:52:03 +0800221}
Shih-wei Liaoabd1e3d2010-04-28 01:47:00 -0700222
Loganf340bf72011-01-14 17:51:40 +0800223
Loganf340bf72011-01-14 17:51:40 +0800224extern "C" void bccGetExportFuncList(BCCScriptRef script,
225 size_t funcListSize,
226 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800227 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800228
Loganbe79ada2011-01-13 01:33:45 +0800229 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800230 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800231
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700232#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800233 size_t count = unwrap(script)->getExportFuncCount();
Steve Blockb20498e2011-12-20 16:24:20 +0000234 ALOGD("ExportFuncCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800235
236 if (count > funcListSize) {
237 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800238 }
Loganbe79ada2011-01-13 01:33:45 +0800239
240 for (size_t i = 0; i < count; ++i) {
Steve Blockb20498e2011-12-20 16:24:20 +0000241 ALOGD("ExportFuncList[%lu] = %p\n", (unsigned long)i, funcList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800242 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800243#endif
Loganbe79ada2011-01-13 01:33:45 +0800244 }
Logan3f3d31f2010-11-27 13:52:03 +0800245}
Stephen Hinescc366e52012-02-21 17:22:04 -0800246
247
248extern "C" void bccGetExportForEachList(BCCScriptRef script,
249 size_t forEachListSize,
250 void **forEachList) {
251 BCC_FUNC_LOGGER();
252
253 if (forEachList) {
254 unwrap(script)->getExportForEachList(forEachListSize, forEachList);
255
256#if DEBUG_BCC_REFLECT
257 size_t count = unwrap(script)->getExportForEachCount();
258 ALOGD("ExportForEachCount = %lu\n", (unsigned long)count);
259
260 if (count > forEachListSize) {
261 count = forEachListSize;
262 }
263
264 for (size_t i = 0; i < count; ++i) {
265 ALOGD("ExportForEachList[%lu] = %p\n", (unsigned long)i, forEachList[i]);
266 }
267#endif
268 }
269}