blob: 9bbf6a0d809e431649db9983e52f3b7773774b6d [file] [log] [blame]
Jakub Staszakde7c8532012-11-14 20:18:34 +00001//===-- ObjectImageCommon.h - Format independent executuable object image -===//
2//
Stephen Hines36b56882014-04-23 16:57:46 -07003// The LLVM Compiler Infrastructure
Jakub Staszakde7c8532012-11-14 20:18:34 +00004//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares a file format independent ObjectImage class.
11//
12//===----------------------------------------------------------------------===//
13
Stephen Hines37ed9c12014-12-01 14:51:49 -080014#ifndef LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
15#define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
Jakub Staszakde7c8532012-11-14 20:18:34 +000016
Jakub Staszakde7c8532012-11-14 20:18:34 +000017#include "llvm/ExecutionEngine/ObjectBuffer.h"
Chandler Carrutha1514e22012-12-04 07:12:27 +000018#include "llvm/ExecutionEngine/ObjectImage.h"
19#include "llvm/Object/ObjectFile.h"
Jakub Staszakde7c8532012-11-14 20:18:34 +000020
Stephen Hinesdce4a402014-05-29 02:49:00 -070021#include <memory>
22
Jakub Staszakde7c8532012-11-14 20:18:34 +000023namespace llvm {
24
Stephen Hines36b56882014-04-23 16:57:46 -070025namespace object {
26 class ObjectFile;
27}
28
Jakub Staszakde7c8532012-11-14 20:18:34 +000029class ObjectImageCommon : public ObjectImage {
30 ObjectImageCommon(); // = delete
31 ObjectImageCommon(const ObjectImageCommon &other); // = delete
Stephen Hines36b56882014-04-23 16:57:46 -070032 void anchor() override;
Jakub Staszakde7c8532012-11-14 20:18:34 +000033
34protected:
Stephen Hinesdce4a402014-05-29 02:49:00 -070035 std::unique_ptr<object::ObjectFile> ObjFile;
Jakub Staszakde7c8532012-11-14 20:18:34 +000036
37 // This form of the constructor allows subclasses to use
38 // format-specific subclasses of ObjectFile directly
Stephen Hines37ed9c12014-12-01 14:51:49 -080039 ObjectImageCommon(std::unique_ptr<ObjectBuffer> Input,
40 std::unique_ptr<object::ObjectFile> Obj)
41 : ObjectImage(std::move(Input)), ObjFile(std::move(Obj)) {}
Jakub Staszakde7c8532012-11-14 20:18:34 +000042
43public:
Stephen Hines37ed9c12014-12-01 14:51:49 -080044 ObjectImageCommon(std::unique_ptr<ObjectBuffer> Input)
45 : ObjectImage(std::move(Input)) {
Stephen Hinesdce4a402014-05-29 02:49:00 -070046 // FIXME: error checking? createObjectFile returns an ErrorOr<ObjectFile*>
47 // and should probably be checked for failure.
Stephen Hines37ed9c12014-12-01 14:51:49 -080048 MemoryBufferRef Buf = Buffer->getMemBuffer();
49 ObjFile = std::move(object::ObjectFile::createObjectFile(Buf).get());
Jakub Staszakde7c8532012-11-14 20:18:34 +000050 }
Stephen Hinesdce4a402014-05-29 02:49:00 -070051 ObjectImageCommon(std::unique_ptr<object::ObjectFile> Input)
52 : ObjectImage(nullptr), ObjFile(std::move(Input)) {}
53 virtual ~ObjectImageCommon() { }
Jakub Staszakde7c8532012-11-14 20:18:34 +000054
Stephen Hines36b56882014-04-23 16:57:46 -070055 object::symbol_iterator begin_symbols() const override
56 { return ObjFile->symbol_begin(); }
57 object::symbol_iterator end_symbols() const override
58 { return ObjFile->symbol_end(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000059
Stephen Hines36b56882014-04-23 16:57:46 -070060 object::section_iterator begin_sections() const override
61 { return ObjFile->section_begin(); }
62 object::section_iterator end_sections() const override
63 { return ObjFile->section_end(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000064
Stephen Hines36b56882014-04-23 16:57:46 -070065 /* Triple::ArchType */ unsigned getArch() const override
66 { return ObjFile->getArch(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000067
Stephen Hines36b56882014-04-23 16:57:46 -070068 StringRef getData() const override { return ObjFile->getData(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000069
Stephen Hinesdce4a402014-05-29 02:49:00 -070070 object::ObjectFile* getObjectFile() const override { return ObjFile.get(); }
Andrew Kayloree7c0d22013-01-25 22:50:58 +000071
Jakub Staszakde7c8532012-11-14 20:18:34 +000072 // Subclasses can override these methods to update the image with loaded
73 // addresses for sections and common symbols
Stephen Hines36b56882014-04-23 16:57:46 -070074 void updateSectionAddress(const object::SectionRef &Sec,
75 uint64_t Addr) override {}
76 void updateSymbolAddress(const object::SymbolRef &Sym,
77 uint64_t Addr) override {}
Jakub Staszakde7c8532012-11-14 20:18:34 +000078
79 // Subclasses can override these methods to provide JIT debugging support
Stephen Hines36b56882014-04-23 16:57:46 -070080 void registerWithDebugger() override {}
81 void deregisterWithDebugger() override {}
Jakub Staszakde7c8532012-11-14 20:18:34 +000082};
83
84} // end namespace llvm
85
Stephen Hines37ed9c12014-12-01 14:51:49 -080086#endif