1 //===- raw_mem_ostream.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/raw_mem_ostream.h> 10 #include <mcld/Support/MsgHandling.h> 11 #include <mcld/Support/MemoryRegion.h> 12 #include <mcld/Support/MemoryArea.h> 13 #include <mcld/Support/FileHandle.h> 14 15 using namespace mcld; 16 17 //===----------------------------------------------------------------------===// 18 // raw_mem_ostream 19 //===----------------------------------------------------------------------===// 20 raw_mem_ostream::raw_mem_ostream(MemoryArea &pMemoryArea) 21 : m_MemoryArea(pMemoryArea), m_Position(0) { 22 if (NULL == m_MemoryArea.handler() || 23 !(m_MemoryArea.handler()->isGood() && 24 m_MemoryArea.handler()->isWritable())) { 25 fatal(diag::fatal_unwritable_output) << m_MemoryArea.handler()->path(); 26 } 27 } 28 29 raw_mem_ostream::~raw_mem_ostream() 30 { 31 flush(); 32 m_MemoryArea.clear(); 33 } 34 35 void raw_mem_ostream::write_impl(const char *pPtr, size_t pSize) 36 { 37 MemoryRegion* region = m_MemoryArea.request(m_Position, pSize); 38 memcpy(region->start(), pPtr, pSize); 39 m_Position += pSize; 40 } 41 42 uint64_t raw_mem_ostream::current_pos() const 43 { 44 return m_Position; 45 } 46 47