//===- Buffer.h -------------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_OBJCOPY_BUFFER_H #define LLVM_TOOLS_OBJCOPY_BUFFER_H #include "llvm/ADT/StringRef.h" #include "llvm/Support/FileOutputBuffer.h" #include "llvm/Support/MemoryBuffer.h" #include <memory> namespace llvm { namespace objcopy { // The class Buffer abstracts out the common interface of FileOutputBuffer and // WritableMemoryBuffer so that the hierarchy of Writers depends on this // abstract interface and doesn't depend on a particular implementation. // TODO: refactor the buffer classes in LLVM to enable us to use them here // directly. class Buffer { StringRef Name; public: virtual ~Buffer(); virtual void allocate(size_t Size) = 0; virtual uint8_t *getBufferStart() = 0; virtual Error commit() = 0; explicit Buffer(StringRef Name) : Name(Name) {} StringRef getName() const { return Name; } }; class FileBuffer : public Buffer { std::unique_ptr<FileOutputBuffer> Buf; public: void allocate(size_t Size) override; uint8_t *getBufferStart() override; Error commit() override; explicit FileBuffer(StringRef FileName) : Buffer(FileName) {} }; class MemBuffer : public Buffer { std::unique_ptr<WritableMemoryBuffer> Buf; public: void allocate(size_t Size) override; uint8_t *getBufferStart() override; Error commit() override; explicit MemBuffer(StringRef Name) : Buffer(Name) {} std::unique_ptr<WritableMemoryBuffer> releaseMemoryBuffer(); }; } // end namespace objcopy } // end namespace llvm #endif // LLVM_TOOLS_OBJCOPY_BUFFER_H |