blob: 4917b93a96e5fea1b343afdc5dcbd6b219ec610d [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
14#ifndef LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
15#define LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
16
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 Hinesdce4a402014-05-29 02:49:00 -070039 ObjectImageCommon(ObjectBuffer *Input, std::unique_ptr<object::ObjectFile> Obj)
Jakub Staszakde7c8532012-11-14 20:18:34 +000040 : ObjectImage(Input), // saves Input as Buffer and takes ownership
Stephen Hinesdce4a402014-05-29 02:49:00 -070041 ObjFile(std::move(Obj))
Jakub Staszakde7c8532012-11-14 20:18:34 +000042 {
43 }
44
45public:
46 ObjectImageCommon(ObjectBuffer* Input)
47 : ObjectImage(Input) // saves Input as Buffer and takes ownership
48 {
Stephen Hinesdce4a402014-05-29 02:49:00 -070049 // FIXME: error checking? createObjectFile returns an ErrorOr<ObjectFile*>
50 // and should probably be checked for failure.
51 ObjFile.reset(object::ObjectFile::createObjectFile(Buffer->getMemBuffer()).get());
Jakub Staszakde7c8532012-11-14 20:18:34 +000052 }
Stephen Hinesdce4a402014-05-29 02:49:00 -070053 ObjectImageCommon(std::unique_ptr<object::ObjectFile> Input)
54 : ObjectImage(nullptr), ObjFile(std::move(Input)) {}
55 virtual ~ObjectImageCommon() { }
Jakub Staszakde7c8532012-11-14 20:18:34 +000056
Stephen Hines36b56882014-04-23 16:57:46 -070057 object::symbol_iterator begin_symbols() const override
58 { return ObjFile->symbol_begin(); }
59 object::symbol_iterator end_symbols() const override
60 { return ObjFile->symbol_end(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000061
Stephen Hines36b56882014-04-23 16:57:46 -070062 object::section_iterator begin_sections() const override
63 { return ObjFile->section_begin(); }
64 object::section_iterator end_sections() const override
65 { return ObjFile->section_end(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000066
Stephen Hines36b56882014-04-23 16:57:46 -070067 /* Triple::ArchType */ unsigned getArch() const override
68 { return ObjFile->getArch(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000069
Stephen Hines36b56882014-04-23 16:57:46 -070070 StringRef getData() const override { return ObjFile->getData(); }
Jakub Staszakde7c8532012-11-14 20:18:34 +000071
Stephen Hinesdce4a402014-05-29 02:49:00 -070072 object::ObjectFile* getObjectFile() const override { return ObjFile.get(); }
Andrew Kayloree7c0d22013-01-25 22:50:58 +000073
Jakub Staszakde7c8532012-11-14 20:18:34 +000074 // Subclasses can override these methods to update the image with loaded
75 // addresses for sections and common symbols
Stephen Hines36b56882014-04-23 16:57:46 -070076 void updateSectionAddress(const object::SectionRef &Sec,
77 uint64_t Addr) override {}
78 void updateSymbolAddress(const object::SymbolRef &Sym,
79 uint64_t Addr) override {}
Jakub Staszakde7c8532012-11-14 20:18:34 +000080
81 // Subclasses can override these methods to provide JIT debugging support
Stephen Hines36b56882014-04-23 16:57:46 -070082 void registerWithDebugger() override {}
83 void deregisterWithDebugger() override {}
Jakub Staszakde7c8532012-11-14 20:18:34 +000084};
85
86} // end namespace llvm
87
88#endif // LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H