//===- subzero/src/IceMemory.cpp - Memory management definitions -*- C++ -*-==//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Implements memory management related routines for subzero.
/////
//===----------------------------------------------------------------------===//

#include "IceMemory.h"

#include "IceCfg.h"
#include "IceLiveness.h"
#include "IceTLS.h"

#include <cassert>
#include <utility>

namespace Ice {
ICE_TLS_DEFINE_FIELD(ArenaAllocator *, CfgAllocatorTraits, CfgAllocator);

CfgAllocatorTraits::allocator_type CfgAllocatorTraits::current() {
  return ICE_TLS_GET_FIELD(CfgAllocator);
}

void CfgAllocatorTraits::set_current(const manager_type *Manager) {
  ArenaAllocator *Allocator =
      Manager == nullptr ? nullptr : Manager->Allocator.get();
  set_current(Allocator);
}

void CfgAllocatorTraits::set_current(ArenaAllocator *Allocator) {
  ICE_TLS_SET_FIELD(CfgAllocator, Allocator);
}

void CfgAllocatorTraits::set_current(std::nullptr_t) {
  ICE_TLS_SET_FIELD(CfgAllocator, nullptr);
}

ICE_TLS_DEFINE_FIELD(ArenaAllocator *, LivenessAllocatorTraits,
                     LivenessAllocator);

LivenessAllocatorTraits::allocator_type LivenessAllocatorTraits::current() {
  return ICE_TLS_GET_FIELD(LivenessAllocator);
}

void LivenessAllocatorTraits::set_current(const manager_type *Manager) {
  ArenaAllocator *Allocator =
      Manager == nullptr ? nullptr : Manager->getAllocator();
  ICE_TLS_SET_FIELD(LivenessAllocator, Allocator);
}
} // end of namespace Ice