| //===- 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 |