blob: d79628338fe76ad508eb388d33d288b41a62694f [file] [log] [blame]
Shih-wei Liao5460a1f2012-03-16 22:41:16 -07001//===- 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//===----------------------------------------------------------------------===//
Shih-wei Liao5460a1f2012-03-16 22:41:16 -07009#include <mcld/Support/MemoryArea.h>
Stephen Hines551ae4e2014-04-24 14:41:24 -070010#include <mcld/Support/MsgHandling.h>
Stephen Hinesa790f0a2014-07-15 18:33:32 -070011
12#include <llvm/Support/ErrorOr.h>
Stephen Hines87f34652014-02-14 18:00:16 -080013
14#include <cassert>
Stephen Hinesa790f0a2014-07-15 18:33:32 -070015#include <system_error>
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070016
17using namespace mcld;
18
19//===--------------------------------------------------------------------===//
20// MemoryArea
Shih-wei Liao67e37f12012-07-27 03:50:34 -070021//===--------------------------------------------------------------------===//
Stephen Hines87f34652014-02-14 18:00:16 -080022MemoryArea::MemoryArea(llvm::StringRef pFilename)
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070023{
Stephen Hinesa790f0a2014-07-15 18:33:32 -070024 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer_or_error =
25 llvm::MemoryBuffer::getFile(pFilename, /*FileSize*/ -1,
Stephen Hines551ae4e2014-04-24 14:41:24 -070026 /*RequiresNullTerminator*/ false);
Stephen Hinesa790f0a2014-07-15 18:33:32 -070027 if (std::error_code ec = buffer_or_error.getError()) {
Stephen Hines48b42622014-07-15 18:36:27 -070028 (void) ec;
Stephen Hines551ae4e2014-04-24 14:41:24 -070029 fatal(diag::fatal_cannot_read_input) << pFilename.str();
30 }
Stephen Hinesa790f0a2014-07-15 18:33:32 -070031 m_pMemoryBuffer = std::move(buffer_or_error.get());
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070032}
33
Stephen Hines87f34652014-02-14 18:00:16 -080034MemoryArea::MemoryArea(const char* pMemBuffer, size_t pSize)
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070035{
Stephen Hines87f34652014-02-14 18:00:16 -080036 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);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070042}
43
Stephen Hines87f34652014-02-14 18:00:16 -080044llvm::StringRef MemoryArea::request(size_t pOffset, size_t pLength)
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070045{
Stephen Hines87f34652014-02-14 18:00:16 -080046 return llvm::StringRef(m_pMemoryBuffer->getBufferStart() + pOffset, pLength);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070047}
48
Stephen Hines87f34652014-02-14 18:00:16 -080049size_t MemoryArea::size() const
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070050{
Stephen Hines87f34652014-02-14 18:00:16 -080051 return m_pMemoryBuffer->getBufferSize();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070052}