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