50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- MemoryArea.cpp -----------------------------------------------------===//
 | 
						|
//
 | 
						|
//                     The MCLinker Project
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
#include "mcld/Support/MemoryArea.h"
 | 
						|
#include "mcld/Support/MsgHandling.h"
 | 
						|
 | 
						|
#include <llvm/Support/ErrorOr.h>
 | 
						|
 | 
						|
#include <cassert>
 | 
						|
#include <system_error>
 | 
						|
 | 
						|
namespace mcld {
 | 
						|
 | 
						|
//===--------------------------------------------------------------------===//
 | 
						|
// MemoryArea
 | 
						|
//===--------------------------------------------------------------------===//
 | 
						|
MemoryArea::MemoryArea(llvm::StringRef pFilename) {
 | 
						|
  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer> > buffer_or_error =
 | 
						|
      llvm::MemoryBuffer::getFile(pFilename,
 | 
						|
                                  /*FileSize*/ -1,
 | 
						|
                                  /*RequiresNullTerminator*/ false);
 | 
						|
  if (!buffer_or_error) {
 | 
						|
    fatal(diag::fatal_cannot_read_input) << pFilename.str();
 | 
						|
  }
 | 
						|
  m_pMemoryBuffer = std::move(buffer_or_error.get());
 | 
						|
}
 | 
						|
 | 
						|
MemoryArea::MemoryArea(const char* pMemBuffer, size_t pSize) {
 | 
						|
  llvm::StringRef mem(pMemBuffer, pSize);
 | 
						|
  m_pMemoryBuffer =
 | 
						|
      llvm::MemoryBuffer::getMemBuffer(mem,
 | 
						|
                                       /*BufferName*/ "NaN",
 | 
						|
                                       /*RequiresNullTerminator*/ false);
 | 
						|
}
 | 
						|
 | 
						|
llvm::StringRef MemoryArea::request(size_t pOffset, size_t pLength) {
 | 
						|
  return llvm::StringRef(m_pMemoryBuffer->getBufferStart() + pOffset, pLength);
 | 
						|
}
 | 
						|
 | 
						|
size_t MemoryArea::size() const {
 | 
						|
  return m_pMemoryBuffer->getBufferSize();
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace mcld
 |