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
20namespace mcld {
21
22class FileHandle;
23
24/// FileOutputBuffer - This interface is borrowed from llvm bassically, and we
25/// may use ostream to emit output later.
26class 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