| //===- MemoryRegion.cpp ---------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <mcld/Support/MemoryRegion.h> |
| #include <mcld/Support/RegionFactory.h> |
| |
| #include <llvm/Support/ManagedStatic.h> |
| |
| using namespace mcld; |
| |
| static llvm::ManagedStatic<RegionFactory> g_RegionFactory; |
| |
| //===----------------------------------------------------------------------===// |
| // MemoryRegion |
| //===----------------------------------------------------------------------===// |
| MemoryRegion::MemoryRegion() |
| : m_pParent(NULL), m_VMAStart(0), m_Length(0) { |
| } |
| |
| MemoryRegion::MemoryRegion(MemoryRegion::Address pVMAStart, size_t pSize) |
| : m_pParent(NULL), m_VMAStart(pVMAStart), m_Length(pSize) { |
| } |
| |
| MemoryRegion::~MemoryRegion() |
| { |
| } |
| |
| MemoryRegion* MemoryRegion::Create(void* pStart, size_t pSize) |
| { |
| return g_RegionFactory->produce(static_cast<Address>(pStart), pSize); |
| } |
| |
| MemoryRegion* MemoryRegion::Create(void* pStart, size_t pSize, Space& pSpace) |
| { |
| MemoryRegion* result = g_RegionFactory->produce(static_cast<Address>(pStart), |
| pSize); |
| result->setParent(pSpace); |
| pSpace.addRegion(*result); |
| return result; |
| } |
| |
| void MemoryRegion::Destroy(MemoryRegion*& pRegion) |
| { |
| if (NULL == pRegion) |
| return; |
| |
| if (pRegion->hasParent()) |
| pRegion->parent()->removeRegion(*pRegion); |
| g_RegionFactory->destruct(pRegion); |
| pRegion = NULL; |
| } |
| |