RSExecutable.h revision ef73a242762bcd8113b9b65ceccbe7d909b5acbc
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"
24c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#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;
320f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass SymbolResolverProxy;
330f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
340f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang/*
350f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * RSExecutable holds the build results of a RSScript.
360f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang */
370f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass RSExecutable {
380f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changprivate:
390f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  RSInfo *mInfo;
400f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  bool mIsInfoDirty;
410f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
420f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  FileBase *mObjFile;
430f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
440f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  ObjectLoader *mLoader;
450f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
460f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Memory address of rs export stuffs
470f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  android::Vector<void *> mExportVarAddrs;
480f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  android::Vector<void *> mExportFuncAddrs;
490f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  android::Vector<void *> mExportForeachFuncAddrs;
500f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
510f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // FIXME: These are designed for RenderScript HAL and is initialized in
520f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  //        RSExecutable::Create(). Both of them come from RSInfo::getPragmas().
530f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  //        If possible, read the pragma key/value pairs directly from RSInfo.
540f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  android::Vector<const char *> mPragmaKeys;
550f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  android::Vector<const char *> mPragmaValues;
560f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
570f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  RSExecutable(RSInfo &pInfo, FileBase &pObjFile, ObjectLoader &pLoader)
580f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    : mInfo(&pInfo), mIsInfoDirty(false), mObjFile(&pObjFile), mLoader(&pLoader)
590f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { }
600f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
610f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changpublic:
620f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // This is a NULL-terminated string array which specifies "Special" functions
630f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // in RenderScript (e.g., root().)
640f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  static const char *SpecialFunctionNames[];
650f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
660f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Return NULL on error. If the return object is non-NULL, it claims the
670f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // ownership of pInfo and pObjFile.
680f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  static RSExecutable *Create(RSInfo &pInfo,
690f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                              FileBase &pObjFile,
700f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                              SymbolResolverProxy &pResolver);
710f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
720f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline const RSInfo &getInfo() const
730f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return *mInfo; }
740f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
750f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Interfaces to RSInfo
760f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline bool isThreadable() const
770f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return mInfo->isThreadable(); }
780f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
790f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline void setThreadable(bool pThreadable = true) {
800f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    if (mInfo->isThreadable() != pThreadable) {
810f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang      mInfo->setThreadable(pThreadable);
820f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang      mIsInfoDirty = true;
830f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    }
840f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    return;
850f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
860f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
870f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Interfaces to ObjectLoader
880f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline void *getSymbolAddress(const char *pName) const
890f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return mLoader->getSymbolAddress(pName); }
900f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
910f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  bool syncInfo(bool pForce = false);
920f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
930f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline const android::Vector<void *> &getExportVarAddrs() const
940f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return mExportVarAddrs; }
950f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline const android::Vector<void *> &getExportFuncAddrs() const
960f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return mExportFuncAddrs; }
970f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline const android::Vector<void *> &getExportForeachFuncAddrs() const
980f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return mExportForeachFuncAddrs; }
990f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1000f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline const android::Vector<const char *> &getPragmaKeys() const
1010f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return mPragmaKeys; }
1020f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  inline const android::Vector<const char *> &getPragmaValues() const
1030f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  { return mPragmaValues; }
1040f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1050f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  ~RSExecutable();
1060f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang};
1070f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1080f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang} // end namespace bcc
1090f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
110c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_RS_EXECUTABLE_H
111