1 //=== FileOutputBuffer.h - File Output Buffer -------------------*- C++ -*-===// 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 // Utility for creating a in-memory buffer that will be written to a file. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_SUPPORT_FILEOUTPUTBUFFER_H 14 #define LLVM_SUPPORT_FILEOUTPUTBUFFER_H 15 16 #include "llvm/ADT/StringRef.h" 17 #include "llvm/Support/DataTypes.h" 18 #include "llvm/Support/Error.h" 19 20 namespace llvm { 21 /// FileOutputBuffer - This interface provides simple way to create an in-memory 22 /// buffer which will be written to a file. During the lifetime of these 23 /// objects, the content or existence of the specified file is undefined. That 24 /// is, creating an OutputBuffer for a file may immediately remove the file. 25 /// If the FileOutputBuffer is committed, the target file's content will become 26 /// the buffer content at the time of the commit. If the FileOutputBuffer is 27 /// not committed, the file will be deleted in the FileOutputBuffer destructor. 28 class FileOutputBuffer { 29 public: 30 enum { 31 /// Set the 'x' bit on the resulting file. 32 F_executable = 1, 33 34 /// Don't use mmap and instead write an in-memory buffer to a file when this 35 /// buffer is closed. 36 F_no_mmap = 2, 37 }; 38 39 /// Factory method to create an OutputBuffer object which manages a read/write 40 /// buffer of the specified size. When committed, the buffer will be written 41 /// to the file at the specified path. 42 /// 43 /// When F_modify is specified and \p FilePath refers to an existing on-disk 44 /// file \p Size may be set to -1, in which case the entire file is used. 45 /// Otherwise, the file shrinks or grows as necessary based on the value of 46 /// \p Size. It is an error to specify F_modify and Size=-1 if \p FilePath 47 /// does not exist. 48 static Expected<std::unique_ptr<FileOutputBuffer>> 49 create(StringRef FilePath, size_t Size, unsigned Flags = 0); 50 51 /// Returns a pointer to the start of the buffer. 52 virtual uint8_t *getBufferStart() const = 0; 53 54 /// Returns a pointer to the end of the buffer. 55 virtual uint8_t *getBufferEnd() const = 0; 56 57 /// Returns size of the buffer. 58 virtual size_t getBufferSize() const = 0; 59 60 /// Returns path where file will show up if buffer is committed. getPath()61 StringRef getPath() const { return FinalPath; } 62 63 /// Flushes the content of the buffer to its file and deallocates the 64 /// buffer. If commit() is not called before this object's destructor 65 /// is called, the file is deleted in the destructor. The optional parameter 66 /// is used if it turns out you want the file size to be smaller than 67 /// initially requested. 68 virtual Error commit() = 0; 69 70 /// If this object was previously committed, the destructor just deletes 71 /// this object. If this object was not committed, the destructor 72 /// deallocates the buffer and the target file is never written. 73 virtual ~FileOutputBuffer() = default; 74 75 /// This removes the temporary file (unless it already was committed) 76 /// but keeps the memory mapping alive. discard()77 virtual void discard() {} 78 79 protected: FileOutputBuffer(StringRef Path)80 FileOutputBuffer(StringRef Path) : FinalPath(Path) {} 81 82 std::string FinalPath; 83 }; 84 } // end namespace llvm 85 86 #endif 87