//===- MemoryAreaFactory.cpp ----------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "mcld/Support/MemoryAreaFactory.h" #include "mcld/Support/MsgHandling.h" #include "mcld/Support/SystemUtils.h" namespace mcld { //===----------------------------------------------------------------------===// // MemoryAreaFactory //===----------------------------------------------------------------------===// MemoryAreaFactory::MemoryAreaFactory(size_t pNum) : GCFactory<MemoryArea, 0>(pNum) { } MemoryAreaFactory::~MemoryAreaFactory() { } MemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, FileHandle::OpenMode pMode) { llvm::StringRef name(pPath.native()); if (m_AreaMap.find(name) == m_AreaMap.end()) { MemoryArea* result = allocate(); new (result) MemoryArea(name); m_AreaMap[name] = result; return result; } return m_AreaMap[name]; } MemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, FileHandle::OpenMode pMode, FileHandle::Permission pPerm) { llvm::StringRef name(pPath.native()); if (m_AreaMap.find(name) == m_AreaMap.end()) { MemoryArea* result = allocate(); new (result) MemoryArea(name); m_AreaMap[name] = result; return result; } return m_AreaMap[name]; } MemoryArea* MemoryAreaFactory::produce(void* pMemBuffer, size_t pSize) { const char* base = reinterpret_cast<const char*>(pMemBuffer); llvm::StringRef name(base, pSize); if (m_AreaMap.find(name) == m_AreaMap.end()) { MemoryArea* result = allocate(); new (result) MemoryArea(base, pSize); m_AreaMap[name] = result; return result; } return m_AreaMap[name]; } MemoryArea* MemoryAreaFactory::produce(int pFD, FileHandle::OpenMode pMode) { // TODO return NULL; } void MemoryAreaFactory::destruct(MemoryArea* pArea) { destroy(pArea); deallocate(pArea); } } // namespace mcld