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 #include "RuntimeStub.h"
     18 
     19 #include <bcc/bcc_assert.h>
     20 
     21 #include <stdbool.h>
     22 #include <string.h>
     23 #include <stdlib.h>
     24 
     25 typedef struct {
     26   const char *mName;
     27   void *mPtr;
     28 } RuntimeFunction;
     29 
     30 #if defined(__arm__)
     31   #define DEF_GENERIC_RUNTIME(func)   \
     32     extern void *func;
     33   #define DEF_VFP_RUNTIME(func) \
     34     extern void *func ## vfp;
     35   #define DEF_LLVM_RUNTIME(func)
     36   #define DEF_BCC_RUNTIME(func)
     37 #include "Runtime.def"
     38 #endif
     39 
     40 static const RuntimeFunction gRuntimes[] = {
     41 #if defined(__arm__)
     42   #define DEF_GENERIC_RUNTIME(func)   \
     43     { #func, (void*) &func },
     44   // TODO: enable only when target support VFP
     45   #define DEF_VFP_RUNTIME(func) \
     46     { #func, (void*) &func ## vfp },
     47 #else
     48   // host compiler library must contain generic runtime
     49   #define DEF_GENERIC_RUNTIME(func)
     50   #define DEF_VFP_RUNTIME(func)
     51 #endif
     52 #define DEF_LLVM_RUNTIME(func)   \
     53   { #func, (void*) &func },
     54 #define DEF_BCC_RUNTIME(func) \
     55   { #func, &func ## _bcc },
     56 #include "Runtime.def"
     57 };
     58 
     59 static int CompareRuntimeFunction(const void *a, const void *b) {
     60   return strcmp(((const RuntimeFunction*) a)->mName,
     61                ((const RuntimeFunction*) b)->mName);
     62 }
     63 
     64 void *FindRuntimeFunction(const char *Name) {
     65   // binary search
     66   const RuntimeFunction Key = { Name, NULL };
     67   const RuntimeFunction *R =
     68       bsearch(&Key,
     69               gRuntimes,
     70               sizeof(gRuntimes) / sizeof(RuntimeFunction),
     71               sizeof(RuntimeFunction),
     72               CompareRuntimeFunction);
     73 
     74   return ((R) ? R->mPtr : NULL);
     75 }
     76 
     77 void VerifyRuntimesTable() {
     78   unsigned N = sizeof(gRuntimes) / sizeof(RuntimeFunction), i;
     79   for(i = 0; i < N; i++) {
     80     const char *Name = gRuntimes[i].mName;
     81     int *Ptr = FindRuntimeFunction(Name);
     82 
     83     if (Ptr != (int*) gRuntimes[i].mPtr)
     84       bccAssert(false && "Table is corrupted (runtime name should be sorted "
     85                          "in Runtime.def).");
     86   }
     87 }
     88