1de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===-- ObjectImageCommon.h - Format independent executuable object image -===// 2de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 4de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 5de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// This file is distributed under the University of Illinois Open Source 6de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// License. See LICENSE.TXT for details. 7de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 8de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===----------------------------------------------------------------------===// 9de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 10de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// This file declares a file format independent ObjectImage class. 11de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 12de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===----------------------------------------------------------------------===// 13de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 14de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#ifndef LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H 15de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#define LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H 16de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 17de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/ExecutionEngine/ObjectBuffer.h" 18a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ExecutionEngine/ObjectImage.h" 19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Object/ObjectFile.h" 20de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <memory> 22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 23de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszaknamespace llvm { 24de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace object { 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class ObjectFile; 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 29de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakclass ObjectImageCommon : public ObjectImage { 30de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak ObjectImageCommon(); // = delete 31de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak ObjectImageCommon(const ObjectImageCommon &other); // = delete 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 33de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 34de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakprotected: 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<object::ObjectFile> ObjFile; 36de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 37de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // This form of the constructor allows subclasses to use 38de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // format-specific subclasses of ObjectFile directly 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ObjectImageCommon(ObjectBuffer *Input, std::unique_ptr<object::ObjectFile> Obj) 40de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak : ObjectImage(Input), // saves Input as Buffer and takes ownership 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ObjFile(std::move(Obj)) 42de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak { 43de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 44de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 45de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakpublic: 46de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak ObjectImageCommon(ObjectBuffer* Input) 47de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak : ObjectImage(Input) // saves Input as Buffer and takes ownership 48de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak { 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // FIXME: error checking? createObjectFile returns an ErrorOr<ObjectFile*> 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // and should probably be checked for failure. 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::unique_ptr<MemoryBuffer> Buf(Buffer->getMemBuffer()); 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ObjFile.reset(object::ObjectFile::createObjectFile(Buf).get()); 53de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ObjectImageCommon(std::unique_ptr<object::ObjectFile> Input) 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : ObjectImage(nullptr), ObjFile(std::move(Input)) {} 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual ~ObjectImageCommon() { } 57de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines object::symbol_iterator begin_symbols() const override 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { return ObjFile->symbol_begin(); } 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines object::symbol_iterator end_symbols() const override 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { return ObjFile->symbol_end(); } 62de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines object::section_iterator begin_sections() const override 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { return ObjFile->section_begin(); } 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines object::section_iterator end_sections() const override 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { return ObjFile->section_end(); } 67de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /* Triple::ArchType */ unsigned getArch() const override 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { return ObjFile->getArch(); } 70de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef getData() const override { return ObjFile->getData(); } 72de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines object::ObjectFile* getObjectFile() const override { return ObjFile.get(); } 74ee7c0d2f931590ccdc53a14b1839e11bb29fc96eAndrew Kaylor 75de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // Subclasses can override these methods to update the image with loaded 76de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // addresses for sections and common symbols 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void updateSectionAddress(const object::SectionRef &Sec, 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Addr) override {} 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void updateSymbolAddress(const object::SymbolRef &Sym, 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Addr) override {} 81de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 82de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // Subclasses can override these methods to provide JIT debugging support 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void registerWithDebugger() override {} 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void deregisterWithDebugger() override {} 85de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak}; 86de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 87de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} // end namespace llvm 88de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 89de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#endif // LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H 90