LLVM  8.0.1
MemoryBuffer.h
Go to the documentation of this file.
1 //===--- MemoryBuffer.h - Memory Buffer Interface ---------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the MemoryBuffer interface.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_SUPPORT_MEMORYBUFFER_H
15 #define LLVM_SUPPORT_MEMORYBUFFER_H
16 
17 #include "llvm-c/Types.h"
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/ADT/Twine.h"
22 #include "llvm/Support/ErrorOr.h"
24 #include <cstddef>
25 #include <cstdint>
26 #include <memory>
27 
28 namespace llvm {
29 
30 class MemoryBufferRef;
31 
32 /// This interface provides simple read-only access to a block of memory, and
33 /// provides simple methods for reading files and standard input into a memory
34 /// buffer. In addition to basic access to the characters in the file, this
35 /// interface guarantees you can read one character past the end of the file,
36 /// and that this character will read as '\0'.
37 ///
38 /// The '\0' guarantee is needed to support an optimization -- it's intended to
39 /// be more efficient for clients which are reading all the data to stop
40 /// reading when they encounter a '\0' than to continually check the file
41 /// position to see if it has reached the end of the file.
42 class MemoryBuffer {
43  const char *BufferStart; // Start of the buffer.
44  const char *BufferEnd; // End of the buffer.
45 
46 protected:
47  MemoryBuffer() = default;
48 
49  void init(const char *BufStart, const char *BufEnd,
50  bool RequiresNullTerminator);
51 
54 
55 public:
56  MemoryBuffer(const MemoryBuffer &) = delete;
57  MemoryBuffer &operator=(const MemoryBuffer &) = delete;
58  virtual ~MemoryBuffer();
59 
60  const char *getBufferStart() const { return BufferStart; }
61  const char *getBufferEnd() const { return BufferEnd; }
62  size_t getBufferSize() const { return BufferEnd-BufferStart; }
63 
64  StringRef getBuffer() const {
65  return StringRef(BufferStart, getBufferSize());
66  }
67 
68  /// Return an identifier for this buffer, typically the filename it was read
69  /// from.
70  virtual StringRef getBufferIdentifier() const { return "Unknown buffer"; }
71 
72  /// Open the specified file as a MemoryBuffer, returning a new MemoryBuffer
73  /// if successful, otherwise returning null. If FileSize is specified, this
74  /// means that the client knows that the file exists and that it has the
75  /// specified size.
76  ///
77  /// \param IsVolatile Set to true to indicate that the contents of the file
78  /// can change outside the user's control, e.g. when libclang tries to parse
79  /// while the user is editing/updating the file or if the file is on an NFS.
81  getFile(const Twine &Filename, int64_t FileSize = -1,
82  bool RequiresNullTerminator = true, bool IsVolatile = false);
83 
84  /// Read all of the specified file into a MemoryBuffer as a stream
85  /// (i.e. until EOF reached). This is useful for special files that
86  /// look like a regular file but have 0 size (e.g. /proc/cpuinfo on Linux).
88  getFileAsStream(const Twine &Filename);
89 
90  /// Given an already-open file descriptor, map some slice of it into a
91  /// MemoryBuffer. The slice is specified by an \p Offset and \p MapSize.
92  /// Since this is in the middle of a file, the buffer is not null terminated.
94  getOpenFileSlice(int FD, const Twine &Filename, uint64_t MapSize,
95  int64_t Offset, bool IsVolatile = false);
96 
97  /// Given an already-open file descriptor, read the file and return a
98  /// MemoryBuffer.
99  ///
100  /// \param IsVolatile Set to true to indicate that the contents of the file
101  /// can change outside the user's control, e.g. when libclang tries to parse
102  /// while the user is editing/updating the file or if the file is on an NFS.
104  getOpenFile(int FD, const Twine &Filename, uint64_t FileSize,
105  bool RequiresNullTerminator = true, bool IsVolatile = false);
106 
107  /// Open the specified memory range as a MemoryBuffer. Note that InputData
108  /// must be null terminated if RequiresNullTerminator is true.
109  static std::unique_ptr<MemoryBuffer>
110  getMemBuffer(StringRef InputData, StringRef BufferName = "",
111  bool RequiresNullTerminator = true);
112 
113  static std::unique_ptr<MemoryBuffer>
114  getMemBuffer(MemoryBufferRef Ref, bool RequiresNullTerminator = true);
115 
116  /// Open the specified memory range as a MemoryBuffer, copying the contents
117  /// and taking ownership of it. InputData does not have to be null terminated.
118  static std::unique_ptr<MemoryBuffer>
119  getMemBufferCopy(StringRef InputData, const Twine &BufferName = "");
120 
121  /// Read all of stdin into a file buffer, and return it.
123 
124  /// Open the specified file as a MemoryBuffer, or open stdin if the Filename
125  /// is "-".
127  getFileOrSTDIN(const Twine &Filename, int64_t FileSize = -1,
128  bool RequiresNullTerminator = true);
129 
130  /// Map a subrange of the specified file as a MemoryBuffer.
132  getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset,
133  bool IsVolatile = false);
134 
135  //===--------------------------------------------------------------------===//
136  // Provided for performance analysis.
137  //===--------------------------------------------------------------------===//
138 
139  /// The kind of memory backing used to support the MemoryBuffer.
140  enum BufferKind {
143  };
144 
145  /// Return information on the memory mechanism used to support the
146  /// MemoryBuffer.
147  virtual BufferKind getBufferKind() const = 0;
148 
150 };
151 
152 /// This class is an extension of MemoryBuffer, which allows copy-on-write
153 /// access to the underlying contents. It only supports creation methods that
154 /// are guaranteed to produce a writable buffer. For example, mapping a file
155 /// read-only is not supported.
157 protected:
158  WritableMemoryBuffer() = default;
159 
162 
163 public:
167 
168  // const_cast is well-defined here, because the underlying buffer is
169  // guaranteed to have been initialized with a mutable buffer.
170  char *getBufferStart() {
171  return const_cast<char *>(MemoryBuffer::getBufferStart());
172  }
173  char *getBufferEnd() {
174  return const_cast<char *>(MemoryBuffer::getBufferEnd());
175  }
177  return {getBufferStart(), getBufferEnd()};
178  }
179 
181  getFile(const Twine &Filename, int64_t FileSize = -1,
182  bool IsVolatile = false);
183 
184  /// Map a subrange of the specified file as a WritableMemoryBuffer.
186  getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset,
187  bool IsVolatile = false);
188 
189  /// Allocate a new MemoryBuffer of the specified size that is not initialized.
190  /// Note that the caller should initialize the memory allocated by this
191  /// method. The memory is owned by the MemoryBuffer object.
192  static std::unique_ptr<WritableMemoryBuffer>
193  getNewUninitMemBuffer(size_t Size, const Twine &BufferName = "");
194 
195  /// Allocate a new zero-initialized MemoryBuffer of the specified size. Note
196  /// that the caller need not initialize the memory allocated by this method.
197  /// The memory is owned by the MemoryBuffer object.
198  static std::unique_ptr<WritableMemoryBuffer>
199  getNewMemBuffer(size_t Size, const Twine &BufferName = "");
200 
201 private:
202  // Hide these base class factory function so one can't write
203  // WritableMemoryBuffer::getXXX()
204  // and be surprised that he got a read-only Buffer.
212 };
213 
214 /// This class is an extension of MemoryBuffer, which allows write access to
215 /// the underlying contents and committing those changes to the original source.
216 /// It only supports creation methods that are guaranteed to produce a writable
217 /// buffer. For example, mapping a file read-only is not supported.
219 protected:
220  WriteThroughMemoryBuffer() = default;
221 
224 
225 public:
229 
230  // const_cast is well-defined here, because the underlying buffer is
231  // guaranteed to have been initialized with a mutable buffer.
232  char *getBufferStart() {
233  return const_cast<char *>(MemoryBuffer::getBufferStart());
234  }
235  char *getBufferEnd() {
236  return const_cast<char *>(MemoryBuffer::getBufferEnd());
237  }
239  return {getBufferStart(), getBufferEnd()};
240  }
241 
243  getFile(const Twine &Filename, int64_t FileSize = -1);
244 
245  /// Map a subrange of the specified file as a ReadWriteMemoryBuffer.
247  getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset);
248 
249 private:
250  // Hide these base class factory function so one can't write
251  // WritableMemoryBuffer::getXXX()
252  // and be surprised that he got a read-only Buffer.
260 };
261 
263  StringRef Buffer;
264  StringRef Identifier;
265 
266 public:
267  MemoryBufferRef() = default;
269  : Buffer(Buffer.getBuffer()), Identifier(Buffer.getBufferIdentifier()) {}
270  MemoryBufferRef(StringRef Buffer, StringRef Identifier)
271  : Buffer(Buffer), Identifier(Identifier) {}
272 
273  StringRef getBuffer() const { return Buffer; }
274 
275  StringRef getBufferIdentifier() const { return Identifier; }
276 
277  const char *getBufferStart() const { return Buffer.begin(); }
278  const char *getBufferEnd() const { return Buffer.end(); }
279  size_t getBufferSize() const { return Buffer.size(); }
280 };
281 
282 // Create wrappers for C Binding types (see CBindingWrapping.h).
284 
285 } // end namespace llvm
286 
287 #endif // LLVM_SUPPORT_MEMORYBUFFER_H
virtual StringRef getBufferIdentifier() const
Return an identifier for this buffer, typically the filename it was read from.
Definition: MemoryBuffer.h:70
void init(const char *BufStart, const char *BufEnd, bool RequiresNullTerminator)
init - Initialize this MemoryBuffer as a reference to externally allocated memory, memory that we know is already null terminated.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getOpenFileSlice(int FD, const Twine &Filename, uint64_t MapSize, int64_t Offset, bool IsVolatile=false)
Given an already-open file descriptor, map some slice of it into a MemoryBuffer.
Represents either an error or a value T.
Definition: ErrorOr.h:57
StringRef getBuffer() const
Definition: MemoryBuffer.h:64
This class represents lattice values for constants.
Definition: AllocatorList.h:24
const char * getBufferEnd() const
Definition: MemoryBuffer.h:278
struct LLVMOpaqueMemoryBuffer * LLVMMemoryBufferRef
LLVM uses a polymorphic type hierarchy which C cannot represent, therefore parameters must be passed ...
Definition: Types.h:49
constexpr char IsVolatile[]
Key for Kernel::Arg::Metadata::mIsVolatile.
MemoryBuffer & operator=(const MemoryBuffer &)=delete
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t size() const
size - Get the string size.
Definition: StringRef.h:138
static std::unique_ptr< MemoryBuffer > getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
Open the specified memory range as a MemoryBuffer.
size_t getBufferSize() const
Definition: MemoryBuffer.h:62
virtual BufferKind getBufferKind() const =0
Return information on the memory mechanism used to support the MemoryBuffer.
#define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
StringRef getBuffer() const
Definition: MemoryBuffer.h:273
The access may reference the value stored in memory.
May access map via data and modify it. Written to path.
Definition: FileSystem.h:1079
May only access map via const_data as read only.
Definition: FileSystem.h:1078
MutableArrayRef< char > getBuffer()
Definition: MemoryBuffer.h:238
static constexpr sys::fs::mapped_file_region::mapmode Mapmode
Definition: MemoryBuffer.h:52
static ErrorOr< std::unique_ptr< MemoryBuffer > > getSTDIN()
Read all of stdin into a file buffer, and return it.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:291
size_t getBufferSize() const
Definition: MemoryBuffer.h:279
This class is an extension of MemoryBuffer, which allows write access to the underlying contents and ...
Definition: MemoryBuffer.h:218
MemoryBuffer()=default
MemoryBufferRef getMemBufferRef() const
This interface provides simple read-only access to a block of memory, and provides simple methods for...
Definition: MemoryBuffer.h:42
static std::unique_ptr< MemoryBuffer > getMemBufferCopy(StringRef InputData, const Twine &BufferName="")
Open the specified memory range as a MemoryBuffer, copying the contents and taking ownership of it...
StringRef getBufferIdentifier() const
Definition: MemoryBuffer.h:275
iterator begin() const
Definition: StringRef.h:106
May modify via data, but changes are lost on destruction.
Definition: FileSystem.h:1080
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset, bool IsVolatile=false)
Map a subrange of the specified file as a MemoryBuffer.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, int64_t FileSize=-1, bool RequiresNullTerminator=true)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
const char * getBufferEnd() const
Definition: MemoryBuffer.h:61
virtual ~MemoryBuffer()
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileAsStream(const Twine &Filename)
Read all of the specified file into a MemoryBuffer as a stream (i.e.
This class is an extension of MemoryBuffer, which allows copy-on-write access to the underlying conte...
Definition: MemoryBuffer.h:156
uint32_t Size
Definition: Profile.cpp:47
BufferKind
The kind of memory backing used to support the MemoryBuffer.
Definition: MemoryBuffer.h:140
const char * getBufferStart() const
Definition: MemoryBuffer.h:60
MemoryBufferRef(MemoryBuffer &Buffer)
Definition: MemoryBuffer.h:268
Provides ErrorOr<T> smart pointer.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, int64_t FileSize=-1, bool RequiresNullTerminator=true, bool IsVolatile=false)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful, otherwise returning null.
const char * getBufferStart() const
Definition: MemoryBuffer.h:277
MemoryBufferRef(StringRef Buffer, StringRef Identifier)
Definition: MemoryBuffer.h:270
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
static ErrorOr< std::unique_ptr< MemoryBuffer > > getOpenFile(int FD, const Twine &Filename, uint64_t FileSize, bool RequiresNullTerminator=true, bool IsVolatile=false)
Given an already-open file descriptor, read the file and return a MemoryBuffer.
iterator end() const
Definition: StringRef.h:108
MutableArrayRef< char > getBuffer()
Definition: MemoryBuffer.h:176