1249423Sdim//===-- ObjectImageCommon.h - Format independent executuable object image -===// 2249423Sdim// 3249423Sdim// The LLVM Compiler Infrastructure 4249423Sdim// 5249423Sdim// This file is distributed under the University of Illinois Open Source 6249423Sdim// License. See LICENSE.TXT for details. 7249423Sdim// 8249423Sdim//===----------------------------------------------------------------------===// 9249423Sdim// 10249423Sdim// This file declares a file format independent ObjectImage class. 11249423Sdim// 12249423Sdim//===----------------------------------------------------------------------===// 13249423Sdim 14249423Sdim#ifndef LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H 15249423Sdim#define LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H 16249423Sdim 17249423Sdim#include "llvm/ExecutionEngine/ObjectBuffer.h" 18249423Sdim#include "llvm/ExecutionEngine/ObjectImage.h" 19249423Sdim#include "llvm/Object/ObjectFile.h" 20249423Sdim 21249423Sdimnamespace llvm { 22249423Sdim 23249423Sdimclass ObjectImageCommon : public ObjectImage { 24249423Sdim ObjectImageCommon(); // = delete 25249423Sdim ObjectImageCommon(const ObjectImageCommon &other); // = delete 26263508Sdim virtual void anchor(); 27249423Sdim 28249423Sdimprotected: 29249423Sdim object::ObjectFile *ObjFile; 30249423Sdim 31249423Sdim // This form of the constructor allows subclasses to use 32249423Sdim // format-specific subclasses of ObjectFile directly 33249423Sdim ObjectImageCommon(ObjectBuffer *Input, object::ObjectFile *Obj) 34249423Sdim : ObjectImage(Input), // saves Input as Buffer and takes ownership 35249423Sdim ObjFile(Obj) 36249423Sdim { 37249423Sdim } 38249423Sdim 39249423Sdimpublic: 40249423Sdim ObjectImageCommon(ObjectBuffer* Input) 41249423Sdim : ObjectImage(Input) // saves Input as Buffer and takes ownership 42249423Sdim { 43249423Sdim ObjFile = object::ObjectFile::createObjectFile(Buffer->getMemBuffer()); 44249423Sdim } 45249423Sdim virtual ~ObjectImageCommon() { delete ObjFile; } 46249423Sdim 47249423Sdim virtual object::symbol_iterator begin_symbols() const 48249423Sdim { return ObjFile->begin_symbols(); } 49249423Sdim virtual object::symbol_iterator end_symbols() const 50249423Sdim { return ObjFile->end_symbols(); } 51249423Sdim 52249423Sdim virtual object::section_iterator begin_sections() const 53249423Sdim { return ObjFile->begin_sections(); } 54249423Sdim virtual object::section_iterator end_sections() const 55249423Sdim { return ObjFile->end_sections(); } 56249423Sdim 57249423Sdim virtual /* Triple::ArchType */ unsigned getArch() const 58249423Sdim { return ObjFile->getArch(); } 59249423Sdim 60249423Sdim virtual StringRef getData() const { return ObjFile->getData(); } 61249423Sdim 62249423Sdim virtual object::ObjectFile* getObjectFile() const { return ObjFile; } 63249423Sdim 64249423Sdim // Subclasses can override these methods to update the image with loaded 65249423Sdim // addresses for sections and common symbols 66249423Sdim virtual void updateSectionAddress(const object::SectionRef &Sec, 67249423Sdim uint64_t Addr) {} 68249423Sdim virtual void updateSymbolAddress(const object::SymbolRef &Sym, uint64_t Addr) 69249423Sdim {} 70249423Sdim 71249423Sdim // Subclasses can override these methods to provide JIT debugging support 72249423Sdim virtual void registerWithDebugger() {} 73249423Sdim virtual void deregisterWithDebugger() {} 74249423Sdim}; 75249423Sdim 76249423Sdim} // end namespace llvm 77249423Sdim 78249423Sdim#endif // LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H 79249423Sdim 80