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_OBJECT_LOADER_H
180f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#define BCC_EXECUTION_ENGINE_OBJECT_LOADER_H
190f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
200f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include <cstddef>
210f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
229795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao#include "bcc/Support/Log.h"
239795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
249795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao#include <utils/Vector.h>
259795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
260f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changnamespace bcc {
270f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
280f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass FileBase;
290f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass ObjectLoaderImpl;
300f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass SymbolResolverInterface;
310f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
320f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changclass ObjectLoader {
339795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liaopublic:
349795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  enum SymbolType {
359795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    // TODO: More types.
369795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    kFunctionType,
379795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    kUnknownType,
389795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  };
399795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
400f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changprivate:
410f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  ObjectLoaderImpl *mImpl;
420f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
430f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  void *mDebugImage;
440f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
450f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  ObjectLoader() : mImpl(NULL), mDebugImage(0) { }
460f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
470f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changpublic:
480f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Load from a in-memory object. pName is a descriptive name of this memory.
490f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  static ObjectLoader *Load(void *pMemStart, size_t pMemSize, const char *pName,
500f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                            SymbolResolverInterface &pResolver,
510f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                            bool pEnableGDBDebug);
520f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
530f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Load from a file.
540f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  static ObjectLoader *Load(FileBase &pFile,
550f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                            SymbolResolverInterface &pResolver,
560f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                            bool pEnableGDBDebug);
570f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
580f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  void *getSymbolAddress(const char *pName) const;
590f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
609795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  size_t getSymbolSize(const char *pName) const;
619795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
629795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  // Get the symbol name where the symbol is of the type pType. If kUnknownType
639795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  // is given, it returns all symbols' names in the object.
649795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  bool getSymbolNameList(android::Vector<const char *>& pNameList,
659795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao                         SymbolType pType = kUnknownType) const;
669795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
670f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  ~ObjectLoader();
680f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang};
690f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
700f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang} // namespace bcc
710f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
720f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#endif // BCC_EXECUTION_ENGINE_OBJECT_LOADER_H
73