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