| /* |
| * 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 |