1e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao/* 2e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Copyright 2011, The Android Open Source Project 3e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 4e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * you may not use this file except in compliance with the License. 6e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * You may obtain a copy of the License at 7e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 8e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 10e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Unless required by applicable law or agreed to in writing, software 11e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 12e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * See the License for the specific language governing permissions and 14e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * limitations under the License. 15e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao */ 16e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao 17a3e9806ff102d256d38bd930d537c206adc8bb6cLogan Chien#ifndef STUB_LAYOUT_H 1845587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien#define STUB_LAYOUT_H 1945587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien 207cea0a041b87afe2c5ad5f26e6a89494d0819bd1Logan Chien#include <map> 2145587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien#include <stdlib.h> 2245587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien 2345587de75f78eb78b400e733d47b6e7d702b55b4Logan Chienclass StubLayout { 2445587de75f78eb78b400e733d47b6e7d702b55b4Logan Chienprivate: 2545587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien unsigned char *table; 262061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien size_t count; 2745587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien 287cea0a041b87afe2c5ad5f26e6a89494d0819bd1Logan Chien std::map<void *, void *> stub_index; 297cea0a041b87afe2c5ad5f26e6a89494d0819bd1Logan Chien 3045587de75f78eb78b400e733d47b6e7d702b55b4Logan Chienpublic: 3145587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien StubLayout(); 3272dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh virtual ~StubLayout() { } 3345587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien 342061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien void initStubTable(unsigned char *table, size_t count); 3545587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien void *allocateStub(void *addr = 0); 362061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien 372061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien size_t calcStubTableSize(size_t count) const; 3872dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh virtual size_t getUnitStubSize() const = 0; 3945587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien 4045587de75f78eb78b400e733d47b6e7d702b55b4Logan Chienprivate: 4172dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh virtual void setStubAddress(void *stub, void *addr) = 0; 4245587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien 4345587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien}; 4445587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien 4572dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsiehclass StubLayoutARM : public StubLayout { 4672dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsiehpublic: 4772dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh StubLayoutARM() { } 4872dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh size_t getUnitStubSize() const; 4972dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 5072dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsiehprivate: 5172dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh virtual void setStubAddress(void *stub, void *addr); 5272dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh}; 5372dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 5472dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsiehclass StubLayoutMIPS : public StubLayout { 5572dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsiehpublic: 5672dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh StubLayoutMIPS() { } 5772dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh size_t getUnitStubSize() const; 5872dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 5972dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsiehprivate: 6072dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh virtual void setStubAddress(void *stub, void *addr); 6172dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh}; 6272dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 6372dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 6445587de75f78eb78b400e733d47b6e7d702b55b4Logan Chien#endif // STUB_LAYOUT_H 65