15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MemoryRegion.cpp ---------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/MemoryRegion.h>
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/RegionFactory.h>
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ManagedStatic.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic llvm::ManagedStatic<RegionFactory> g_RegionFactory;
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MemoryRegion
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMemoryRegion::MemoryRegion()
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_pParent(NULL), m_VMAStart(0), m_Length(0) {
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMemoryRegion::MemoryRegion(MemoryRegion::Address pVMAStart, size_t pSize)
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_pParent(NULL), m_VMAStart(pVMAStart), m_Length(pSize) {
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMemoryRegion::~MemoryRegion()
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMemoryRegion* MemoryRegion::Create(void* pStart, size_t pSize)
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return g_RegionFactory->produce(static_cast<Address>(pStart), pSize);
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMemoryRegion* MemoryRegion::Create(void* pStart, size_t pSize, Space& pSpace)
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MemoryRegion* result = g_RegionFactory->produce(static_cast<Address>(pStart),
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                  pSize);
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  result->setParent(pSpace);
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pSpace.addRegion(*result);
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return result;
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid MemoryRegion::Destroy(MemoryRegion*& pRegion)
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (NULL == pRegion)
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return;
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (pRegion->hasParent())
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    pRegion->parent()->removeRegion(*pRegion);
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_RegionFactory->destruct(pRegion);
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pRegion = NULL;
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
58