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 171464869cb325e30673005a16accaf47da8b6ba1bDaniel Dunbar#include "llvm/ADT/StringRef.h" 181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 19333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 20333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnernamespace llvm { 21333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 22333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencerclass error_code; 233ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencertemplate<class T> class OwningPtr; 24333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer 25333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// MemoryBuffer - This interface provides simple read-only access to a block 26333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// of memory, and provides simple methods for reading files and standard input 27333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// into a memory buffer. In addition to basic access to the characters in the 28333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/// file, this interface guarantees you can read one character past the end of 29f605773869d1489dcfb10c47f99ada9fe4908b45Jeffrey Yasskin/// the file, and that this character will read as '\0'. 3030f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// 3130f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// The '\0' guarantee is needed to support an optimization -- it's intended to 3230f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// be more efficient for clients which are reading all the data to stop 3330f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// reading when they encounter a '\0' than to continually check the file 3430f30e43861512d78023c84952e5e524c0003ae9Dan Gohman/// position to see if it has reached the end of the file. 35333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerclass MemoryBuffer { 36333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *BufferStart; // Start of the buffer. 37333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *BufferEnd; // End of the buffer. 38333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 39d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer MemoryBuffer(const MemoryBuffer &); // DO NOT IMPLEMENT 40d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer MemoryBuffer &operator=(const MemoryBuffer &); // DO NOT IMPLEMENT 41333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerprotected: 42d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer MemoryBuffer() {} 43f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola void init(const char *BufStart, const char *BufEnd, 44f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola bool RequiresNullTerminator); 45333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerpublic: 46333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner virtual ~MemoryBuffer(); 47fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 48333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *getBufferStart() const { return BufferStart; } 49333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const char *getBufferEnd() const { return BufferEnd; } 5034cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng size_t getBufferSize() const { return BufferEnd-BufferStart; } 51fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 52333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer StringRef getBuffer() const { 53333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer return StringRef(BufferStart, getBufferSize()); 541464869cb325e30673005a16accaf47da8b6ba1bDaniel Dunbar } 551464869cb325e30673005a16accaf47da8b6ba1bDaniel Dunbar 56333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getBufferIdentifier - Return an identifier for this buffer, typically the 57333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// filename it was read from. 58333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner virtual const char *getBufferIdentifier() const { 59333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner return "Unknown buffer"; 60333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner } 61333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 62333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getFile - Open the specified file as a MemoryBuffer, returning a new 63333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// MemoryBuffer if successful, otherwise returning null. If FileSize is 64333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// specified, this means that the client knows that the file exists and that 65333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// it has the specified size. 663ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer static error_code getFile(StringRef Filename, OwningPtr<MemoryBuffer> &result, 6711d1803770f54dad441007a6ebafc70cb9395695Rafael Espindola int64_t FileSize = -1, 6811d1803770f54dad441007a6ebafc70cb9395695Rafael Espindola bool RequiresNullTerminator = true); 693ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer static error_code getFile(const char *Filename, 703ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer OwningPtr<MemoryBuffer> &result, 7111d1803770f54dad441007a6ebafc70cb9395695Rafael Espindola int64_t FileSize = -1, 7211d1803770f54dad441007a6ebafc70cb9395695Rafael Espindola bool RequiresNullTerminator = true); 73333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 747cf705461cfdca5dd5b48a5065f8e24a1ce8c8c4Chris Lattner /// getOpenFile - Given an already-open file descriptor, read the file and 75b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola /// return a MemoryBuffer. 763ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer static error_code getOpenFile(int FD, const char *Filename, 773ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer OwningPtr<MemoryBuffer> &result, 7871280b55a3406c7dd4215449bf4a3ab216e78ffdIvan Krasin uint64_t FileSize = -1, 7971280b55a3406c7dd4215449bf4a3ab216e78ffdIvan Krasin uint64_t MapSize = -1, 8071280b55a3406c7dd4215449bf4a3ab216e78ffdIvan Krasin int64_t Offset = 0, 81f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola bool RequiresNullTerminator = true); 82333ad3f2bf2941618f8e1563da022da011e615c0Michael J. Spencer 83333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getMemBuffer - Open the specified memory range as a MemoryBuffer. Note 849bb4a2ae8a0ce6404b9752f93ceebb2d00401997Chris Lattner /// that InputData must be null terminated if RequiresNullTerminator is true. 854c842dda3939c6b9f83ba7e8e19e43445cd9a832Chris Lattner static MemoryBuffer *getMemBuffer(StringRef InputData, 869916d2ac3941513e301e39dee76a981c7caab694Rafael Espindola StringRef BufferName = "", 879916d2ac3941513e301e39dee76a981c7caab694Rafael Espindola bool RequiresNullTerminator = true); 88fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 893daae2701b76293c31c1cbdafc9782352321e1f0Chris Lattner /// getMemBufferCopy - Open the specified memory range as a MemoryBuffer, 90867fe8570f299a058f155f98646d85cabc27155bDuncan Sands /// copying the contents and taking ownership of it. InputData does not 91867fe8570f299a058f155f98646d85cabc27155bDuncan Sands /// have to be null terminated. 924c842dda3939c6b9f83ba7e8e19e43445cd9a832Chris Lattner static MemoryBuffer *getMemBufferCopy(StringRef InputData, 93d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer StringRef BufferName = ""); 94fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 95333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getNewMemBuffer - Allocate a new MemoryBuffer of the specified size that 96333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// is completely initialized to zeros. Note that the caller should 97333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// initialize the memory allocated by this method. The memory is owned by 98333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// the MemoryBuffer object. 99d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer static MemoryBuffer *getNewMemBuffer(size_t Size, StringRef BufferName = ""); 100fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 101333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// getNewUninitMemBuffer - Allocate a new MemoryBuffer of the specified size 102333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// that is not initialized. Note that the caller should initialize the 103333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// memory allocated by this method. The memory is owned by the MemoryBuffer 104333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /// object. 10534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng static MemoryBuffer *getNewUninitMemBuffer(size_t Size, 106d65267ee625bb9cf8dc655a0c0409760e2b76c71Daniel Dunbar StringRef BufferName = ""); 107fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 108d65267ee625bb9cf8dc655a0c0409760e2b76c71Daniel Dunbar /// getSTDIN - Read all of stdin into a file buffer, and return it. 109333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer /// If an error occurs, this returns null and sets ec. 1103ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer static error_code getSTDIN(OwningPtr<MemoryBuffer> &result); 111fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 112fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 113e96eec0c6966473ed8f71ecf4d2dd37daec29d36Chris Lattner /// getFileOrSTDIN - Open the specified file as a MemoryBuffer, or open stdin 114333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer /// if the Filename is "-". If an error occurs, this returns null and sets 115333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer /// ec. 1163ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer static error_code getFileOrSTDIN(StringRef Filename, 1173ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer OwningPtr<MemoryBuffer> &result, 1183ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer int64_t FileSize = -1); 1193ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer static error_code getFileOrSTDIN(const char *Filename, 1203ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer OwningPtr<MemoryBuffer> &result, 1213ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer int64_t FileSize = -1); 1225d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek 1235d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek 1245d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek //===--------------------------------------------------------------------===// 1255d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek // Provided for performance analysis. 1265d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek //===--------------------------------------------------------------------===// 1275d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek 1285d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek /// The kind of memory backing used to support the MemoryBuffer. 1295d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek enum BufferKind { 1305d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek MemoryBuffer_Malloc, 1315d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek MemoryBuffer_MMap 1325d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek }; 1335d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek 1345d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek /// Return information on the memory mechanism used to support the 1355d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek /// MemoryBuffer. 1365d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek virtual BufferKind getBufferKind() const = 0; 137333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner}; 138333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 139333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner} // end namespace llvm 140333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 141333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner#endif 142