//===- Buffer.h -------------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #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 Error 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; // Indicates that allocate(0) was called, and commit() should create or // truncate a file instead of using a FileOutputBuffer. bool EmptyFile = false; public: Error 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: Error 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 |