File indexing completed on 2026-05-10 08:44:32
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_SUPPORT_MEMORYBUFFER_H
0014 #define LLVM_SUPPORT_MEMORYBUFFER_H
0015
0016 #include "llvm-c/Types.h"
0017 #include "llvm/ADT/ArrayRef.h"
0018 #include "llvm/ADT/StringRef.h"
0019 #include "llvm/ADT/Twine.h"
0020 #include "llvm/Support/Alignment.h"
0021 #include "llvm/Support/CBindingWrapping.h"
0022 #include "llvm/Support/ErrorOr.h"
0023 #include "llvm/Support/MemoryBufferRef.h"
0024 #include <cstddef>
0025 #include <cstdint>
0026 #include <memory>
0027
0028 namespace llvm {
0029 namespace sys {
0030 namespace fs {
0031
0032 #if defined(_WIN32)
0033
0034 using file_t = void *;
0035 #else
0036 using file_t = int;
0037 #endif
0038 }
0039 }
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 class MemoryBuffer {
0052 const char *BufferStart;
0053 const char *BufferEnd;
0054
0055 protected:
0056 MemoryBuffer() = default;
0057
0058 void init(const char *BufStart, const char *BufEnd,
0059 bool RequiresNullTerminator);
0060
0061 public:
0062 MemoryBuffer(const MemoryBuffer &) = delete;
0063 MemoryBuffer &operator=(const MemoryBuffer &) = delete;
0064 virtual ~MemoryBuffer();
0065
0066 const char *getBufferStart() const { return BufferStart; }
0067 const char *getBufferEnd() const { return BufferEnd; }
0068 size_t getBufferSize() const { return BufferEnd-BufferStart; }
0069
0070 StringRef getBuffer() const {
0071 return StringRef(BufferStart, getBufferSize());
0072 }
0073
0074
0075
0076 virtual StringRef getBufferIdentifier() const { return "Unknown buffer"; }
0077
0078
0079
0080
0081
0082
0083 virtual void dontNeedIfMmap() {}
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 static ErrorOr<std::unique_ptr<MemoryBuffer>>
0098 getFile(const Twine &Filename, bool IsText = false,
0099 bool RequiresNullTerminator = true, bool IsVolatile = false,
0100 std::optional<Align> Alignment = std::nullopt);
0101
0102
0103
0104
0105 static ErrorOr<std::unique_ptr<MemoryBuffer>>
0106 getFileAsStream(const Twine &Filename);
0107
0108
0109
0110
0111 static ErrorOr<std::unique_ptr<MemoryBuffer>>
0112 getOpenFileSlice(sys::fs::file_t FD, const Twine &Filename, uint64_t MapSize,
0113 int64_t Offset, bool IsVolatile = false,
0114 std::optional<Align> Alignment = std::nullopt);
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125 static ErrorOr<std::unique_ptr<MemoryBuffer>>
0126 getOpenFile(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize,
0127 bool RequiresNullTerminator = true, bool IsVolatile = false,
0128 std::optional<Align> Alignment = std::nullopt);
0129
0130
0131
0132 static std::unique_ptr<MemoryBuffer>
0133 getMemBuffer(StringRef InputData, StringRef BufferName = "",
0134 bool RequiresNullTerminator = true);
0135
0136 static std::unique_ptr<MemoryBuffer>
0137 getMemBuffer(MemoryBufferRef Ref, bool RequiresNullTerminator = true);
0138
0139
0140
0141 static std::unique_ptr<MemoryBuffer>
0142 getMemBufferCopy(StringRef InputData, const Twine &BufferName = "");
0143
0144
0145 static ErrorOr<std::unique_ptr<MemoryBuffer>> getSTDIN();
0146
0147
0148
0149 static ErrorOr<std::unique_ptr<MemoryBuffer>>
0150 getFileOrSTDIN(const Twine &Filename, bool IsText = false,
0151 bool RequiresNullTerminator = true,
0152 std::optional<Align> Alignment = std::nullopt);
0153
0154
0155 static ErrorOr<std::unique_ptr<MemoryBuffer>>
0156 getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset,
0157 bool IsVolatile = false,
0158 std::optional<Align> Alignment = std::nullopt);
0159
0160
0161
0162
0163
0164
0165 enum BufferKind {
0166 MemoryBuffer_Malloc,
0167 MemoryBuffer_MMap
0168 };
0169
0170
0171
0172 virtual BufferKind getBufferKind() const = 0;
0173
0174 MemoryBufferRef getMemBufferRef() const;
0175 };
0176
0177
0178
0179
0180
0181 class WritableMemoryBuffer : public MemoryBuffer {
0182 protected:
0183 WritableMemoryBuffer() = default;
0184
0185 public:
0186 using MemoryBuffer::getBuffer;
0187 using MemoryBuffer::getBufferEnd;
0188 using MemoryBuffer::getBufferStart;
0189
0190
0191
0192 char *getBufferStart() {
0193 return const_cast<char *>(MemoryBuffer::getBufferStart());
0194 }
0195 char *getBufferEnd() {
0196 return const_cast<char *>(MemoryBuffer::getBufferEnd());
0197 }
0198 MutableArrayRef<char> getBuffer() {
0199 return {getBufferStart(), getBufferEnd()};
0200 }
0201
0202 static ErrorOr<std::unique_ptr<WritableMemoryBuffer>>
0203 getFile(const Twine &Filename, bool IsVolatile = false,
0204 std::optional<Align> Alignment = std::nullopt);
0205
0206
0207 static ErrorOr<std::unique_ptr<WritableMemoryBuffer>>
0208 getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset,
0209 bool IsVolatile = false,
0210 std::optional<Align> Alignment = std::nullopt);
0211
0212
0213
0214
0215
0216
0217
0218 static std::unique_ptr<WritableMemoryBuffer>
0219 getNewUninitMemBuffer(size_t Size, const Twine &BufferName = "",
0220 std::optional<Align> Alignment = std::nullopt);
0221
0222
0223
0224
0225 static std::unique_ptr<WritableMemoryBuffer>
0226 getNewMemBuffer(size_t Size, const Twine &BufferName = "");
0227
0228 private:
0229
0230
0231
0232 using MemoryBuffer::getFileAsStream;
0233 using MemoryBuffer::getFileOrSTDIN;
0234 using MemoryBuffer::getMemBuffer;
0235 using MemoryBuffer::getMemBufferCopy;
0236 using MemoryBuffer::getOpenFile;
0237 using MemoryBuffer::getOpenFileSlice;
0238 using MemoryBuffer::getSTDIN;
0239 };
0240
0241
0242
0243
0244
0245 class WriteThroughMemoryBuffer : public MemoryBuffer {
0246 protected:
0247 WriteThroughMemoryBuffer() = default;
0248
0249 public:
0250 using MemoryBuffer::getBuffer;
0251 using MemoryBuffer::getBufferEnd;
0252 using MemoryBuffer::getBufferStart;
0253
0254
0255
0256 char *getBufferStart() {
0257 return const_cast<char *>(MemoryBuffer::getBufferStart());
0258 }
0259 char *getBufferEnd() {
0260 return const_cast<char *>(MemoryBuffer::getBufferEnd());
0261 }
0262 MutableArrayRef<char> getBuffer() {
0263 return {getBufferStart(), getBufferEnd()};
0264 }
0265
0266 static ErrorOr<std::unique_ptr<WriteThroughMemoryBuffer>>
0267 getFile(const Twine &Filename, int64_t FileSize = -1);
0268
0269
0270 static ErrorOr<std::unique_ptr<WriteThroughMemoryBuffer>>
0271 getFileSlice(const Twine &Filename, uint64_t MapSize, uint64_t Offset);
0272
0273 private:
0274
0275
0276
0277 using MemoryBuffer::getFileAsStream;
0278 using MemoryBuffer::getFileOrSTDIN;
0279 using MemoryBuffer::getMemBuffer;
0280 using MemoryBuffer::getMemBufferCopy;
0281 using MemoryBuffer::getOpenFile;
0282 using MemoryBuffer::getOpenFileSlice;
0283 using MemoryBuffer::getSTDIN;
0284 };
0285
0286
0287 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef)
0288
0289 }
0290
0291 #endif