RSExecutable.h revision e198abec6c5e3eab380ccf6897b0a0b9c2dd92dd
10f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang/* 20f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * Copyright 2012, The Android Open Source Project 30f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * 40f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 50f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * you may not use this file except in compliance with the License. 60f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * You may obtain a copy of the License at 70f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * 80f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 90f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * 100f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * Unless required by applicable law or agreed to in writing, software 110f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 120f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * See the License for the specific language governing permissions and 140f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * limitations under the License. 150f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang */ 160f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#ifndef BCC_RS_EXECUTABLE_H 18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_RS_EXECUTABLE_H 190f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 200f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include <cstddef> 210f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 22c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang 23c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/ExecutionEngine/ObjectLoader.h" 24e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines#include "bcc/Renderscript/RSInfo.h" 25ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h" 260f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 270f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include <utils/Vector.h> 280f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 290f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changnamespace bcc { 300f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 310f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass FileBase; 326d01af642a7cacdbd483f0c57e9f17cdeaaa98d6Shih-wei Liaoclass OutputFile; 330f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass SymbolResolverProxy; 340f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 350f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang/* 360f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * RSExecutable holds the build results of a RSScript. 370f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang */ 380f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass RSExecutable { 390f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changprivate: 400f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang RSInfo *mInfo; 410f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang bool mIsInfoDirty; 420f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 430f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang FileBase *mObjFile; 440f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 450f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang ObjectLoader *mLoader; 460f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 470f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // Memory address of rs export stuffs 480f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang android::Vector<void *> mExportVarAddrs; 490f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang android::Vector<void *> mExportFuncAddrs; 500f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang android::Vector<void *> mExportForeachFuncAddrs; 510f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 52e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines // FIXME: These are designed for Renderscript HAL and is initialized in 530f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // RSExecutable::Create(). Both of them come from RSInfo::getPragmas(). 540f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // If possible, read the pragma key/value pairs directly from RSInfo. 550f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang android::Vector<const char *> mPragmaKeys; 560f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang android::Vector<const char *> mPragmaValues; 570f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 580f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang RSExecutable(RSInfo &pInfo, FileBase &pObjFile, ObjectLoader &pLoader) 590f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang : mInfo(&pInfo), mIsInfoDirty(false), mObjFile(&pObjFile), mLoader(&pLoader) 600f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { } 610f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 620f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changpublic: 630f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // This is a NULL-terminated string array which specifies "Special" functions 64e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines // in Renderscript (e.g., root().) 650f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang static const char *SpecialFunctionNames[]; 660f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 670f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // Return NULL on error. If the return object is non-NULL, it claims the 680f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // ownership of pInfo and pObjFile. 690f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang static RSExecutable *Create(RSInfo &pInfo, 700f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang FileBase &pObjFile, 710f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang SymbolResolverProxy &pResolver); 720f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 730f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline const RSInfo &getInfo() const 740f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return *mInfo; } 750f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 760f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // Interfaces to RSInfo 770f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline bool isThreadable() const 780f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return mInfo->isThreadable(); } 790f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 800f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline void setThreadable(bool pThreadable = true) { 810f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang if (mInfo->isThreadable() != pThreadable) { 820f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang mInfo->setThreadable(pThreadable); 830f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang mIsInfoDirty = true; 840f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang } 850f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang return; 860f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang } 870f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 880f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang // Interfaces to ObjectLoader 890f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline void *getSymbolAddress(const char *pName) const 900f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return mLoader->getSymbolAddress(pName); } 910f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 920f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang bool syncInfo(bool pForce = false); 930f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 946d01af642a7cacdbd483f0c57e9f17cdeaaa98d6Shih-wei Liao // Disassemble and dump the relocated functions to the pOutput. 956d01af642a7cacdbd483f0c57e9f17cdeaaa98d6Shih-wei Liao void dumpDisassembly(OutputFile &pOutput) const; 966d01af642a7cacdbd483f0c57e9f17cdeaaa98d6Shih-wei Liao 970f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline const android::Vector<void *> &getExportVarAddrs() const 980f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return mExportVarAddrs; } 990f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline const android::Vector<void *> &getExportFuncAddrs() const 1000f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return mExportFuncAddrs; } 1010f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline const android::Vector<void *> &getExportForeachFuncAddrs() const 1020f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return mExportForeachFuncAddrs; } 1030f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 1040f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline const android::Vector<const char *> &getPragmaKeys() const 1050f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return mPragmaKeys; } 1060f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang inline const android::Vector<const char *> &getPragmaValues() const 1070f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang { return mPragmaValues; } 1080f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 1090f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang ~RSExecutable(); 1100f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang}; 1110f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 1120f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang} // end namespace bcc 1130f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang 114c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_RS_EXECUTABLE_H 115