1//===- MemoryArea.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/MemoryArea.h> 10#include <mcld/Support/MsgHandling.h> 11 12#include <llvm/Support/ErrorOr.h> 13 14#include <cassert> 15#include <system_error> 16 17using namespace mcld; 18 19//===--------------------------------------------------------------------===// 20// MemoryArea 21//===--------------------------------------------------------------------===// 22MemoryArea::MemoryArea(llvm::StringRef pFilename) 23{ 24 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer_or_error = 25 llvm::MemoryBuffer::getFile(pFilename, /*FileSize*/ -1, 26 /*RequiresNullTerminator*/ false); 27 if (std::error_code ec = buffer_or_error.getError()) { 28 (void) ec; 29 fatal(diag::fatal_cannot_read_input) << pFilename.str(); 30 } 31 m_pMemoryBuffer = std::move(buffer_or_error.get()); 32} 33 34MemoryArea::MemoryArea(const char* pMemBuffer, size_t pSize) 35{ 36 llvm::StringRef mem(pMemBuffer, pSize); 37 llvm::MemoryBuffer* buffer = 38 llvm::MemoryBuffer::getMemBuffer(mem, /*BufferName*/ "NaN", 39 /*RequiresNullTerminator*/ false); 40 assert(buffer != NULL); 41 m_pMemoryBuffer.reset(buffer); 42} 43 44llvm::StringRef MemoryArea::request(size_t pOffset, size_t pLength) 45{ 46 return llvm::StringRef(m_pMemoryBuffer->getBufferStart() + pOffset, pLength); 47} 48 49size_t MemoryArea::size() const 50{ 51 return m_pMemoryBuffer->getBufferSize(); 52} 53