mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 17:25:21 +00:00
Don't own the buffer in object::Binary.
Owning the buffer is somewhat inflexible. Some Binaries have sub Binaries (like Archive) and we had to create dummy buffers just to handle that. It is also a bad fit for IRObjectFile where the Module wants to own the buffer too. Keeping this ownership would make supporting IR inside native objects particularly painful. This patch focuses in lib/Object. If something elsewhere used to own an Binary, now it also owns a MemoryBuffer. This patch introduces a few new types. * MemoryBufferRef. This is just a pair of StringRefs for the data and name. This is to MemoryBuffer as StringRef is to std::string. * OwningBinary. A combination of Binary and a MemoryBuffer. This is needed for convenience functions that take a filename and return both the buffer and the Binary using that buffer. The C api now uses OwningBinary to avoid any change in semantics. I will start a new thread to see if we want to change it and how. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216002 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -17,11 +17,11 @@
|
||||
#include "llvm/Object/Error.h"
|
||||
#include "llvm/Support/ErrorOr.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class LLVMContext;
|
||||
class MemoryBuffer;
|
||||
class StringRef;
|
||||
|
||||
namespace object {
|
||||
@@ -34,9 +34,9 @@ private:
|
||||
unsigned int TypeID;
|
||||
|
||||
protected:
|
||||
std::unique_ptr<MemoryBuffer> Data;
|
||||
MemoryBufferRef Data;
|
||||
|
||||
Binary(unsigned int Type, std::unique_ptr<MemoryBuffer> Source);
|
||||
Binary(unsigned int Type, MemoryBufferRef Source);
|
||||
|
||||
enum {
|
||||
ID_Archive,
|
||||
@@ -78,8 +78,8 @@ public:
|
||||
virtual ~Binary();
|
||||
|
||||
StringRef getData() const;
|
||||
MemoryBuffer *releaseBuffer() { return Data.release(); }
|
||||
StringRef getFileName() const;
|
||||
MemoryBufferRef getMemoryBufferRef() const;
|
||||
|
||||
// Cast methods.
|
||||
unsigned int getType() const { return TypeID; }
|
||||
@@ -126,11 +126,37 @@ public:
|
||||
/// @brief Create a Binary from Source, autodetecting the file type.
|
||||
///
|
||||
/// @param Source The data to create the Binary from.
|
||||
ErrorOr<std::unique_ptr<Binary>>
|
||||
createBinary(std::unique_ptr<MemoryBuffer> Source,
|
||||
LLVMContext *Context = nullptr);
|
||||
ErrorOr<std::unique_ptr<Binary>> createBinary(MemoryBufferRef Source,
|
||||
LLVMContext *Context = nullptr);
|
||||
|
||||
ErrorOr<std::unique_ptr<Binary>> createBinary(StringRef Path);
|
||||
template <typename T> class OwningBinary {
|
||||
std::unique_ptr<T> Bin;
|
||||
std::unique_ptr<MemoryBuffer> Buf;
|
||||
|
||||
public:
|
||||
OwningBinary();
|
||||
OwningBinary(std::unique_ptr<T> Bin, std::unique_ptr<MemoryBuffer> Buf);
|
||||
std::unique_ptr<T> &getBinary();
|
||||
std::unique_ptr<MemoryBuffer> &getBuffer();
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
OwningBinary<T>::OwningBinary(std::unique_ptr<T> Bin,
|
||||
std::unique_ptr<MemoryBuffer> Buf)
|
||||
: Bin(std::move(Bin)), Buf(std::move(Buf)) {}
|
||||
|
||||
template <typename T> OwningBinary<T>::OwningBinary() {}
|
||||
|
||||
template <typename T> std::unique_ptr<T> &OwningBinary<T>::getBinary() {
|
||||
return Bin;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::unique_ptr<MemoryBuffer> &OwningBinary<T>::getBuffer() {
|
||||
return Buf;
|
||||
}
|
||||
|
||||
ErrorOr<OwningBinary<Binary>> createBinary(StringRef Path);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user