Home | History | Annotate | Download | only in ExecutionEngine
      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 #if defined(__arm__)
    141   android::StopWatch compileTimer("bcc: PrepareExecutable time");
    142 #endif
    143 
    144   return unwrap(script)->prepareExecutable(cacheDir, cacheName, flags);
    145 }
    146 
    147 
    148 extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
    149   BCC_FUNC_LOGGER();
    150 
    151   void *addr = unwrap(script)->lookup(funcname);
    152 
    153 #if DEBUG_BCC_REFLECT
    154   LOGD("Function Address: %s --> %p\n", funcname, addr);
    155 #endif
    156 
    157   return addr;
    158 }
    159 
    160 
    161 extern "C" void bccGetExportVarList(BCCScriptRef script,
    162                                     size_t varListSize,
    163                                     void **varList) {
    164   BCC_FUNC_LOGGER();
    165 
    166   if (varList) {
    167     unwrap(script)->getExportVarList(varListSize, varList);
    168 
    169 #if DEBUG_BCC_REFLECT
    170     size_t count = unwrap(script)->getExportVarCount();
    171     LOGD("ExportVarCount = %lu\n", (unsigned long)count);
    172 
    173     if (count > varListSize) {
    174       count = varListSize;
    175     }
    176 
    177     for (size_t i = 0; i < count; ++i) {
    178       LOGD("ExportVarList[%lu] = %p\n", (unsigned long)i, varList[i]);
    179     }
    180 #endif
    181   }
    182 }
    183 
    184 
    185 extern "C" void bccGetExportFuncList(BCCScriptRef script,
    186                                      size_t funcListSize,
    187                                      void **funcList) {
    188   BCC_FUNC_LOGGER();
    189 
    190   if (funcList) {
    191     unwrap(script)->getExportFuncList(funcListSize, funcList);
    192 
    193 #if DEBUG_BCC_REFLECT
    194     size_t count = unwrap(script)->getExportFuncCount();
    195     LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
    196 
    197     if (count > funcListSize) {
    198       count = funcListSize;
    199     }
    200 
    201     for (size_t i = 0; i < count; ++i) {
    202       LOGD("ExportFuncList[%lu] = %p\n", (unsigned long)i, funcList[i]);
    203     }
    204 #endif
    205   }
    206 }
    207 
    208