15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MemoryAreaFactory.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/MemoryAreaFactory.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h" 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/SystemUtils.h" 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MemoryAreaFactory 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMemoryAreaFactory::MemoryAreaFactory(size_t pNum) 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines : GCFactory<MemoryArea, 0>(pNum) { 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2237b74a387bb3993387029859c2d9d051c41c724eStephen HinesMemoryAreaFactory::~MemoryAreaFactory() { 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesMemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines FileHandle::OpenMode pMode) { 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::StringRef name(pPath.native()); 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (m_AreaMap.find(name) == m_AreaMap.end()) { 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* result = allocate(); 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) MemoryArea(name); 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_AreaMap[name] = result; 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return m_AreaMap[name]; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesMemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines FileHandle::OpenMode pMode, 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines FileHandle::Permission pPerm) { 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::StringRef name(pPath.native()); 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (m_AreaMap.find(name) == m_AreaMap.end()) { 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* result = allocate(); 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) MemoryArea(name); 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_AreaMap[name] = result; 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return m_AreaMap[name]; 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 5237b74a387bb3993387029859c2d9d051c41c724eStephen HinesMemoryArea* MemoryAreaFactory::produce(void* pMemBuffer, size_t pSize) { 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const char* base = reinterpret_cast<const char*>(pMemBuffer); 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::StringRef name(base, pSize); 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (m_AreaMap.find(name) == m_AreaMap.end()) { 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines MemoryArea* result = allocate(); 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) MemoryArea(base, pSize); 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_AreaMap[name] = result; 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return result; 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return m_AreaMap[name]; 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6537b74a387bb3993387029859c2d9d051c41c724eStephen HinesMemoryArea* MemoryAreaFactory::produce(int pFD, FileHandle::OpenMode pMode) { 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // TODO 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid MemoryAreaFactory::destruct(MemoryArea* pArea) { 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao destroy(pArea); 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao deallocate(pArea); 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 76