Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 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 | //===----------------------------------------------------------------------===// |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 9 | #include <mcld/Support/MemoryArea.h> |
Stephen Hines | 551ae4e | 2014-04-24 14:41:24 -0700 | [diff] [blame] | 10 | #include <mcld/Support/MsgHandling.h> |
Stephen Hines | a790f0a | 2014-07-15 18:33:32 -0700 | [diff] [blame] | 11 | |
| 12 | #include <llvm/Support/ErrorOr.h> |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 13 | |
| 14 | #include <cassert> |
Stephen Hines | a790f0a | 2014-07-15 18:33:32 -0700 | [diff] [blame] | 15 | #include <system_error> |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 16 | |
| 17 | using namespace mcld; |
| 18 | |
| 19 | //===--------------------------------------------------------------------===// |
| 20 | // MemoryArea |
Shih-wei Liao | 67e37f1 | 2012-07-27 03:50:34 -0700 | [diff] [blame] | 21 | //===--------------------------------------------------------------------===// |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 22 | MemoryArea::MemoryArea(llvm::StringRef pFilename) |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 23 | { |
Stephen Hines | a790f0a | 2014-07-15 18:33:32 -0700 | [diff] [blame] | 24 | llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer_or_error = |
| 25 | llvm::MemoryBuffer::getFile(pFilename, /*FileSize*/ -1, |
Stephen Hines | 551ae4e | 2014-04-24 14:41:24 -0700 | [diff] [blame] | 26 | /*RequiresNullTerminator*/ false); |
Stephen Hines | a790f0a | 2014-07-15 18:33:32 -0700 | [diff] [blame] | 27 | if (std::error_code ec = buffer_or_error.getError()) { |
Stephen Hines | 48b4262 | 2014-07-15 18:36:27 -0700 | [diff] [blame] | 28 | (void) ec; |
Stephen Hines | 551ae4e | 2014-04-24 14:41:24 -0700 | [diff] [blame] | 29 | fatal(diag::fatal_cannot_read_input) << pFilename.str(); |
| 30 | } |
Stephen Hines | a790f0a | 2014-07-15 18:33:32 -0700 | [diff] [blame] | 31 | m_pMemoryBuffer = std::move(buffer_or_error.get()); |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 32 | } |
| 33 | |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 34 | MemoryArea::MemoryArea(const char* pMemBuffer, size_t pSize) |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 35 | { |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 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); |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 42 | } |
| 43 | |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 44 | llvm::StringRef MemoryArea::request(size_t pOffset, size_t pLength) |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 45 | { |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 46 | return llvm::StringRef(m_pMemoryBuffer->getBufferStart() + pOffset, pLength); |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 47 | } |
| 48 | |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 49 | size_t MemoryArea::size() const |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 50 | { |
Stephen Hines | 87f3465 | 2014-02-14 18:00:16 -0800 | [diff] [blame] | 51 | return m_pMemoryBuffer->getBufferSize(); |
Shih-wei Liao | 5460a1f | 2012-03-16 22:41:16 -0700 | [diff] [blame] | 52 | } |