//===---- ObjectImage.h - Format independent executuable object image -----===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares a file format independent ObjectImage class.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_EXECUTIONENGINE_OBJECTIMAGE_H
#define LLVM_EXECUTIONENGINE_OBJECTIMAGE_H

#include "llvm/ExecutionEngine/ObjectBuffer.h"
#include "llvm/Object/ObjectFile.h"

namespace llvm {


/// ObjectImage - A container class that represents an ObjectFile that has been
/// or is in the process of being loaded into memory for execution.
class ObjectImage {
  ObjectImage() LLVM_DELETED_FUNCTION;
  ObjectImage(const ObjectImage &other) LLVM_DELETED_FUNCTION;
  virtual void anchor();

protected:
  std::unique_ptr<ObjectBuffer> Buffer;

public:
  ObjectImage(ObjectBuffer *Input) : Buffer(Input) {}
  virtual ~ObjectImage() {}

  virtual object::symbol_iterator begin_symbols() const = 0;
  virtual object::symbol_iterator end_symbols() const = 0;
  iterator_range<object::symbol_iterator> symbols() const {
    return iterator_range<object::symbol_iterator>(begin_symbols(),
                                                   end_symbols());
  }

  virtual object::section_iterator begin_sections() const = 0;
  virtual object::section_iterator end_sections() const  = 0;
  iterator_range<object::section_iterator> sections() const {
    return iterator_range<object::section_iterator>(begin_sections(),
                                                    end_sections());
  }

  virtual /* Triple::ArchType */ unsigned getArch() const = 0;

  // Subclasses can override these methods to update the image with loaded
  // addresses for sections and common symbols
  virtual void updateSectionAddress(const object::SectionRef &Sec,
                                    uint64_t Addr) = 0;
  virtual void updateSymbolAddress(const object::SymbolRef &Sym,
                                   uint64_t Addr) = 0;

  virtual StringRef getData() const = 0;

  virtual object::ObjectFile* getObjectFile() const = 0;

  // Subclasses can override these methods to provide JIT debugging support
  virtual void registerWithDebugger() = 0;
  virtual void deregisterWithDebugger() = 0;
};

} // end namespace llvm

#endif // LLVM_EXECUTIONENGINE_OBJECTIMAGE_H
