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