1 //===- FileOutputBuffer.h -------------------------------------------------===// 2 // 3 // the mclinker project 4 // 5 // this file is distributed under the university of illinois open source 6 // license. see license.txt for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_SUPPORT_FILEOUTPUTBUFFER_H 10 #define MCLD_SUPPORT_FILEOUTPUTBUFFER_H 11 12 #include <mcld/Support/MemoryRegion.h> 13 #include <llvm/ADT/StringRef.h> 14 #include <llvm/Support/DataTypes.h> 15 #include <llvm/Support/FileSystem.h> 16 #include <system_error> 17 18 namespace mcld { 19 20 class FileHandle; 21 22 /// FileOutputBuffer - This interface is borrowed from llvm bassically, and we 23 /// may use ostream to emit output later. 24 class FileOutputBuffer { 25 public: 26 /// Factory method to create an OutputBuffer object which manages a read/write 27 /// buffer of the specified size. When committed, the buffer will be written 28 /// to the file at the specified path. 29 static std::error_code create(FileHandle& pFileHandle, 30 size_t pSize, 31 std::unique_ptr<FileOutputBuffer>& pResult); 32 33 /// Returns a pointer to the start of the buffer. getBufferStart()34 uint8_t* getBufferStart() { 35 return (uint8_t*)m_pRegion->data(); 36 } 37 38 /// Returns a pointer to the end of the buffer. getBufferEnd()39 uint8_t* getBufferEnd() { 40 return (uint8_t*)m_pRegion->data() + m_pRegion->size(); 41 } 42 43 /// Returns size of the buffer. getBufferSize()44 size_t getBufferSize() const { 45 return m_pRegion->size(); 46 } 47 48 MemoryRegion request(size_t pOffset, size_t pLength); 49 50 /// Returns path where file will show up if buffer is committed. 51 llvm::StringRef getPath() const; 52 53 ~FileOutputBuffer(); 54 55 private: 56 FileOutputBuffer(const FileOutputBuffer &); 57 FileOutputBuffer &operator=(const FileOutputBuffer &); 58 59 FileOutputBuffer(llvm::sys::fs::mapped_file_region* pRegion, 60 FileHandle& pFileHandle); 61 62 std::unique_ptr<llvm::sys::fs::mapped_file_region> m_pRegion; 63 FileHandle& m_FileHandle; 64 }; 65 66 } // namespace mcld 67 68 #endif 69