1//===- FileOutputBuffer.cpp ------------------------------------------------===// 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#include <mcld/Support/FileOutputBuffer.h> 10#include <mcld/Support/FileHandle.h> 11#include <mcld/Support/Path.h> 12 13using namespace mcld; 14using llvm::sys::fs::mapped_file_region; 15 16FileOutputBuffer::FileOutputBuffer(llvm::sys::fs::mapped_file_region* pRegion, 17 FileHandle& pFileHandle) 18 : m_pRegion(pRegion), m_FileHandle(pFileHandle) 19{ 20} 21 22FileOutputBuffer::~FileOutputBuffer() 23{ 24 // Unmap buffer, letting OS flush dirty pages to file on disk. 25 m_pRegion.reset(0); 26} 27 28std::error_code FileOutputBuffer::create(FileHandle& pFileHandle, 29 size_t pSize, std::unique_ptr<FileOutputBuffer>& pResult) 30{ 31 std::error_code ec; 32 std::unique_ptr<mapped_file_region> mapped_file(new mapped_file_region( 33 pFileHandle.handler(), 34 false, 35 mapped_file_region::readwrite, 36 pSize, 37 0, 38 ec)); 39 40 if (ec) 41 return ec; 42 43 pResult.reset(new FileOutputBuffer(mapped_file.get(), pFileHandle)); 44 if (pResult) 45 mapped_file.release(); 46 return std::error_code(); 47} 48 49MemoryRegion FileOutputBuffer::request(size_t pOffset, size_t pLength) 50{ 51 if (pOffset > getBufferSize() || (pOffset + pLength) > getBufferSize()) 52 return MemoryRegion(); 53 return MemoryRegion(getBufferStart() + pOffset, pLength); 54} 55 56llvm::StringRef FileOutputBuffer::getPath() const 57{ 58 return m_FileHandle.path().native(); 59} 60