1862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang/*
2862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * Copyright 2012, The Android Open Source Project
3862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang *
4862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * you may not use this file except in compliance with the License.
6862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * You may obtain a copy of the License at
7862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang *
8862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang *
10862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * Unless required by applicable law or agreed to in writing, software
11862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * See the License for the specific language governing permissions and
14862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang * limitations under the License.
15862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang */
16862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang
17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/ExecutionEngine/SymbolResolverProxy.h"
18862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang
19862f3ba997e14b61dce9d341a75688951e67fd1bZonr Changusing namespace bcc;
20862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang
21862f3ba997e14b61dce9d341a75688951e67fd1bZonr Changvoid *SymbolResolverProxy::getAddress(const char *pName) {
22862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang  // Search the address of the symbol by following the chain of resolvers.
23862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang  for (size_t i = 0; i < mChain.size(); i++) {
24862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang    void *addr = mChain[i]->getAddress(pName);
25862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang    if (addr != NULL) {
26862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang      return addr;
27862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang    }
28862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang  }
29862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang  // Symbol not found or there's no resolver containing in the chain.
30862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang  return NULL;
31862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang}
32862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang
33862f3ba997e14b61dce9d341a75688951e67fd1bZonr Changvoid SymbolResolverProxy::chainResolver(SymbolResolverInterface &pResolver) {
34862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang  mChain.push_back(&pResolver);
35862f3ba997e14b61dce9d341a75688951e67fd1bZonr Chang}
36