76 lines
2.2 KiB
C++
76 lines
2.2 KiB
C++
//===- 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
|