1 /* 2 * Copyright 2010, The Android Open Source Project 3 * 4 * 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. 15 */ 16 17 // Bitcode compiler (bcc) for Android: 18 // This is an eager-compilation JIT running on Android. 19 20 #include <bcc/bcc.h> 21 #include "bcc_internal.h" 22 23 #include "Config.h" 24 25 #include "Compiler.h" 26 #include "DebugHelper.h" 27 #include "Script.h" 28 29 #include <string> 30 31 #include <utils/StopWatch.h> 32 33 using namespace bcc; 34 35 namespace llvm { 36 class Module; 37 } 38 39 static bool bccBuildStampPrinted = false; 40 41 static void bccPrintBuildStamp() { 42 if (!bccBuildStampPrinted) { 43 LOGI("LIBBCC build time: %s", bccGetBuildTime()); 44 LOGI("LIBBCC build revision: %s", bccGetBuildRev()); 45 bccBuildStampPrinted = true; 46 } 47 } 48 49 extern "C" BCCScriptRef bccCreateScript() { 50 BCC_FUNC_LOGGER(); 51 bccPrintBuildStamp(); 52 return wrap(new bcc::Script()); 53 } 54 55 56 extern "C" void bccDisposeScript(BCCScriptRef script) { 57 BCC_FUNC_LOGGER(); 58 delete unwrap(script); 59 } 60 61 62 extern "C" int bccRegisterSymbolCallback(BCCScriptRef script, 63 BCCSymbolLookupFn pFn, 64 void *pContext) { 65 BCC_FUNC_LOGGER(); 66 return unwrap(script)->registerSymbolCallback(pFn, pContext); 67 } 68 69 70 extern "C" int bccGetError(BCCScriptRef script) { 71 BCC_FUNC_LOGGER(); 72 return unwrap(script)->getError(); 73 } 74 75 extern "C" int bccReadBC(BCCScriptRef script, 76 char const *resName, 77 char const *bitcode, 78 size_t bitcodeSize, 79 unsigned long flags) { 80 BCC_FUNC_LOGGER(); 81 return unwrap(script)->addSourceBC(0, resName, bitcode, bitcodeSize, flags); 82 } 83 84 85 extern "C" int bccReadModule(BCCScriptRef script, 86 char const *resName /* deprecated */, 87 LLVMModuleRef module, 88 unsigned long flags) { 89 BCC_FUNC_LOGGER(); 90 return unwrap(script)->addSourceModule(0, unwrap(module), flags); 91 } 92 93 94 extern "C" int bccReadFile(BCCScriptRef script, 95 char const *path, 96 unsigned long flags) { 97 BCC_FUNC_LOGGER(); 98 return unwrap(script)->addSourceFile(0, path, flags); 99 } 100 101 102 extern "C" int bccLinkBC(BCCScriptRef script, 103 char const *resName, 104 char const *bitcode, 105 size_t bitcodeSize, 106 unsigned long flags) { 107 BCC_FUNC_LOGGER(); 108 return unwrap(script)->addSourceBC(1, resName, bitcode, bitcodeSize, flags); 109 } 110 111 112 extern "C" int bccLinkFile(BCCScriptRef script, 113 char const *path, 114 unsigned long flags) { 115 BCC_FUNC_LOGGER(); 116 return unwrap(script)->addSourceFile(1, path, flags); 117 } 118 119 120 extern "C" void bccMarkExternalSymbol(BCCScriptRef script, char const *name) { 121 BCC_FUNC_LOGGER(); 122 unwrap(script)->markExternalSymbol(name); 123 } 124 125 126 extern "C" int bccPrepareSharedObject(BCCScriptRef script, 127 char const *cacheDir, 128 char const *cacheName, 129 unsigned long flags) { 130 return unwrap(script)->prepareSharedObject(cacheDir, cacheName, flags); 131 } 132 133 134 extern "C" int bccPrepareExecutable(BCCScriptRef script, 135 char const *cacheDir, 136 char const *cacheName, 137 unsigned long flags) { 138 BCC_FUNC_LOGGER(); 139 140 android::StopWatch compileTimer("bcc: PrepareExecutable time"); 141 142 return unwrap(script)->prepareExecutable(cacheDir, cacheName, flags); 143 } 144 145 146 extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) { 147 BCC_FUNC_LOGGER(); 148 149 void *addr = unwrap(script)->lookup(funcname); 150 151 #if DEBUG_BCC_REFLECT 152 LOGD("Function Address: %s --> %p\n", funcname, addr); 153 #endif 154 155 return addr; 156 } 157 158 159 extern "C" void bccGetExportVarList(BCCScriptRef script, 160 size_t varListSize, 161 void **varList) { 162 BCC_FUNC_LOGGER(); 163 164 if (varList) { 165 unwrap(script)->getExportVarList(varListSize, varList); 166 167 #if DEBUG_BCC_REFLECT 168 size_t count = unwrap(script)->getExportVarCount(); 169 LOGD("ExportVarCount = %lu\n", (unsigned long)count); 170 171 if (count > varListSize) { 172 count = varListSize; 173 } 174 175 for (size_t i = 0; i < count; ++i) { 176 LOGD("ExportVarList[%lu] = %p\n", (unsigned long)i, varList[i]); 177 } 178 #endif 179 } 180 } 181 182 183 extern "C" void bccGetExportFuncList(BCCScriptRef script, 184 size_t funcListSize, 185 void **funcList) { 186 BCC_FUNC_LOGGER(); 187 188 if (funcList) { 189 unwrap(script)->getExportFuncList(funcListSize, funcList); 190 191 #if DEBUG_BCC_REFLECT 192 size_t count = unwrap(script)->getExportFuncCount(); 193 LOGD("ExportFuncCount = %lu\n", (unsigned long)count); 194 195 if (count > funcListSize) { 196 count = funcListSize; 197 } 198 199 for (size_t i = 0; i < count; ++i) { 200 LOGD("ExportFuncList[%lu] = %p\n", (unsigned long)i, funcList[i]); 201 } 202 #endif 203 } 204 } 205 206