-//===-- ObjectImageCommon.h - Format independent executuable object image -===//\r
-//\r
-// The LLVM Compiler Infrastructure\r
-//\r
-// This file is distributed under the University of Illinois Open Source\r
-// License. See LICENSE.TXT for details.\r
-//\r
-//===----------------------------------------------------------------------===//\r
-//\r
-// This file declares a file format independent ObjectImage class.\r
-//\r
-//===----------------------------------------------------------------------===//\r
-\r
-#ifndef LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H\r
-#define LLVM_RUNTIMEDYLD_OBJECTIMAGECOMMON_H\r
-\r
-#include "llvm/Object/ObjectFile.h"\r
-#include "llvm/ExecutionEngine/ObjectImage.h"\r
-#include "llvm/ExecutionEngine/ObjectBuffer.h"\r
-\r
-namespace llvm {\r
-\r
-class ObjectImageCommon : public ObjectImage {\r
- ObjectImageCommon(); // = delete\r
- ObjectImageCommon(const ObjectImageCommon &other); // = delete\r
-\r
-protected:\r
- object::ObjectFile *ObjFile;\r
-\r
- // This form of the constructor allows subclasses to use\r
- // format-specific subclasses of ObjectFile directly\r
- ObjectImageCommon(ObjectBuffer *Input, object::ObjectFile *Obj)\r
- : ObjectImage(Input), // saves Input as Buffer and takes ownership\r
- ObjFile(Obj)\r
- {\r
- }\r
-\r
-public:\r
- ObjectImageCommon(ObjectBuffer* Input)\r
- : ObjectImage(Input) // saves Input as Buffer and takes ownership\r
- {\r
- ObjFile = object::ObjectFile::createObjectFile(Buffer->getMemBuffer());\r
- }\r
- virtual ~ObjectImageCommon() { delete ObjFile; }\r
-\r
- virtual object::symbol_iterator begin_symbols() const\r
- { return ObjFile->begin_symbols(); }\r
- virtual object::symbol_iterator end_symbols() const\r
- { return ObjFile->end_symbols(); }\r
-\r
- virtual object::section_iterator begin_sections() const\r
- { return ObjFile->begin_sections(); }\r
- virtual object::section_iterator end_sections() const\r
- { return ObjFile->end_sections(); }\r
-\r
- virtual /* Triple::ArchType */ unsigned getArch() const\r
- { return ObjFile->getArch(); }\r
-\r
- virtual StringRef getData() const { return ObjFile->getData(); }\r
-\r
- // Subclasses can override these methods to update the image with loaded\r
- // addresses for sections and common symbols\r
- virtual void updateSectionAddress(const object::SectionRef &Sec,\r
- uint64_t Addr) {}\r
- virtual void updateSymbolAddress(const object::SymbolRef &Sym, uint64_t Addr)\r
- {}\r
-\r
- // Subclasses can override these methods to provide JIT debugging support\r
- virtual void registerWithDebugger() {}\r
- virtual void deregisterWithDebugger() {}\r
-};\r
-\r
-} // end namespace llvm\r
-\r
-#endif // LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H\r
-\r
+//===-- 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_LIB_EXECUTIONENGINE_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
+#define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
+
+#include "llvm/ExecutionEngine/ObjectBuffer.h"
+#include "llvm/ExecutionEngine/ObjectImage.h"
+#include "llvm/Object/ObjectFile.h"
+
+#include <memory>
+
+namespace llvm {
+
+namespace object {
+ class ObjectFile;
+}
+
+class ObjectImageCommon : public ObjectImage {
+ ObjectImageCommon(); // = delete
+ ObjectImageCommon(const ObjectImageCommon &other); // = delete
+ void anchor() override;
+
+protected:
+ std::unique_ptr<object::ObjectFile> ObjFile;
+
+ // This form of the constructor allows subclasses to use
+ // format-specific subclasses of ObjectFile directly
+ ObjectImageCommon(std::unique_ptr<ObjectBuffer> Input,
+ std::unique_ptr<object::ObjectFile> Obj)
+ : ObjectImage(std::move(Input)), ObjFile(std::move(Obj)) {}
+
+public:
+ ObjectImageCommon(std::unique_ptr<ObjectBuffer> Input)
+ : ObjectImage(std::move(Input)) {
+ // FIXME: error checking? createObjectFile returns an ErrorOr<ObjectFile*>
+ // and should probably be checked for failure.
+ MemoryBufferRef Buf = Buffer->getMemBuffer();
+ ObjFile = std::move(object::ObjectFile::createObjectFile(Buf).get());
+ }
+ ObjectImageCommon(std::unique_ptr<object::ObjectFile> Input)
+ : ObjectImage(nullptr), ObjFile(std::move(Input)) {}
+ virtual ~ObjectImageCommon() { }
+
+ object::symbol_iterator begin_symbols() const override
+ { return ObjFile->symbol_begin(); }
+ object::symbol_iterator end_symbols() const override
+ { return ObjFile->symbol_end(); }
+
+ object::section_iterator begin_sections() const override
+ { return ObjFile->section_begin(); }
+ object::section_iterator end_sections() const override
+ { return ObjFile->section_end(); }
+
+ /* Triple::ArchType */ unsigned getArch() const override
+ { return ObjFile->getArch(); }
+
+ StringRef getData() const override { return ObjFile->getData(); }
+
+ object::ObjectFile* getObjectFile() const override { return ObjFile.get(); }
+
+ // Subclasses can override these methods to update the image with loaded
+ // addresses for sections and common symbols
+ void updateSectionAddress(const object::SectionRef &Sec,
+ uint64_t Addr) override {}
+ void updateSymbolAddress(const object::SymbolRef &Sym,
+ uint64_t Addr) override {}
+
+ // Subclasses can override these methods to provide JIT debugging support
+ void registerWithDebugger() override {}
+ void deregisterWithDebugger() override {}
+};
+
+} // end namespace llvm
+
+#endif