• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- Buffer.h -------------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_TOOLS_OBJCOPY_BUFFER_H
10 #define LLVM_TOOLS_OBJCOPY_BUFFER_H
11 
12 #include "llvm/ADT/StringRef.h"
13 #include "llvm/Support/FileOutputBuffer.h"
14 #include "llvm/Support/MemoryBuffer.h"
15 #include <memory>
16 
17 namespace llvm {
18 namespace objcopy {
19 
20 // The class Buffer abstracts out the common interface of FileOutputBuffer and
21 // WritableMemoryBuffer so that the hierarchy of Writers depends on this
22 // abstract interface and doesn't depend on a particular implementation.
23 // TODO: refactor the buffer classes in LLVM to enable us to use them here
24 // directly.
25 class Buffer {
26   StringRef Name;
27 
28 public:
29   virtual ~Buffer();
30   virtual Error allocate(size_t Size) = 0;
31   virtual uint8_t *getBufferStart() = 0;
32   virtual Error commit() = 0;
33 
Buffer(StringRef Name)34   explicit Buffer(StringRef Name) : Name(Name) {}
getName()35   StringRef getName() const { return Name; }
36 };
37 
38 class FileBuffer : public Buffer {
39   std::unique_ptr<FileOutputBuffer> Buf;
40   // Indicates that allocate(0) was called, and commit() should create or
41   // truncate a file instead of using a FileOutputBuffer.
42   bool EmptyFile = false;
43 
44 public:
45   Error allocate(size_t Size) override;
46   uint8_t *getBufferStart() override;
47   Error commit() override;
48 
FileBuffer(StringRef FileName)49   explicit FileBuffer(StringRef FileName) : Buffer(FileName) {}
50 };
51 
52 class MemBuffer : public Buffer {
53   std::unique_ptr<WritableMemoryBuffer> Buf;
54 
55 public:
56   Error allocate(size_t Size) override;
57   uint8_t *getBufferStart() override;
58   Error commit() override;
59 
MemBuffer(StringRef Name)60   explicit MemBuffer(StringRef Name) : Buffer(Name) {}
61 
62   std::unique_ptr<WritableMemoryBuffer> releaseMemoryBuffer();
63 };
64 
65 } // end namespace objcopy
66 } // end namespace llvm
67 
68 #endif // LLVM_TOOLS_OBJCOPY_BUFFER_H
69