Home | History | Annotate | Download | only in Support
      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 
     14 #include <llvm/ADT/StringRef.h>
     15 #include <llvm/Support/DataTypes.h>
     16 #include <llvm/Support/FileSystem.h>
     17 
     18 #include <system_error>
     19 
     20 namespace mcld {
     21 
     22 class FileHandle;
     23 
     24 /// FileOutputBuffer - This interface is borrowed from llvm bassically, and we
     25 /// may use ostream to emit output later.
     26 class FileOutputBuffer {
     27  public:
     28   /// Factory method to create an OutputBuffer object which manages a read/write
     29   /// buffer of the specified size. When committed, the buffer will be written
     30   /// to the file at the specified path.
     31   static std::error_code create(FileHandle& pFileHandle,
     32                                 size_t pSize,
     33                                 std::unique_ptr<FileOutputBuffer>& pResult);
     34 
     35   /// Returns a pointer to the start of the buffer.
     36   uint8_t* getBufferStart() {
     37     return reinterpret_cast<uint8_t*>(m_pRegion->data());
     38   }
     39 
     40   /// Returns a pointer to the end of the buffer.
     41   uint8_t* getBufferEnd() {
     42     return reinterpret_cast<uint8_t*>(m_pRegion->data()) + m_pRegion->size();
     43   }
     44 
     45   /// Returns size of the buffer.
     46   size_t getBufferSize() const { return m_pRegion->size(); }
     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  // MCLD_SUPPORT_FILEOUTPUTBUFFER_H_
     69