15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MemoryArea.cpp -----------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryArea.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h"
110dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
120dea6bc96bb52346737966839ac68644f7939f58Stephen Hines#include <llvm/Support/ErrorOr.h>
1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <cassert>
150dea6bc96bb52346737966839ac68644f7939f58Stephen Hines#include <system_error>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===--------------------------------------------------------------------===//
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MemoryArea
2167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao//===--------------------------------------------------------------------===//
2237b74a387bb3993387029859c2d9d051c41c724eStephen HinesMemoryArea::MemoryArea(llvm::StringRef pFilename) {
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer> > buffer_or_error =
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      llvm::MemoryBuffer::getFile(pFilename,
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  /*FileSize*/ -1,
26551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                  /*RequiresNullTerminator*/ false);
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (!buffer_or_error) {
28551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    fatal(diag::fatal_cannot_read_input) << pFilename.str();
29551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
300dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  m_pMemoryBuffer = std::move(buffer_or_error.get());
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3337b74a387bb3993387029859c2d9d051c41c724eStephen HinesMemoryArea::MemoryArea(const char* pMemBuffer, size_t pSize) {
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef mem(pMemBuffer, pSize);
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pMemoryBuffer =
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      llvm::MemoryBuffer::getMemBuffer(mem,
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                       /*BufferName*/ "NaN",
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                       /*RequiresNullTerminator*/ false);
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesllvm::StringRef MemoryArea::request(size_t pOffset, size_t pLength) {
4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  return llvm::StringRef(m_pMemoryBuffer->getBufferStart() + pOffset, pLength);
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t MemoryArea::size() const {
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  return m_pMemoryBuffer->getBufferSize();
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
50