1343171Sdim//===- Buffer.h -------------------------------------------------*- C++ -*-===// 2343171Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6343171Sdim// 7343171Sdim//===----------------------------------------------------------------------===// 8343171Sdim 9343171Sdim#ifndef LLVM_TOOLS_OBJCOPY_BUFFER_H 10343171Sdim#define LLVM_TOOLS_OBJCOPY_BUFFER_H 11343171Sdim 12343171Sdim#include "llvm/ADT/StringRef.h" 13343171Sdim#include "llvm/Support/FileOutputBuffer.h" 14343171Sdim#include "llvm/Support/MemoryBuffer.h" 15343171Sdim#include <memory> 16343171Sdim 17343171Sdimnamespace llvm { 18343171Sdimnamespace objcopy { 19343171Sdim 20343171Sdim// The class Buffer abstracts out the common interface of FileOutputBuffer and 21343171Sdim// WritableMemoryBuffer so that the hierarchy of Writers depends on this 22343171Sdim// abstract interface and doesn't depend on a particular implementation. 23343171Sdim// TODO: refactor the buffer classes in LLVM to enable us to use them here 24343171Sdim// directly. 25343171Sdimclass Buffer { 26343171Sdim StringRef Name; 27343171Sdim 28343171Sdimpublic: 29343171Sdim virtual ~Buffer(); 30353358Sdim virtual Error allocate(size_t Size) = 0; 31343171Sdim virtual uint8_t *getBufferStart() = 0; 32343171Sdim virtual Error commit() = 0; 33343171Sdim 34343171Sdim explicit Buffer(StringRef Name) : Name(Name) {} 35343171Sdim StringRef getName() const { return Name; } 36343171Sdim}; 37343171Sdim 38343171Sdimclass FileBuffer : public Buffer { 39343171Sdim std::unique_ptr<FileOutputBuffer> Buf; 40353358Sdim // Indicates that allocate(0) was called, and commit() should create or 41353358Sdim // truncate a file instead of using a FileOutputBuffer. 42353358Sdim bool EmptyFile = false; 43343171Sdim 44343171Sdimpublic: 45353358Sdim Error allocate(size_t Size) override; 46343171Sdim uint8_t *getBufferStart() override; 47343171Sdim Error commit() override; 48343171Sdim 49343171Sdim explicit FileBuffer(StringRef FileName) : Buffer(FileName) {} 50343171Sdim}; 51343171Sdim 52343171Sdimclass MemBuffer : public Buffer { 53343171Sdim std::unique_ptr<WritableMemoryBuffer> Buf; 54343171Sdim 55343171Sdimpublic: 56353358Sdim Error allocate(size_t Size) override; 57343171Sdim uint8_t *getBufferStart() override; 58343171Sdim Error commit() override; 59343171Sdim 60343171Sdim explicit MemBuffer(StringRef Name) : Buffer(Name) {} 61343171Sdim 62343171Sdim std::unique_ptr<WritableMemoryBuffer> releaseMemoryBuffer(); 63343171Sdim}; 64343171Sdim 65343171Sdim} // end namespace objcopy 66343171Sdim} // end namespace llvm 67343171Sdim 68343171Sdim#endif // LLVM_TOOLS_OBJCOPY_BUFFER_H 69