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