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