C++程序  |  58行  |  1.59 KB

//===- 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;
}