1333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner//===--- MemoryBuffer.h - Memory Buffer Interface ---------------*- C++ -*-===// 2333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner// 3333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner// The LLVM Compiler Infrastructure 4333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner// 8333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner//===----------------------------------------------------------------------===// 9333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner// 10333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner// This file defines the MemoryBuffer interface. 11333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner// 12333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner//===----------------------------------------------------------------------===// 13333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 14333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner#ifndef LLVM_SUPPORT_MEMORYBUFFER_H 15333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner#define LLVM_SUPPORT_MEMORYBUFFER_H 16333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm-c/Support.h" 1876a74f72534452b53ba3ba054bd8ab27efc48487Rafael Espindola#include "llvm/ADT/Twine.h" 1940be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/Support/CBindingWrapping.h" 20f630e49efc7bf3f1716b6daab3c2cc11a908754aCraig Topper#include "llvm/Support/Compiler.h" 211f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/ErrorOr.h" 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <memory> 24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <system_error> 25333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 26333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnernamespace llvm { 27333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// MemoryBuffer - This interface provides simple read-only access to a block 28333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// of memory, and provides simple methods for reading files and standard input 29333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// into a memory buffer. In addition to basic access to the characters in the 30333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// file, this interface guarantees you can read one character past the end of 31f605773869d1489dcfb10c47f99ada9fe4908b45Jeffrey Yasskin/// the file, and that this character will read as '\0'. 3230f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// 3330f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// The '\0' guarantee is needed to support an optimization -- it's intended to 3430f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// be more efficient for clients which are reading all the data to stop 3530f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// reading when they encounter a '\0' than to continually check the file 3630f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// position to see if it has reached the end of the file. 37333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerclass MemoryBuffer { 38333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *BufferStart; // Start of the buffer. 39333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *BufferEnd; // End of the buffer. 40333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 41f630e49efc7bf3f1716b6daab3c2cc11a908754aCraig Topper MemoryBuffer(const MemoryBuffer &) LLVM_DELETED_FUNCTION; 42f630e49efc7bf3f1716b6daab3c2cc11a908754aCraig Topper MemoryBuffer &operator=(const MemoryBuffer &) LLVM_DELETED_FUNCTION; 43333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerprotected: 44d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer MemoryBuffer() {} 45f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola void init(const char *BufStart, const char *BufEnd, 46f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola bool RequiresNullTerminator); 47333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerpublic: 48333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner virtual ~MemoryBuffer(); 49fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 50333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *getBufferStart() const { return BufferStart; } 51333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *getBufferEnd() const { return BufferEnd; } 5234cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng size_t getBufferSize() const { return BufferEnd-BufferStart; } 53fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 54333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer StringRef getBuffer() const { 55333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer return StringRef(BufferStart, getBufferSize()); 561464869cb325e30673005a16accaf47da8b6ba1bDaniel Dunbar } 571464869cb325e30673005a16accaf47da8b6ba1bDaniel Dunbar 58333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getBufferIdentifier - Return an identifier for this buffer, typically the 59333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// filename it was read from. 60333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner virtual const char *getBufferIdentifier() const { 61333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner return "Unknown buffer"; 62333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner } 63333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Open the specified file as a MemoryBuffer, returning a new MemoryBuffer 65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// if successful, otherwise returning null. If FileSize is specified, this 66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// means that the client knows that the file exists and that it has the 67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// specified size. 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \param IsVolatileSize Set to true to indicate that the file size may be 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// changing, e.g. when libclang tries to parse while the user is 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// editing/updating the file. 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static ErrorOr<std::unique_ptr<MemoryBuffer>> 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getFile(Twine Filename, int64_t FileSize = -1, 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool RequiresNullTerminator = true, bool IsVolatileSize = false); 75333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 7625c6cec2a29f7f835d559865cecb18621a0d61deEli Bendersky /// Given an already-open file descriptor, map some slice of it into a 7725c6cec2a29f7f835d559865cecb18621a0d61deEli Bendersky /// MemoryBuffer. The slice is specified by an \p Offset and \p MapSize. 7825c6cec2a29f7f835d559865cecb18621a0d61deEli Bendersky /// Since this is in the middle of a file, the buffer is not null terminated. 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \param IsVolatileSize Set to true to indicate that the file size may be 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// changing, e.g. when libclang tries to parse while the user is 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// editing/updating the file. 83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static ErrorOr<std::unique_ptr<MemoryBuffer>> 84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getOpenFileSlice(int FD, const char *Filename, uint64_t MapSize, 85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines int64_t Offset, bool IsVolatileSize = false); 8670c7e485453fdbc228406715556f9447bc9f9fd8Rafael Espindola 8770c7e485453fdbc228406715556f9447bc9f9fd8Rafael Espindola /// Given an already-open file descriptor, read the file and return a 8870c7e485453fdbc228406715556f9447bc9f9fd8Rafael Espindola /// MemoryBuffer. 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \param IsVolatileSize Set to true to indicate that the file size may be 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// changing, e.g. when libclang tries to parse while the user is 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// editing/updating the file. 93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static ErrorOr<std::unique_ptr<MemoryBuffer>> 94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getOpenFile(int FD, const char *Filename, uint64_t FileSize, 95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool RequiresNullTerminator = true, bool IsVolatileSize = false); 96333ad3f2bf2941618f8e1563da022da011e615c0Michael J. Spencer 97333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getMemBuffer - Open the specified memory range as a MemoryBuffer. Note 989bb4a2ae8a0ce6404b9752f93ceebb2d00401997Chris Lattner /// that InputData must be null terminated if RequiresNullTerminator is true. 994c842dda3939c6b9f83ba7e8e19e43445cd9a832Chris Lattner static MemoryBuffer *getMemBuffer(StringRef InputData, 1009916d2ac3941513e301e39dee76a981c7caab694Rafael Espindola StringRef BufferName = "", 1019916d2ac3941513e301e39dee76a981c7caab694Rafael Espindola bool RequiresNullTerminator = true); 102fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1033daae2701b76293c31c1cbdafc9782352321e1f0Chris Lattner /// getMemBufferCopy - Open the specified memory range as a MemoryBuffer, 104867fe8570f299a058f155f98646d85cabc27155bDuncan Sands /// copying the contents and taking ownership of it. InputData does not 105867fe8570f299a058f155f98646d85cabc27155bDuncan Sands /// have to be null terminated. 1064c842dda3939c6b9f83ba7e8e19e43445cd9a832Chris Lattner static MemoryBuffer *getMemBufferCopy(StringRef InputData, 107d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer StringRef BufferName = ""); 108fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 109333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getNewMemBuffer - Allocate a new MemoryBuffer of the specified size that 110333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// is completely initialized to zeros. Note that the caller should 111333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// initialize the memory allocated by this method. The memory is owned by 112333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// the MemoryBuffer object. 113d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer static MemoryBuffer *getNewMemBuffer(size_t Size, StringRef BufferName = ""); 114fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 115333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getNewUninitMemBuffer - Allocate a new MemoryBuffer of the specified size 116333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// that is not initialized. Note that the caller should initialize the 117333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// memory allocated by this method. The memory is owned by the MemoryBuffer 118333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// object. 11934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng static MemoryBuffer *getNewUninitMemBuffer(size_t Size, 120d65267ee625bb9cf8dc655a0c0409760e2b76c71Daniel Dunbar StringRef BufferName = ""); 121fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Read all of stdin into a file buffer, and return it. 123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static ErrorOr<std::unique_ptr<MemoryBuffer>> getSTDIN(); 124fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 125cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Open the specified file as a MemoryBuffer, or open stdin if the Filename 126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// is "-". 127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static ErrorOr<std::unique_ptr<MemoryBuffer>> 128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getFileOrSTDIN(StringRef Filename, int64_t FileSize = -1); 129dd5af27a74a01f0d03356cea15d3a403f4964f8bRafael Espindola 1305d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek //===--------------------------------------------------------------------===// 1315d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek // Provided for performance analysis. 1325d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek //===--------------------------------------------------------------------===// 1335d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek 1345d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek /// The kind of memory backing used to support the MemoryBuffer. 1355d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek enum BufferKind { 1365d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek MemoryBuffer_Malloc, 1375d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek MemoryBuffer_MMap 1385d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek }; 1395d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek 1405d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek /// Return information on the memory mechanism used to support the 1415d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek /// MemoryBuffer. 1425d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek virtual BufferKind getBufferKind() const = 0; 143333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner}; 144333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 14540be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo// Create wrappers for C Binding types (see CBindingWrapping.h). 14640be1e85665d10f5444186f0e7106e368dd735b8Filip PizloDEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef) 14740be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo 148333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner} // end namespace llvm 149333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 150333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner#endif 151