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