| //===- 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; |
| bool KeepOwnership = false; |
| unsigned UserID = 0; |
| unsigned GroupID = 0; |
| |
| public: |
| Error allocate(size_t Size) override; |
| uint8_t *getBufferStart() override; |
| Error commit() override; |
| |
| explicit FileBuffer(StringRef FileName) : Buffer(FileName) {} |
| explicit FileBuffer(StringRef FileName, bool Keep, unsigned UID, unsigned GID) |
| : Buffer(FileName), KeepOwnership(Keep), UserID(UID), GroupID(GID) {} |
| }; |
| |
| 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 |