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
13namespace mcld {
14
15//===----------------------------------------------------------------------===//
16// MemoryAreaFactory
17//===----------------------------------------------------------------------===//
18MemoryAreaFactory::MemoryAreaFactory(size_t pNum)
19    : GCFactory<MemoryArea, 0>(pNum) {
20}
21
22MemoryAreaFactory::~MemoryAreaFactory() {
23}
24
25MemoryArea* 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
38MemoryArea* 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
52MemoryArea* 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
65MemoryArea* MemoryAreaFactory::produce(int pFD, FileHandle::OpenMode pMode) {
66  // TODO
67  return NULL;
68}
69
70void MemoryAreaFactory::destruct(MemoryArea* pArea) {
71  destroy(pArea);
72  deallocate(pArea);
73}
74
75}  // namespace mcld
76