1 //===- MemoryAreaFactory.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/MemoryAreaFactory.h" 10 #include "mcld/Support/MsgHandling.h" 11 #include "mcld/Support/SystemUtils.h" 12 13 namespace mcld { 14 15 //===----------------------------------------------------------------------===// 16 // MemoryAreaFactory 17 //===----------------------------------------------------------------------===// 18 MemoryAreaFactory::MemoryAreaFactory(size_t pNum) 19 : GCFactory<MemoryArea, 0>(pNum) { 20 } 21 22 MemoryAreaFactory::~MemoryAreaFactory() { 23 } 24 25 MemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, 26 FileHandle::OpenMode pMode) { 27 llvm::StringRef name(pPath.native()); 28 if (m_AreaMap.find(name) == m_AreaMap.end()) { 29 MemoryArea* result = allocate(); 30 new (result) MemoryArea(name); 31 m_AreaMap[name] = result; 32 return result; 33 } 34 35 return m_AreaMap[name]; 36 } 37 38 MemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, 39 FileHandle::OpenMode pMode, 40 FileHandle::Permission pPerm) { 41 llvm::StringRef name(pPath.native()); 42 if (m_AreaMap.find(name) == m_AreaMap.end()) { 43 MemoryArea* result = allocate(); 44 new (result) MemoryArea(name); 45 m_AreaMap[name] = result; 46 return result; 47 } 48 49 return m_AreaMap[name]; 50 } 51 52 MemoryArea* MemoryAreaFactory::produce(void* pMemBuffer, size_t pSize) { 53 const char* base = reinterpret_cast<const char*>(pMemBuffer); 54 llvm::StringRef name(base, pSize); 55 if (m_AreaMap.find(name) == m_AreaMap.end()) { 56 MemoryArea* result = allocate(); 57 new (result) MemoryArea(base, pSize); 58 m_AreaMap[name] = result; 59 return result; 60 } 61 62 return m_AreaMap[name]; 63 } 64 65 MemoryArea* MemoryAreaFactory::produce(int pFD, FileHandle::OpenMode pMode) { 66 // TODO 67 return NULL; 68 } 69 70 void MemoryAreaFactory::destruct(MemoryArea* pArea) { 71 destroy(pArea); 72 deallocate(pArea); 73 } 74 75 } // namespace mcld 76