LLVM 22.0.0git
MemoryBuffer.cpp
Go to the documentation of this file.
1//===--- MemoryBuffer.cpp - Memory Buffer implementation ------------------===//
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// This file implements the MemoryBuffer interface.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/STLExtras.h"
16#include "llvm/Config/config.h"
19#include "llvm/Support/Errc.h"
20#include "llvm/Support/Error.h"
27#include <algorithm>
28#include <cassert>
29#include <cstring>
30#include <new>
31#include <sys/types.h>
32#include <system_error>
33#if !defined(_MSC_VER) && !defined(__MINGW32__)
34#include <unistd.h>
35#else
36#include <io.h>
37#endif
38
39using namespace llvm;
40
41//===----------------------------------------------------------------------===//
42// MemoryBuffer implementation itself.
43//===----------------------------------------------------------------------===//
44
46
47/// init - Initialize this MemoryBuffer as a reference to externally allocated
48/// memory, memory that we know is already null terminated.
49void MemoryBuffer::init(const char *BufStart, const char *BufEnd,
50 bool RequiresNullTerminator) {
51 assert((!RequiresNullTerminator || BufEnd[0] == 0) &&
52 "Buffer is not null terminated!");
53 BufferStart = BufStart;
54 BufferEnd = BufEnd;
55}
56
57//===----------------------------------------------------------------------===//
58// MemoryBufferMem implementation.
59//===----------------------------------------------------------------------===//
60
61/// CopyStringRef - Copies contents of a StringRef into a block of memory and
62/// null-terminates it.
63static void CopyStringRef(char *Memory, StringRef Data) {
64 if (!Data.empty())
65 memcpy(Memory, Data.data(), Data.size());
66 Memory[Data.size()] = 0; // Null terminate string.
67}
68
69namespace {
70struct NamedBufferAlloc {
71 const Twine &Name;
72 NamedBufferAlloc(const Twine &Name) : Name(Name) {}
73};
74} // namespace
75
76void *operator new(size_t N, const NamedBufferAlloc &Alloc) {
77 SmallString<256> NameBuf;
78 StringRef NameRef = Alloc.Name.toStringRef(NameBuf);
79
80 // We use malloc() and manually handle it returning null instead of calling
81 // operator new because we need all uses of NamedBufferAlloc to be
82 // deallocated with a call to free() due to needing to use malloc() in
83 // WritableMemoryBuffer::getNewUninitMemBuffer() to work around the out-of-
84 // memory handler installed by default in LLVM. See operator delete() member
85 // functions within this file for the paired call to free().
86 char *Mem =
87 static_cast<char *>(std::malloc(N + sizeof(size_t) + NameRef.size() + 1));
88 if (!Mem)
89 llvm::report_bad_alloc_error("Allocation failed");
90 *reinterpret_cast<size_t *>(Mem + N) = NameRef.size();
91 CopyStringRef(Mem + N + sizeof(size_t), NameRef);
92 return Mem;
93}
94
95namespace {
96/// MemoryBufferMem - Named MemoryBuffer pointing to a block of memory.
97template<typename MB>
98class MemoryBufferMem : public MB {
99public:
100 MemoryBufferMem(StringRef InputData, bool RequiresNullTerminator) {
101 MemoryBuffer::init(InputData.begin(), InputData.end(),
102 RequiresNullTerminator);
103 }
104
105 /// Disable sized deallocation for MemoryBufferMem, because it has
106 /// tail-allocated data.
107 void operator delete(void *p) { std::free(p); }
108
109 StringRef getBufferIdentifier() const override {
110 // The name is stored after the class itself.
111 return StringRef(reinterpret_cast<const char *>(this + 1) + sizeof(size_t),
112 *reinterpret_cast<const size_t *>(this + 1));
113 }
114
115 MemoryBuffer::BufferKind getBufferKind() const override {
117 }
118};
119} // namespace
120
121template <typename MB>
123getFileAux(const Twine &Filename, uint64_t MapSize, uint64_t Offset,
124 bool IsText, bool RequiresNullTerminator, bool IsVolatile,
125 std::optional<Align> Alignment);
126
127std::unique_ptr<MemoryBuffer>
129 bool RequiresNullTerminator) {
130 auto *Ret = new (NamedBufferAlloc(BufferName))
131 MemoryBufferMem<MemoryBuffer>(InputData, RequiresNullTerminator);
132 return std::unique_ptr<MemoryBuffer>(Ret);
133}
134
135std::unique_ptr<MemoryBuffer>
136MemoryBuffer::getMemBuffer(MemoryBufferRef Ref, bool RequiresNullTerminator) {
137 return std::unique_ptr<MemoryBuffer>(getMemBuffer(
138 Ref.getBuffer(), Ref.getBufferIdentifier(), RequiresNullTerminator));
139}
140
142getMemBufferCopyImpl(StringRef InputData, const Twine &BufferName) {
143 auto Buf =
144 WritableMemoryBuffer::getNewUninitMemBuffer(InputData.size(), BufferName);
145 if (!Buf)
147 // Calling memcpy with null src/dst is UB, and an empty StringRef is
148 // represented with {nullptr, 0}.
149 llvm::copy(InputData, Buf->getBufferStart());
150 return std::move(Buf);
151}
152
153std::unique_ptr<MemoryBuffer>
154MemoryBuffer::getMemBufferCopy(StringRef InputData, const Twine &BufferName) {
155 auto Buf = getMemBufferCopyImpl(InputData, BufferName);
156 if (Buf)
157 return std::move(*Buf);
158 return nullptr;
159}
160
162MemoryBuffer::getFileOrSTDIN(const Twine &Filename, bool IsText,
163 bool RequiresNullTerminator,
164 std::optional<Align> Alignment) {
166
167 SmallString<256> NameBuf;
168 StringRef NameRef = Filename.toStringRef(NameBuf);
169
170 if (NameRef == "-")
171 return getSTDIN();
172 return getFile(Filename, IsText, RequiresNullTerminator,
173 /*IsVolatile=*/false, Alignment);
174}
175
178 uint64_t Offset, bool IsVolatile,
179 std::optional<Align> Alignment) {
181
182 return getFileAux<MemoryBuffer>(FilePath, MapSize, Offset, /*IsText=*/false,
183 /*RequiresNullTerminator=*/false, IsVolatile,
184 Alignment);
185}
186
187//===----------------------------------------------------------------------===//
188// MemoryBuffer::getFile implementation.
189//===----------------------------------------------------------------------===//
190
191namespace {
192
193template <typename MB>
194constexpr sys::fs::mapped_file_region::mapmode Mapmode =
196template <>
197constexpr sys::fs::mapped_file_region::mapmode Mapmode<MemoryBuffer> =
199template <>
200constexpr sys::fs::mapped_file_region::mapmode Mapmode<WritableMemoryBuffer> =
202template <>
204 Mapmode<WriteThroughMemoryBuffer> = sys::fs::mapped_file_region::readwrite;
205
206/// Memory maps a file descriptor using sys::fs::mapped_file_region.
207///
208/// This handles converting the offset into a legal offset on the platform.
209template<typename MB>
210class MemoryBufferMMapFile : public MB {
212
213 static uint64_t getLegalMapOffset(uint64_t Offset) {
215 }
216
217 static uint64_t getLegalMapSize(uint64_t Len, uint64_t Offset) {
218 return Len + (Offset - getLegalMapOffset(Offset));
219 }
220
221 const char *getStart(uint64_t Len, uint64_t Offset) {
222 return MFR.const_data() + (Offset - getLegalMapOffset(Offset));
223 }
224
225public:
226 MemoryBufferMMapFile(bool RequiresNullTerminator, sys::fs::file_t FD, uint64_t Len,
227 uint64_t Offset, std::error_code &EC)
228 : MFR(FD, Mapmode<MB>, getLegalMapSize(Len, Offset),
229 getLegalMapOffset(Offset), EC) {
230 if (!EC) {
231 const char *Start = getStart(Len, Offset);
232 MemoryBuffer::init(Start, Start + Len, RequiresNullTerminator);
233 }
234 }
235
236 /// Disable sized deallocation for MemoryBufferMMapFile, because it has
237 /// tail-allocated data.
238 void operator delete(void *p) { std::free(p); }
239
240 StringRef getBufferIdentifier() const override {
241 // The name is stored after the class itself.
242 return StringRef(reinterpret_cast<const char *>(this + 1) + sizeof(size_t),
243 *reinterpret_cast<const size_t *>(this + 1));
244 }
245
246 MemoryBuffer::BufferKind getBufferKind() const override {
248 }
249
250 void dontNeedIfMmap() override { MFR.dontNeed(); }
251 void willNeedIfMmap() override { MFR.willNeed(); }
252};
253} // namespace
254
258 if (Error E = sys::fs::readNativeFileToEOF(FD, Buffer))
259 return errorToErrorCode(std::move(E));
260 return getMemBufferCopyImpl(Buffer, BufferName);
261}
262
264MemoryBuffer::getFile(const Twine &Filename, bool IsText,
265 bool RequiresNullTerminator, bool IsVolatile,
266 std::optional<Align> Alignment) {
268
269 return getFileAux<MemoryBuffer>(Filename, /*MapSize=*/-1, /*Offset=*/0,
270 IsText, RequiresNullTerminator, IsVolatile,
271 Alignment);
272}
273
274template <typename MB>
276getOpenFileImpl(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize,
277 uint64_t MapSize, int64_t Offset, bool RequiresNullTerminator,
278 bool IsVolatile, std::optional<Align> Alignment);
279
280template <typename MB>
282getFileAux(const Twine &Filename, uint64_t MapSize, uint64_t Offset,
283 bool IsText, bool RequiresNullTerminator, bool IsVolatile,
284 std::optional<Align> Alignment) {
286 Filename, IsText ? sys::fs::OF_TextWithCRLF : sys::fs::OF_None);
287 if (!FDOrErr)
288 return errorToErrorCode(FDOrErr.takeError());
289 sys::fs::file_t FD = *FDOrErr;
290 auto Ret = getOpenFileImpl<MB>(FD, Filename, /*FileSize=*/-1, MapSize, Offset,
291 RequiresNullTerminator, IsVolatile, Alignment);
293 return Ret;
294}
295
297WritableMemoryBuffer::getFile(const Twine &Filename, bool IsVolatile,
298 std::optional<Align> Alignment) {
300
302 Filename, /*MapSize=*/-1, /*Offset=*/0, /*IsText=*/false,
303 /*RequiresNullTerminator=*/false, IsVolatile, Alignment);
304}
305
308 uint64_t Offset, bool IsVolatile,
309 std::optional<Align> Alignment) {
311
313 Filename, MapSize, Offset, /*IsText=*/false,
314 /*RequiresNullTerminator=*/false, IsVolatile, Alignment);
315}
316
317std::unique_ptr<WritableMemoryBuffer>
319 const Twine &BufferName,
320 std::optional<Align> Alignment) {
321 using MemBuffer = MemoryBufferMem<WritableMemoryBuffer>;
322
323 // Use 16-byte alignment if no alignment is specified.
324 Align BufAlign = Alignment.value_or(Align(16));
325
326 // Allocate space for the MemoryBuffer, the data and the name. It is important
327 // that MemoryBuffer and data are aligned so PointerIntPair works with them.
328 SmallString<256> NameBuf;
329 StringRef NameRef = BufferName.toStringRef(NameBuf);
330
331 size_t StringLen = sizeof(MemBuffer) + sizeof(size_t) + NameRef.size() + 1;
332 size_t RealLen = StringLen + Size + 1 + BufAlign.value();
333 if (RealLen <= Size) // Check for rollover.
334 return nullptr;
335 // We use a call to malloc() rather than a call to a non-throwing operator
336 // new() because LLVM unconditionally installs an out of memory new handler
337 // when exceptions are disabled. This new handler intentionally crashes to
338 // aid with debugging, but that makes non-throwing new calls unhelpful.
339 // See MemoryBufferMem::operator delete() for the paired call to free(), and
340 // llvm::install_out_of_memory_new_handler() for the installation of the
341 // custom new handler.
342 char *Mem = static_cast<char *>(std::malloc(RealLen));
343 if (!Mem)
344 return nullptr;
345
346 // The name is stored after the class itself.
347 *reinterpret_cast<size_t *>(Mem + sizeof(MemBuffer)) = NameRef.size();
348 CopyStringRef(Mem + sizeof(MemBuffer) + sizeof(size_t), NameRef);
349
350 // The buffer begins after the name and must be aligned.
351 char *Buf = (char *)alignAddr(Mem + StringLen, BufAlign);
352 Buf[Size] = 0; // Null terminate buffer.
353
354 auto *Ret = new (Mem) MemBuffer(StringRef(Buf, Size), true);
355 return std::unique_ptr<WritableMemoryBuffer>(Ret);
356}
357
358std::unique_ptr<WritableMemoryBuffer>
361 if (!SB)
362 return nullptr;
363 memset(SB->getBufferStart(), 0, Size);
364 return SB;
365}
366
368 size_t FileSize,
369 size_t MapSize,
370 off_t Offset,
371 bool RequiresNullTerminator,
372 int PageSize,
373 bool IsVolatile) {
374#if defined(__MVS__)
375 // zOS Enhanced ASCII auto convert does not support mmap.
376 return false;
377#endif
378
379 // mmap may leave the buffer without null terminator if the file size changed
380 // by the time the last page is mapped in, so avoid it if the file size is
381 // likely to change.
382 if (IsVolatile && RequiresNullTerminator)
383 return false;
384
385 // We don't use mmap for small files because this can severely fragment our
386 // address space.
387 if (MapSize < 4 * 4096 || MapSize < (unsigned)PageSize)
388 return false;
389
390 if (!RequiresNullTerminator)
391 return true;
392
393 // If we don't know the file size, use fstat to find out. fstat on an open
394 // file descriptor is cheaper than stat on a random path.
395 // FIXME: this chunk of code is duplicated, but it avoids a fstat when
396 // RequiresNullTerminator = false and MapSize != -1.
397 if (FileSize == size_t(-1)) {
399 if (sys::fs::status(FD, Status))
400 return false;
401 FileSize = Status.getSize();
402 }
403
404 // If we need a null terminator and the end of the map is inside the file,
405 // we cannot use mmap.
406 size_t End = Offset + MapSize;
407 assert(End <= FileSize);
408 if (End != FileSize)
409 return false;
410
411 // Don't try to map files that are exactly a multiple of the system page size
412 // if we need a null terminator.
413 if ((FileSize & (PageSize -1)) == 0)
414 return false;
415
416#if defined(__CYGWIN__)
417 // Don't try to map files that are exactly a multiple of the physical page size
418 // if we need a null terminator.
419 // FIXME: We should reorganize again getPageSize() on Win32.
420 if ((FileSize & (4096 - 1)) == 0)
421 return false;
422#endif
423
424 return true;
425}
426
428getReadWriteFile(const Twine &Filename, uint64_t FileSize, uint64_t MapSize,
432 if (!FDOrErr)
433 return errorToErrorCode(FDOrErr.takeError());
434 sys::fs::file_t FD = *FDOrErr;
435
436 // Default is to map the full file.
437 if (MapSize == uint64_t(-1)) {
438 // If we don't know the file size, use fstat to find out. fstat on an open
439 // file descriptor is cheaper than stat on a random path.
440 if (FileSize == uint64_t(-1)) {
442 std::error_code EC = sys::fs::status(FD, Status);
443 if (EC)
444 return EC;
445
446 // If this not a file or a block device (e.g. it's a named pipe
447 // or character device), we can't mmap it, so error out.
452
453 FileSize = Status.getSize();
454 }
455 MapSize = FileSize;
456 }
457
458 std::error_code EC;
459 std::unique_ptr<WriteThroughMemoryBuffer> Result(
460 new (NamedBufferAlloc(Filename))
461 MemoryBufferMMapFile<WriteThroughMemoryBuffer>(false, FD, MapSize,
462 Offset, EC));
463 if (EC)
464 return EC;
465 return std::move(Result);
466}
467
469WriteThroughMemoryBuffer::getFile(const Twine &Filename, int64_t FileSize) {
471
472 return getReadWriteFile(Filename, FileSize, FileSize, 0);
473}
474
475/// Map a subrange of the specified file as a WritableMemoryBuffer.
480
481 return getReadWriteFile(Filename, -1, MapSize, Offset);
482}
483
484template <typename MB>
486getOpenFileImpl(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize,
487 uint64_t MapSize, int64_t Offset, bool RequiresNullTerminator,
488 bool IsVolatile, std::optional<Align> Alignment) {
490
491 // Default is to map the full file.
492 if (MapSize == uint64_t(-1)) {
493 // If we don't know the file size, use fstat to find out. fstat on an open
494 // file descriptor is cheaper than stat on a random path.
495 if (FileSize == uint64_t(-1)) {
497 std::error_code EC = sys::fs::status(FD, Status);
498 if (EC)
499 return EC;
500
501 // If this not a file or a block device (e.g. it's a named pipe
502 // or character device), we can't trust the size. Create the memory
503 // buffer by copying off the stream.
507 return getMemoryBufferForStream(FD, Filename);
508
509 FileSize = Status.getSize();
510 }
511 MapSize = FileSize;
512 }
513
514 if (shouldUseMmap(FD, FileSize, MapSize, Offset, RequiresNullTerminator,
515 PageSize, IsVolatile)) {
516 std::error_code EC;
517 std::unique_ptr<MB> Result(
518 new (NamedBufferAlloc(Filename)) MemoryBufferMMapFile<MB>(
519 RequiresNullTerminator, FD, MapSize, Offset, EC));
520 if (!EC) {
521 // On at least Linux, and possibly on other systems, mmap may return pages
522 // from the page cache that are not properly filled with trailing zeroes,
523 // if some prior user of the page wrote non-zero bytes. Detect this and
524 // don't use mmap in that case.
525 if (!RequiresNullTerminator || *Result->getBufferEnd() == '\0')
526 return std::move(Result);
527 }
528 }
529
530#ifdef __MVS__
531 ErrorOr<bool> NeedsConversion = needConversion(Filename, FD);
532 if (std::error_code EC = NeedsConversion.getError())
533 return EC;
534 // File size may increase due to EBCDIC -> UTF-8 conversion, therefore we
535 // cannot trust the file size and we create the memory buffer by copying
536 // off the stream.
537 // Note: This only works with the assumption of reading a full file (i.e,
538 // Offset == 0 and MapSize == FileSize). Reading a file slice does not work.
539 if (*NeedsConversion && Offset == 0 && MapSize == FileSize)
540 return getMemoryBufferForStream(FD, Filename);
541#endif
542
543 auto Buf =
544 WritableMemoryBuffer::getNewUninitMemBuffer(MapSize, Filename, Alignment);
545 if (!Buf) {
546 // Failed to create a buffer. The only way it can fail is if
547 // new(std::nothrow) returns 0.
549 }
550
551 // Read until EOF, zero-initialize the rest.
552 MutableArrayRef<char> ToRead = Buf->getBuffer();
553 while (!ToRead.empty()) {
554 Expected<size_t> ReadBytes =
556 if (!ReadBytes)
557 return errorToErrorCode(ReadBytes.takeError());
558 if (*ReadBytes == 0) {
559 std::memset(ToRead.data(), 0, ToRead.size());
560 break;
561 }
562 ToRead = ToRead.drop_front(*ReadBytes);
563 Offset += *ReadBytes;
564 }
565
566 return std::move(Buf);
567}
568
571 uint64_t FileSize, bool RequiresNullTerminator,
572 bool IsVolatile, std::optional<Align> Alignment) {
574
575 return getOpenFileImpl<MemoryBuffer>(FD, Filename, FileSize, FileSize, 0,
576 RequiresNullTerminator, IsVolatile,
577 Alignment);
578}
579
581 sys::fs::file_t FD, const Twine &Filename, uint64_t MapSize, int64_t Offset,
582 bool IsVolatile, std::optional<Align> Alignment) {
583 assert(MapSize != uint64_t(-1));
584
586
587 return getOpenFileImpl<MemoryBuffer>(FD, Filename, -1, MapSize, Offset, false,
588 IsVolatile, Alignment);
589}
590
593
594 // Read in all of the data from stdin, we cannot mmap stdin.
595 //
596 // FIXME: That isn't necessarily true, we should try to mmap stdin and
597 // fallback if it fails.
599
601}
602
606
609 if (!FDOrErr)
610 return errorToErrorCode(FDOrErr.takeError());
611 sys::fs::file_t FD = *FDOrErr;
613 getMemoryBufferForStream(FD, Filename);
615 return Ret;
616}
617
620 StringRef Identifier = getBufferIdentifier();
621 return MemoryBufferRef(Data, Identifier);
622}
623
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Prepare AGPR Alloc
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static cl::opt< int > PageSize("imp-null-check-page-size", cl::desc("The page size of the target in bytes"), cl::init(4096), cl::Hidden)
static bool shouldUseMmap(sys::fs::file_t FD, size_t FileSize, size_t MapSize, off_t Offset, bool RequiresNullTerminator, int PageSize, bool IsVolatile)
static ErrorOr< std::unique_ptr< MB > > getFileAux(const Twine &Filename, uint64_t MapSize, uint64_t Offset, bool IsText, bool RequiresNullTerminator, bool IsVolatile, std::optional< Align > Alignment)
static ErrorOr< std::unique_ptr< WriteThroughMemoryBuffer > > getReadWriteFile(const Twine &Filename, uint64_t FileSize, uint64_t MapSize, uint64_t Offset)
static ErrorOr< std::unique_ptr< MB > > getOpenFileImpl(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize, uint64_t MapSize, int64_t Offset, bool RequiresNullTerminator, bool IsVolatile, std::optional< Align > Alignment)
static ErrorOr< std::unique_ptr< WritableMemoryBuffer > > getMemBufferCopyImpl(StringRef InputData, const Twine &BufferName)
static void CopyStringRef(char *Memory, StringRef Data)
CopyStringRef - Copies contents of a StringRef into a block of memory and null-terminates it.
static ErrorOr< std::unique_ptr< WritableMemoryBuffer > > getMemoryBufferForStream(sys::fs::file_t FD, const Twine &BufferName)
Provides a library for accessing information about this process and other processes on the operating ...
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallString class.
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
Represents either an error or a value T.
Definition ErrorOr.h:56
std::error_code getError() const
Definition ErrorOr.h:152
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Tagged union holding either a T or a Error.
Definition Error.h:485
Error takeError()
Take ownership of the stored error.
Definition Error.h:612
static ErrorOr< std::unique_ptr< MemoryBuffer > > getOpenFile(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Given an already-open file descriptor, read the file and return a MemoryBuffer.
static std::unique_ptr< MemoryBuffer > getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
Open the specified memory range as a MemoryBuffer.
BufferKind
The kind of memory backing used to support the MemoryBuffer.
virtual StringRef getBufferIdentifier() const
Return an identifier for this buffer, typically the filename it was read from.
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.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getOpenFileSlice(sys::fs::file_t FD, const Twine &Filename, uint64_t MapSize, int64_t Offset, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Given an already-open file descriptor, map some slice of it into a MemoryBuffer.
void init(const char *BufStart, const char *BufEnd, bool RequiresNullTerminator)
init - Initialize this MemoryBuffer as a reference to externally allocated memory,...
StringRef getBuffer() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileAsStream(const Twine &Filename)
Read all of the specified file into a MemoryBuffer as a stream (i.e.
MemoryBufferRef getMemBufferRef() const
virtual ~MemoryBuffer()
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Map a subrange of the specified file as a MemoryBuffer.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
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:298
MutableArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition ArrayRef.h:387
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
iterator begin() const
Definition StringRef.h:112
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
iterator end() const
Definition StringRef.h:114
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
Definition Twine.h:461
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI std::unique_ptr< WritableMemoryBuffer > getNewMemBuffer(size_t Size, const Twine &BufferName="")
Allocate a new zero-initialized MemoryBuffer of the specified size.
static LLVM_ABI ErrorOr< std::unique_ptr< WritableMemoryBuffer > > getFile(const Twine &Filename, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
static LLVM_ABI std::unique_ptr< WritableMemoryBuffer > getNewUninitMemBuffer(size_t Size, const Twine &BufferName="", std::optional< Align > Alignment=std::nullopt)
Allocate a new MemoryBuffer of the specified size that is not initialized.
static LLVM_ABI ErrorOr< std::unique_ptr< WritableMemoryBuffer > > getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Map a subrange of the specified file as a WritableMemoryBuffer.
static LLVM_ABI ErrorOr< std::unique_ptr< WriteThroughMemoryBuffer > > getFile(const Twine &Filename, int64_t FileSize=-1)
static LLVM_ABI ErrorOr< std::unique_ptr< WriteThroughMemoryBuffer > > getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset)
Map a subrange of the specified file as a ReadWriteMemoryBuffer.
This class provides various memory handling functions that manipulate MemoryBlock instances.
Definition Memory.h:54
static unsigned getPageSizeEstimate()
Get the process's estimated page size.
Definition Process.h:62
Represents the result of a call to sys::fs::status().
Definition FileSystem.h:222
This class represents a memory mapped file.
static LLVM_ABI int alignment()
@ priv
May modify via data, but changes are lost on destruction.
@ readonly
May only access map via const_data as read only.
@ readwrite
May access map via data and modify it. Written to path.
LLVM_ABI const char * const_data() const
Get a const view of the data.
Definition Path.cpp:1192
LLVM_ABI std::error_code closeFile(file_t &F)
Close the file object.
LLVM_ABI Error readNativeFileToEOF(file_t FileHandle, SmallVectorImpl< char > &Buffer, ssize_t ChunkSize=DefaultReadChunkSize)
Reads from FileHandle until EOF, appending to Buffer in chunks of size ChunkSize.
Definition Path.cpp:1197
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition FileSystem.h:755
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
Definition FileSystem.h:764
file_type
An enumeration for the file system's view of the type.
Definition FileSystem.h:62
@ CD_OpenExisting
CD_OpenExisting - When opening a file:
Definition FileSystem.h:737
LLVM_ABI Expected< size_t > readNativeFileSlice(file_t FileHandle, MutableArrayRef< char > Buf, uint64_t Offset)
Reads Buf.size() bytes from FileHandle at offset Offset into Buf.
Expected< file_t > openNativeFileForReadWrite(const Twine &Name, CreationDisposition Disp, OpenFlags Flags, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
LLVM_ABI Expected< file_t > openNativeFileForRead(const Twine &Name, OpenFlags Flags=OF_None, SmallVectorImpl< char > *RealPath=nullptr)
Opens the file with the given name in a read-only mode, returning its open file descriptor.
LLVM_ABI std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
LLVM_ABI file_t getStdinHandle()
Return an open handle to standard in.
void violationIfEnabled()
Definition IOSandbox.h:37
LLVM_ABI std::error_code ChangeStdinMode(fs::OpenFlags Flags)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
std::error_code make_error_code(BitcodeError E)
@ not_enough_memory
Definition Errc.h:68
@ invalid_argument
Definition Errc.h:56
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1883
LLVM_ABI std::error_code errorToErrorCode(Error Err)
Helper for converting an ECError to a std::error_code.
Definition Error.cpp:117
LLVM_ABI void report_bad_alloc_error(const char *Reason, bool GenCrashDiag=true)
Reports a bad alloc error, calling any user defined bad alloc error handler.
uintptr_t alignAddr(const void *Addr, Align Alignment)
Aligns Addr to Alignment bytes, rounding up.
Definition Alignment.h:176
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77