BCCRuntimeSymbolResolver.cpp revision bbcef8ad069ee33c3bfc52dcd1bd6e1a7633e1f9
1932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang/*
2932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * Copyright 2010, The Android Open Source Project
3932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *
4932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * you may not use this file except in compliance with the License.
6932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * You may obtain a copy of the License at
7932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *
8932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *
10932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * Unless required by applicable law or agreed to in writing, software
11932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * See the License for the specific language governing permissions and
14932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * limitations under the License.
15932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang */
16932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang
17a6f41a76ed28224bccaf3c207943f84c7ef4fb8aLogan#include "RuntimeStub.h"
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
19bbcef8ad069ee33c3bfc52dcd1bd6e1a7633e1f9Stephen Hines#include <bcc/bcc_assert.h>
20bbcef8ad069ee33c3bfc52dcd1bd6e1a7633e1f9Stephen Hines
21bbcef8ad069ee33c3bfc52dcd1bd6e1a7633e1f9Stephen Hines#include <stdbool.h>
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <string.h>
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <stdlib.h>
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef struct {
26932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  const char *mName;
27932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  void *mPtr;
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} RuntimeFunction;
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if defined(__arm__)
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  #define DEF_GENERIC_RUNTIME(func)   \
32932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang    extern void *func;
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  #define DEF_VFP_RUNTIME(func) \
34932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang    extern void *func ## vfp;
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  #define DEF_LLVM_RUNTIME(func)
36abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liao  #define DEF_BCC_RUNTIME(func)
37c4395235b212be7a626becb0c03020eab4859739Logan#include "Runtime.def"
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
40abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liaostatic const RuntimeFunction gRuntimes[] = {
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if defined(__arm__)
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  #define DEF_GENERIC_RUNTIME(func)   \
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    { #func, (void*) &func },
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  // TODO: enable only when target support VFP
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  #define DEF_VFP_RUNTIME(func) \
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    { #func, (void*) &func ## vfp },
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#else
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  // host compiler library must contain generic runtime
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  #define DEF_GENERIC_RUNTIME(func)
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  #define DEF_VFP_RUNTIME(func)
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define DEF_LLVM_RUNTIME(func)   \
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  { #func, (void*) &func },
54abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liao#define DEF_BCC_RUNTIME(func) \
55abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liao  { #func, &func ## _bcc },
56c4395235b212be7a626becb0c03020eab4859739Logan#include "Runtime.def"
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao};
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
59932648d528f333d43defdf16b3f8e84afa865cc8Zonr Changstatic int CompareRuntimeFunction(const void *a, const void *b) {
60932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  return strcmp(((const RuntimeFunction*) a)->mName,
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               ((const RuntimeFunction*) b)->mName);
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
64932648d528f333d43defdf16b3f8e84afa865cc8Zonr Changvoid *FindRuntimeFunction(const char *Name) {
65932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  // binary search
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  const RuntimeFunction Key = { Name, NULL };
67932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  const RuntimeFunction *R =
68932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang      bsearch(&Key,
69932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang              gRuntimes,
70932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang              sizeof(gRuntimes) / sizeof(RuntimeFunction),
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao              sizeof(RuntimeFunction),
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao              CompareRuntimeFunction);
73932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang
74932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  return ((R) ? R->mPtr : NULL);
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
76abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liao
77abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liaovoid VerifyRuntimesTable() {
78932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  unsigned N = sizeof(gRuntimes) / sizeof(RuntimeFunction), i;
79932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang  for(i = 0; i < N; i++) {
80932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang    const char *Name = gRuntimes[i].mName;
81932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang    int *Ptr = FindRuntimeFunction(Name);
82abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liao
83932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang    if (Ptr != (int*) gRuntimes[i].mPtr)
84bbcef8ad069ee33c3bfc52dcd1bd6e1a7633e1f9Stephen Hines      bccAssert(false && "Table is corrupted (runtime name should be sorted "
85bbcef8ad069ee33c3bfc52dcd1bd6e1a7633e1f9Stephen Hines                         "in Runtime.def).");
86abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liao  }
87abd1e3dd923239043a865a9eeaca69b24857e77eShih-wei Liao}
88