blob: 075d6c178a44b60cd2ac7a091b219dfb698ff85e [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
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 Liao8afed382012-01-10 15:57:24 +080032#include <llvm/Support/CodeGen.h>
Shih-wei Liao77ed6142010-04-07 12:21:42 -070033
Loganf340bf72011-01-14 17:51:40 +080034using namespace bcc;
35
Logan39a2ca52010-11-27 01:03:06 +080036namespace llvm {
37 class Module;
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -080038}
39
Logan Chien3378a022011-07-13 19:44:37 +080040static bool bccBuildStampPrinted = false;
41
42static void bccPrintBuildStamp() {
43 if (!bccBuildStampPrinted) {
Steve Block440e0312012-01-04 20:06:16 +000044 ALOGI("LIBBCC build time: %s", bccGetBuildTime());
45 ALOGI("LIBBCC build revision: %s", bccGetBuildRev());
Logan Chien3378a022011-07-13 19:44:37 +080046 bccBuildStampPrinted = true;
47 }
48}
49
Loganf340bf72011-01-14 17:51:40 +080050extern "C" BCCScriptRef bccCreateScript() {
Logan3c01aaa2011-01-01 01:40:39 +080051 BCC_FUNC_LOGGER();
Logan Chien3378a022011-07-13 19:44:37 +080052 bccPrintBuildStamp();
Loganf340bf72011-01-14 17:51:40 +080053 return wrap(new bcc::Script());
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" void bccDisposeScript(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080058 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080059 delete unwrap(script);
Logan3f3d31f2010-11-27 13:52:03 +080060}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070061
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080062
Shih-wei Liaoce82d492011-01-20 12:34:03 -080063extern "C" int bccRegisterSymbolCallback(BCCScriptRef script,
64 BCCSymbolLookupFn pFn,
65 void *pContext) {
Logan3c01aaa2011-01-01 01:40:39 +080066 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080067 return unwrap(script)->registerSymbolCallback(pFn, pContext);
Logan3f3d31f2010-11-27 13:52:03 +080068}
Shih-wei Liao77ed6142010-04-07 12:21:42 -070069
Shih-wei Liao39ebe2c2011-01-28 11:22:32 -080070
Loganf340bf72011-01-14 17:51:40 +080071extern "C" int bccGetError(BCCScriptRef script) {
Logan3c01aaa2011-01-01 01:40:39 +080072 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +080073 return unwrap(script)->getError();
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 bccReadBC(BCCScriptRef script,
77 char const *resName,
78 char const *bitcode,
79 size_t bitcodeSize,
80 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080081 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080082 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags);
Logan3f3d31f2010-11-27 13:52:03 +080083}
Zonr Chang932648d2010-10-13 22:23:56 +080084
Loganf340bf72011-01-14 17:51:40 +080085
86extern "C" int bccReadModule(BCCScriptRef script,
Logan474cbd22011-01-31 01:47:44 +080087 char const *resName /* deprecated */,
Loganf340bf72011-01-14 17:51:40 +080088 LLVMModuleRef module,
89 unsigned long flags) {
Logan3c01aaa2011-01-01 01:40:39 +080090 BCC_FUNC_LOGGER();
Logan474cbd22011-01-31 01:47:44 +080091 return unwrap(script)->addSourceModule(0, unwrap(module), flags);
92}
93
94
95extern "C" int bccReadFile(BCCScriptRef script,
96 char const *path,
97 unsigned long flags) {
98 BCC_FUNC_LOGGER();
99 return unwrap(script)->addSourceFile(0, path, 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();
Logan474cbd22011-01-31 01:47:44 +0800109 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags);
110}
111
112
113extern "C" int bccLinkFile(BCCScriptRef script,
114 char const *path,
115 unsigned long flags) {
116 BCC_FUNC_LOGGER();
117 return unwrap(script)->addSourceFile(1, path, flags);
Loganf340bf72011-01-14 17:51:40 +0800118}
119
120
Logan Chien7890d432011-08-03 14:55:17 +0800121extern "C" void bccMarkExternalSymbol(BCCScriptRef script, char const *name) {
122 BCC_FUNC_LOGGER();
123 unwrap(script)->markExternalSymbol(name);
124}
125
126
Shih-wei Liao8afed382012-01-10 15:57:24 +0800127extern "C" int bccPrepareObject(BCCScriptRef script,
128 char const *cacheDir,
129 char const *cacheName,
130 bccRelocModelEnum RelocModel,
131 unsigned long flags) {
132 BCC_FUNC_LOGGER();
133 llvm::Reloc::Model RM;
134
135 switch (RelocModel) {
136 case bccRelocDefault: RM = llvm::Reloc::Default; break;
137 case bccRelocStatic: RM = llvm::Reloc::Static; break;
138 case bccRelocPIC: RM = llvm::Reloc::PIC_; break;
139 case bccRelocDynamicNoPIC: RM = llvm::Reloc::DynamicNoPIC; break;
140 default: {
141 ALOGE("Unrecognized relocation model for bccPrepareObject!");
142 return BCC_INVALID_VALUE;
143 }
144 }
145
146 return unwrap(script)->prepareObject(cacheDir, cacheName, RM, flags);
Joseph Wen34c600a2011-07-25 17:59:17 -0700147}
148
149
Loganf340bf72011-01-14 17:51:40 +0800150extern "C" int bccPrepareExecutable(BCCScriptRef script,
Logan Chienc2be0a12011-07-19 23:10:48 +0800151 char const *cacheDir,
152 char const *cacheName,
Loganf340bf72011-01-14 17:51:40 +0800153 unsigned long flags) {
Logan Chien311c26f2011-07-11 14:30:34 +0800154 BCC_FUNC_LOGGER();
155
Shih-wei Liaof6267d12011-01-07 19:23:58 -0800156 android::StopWatch compileTimer("bcc: PrepareExecutable time");
Logand80e65b2010-12-03 21:28:04 +0800157
Logan Chien311c26f2011-07-11 14:30:34 +0800158 return unwrap(script)->prepareExecutable(cacheDir, cacheName, flags);
Logan3f3d31f2010-11-27 13:52:03 +0800159}
Shih-wei Liao7c5a5f72010-11-08 01:59:13 -0800160
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700161
Loganf340bf72011-01-14 17:51:40 +0800162extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
Logan3c01aaa2011-01-01 01:40:39 +0800163 BCC_FUNC_LOGGER();
Loganf340bf72011-01-14 17:51:40 +0800164
165 void *addr = unwrap(script)->lookup(funcname);
166
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700167#if DEBUG_BCC_REFLECT
Steve Blockb20498e2011-12-20 16:24:20 +0000168 ALOGD("Function Address: %s --> %p\n", funcname, addr);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800169#endif
Loganf340bf72011-01-14 17:51:40 +0800170
171 return addr;
Logan3f3d31f2010-11-27 13:52:03 +0800172}
Shih-wei Liao77ed6142010-04-07 12:21:42 -0700173
Loganbe79ada2011-01-13 01:33:45 +0800174
Loganf340bf72011-01-14 17:51:40 +0800175extern "C" void bccGetExportVarList(BCCScriptRef script,
176 size_t varListSize,
177 void **varList) {
178 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800179
180 if (varList) {
Loganf340bf72011-01-14 17:51:40 +0800181 unwrap(script)->getExportVarList(varListSize, varList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800182
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700183#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800184 size_t count = unwrap(script)->getExportVarCount();
Steve Blockb20498e2011-12-20 16:24:20 +0000185 ALOGD("ExportVarCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800186
187 if (count > varListSize) {
188 count = varListSize;
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) {
Steve Blockb20498e2011-12-20 16:24:20 +0000192 ALOGD("ExportVarList[%lu] = %p\n", (unsigned long)i, varList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800193 }
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 Liaoabd1e3d2010-04-28 01:47:00 -0700197
Loganf340bf72011-01-14 17:51:40 +0800198
Loganf340bf72011-01-14 17:51:40 +0800199extern "C" void bccGetExportFuncList(BCCScriptRef script,
200 size_t funcListSize,
201 void **funcList) {
Logan3c01aaa2011-01-01 01:40:39 +0800202 BCC_FUNC_LOGGER();
Loganbe79ada2011-01-13 01:33:45 +0800203
Loganbe79ada2011-01-13 01:33:45 +0800204 if (funcList) {
Loganf340bf72011-01-14 17:51:40 +0800205 unwrap(script)->getExportFuncList(funcListSize, funcList);
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800206
Shih-wei Liao9f73de02011-07-01 04:40:24 -0700207#if DEBUG_BCC_REFLECT
Loganf340bf72011-01-14 17:51:40 +0800208 size_t count = unwrap(script)->getExportFuncCount();
Steve Blockb20498e2011-12-20 16:24:20 +0000209 ALOGD("ExportFuncCount = %lu\n", (unsigned long)count);
Loganbe79ada2011-01-13 01:33:45 +0800210
211 if (count > funcListSize) {
212 count = funcListSize;
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800213 }
Loganbe79ada2011-01-13 01:33:45 +0800214
215 for (size_t i = 0; i < count; ++i) {
Steve Blockb20498e2011-12-20 16:24:20 +0000216 ALOGD("ExportFuncList[%lu] = %p\n", (unsigned long)i, funcList[i]);
Loganbe79ada2011-01-13 01:33:45 +0800217 }
Shih-wei Liaod6d488c2010-12-04 18:23:50 -0800218#endif
Loganbe79ada2011-01-13 01:33:45 +0800219 }
Logan3f3d31f2010-11-27 13:52:03 +0800220}