/* * Copyright 2012, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BCC_RS_EXECUTABLE_H #define BCC_RS_EXECUTABLE_H #include <cstddef> #include "bcc/ExecutionEngine/ObjectLoader.h" #include "bcc/Renderscript/RSInfo.h" #include "bcc/Support/Log.h" #include <utils/Vector.h> namespace bcc { class FileBase; class OutputFile; class SymbolResolverProxy; /* * RSExecutable holds the build results of a RSScript. */ class RSExecutable { private: RSInfo *mInfo; bool mIsInfoDirty; FileBase *mObjFile; ObjectLoader *mLoader; // Memory address of rs export stuffs android::Vector<void *> mExportVarAddrs; android::Vector<void *> mExportFuncAddrs; android::Vector<void *> mExportForeachFuncAddrs; // FIXME: These are designed for Renderscript HAL and is initialized in // RSExecutable::Create(). Both of them come from RSInfo::getPragmas(). // If possible, read the pragma key/value pairs directly from RSInfo. android::Vector<const char *> mPragmaKeys; android::Vector<const char *> mPragmaValues; RSExecutable(RSInfo &pInfo, FileBase &pObjFile, ObjectLoader &pLoader) : mInfo(&pInfo), mIsInfoDirty(false), mObjFile(&pObjFile), mLoader(&pLoader) { } public: // This is a NULL-terminated string array which specifies "Special" functions // in Renderscript (e.g., root().) static const char *SpecialFunctionNames[]; // Return NULL on error. If the return object is non-NULL, it claims the // ownership of pInfo and pObjFile. static RSExecutable *Create(RSInfo &pInfo, FileBase &pObjFile, SymbolResolverProxy &pResolver); inline const RSInfo &getInfo() const { return *mInfo; } // Interfaces to RSInfo inline bool isThreadable() const { return mInfo->isThreadable(); } inline void setThreadable(bool pThreadable = true) { if (mInfo->isThreadable() != pThreadable) { mInfo->setThreadable(pThreadable); mIsInfoDirty = true; } return; } // Interfaces to ObjectLoader inline void *getSymbolAddress(const char *pName) const { return mLoader->getSymbolAddress(pName); } bool syncInfo(bool pForce = false); // Disassemble and dump the relocated functions to the pOutput. void dumpDisassembly(OutputFile &pOutput) const; inline const android::Vector<void *> &getExportVarAddrs() const { return mExportVarAddrs; } inline const android::Vector<void *> &getExportFuncAddrs() const { return mExportFuncAddrs; } inline const android::Vector<void *> &getExportForeachFuncAddrs() const { return mExportForeachFuncAddrs; } inline const android::Vector<const char *> &getPragmaKeys() const { return mPragmaKeys; } inline const android::Vector<const char *> &getPragmaValues() const { return mPragmaValues; } ~RSExecutable(); }; } // end namespace bcc #endif // BCC_RS_EXECUTABLE_H