mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
b138caba43
This makes the buffer ownership on error conditions very natural. The buffer is only moved out of the argument if an object is constructed that now owns the buffer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211546 91177308-0d34-0410-b5e6-96231b3b80d8
90 lines
3.0 KiB
C++
90 lines
3.0 KiB
C++
//===-- 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_RUNTIMEDYLD_OBJECTIMAGECOMMON_H
|
|
#define LLVM_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(ObjectBuffer *Input, std::unique_ptr<object::ObjectFile> Obj)
|
|
: ObjectImage(Input), // saves Input as Buffer and takes ownership
|
|
ObjFile(std::move(Obj))
|
|
{
|
|
}
|
|
|
|
public:
|
|
ObjectImageCommon(ObjectBuffer* Input)
|
|
: ObjectImage(Input) // saves Input as Buffer and takes ownership
|
|
{
|
|
// FIXME: error checking? createObjectFile returns an ErrorOr<ObjectFile*>
|
|
// and should probably be checked for failure.
|
|
std::unique_ptr<MemoryBuffer> Buf(Buffer->getMemBuffer());
|
|
ObjFile.reset(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 // LLVM_RUNTIMEDYLD_OBJECT_IMAGE_H
|