//===-- ObjectImageCommon.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_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
#define LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H

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

namespace llvm {

class ObjectImageCommon : public ObjectImage {
  ObjectImageCommon(); // = delete
  ObjectImageCommon(const ObjectImageCommon &other); // = delete

protected:
  object::ObjectFile *ObjFile;

  // This form of the constructor allows subclasses to use
  // format-specific subclasses of ObjectFile directly
  ObjectImageCommon(ObjectBuffer *Input, object::ObjectFile *Obj)
  : ObjectImage(Input), // saves Input as Buffer and takes ownership
    ObjFile(Obj)
  {
  }

public:
  ObjectImageCommon(ObjectBuffer* Input)
  : ObjectImage(Input) // saves Input as Buffer and takes ownership
  {
    ObjFile = object::ObjectFile::createObjectFile(Buffer->getMemBuffer());
  }
  virtual ~ObjectImageCommon() { delete ObjFile; }

  virtual object::symbol_iterator begin_symbols() const
	      { return ObjFile->begin_symbols(); }
  virtual object::symbol_iterator end_symbols() const
	      { return ObjFile->end_symbols(); }

  virtual object::section_iterator begin_sections() const
	      { return ObjFile->begin_sections(); }
  virtual object::section_iterator end_sections() const
	      { return ObjFile->end_sections(); }

  virtual /* Triple::ArchType */ unsigned getArch() const
	      { return ObjFile->getArch(); }

  virtual StringRef getData() const { return ObjFile->getData(); }

  virtual object::ObjectFile* getObjectFile() const { return ObjFile; }

  // 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) {}
  virtual void updateSymbolAddress(const object::SymbolRef &Sym, uint64_t Addr)
	      {}

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

} // end namespace llvm

#endif // LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H

