/* Copyright (C) 2020-2025 Free Software Foundation, Inc.
   Contributed by Jakub Jelinek <jakub@redhat.com>.

   This file is part of the GNU Offloading and Multi Processing Library
   (libgomp).

   Libgomp is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* This file contains wrappers for the system allocation routines.  Most
   places in the OpenMP API do not make any provision for failure, so in
   general we cannot allow memory allocation to fail.  */

#define _GNU_SOURCE
#include "libgomp.h"
#include <stdlib.h>
#include <string.h>
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
#include <dlfcn.h>
#endif

/* Keeping track whether a Fortran scalar allocatable/pointer has been
   allocated via 'omp allocators'/'omp allocate'.  */

struct fort_alloc_splay_tree_key_s {
  void *ptr;
};

typedef struct fort_alloc_splay_tree_node_s *fort_alloc_splay_tree_node;
typedef struct fort_alloc_splay_tree_s *fort_alloc_splay_tree;
typedef struct fort_alloc_splay_tree_key_s *fort_alloc_splay_tree_key;

static inline int
fort_alloc_splay_compare (fort_alloc_splay_tree_key x, fort_alloc_splay_tree_key y)
{
  if (x->ptr < y->ptr)
    return -1;
  if (x->ptr > y->ptr)
    return 1;
  return 0;
}
#define splay_tree_prefix fort_alloc
#define splay_tree_static
#include "splay-tree.h"

#define splay_tree_prefix fort_alloc
#define splay_tree_static
#define splay_tree_c
#include "splay-tree.h"

static struct fort_alloc_splay_tree_s fort_alloc_scalars;

/* Add pointer as being alloced by GOMP_alloc.  */
void
GOMP_add_alloc (void *ptr)
{
  if (ptr == NULL)
    return;
  fort_alloc_splay_tree_node item;
  item = gomp_malloc (sizeof (struct splay_tree_node_s));
  item->key.ptr = ptr;
  item->left = NULL;
  item->right = NULL;
  fort_alloc_splay_tree_insert (&fort_alloc_scalars, item);
}

/* Remove pointer, either called by FREE or by REALLOC,
   either of them can change the allocation status.  */
bool
GOMP_is_alloc (void *ptr)
{
  struct fort_alloc_splay_tree_key_s needle;
  fort_alloc_splay_tree_node n;
  needle.ptr = ptr;
  n = fort_alloc_splay_tree_lookup_node (&fort_alloc_scalars, &needle);
  if (n)
    {
      fort_alloc_splay_tree_remove (&fort_alloc_scalars, &n->key);
      free (n);
    }
  return n != NULL;
}


#define omp_max_predefined_alloc omp_thread_mem_alloc
#define ompx_gnu_min_predefined_alloc ompx_gnu_pinned_mem_alloc
#define ompx_gnu_max_predefined_alloc ompx_gnu_managed_mem_alloc

_Static_assert (GOMP_OMP_PREDEF_ALLOC_MAX == omp_thread_mem_alloc,
		"GOMP_OMP_PREDEF_ALLOC_MAX == omp_thread_mem_alloc");
_Static_assert (GOMP_OMPX_PREDEF_ALLOC_MIN == ompx_gnu_min_predefined_alloc,
		"GOMP_OMPX_PREDEF_ALLOC_MIN == ompx_gnu_min_predefined_alloc");
_Static_assert (GOMP_OMPX_PREDEF_ALLOC_MAX == ompx_gnu_max_predefined_alloc,
		"GOMP_OMPX_PREDEF_ALLOC_MAX == ompx_gnu_max_predefined_alloc");
_Static_assert (GOMP_OMP_PREDEF_ALLOC_THREADS == omp_thread_mem_alloc,
		"GOMP_OMP_PREDEF_ALLOC_THREADS == omp_thread_mem_alloc");

#define omp_max_predefined_mem_space omp_low_lat_mem_space
#define ompx_gnu_min_predefined_mem_space ompx_gnu_managed_mem_space
#define ompx_gnu_max_predefined_mem_space ompx_gnu_managed_mem_space

_Static_assert (GOMP_OMP_PREDEF_MEMSPACE_MAX == omp_max_predefined_mem_space,
		"GOMP_OMP_PREDEF_MEMSPACE_MAX == omp_max_predefined_mem_space");
_Static_assert (GOMP_OMPX_PREDEF_MEMSPACE_MIN == ompx_gnu_min_predefined_mem_space,
		"GOMP_OMPX_PREDEF_MEMSPACE_MIN == ompx_gnu_min_predefined_mem_space");
_Static_assert (GOMP_OMPX_PREDEF_MEMSPACE_MAX == ompx_gnu_max_predefined_mem_space,
		"GOMP_OMPX_PREDEF_MEMSPACE_MAX == ompx_gnu_max_predefined_mem_space");

#if 0 /* For testing the fall-back macros compile, only.  */
#undef MEMSPACE_ALLOC
#undef MEMSPACE_CALLOC
#undef MEMSPACE_REALLOC
#undef MEMSPACE_FREE
#undef MEMSPACE_VALIDATE
#endif

/* These macros may be overridden in config/<target>/allocator.c.
   The defaults (no override) are to return NULL for pinned memory requests
   or non-standard memory spaces (these need a deliberate implementation), and
   pass through to the regular OS calls otherwise.
   The following definitions (ab)use comma operators to avoid unused
   variable errors.  */
#ifndef MEMSPACE_ALLOC
#define MEMSPACE_ALLOC(MEMSPACE, SIZE, PIN) \
  ((PIN) || (MEMSPACE) > GOMP_OMP_PREDEF_MEMSPACE_MAX \
   ? NULL : malloc (((void)(MEMSPACE), (SIZE))))
#endif
#ifndef MEMSPACE_CALLOC
#define MEMSPACE_CALLOC(MEMSPACE, SIZE, PIN) \
  ((PIN) || (MEMSPACE) > GOMP_OMP_PREDEF_MEMSPACE_MAX \
   ? NULL : calloc (1, (((void)(MEMSPACE), (SIZE)))))
#endif
#ifndef MEMSPACE_REALLOC
#define MEMSPACE_REALLOC(MEMSPACE, ADDR, OLDSIZE, SIZE, OLDPIN, PIN) \
   ((PIN) || (OLDPIN) || (MEMSPACE) > GOMP_OMP_PREDEF_MEMSPACE_MAX \
    ? NULL \
    : realloc (ADDR, (((void)(MEMSPACE), (void)(OLDSIZE), (SIZE)))))
#endif
#ifndef MEMSPACE_FREE
#define MEMSPACE_FREE(MEMSPACE, ADDR, SIZE, PIN) \
  if (PIN) free (((void)(MEMSPACE), (void)(SIZE), (ADDR)))
#endif
#ifndef MEMSPACE_VALIDATE
#define MEMSPACE_VALIDATE(MEMSPACE, ACCESS, PIN) \
  ((PIN) || (MEMSPACE) > GOMP_OMP_PREDEF_MEMSPACE_MAX \
   ? 0 : ((void)(MEMSPACE), (void)(ACCESS), 1))
#endif

/* Map the predefined allocators to the correct memory space.
   The index to this table is the omp_allocator_handle_t enum value.
   When the user calls omp_alloc with a predefined allocator this
   table determines what memory they get.  */
static const omp_memspace_handle_t predefined_omp_alloc_mapping[] = {
  omp_default_mem_space,   /* omp_null_allocator doesn't actually use this. */
  omp_default_mem_space,   /* omp_default_mem_alloc. */
  omp_large_cap_mem_space, /* omp_large_cap_mem_alloc. */
  omp_const_mem_space,     /* omp_const_mem_alloc. */
  omp_high_bw_mem_space,   /* omp_high_bw_mem_alloc. */
  omp_low_lat_mem_space,   /* omp_low_lat_mem_alloc. */
  omp_low_lat_mem_space,   /* omp_cgroup_mem_alloc (implementation defined). */
  omp_low_lat_mem_space,   /* omp_pteam_mem_alloc (implementation defined). */
  omp_low_lat_mem_space,   /* omp_thread_mem_alloc (implementation defined). */
};
static const omp_memspace_handle_t predefined_ompx_gnu_alloc_mapping[] = {
  omp_default_mem_space,   /* ompx_gnu_pinned_mem_alloc. */
  ompx_gnu_managed_mem_space,  /* ompx_gnu_managed_mem_alloc. */
};

#define ARRAY_SIZE(A) (sizeof (A) / sizeof ((A)[0]))
_Static_assert (ARRAY_SIZE (predefined_omp_alloc_mapping)
		== omp_max_predefined_alloc + 1,
		"predefined_omp_alloc_mapping must match omp_memspace_handle_t");
_Static_assert (ARRAY_SIZE (predefined_ompx_gnu_alloc_mapping)
		== (ompx_gnu_max_predefined_alloc
		    - ompx_gnu_min_predefined_alloc) + 1,
		"predefined_ompx_gnu_alloc_mapping must match"
		" omp_memspace_handle_t");

static inline bool
predefined_allocator_p (omp_allocator_handle_t allocator)
{
  return allocator <= ompx_gnu_max_predefined_alloc;
}

static inline omp_memspace_handle_t
predefined_alloc_mapping (omp_allocator_handle_t allocator)
{
  if (allocator <= omp_max_predefined_alloc)
    return predefined_omp_alloc_mapping[allocator];
  else if (allocator >= ompx_gnu_min_predefined_alloc
	   && allocator <= ompx_gnu_max_predefined_alloc)
    {
      int index = allocator - ompx_gnu_min_predefined_alloc;
      return predefined_ompx_gnu_alloc_mapping[index];
    }
  else
    /* This should never happen.  */
    return omp_default_mem_space;
}

enum gomp_numa_memkind_kind
{
  GOMP_MEMKIND_NONE = 0,
#define GOMP_MEMKIND_KINDS \
  GOMP_MEMKIND_KIND (HBW_INTERLEAVE),		\
  GOMP_MEMKIND_KIND (HBW_PREFERRED),		\
  GOMP_MEMKIND_KIND (DAX_KMEM_ALL),		\
  GOMP_MEMKIND_KIND (DAX_KMEM),			\
  GOMP_MEMKIND_KIND (INTERLEAVE),		\
  GOMP_MEMKIND_KIND (DEFAULT)
#define GOMP_MEMKIND_KIND(kind) GOMP_MEMKIND_##kind
  GOMP_MEMKIND_KINDS,
#undef GOMP_MEMKIND_KIND
  GOMP_MEMKIND_COUNT,
  GOMP_MEMKIND_LIBNUMA = GOMP_MEMKIND_COUNT
};

struct omp_allocator_data
{
  omp_memspace_handle_t memspace;
  omp_uintptr_t alignment;
  omp_uintptr_t pool_size;
  omp_uintptr_t used_pool_size;
  omp_allocator_handle_t fb_data;
  unsigned int sync_hint : 8;
  unsigned int access : 8;
  unsigned int fallback : 8;
  unsigned int pinned : 1;
  unsigned int partition : 7;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
  unsigned int memkind : 8;
#endif
#ifndef HAVE_SYNC_BUILTINS
  gomp_mutex_t lock;
#endif
};

struct omp_mem_header
{
  void *ptr;
  size_t size;
  omp_allocator_handle_t allocator;
  void *pad;
};

struct gomp_libnuma_data
{
  void *numa_handle;
  void *(*numa_alloc_local) (size_t);
  void *(*numa_realloc) (void *, size_t, size_t);
  void (*numa_free) (void *, size_t);
};

struct gomp_memkind_data
{
  void *memkind_handle;
  void *(*memkind_malloc) (void *, size_t);
  void *(*memkind_calloc) (void *, size_t, size_t);
  void *(*memkind_realloc) (void *, void *, size_t);
  void (*memkind_free) (void *, void *);
  int (*memkind_check_available) (void *);
  void **kinds[GOMP_MEMKIND_COUNT];
};

#ifdef LIBGOMP_USE_LIBNUMA
static struct gomp_libnuma_data *libnuma_data;
static pthread_once_t libnuma_data_once = PTHREAD_ONCE_INIT;

static void
gomp_init_libnuma (void)
{
  void *handle = dlopen ("libnuma.so.1", RTLD_LAZY);
  struct gomp_libnuma_data *data;

  data = calloc (1, sizeof (struct gomp_libnuma_data));
  if (data == NULL)
    {
      if (handle)
	dlclose (handle);
      return;
    }
  if (handle)
    {
      int (*numa_available) (void);
      numa_available
	= (__typeof (numa_available)) dlsym (handle, "numa_available");
      if (!numa_available || numa_available () != 0)
	{
	  dlclose (handle);
	  handle = NULL;
	}
    }
  if (!handle)
    {
      __atomic_store_n (&libnuma_data, data, MEMMODEL_RELEASE);
      return;
    }
  data->numa_handle = handle;
  data->numa_alloc_local
    = (__typeof (data->numa_alloc_local)) dlsym (handle, "numa_alloc_local");
  data->numa_realloc
    = (__typeof (data->numa_realloc)) dlsym (handle, "numa_realloc");
  data->numa_free
    = (__typeof (data->numa_free)) dlsym (handle, "numa_free");
  __atomic_store_n (&libnuma_data, data, MEMMODEL_RELEASE);
}

static struct gomp_libnuma_data *
gomp_get_libnuma (void)
{
  struct gomp_libnuma_data *data
    = __atomic_load_n (&libnuma_data, MEMMODEL_ACQUIRE);
  if (data)
    return data;
  pthread_once (&libnuma_data_once, gomp_init_libnuma);
  return __atomic_load_n (&libnuma_data, MEMMODEL_ACQUIRE);
}
#endif

#ifdef LIBGOMP_USE_MEMKIND
static struct gomp_memkind_data *memkind_data;
static pthread_once_t memkind_data_once = PTHREAD_ONCE_INIT;

static void
gomp_init_memkind (void)
{
  void *handle = dlopen ("libmemkind.so.0", RTLD_LAZY);
  struct gomp_memkind_data *data;
  int i;
  static const char *kinds[] = {
    NULL,
#define GOMP_MEMKIND_KIND(kind) "MEMKIND_" #kind
    GOMP_MEMKIND_KINDS
#undef GOMP_MEMKIND_KIND
  };

  data = calloc (1, sizeof (struct gomp_memkind_data));
  if (data == NULL)
    {
      if (handle)
	dlclose (handle);
      return;
    }
  if (!handle)
    {
      __atomic_store_n (&memkind_data, data, MEMMODEL_RELEASE);
      return;
    }
  data->memkind_handle = handle;
  data->memkind_malloc
    = (__typeof (data->memkind_malloc)) dlsym (handle, "memkind_malloc");
  data->memkind_calloc
    = (__typeof (data->memkind_calloc)) dlsym (handle, "memkind_calloc");
  data->memkind_realloc
    = (__typeof (data->memkind_realloc)) dlsym (handle, "memkind_realloc");
  data->memkind_free
    = (__typeof (data->memkind_free)) dlsym (handle, "memkind_free");
  data->memkind_check_available
    = (__typeof (data->memkind_check_available))
      dlsym (handle, "memkind_check_available");
  if (data->memkind_malloc
      && data->memkind_calloc
      && data->memkind_realloc
      && data->memkind_free
      && data->memkind_check_available)
    for (i = 1; i < GOMP_MEMKIND_COUNT; ++i)
      {
	data->kinds[i] = (void **) dlsym (handle, kinds[i]);
	if (data->kinds[i] && data->memkind_check_available (*data->kinds[i]))
	  data->kinds[i] = NULL;
      }
  __atomic_store_n (&memkind_data, data, MEMMODEL_RELEASE);
}

static struct gomp_memkind_data *
gomp_get_memkind (void)
{
  struct gomp_memkind_data *data
    = __atomic_load_n (&memkind_data, MEMMODEL_ACQUIRE);
  if (data)
    return data;
  pthread_once (&memkind_data_once, gomp_init_memkind);
  return __atomic_load_n (&memkind_data, MEMMODEL_ACQUIRE);
}
#endif

omp_allocator_handle_t
omp_init_allocator (omp_memspace_handle_t memspace, int ntraits,
		    const omp_alloctrait_t traits[])
{
  struct omp_allocator_data data
    = { memspace, 1, ~(uintptr_t) 0, 0, 0, omp_atv_contended, omp_atv_all,
	omp_atv_default_mem_fb, omp_atv_false, omp_atv_environment,
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
	GOMP_MEMKIND_NONE
#endif
      };
  struct omp_allocator_data *ret;
  int i;

  if (memspace > omp_max_predefined_mem_space
      && (memspace < ompx_gnu_min_predefined_mem_space
	  || memspace > ompx_gnu_max_predefined_mem_space))
    return omp_null_allocator;
  for (i = 0; i < ntraits; i++)
    switch (traits[i].key)
      {
      case omp_atk_sync_hint:
	switch (traits[i].value)
	  {
	  case omp_atv_default:
	    data.sync_hint = omp_atv_contended;
	    break;
	  case omp_atv_contended:
	  case omp_atv_uncontended:
	  case omp_atv_serialized:
	  case omp_atv_private:
	    data.sync_hint = traits[i].value;
	    break;
	  default:
	    return omp_null_allocator;
	  }
	break;
      case omp_atk_alignment:
        if (traits[i].value == omp_atv_default)
	  {
	    data.alignment = 1;
	    break;
	  }
	if ((traits[i].value & (traits[i].value - 1)) != 0
	    || !traits[i].value)
	  return omp_null_allocator;
	data.alignment = traits[i].value;
	break;
      case omp_atk_access:
	switch (traits[i].value)
	  {
	  case omp_atv_default:
	    data.access = omp_atv_all;
	    break;
	  case omp_atv_all:
	  case omp_atv_cgroup:
	  case omp_atv_pteam:
	  case omp_atv_thread:
	    data.access = traits[i].value;
	    break;
	  default:
	    return omp_null_allocator;
	  }
	break;
      case omp_atk_pool_size:
	if (traits[i].value == omp_atv_default)
	  data.pool_size = ~(uintptr_t) 0;
	else
	  data.pool_size = traits[i].value;
	break;
      case omp_atk_fallback:
	switch (traits[i].value)
	  {
	  case omp_atv_default:
	    data.fallback = omp_atv_default_mem_fb;
	    break;
	  case omp_atv_default_mem_fb:
	  case omp_atv_null_fb:
	  case omp_atv_abort_fb:
	  case omp_atv_allocator_fb:
	    data.fallback = traits[i].value;
	    break;
	  default:
	    return omp_null_allocator;
	  }
	break;
      case omp_atk_fb_data:
	data.fb_data = traits[i].value;
	break;
      case omp_atk_pinned:
	switch (traits[i].value)
	  {
	  case omp_atv_default:
	  case omp_atv_false:
	    data.pinned = omp_atv_false;
	    break;
	  case omp_atv_true:
	    data.pinned = omp_atv_true;
	    break;
	  default:
	    return omp_null_allocator;
	  }
	break;
      case omp_atk_partition:
	switch (traits[i].value)
	  {
	  case omp_atv_default:
	    data.partition = omp_atv_environment;
	    break;
	  case omp_atv_environment:
	  case omp_atv_nearest:
	  case omp_atv_blocked:
	  case omp_atv_interleaved:
	    data.partition = traits[i].value;
	    break;
	  default:
	    return omp_null_allocator;
	  }
	break;
      default:
	return omp_null_allocator;
      }

  if (data.alignment < sizeof (void *))
    data.alignment = sizeof (void *);

  switch (memspace)
    {
#ifdef LIBGOMP_USE_MEMKIND
    case omp_high_bw_mem_space:
      struct gomp_memkind_data *memkind_data;
      memkind_data = gomp_get_memkind ();
      if (data.partition == omp_atv_interleaved
	  && memkind_data->kinds[GOMP_MEMKIND_HBW_INTERLEAVE])
	{
	  data.memkind = GOMP_MEMKIND_HBW_INTERLEAVE;
	  break;
	}
      else if (memkind_data->kinds[GOMP_MEMKIND_HBW_PREFERRED])
	{
	  data.memkind = GOMP_MEMKIND_HBW_PREFERRED;
	  break;
	}
      break;
    case omp_large_cap_mem_space:
      memkind_data = gomp_get_memkind ();
      if (memkind_data->kinds[GOMP_MEMKIND_DAX_KMEM_ALL])
	data.memkind = GOMP_MEMKIND_DAX_KMEM_ALL;
      else if (memkind_data->kinds[GOMP_MEMKIND_DAX_KMEM])
	data.memkind = GOMP_MEMKIND_DAX_KMEM;
      break;
#endif
    default:
#ifdef LIBGOMP_USE_MEMKIND
      if (data.partition == omp_atv_interleaved)
	{
	  memkind_data = gomp_get_memkind ();
	  if (memkind_data->kinds[GOMP_MEMKIND_INTERLEAVE])
	    data.memkind = GOMP_MEMKIND_INTERLEAVE;
	}
#endif
      break;
    }

#ifdef LIBGOMP_USE_LIBNUMA
  if (data.memkind == GOMP_MEMKIND_NONE && data.partition == omp_atv_nearest)
    {
      libnuma_data = gomp_get_libnuma ();
      if (libnuma_data->numa_alloc_local != NULL)
	data.memkind = GOMP_MEMKIND_LIBNUMA;
    }
#endif

  /* Reject unsupported memory spaces.  */
  if (!MEMSPACE_VALIDATE (data.memspace, data.access, data.pinned))
    return omp_null_allocator;

  ret = gomp_malloc (sizeof (struct omp_allocator_data));
  *ret = data;
#ifndef HAVE_SYNC_BUILTINS
  gomp_mutex_init (&ret->lock);
#endif
  return (omp_allocator_handle_t) ret;
}

void
omp_destroy_allocator (omp_allocator_handle_t allocator)
{
  if (allocator != omp_null_allocator)
    {
#ifndef HAVE_SYNC_BUILTINS
      gomp_mutex_destroy (&((struct omp_allocator_data *) allocator)->lock);
#endif
      free ((void *) allocator);
    }
}

ialias (omp_init_allocator)
ialias (omp_destroy_allocator)

void *
omp_aligned_alloc (size_t alignment, size_t size,
		   omp_allocator_handle_t allocator)
{
  struct omp_allocator_data *allocator_data;
  size_t new_size, new_alignment;
  void *ptr, *ret;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
  enum gomp_numa_memkind_kind memkind;
#endif

  if (__builtin_expect (size == 0, 0))
    return NULL;

retry:
  new_alignment = alignment;
  if (allocator == omp_null_allocator)
    {
      struct gomp_thread *thr = gomp_thread ();
      if (thr->ts.def_allocator == omp_null_allocator)
	thr->ts.def_allocator = gomp_def_allocator;
      allocator = (omp_allocator_handle_t) thr->ts.def_allocator;
    }

  if (!predefined_allocator_p (allocator))
    {
      allocator_data = (struct omp_allocator_data *) allocator;
      if (new_alignment < allocator_data->alignment)
	new_alignment = allocator_data->alignment;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      memkind = allocator_data->memkind;
#endif
    }
  else
    {
      allocator_data = NULL;
      if (new_alignment < sizeof (void *))
	new_alignment = sizeof (void *);
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      memkind = GOMP_MEMKIND_NONE;
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (allocator == omp_high_bw_mem_alloc)
	memkind = GOMP_MEMKIND_HBW_PREFERRED;
      else if (allocator == omp_large_cap_mem_alloc)
	memkind = GOMP_MEMKIND_DAX_KMEM_ALL;
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  if (!memkind_data->kinds[memkind])
	    memkind = GOMP_MEMKIND_NONE;
	}
#endif
    }

  new_size = sizeof (struct omp_mem_header);
  if (new_alignment > sizeof (void *))
    new_size += new_alignment - sizeof (void *);
  if (__builtin_add_overflow (size, new_size, &new_size))
    goto fail;
#ifdef OMP_LOW_LAT_MEM_ALLOC_INVALID
  if (allocator == omp_low_lat_mem_alloc)
    goto fail;
#endif

  if (__builtin_expect (allocator_data
			&& allocator_data->pool_size < ~(uintptr_t) 0, 0))
    {
      uintptr_t used_pool_size;
      if (new_size > allocator_data->pool_size)
	goto fail;
#ifdef HAVE_SYNC_BUILTINS
      used_pool_size = __atomic_load_n (&allocator_data->used_pool_size,
					MEMMODEL_RELAXED);
      do
	{
	  uintptr_t new_pool_size;
	  if (__builtin_add_overflow (used_pool_size, new_size,
				      &new_pool_size)
	      || new_pool_size > allocator_data->pool_size)
	    goto fail;
	  if (__atomic_compare_exchange_n (&allocator_data->used_pool_size,
					   &used_pool_size, new_pool_size,
					   true, MEMMODEL_RELAXED,
					   MEMMODEL_RELAXED))
	    break;
	}
      while (1);
#else
      gomp_mutex_lock (&allocator_data->lock);
      if (__builtin_add_overflow (allocator_data->used_pool_size, new_size,
				  &used_pool_size)
	  || used_pool_size > allocator_data->pool_size)
	{
	  gomp_mutex_unlock (&allocator_data->lock);
	  goto fail;
	}
      allocator_data->used_pool_size = used_pool_size;
      gomp_mutex_unlock (&allocator_data->lock);
#endif
#ifdef LIBGOMP_USE_LIBNUMA
      if (memkind == GOMP_MEMKIND_LIBNUMA)
	ptr = libnuma_data->numa_alloc_local (new_size);
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[memkind];
	  ptr = memkind_data->memkind_malloc (kind, new_size);
	}
      else
#endif
	ptr = MEMSPACE_ALLOC (allocator_data->memspace, new_size,
			      allocator_data->pinned);
      if (ptr == NULL)
	{
#ifdef HAVE_SYNC_BUILTINS
	  __atomic_add_fetch (&allocator_data->used_pool_size, -new_size,
			      MEMMODEL_RELAXED);
#else
	  gomp_mutex_lock (&allocator_data->lock);
	  allocator_data->used_pool_size -= new_size;
	  gomp_mutex_unlock (&allocator_data->lock);
#endif
	  goto fail;
	}
    }
  else
    {
#ifdef LIBGOMP_USE_LIBNUMA
      if (memkind == GOMP_MEMKIND_LIBNUMA)
	ptr = libnuma_data->numa_alloc_local (new_size);
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[memkind];
	  ptr = memkind_data->memkind_malloc (kind, new_size);
	}
      else
#endif
	{
	  omp_memspace_handle_t memspace;
	  memspace = (allocator_data
		      ? allocator_data->memspace
		      : predefined_alloc_mapping (allocator));
	  int pinned = (allocator_data
			? allocator_data->pinned
			: allocator == ompx_gnu_pinned_mem_alloc);
	  ptr = MEMSPACE_ALLOC (memspace, new_size, pinned);
	}
      if (ptr == NULL)
	goto fail;
    }

  if (new_alignment > sizeof (void *))
    ret = (void *) (((uintptr_t) ptr
		     + sizeof (struct omp_mem_header)
		     + new_alignment - sizeof (void *))
		    & ~(new_alignment - 1));
  else
    ret = (char *) ptr + sizeof (struct omp_mem_header);
  ((struct omp_mem_header *) ret)[-1].ptr = ptr;
  ((struct omp_mem_header *) ret)[-1].size = new_size;
  ((struct omp_mem_header *) ret)[-1].allocator = allocator;
  return ret;

fail:;
  int fallback = (allocator_data
		  ? allocator_data->fallback
		  : (allocator == omp_default_mem_alloc
		     || allocator == ompx_gnu_pinned_mem_alloc)
		  ? omp_atv_null_fb
		  : omp_atv_default_mem_fb);
  switch (fallback)
    {
    case omp_atv_default_mem_fb:
      allocator = omp_default_mem_alloc;
      goto retry;
    case omp_atv_null_fb:
      break;
    default:
    case omp_atv_abort_fb:
      gomp_fatal ("Out of memory allocating %lu bytes",
		  (unsigned long) size);
    case omp_atv_allocator_fb:
      allocator = allocator_data->fb_data;
      goto retry;
    }
  return NULL;
}

ialias (omp_aligned_alloc)

void *
omp_alloc (size_t size, omp_allocator_handle_t allocator)
{
  return ialias_call (omp_aligned_alloc) (1, size, allocator);
}

/* Like omp_aligned_alloc, but apply on top of that:
   "For allocations that arise from this ... the null_fb value of the
   fallback allocator trait behaves as if the abort_fb had been specified."  */

void *
GOMP_alloc (size_t alignment, size_t size, uintptr_t allocator)
{
  void *ret
    = ialias_call (omp_aligned_alloc) (alignment, size,
				       (omp_allocator_handle_t) allocator);
  if (__builtin_expect (ret == NULL, 0) && size)
    gomp_fatal ("Out of memory allocating %lu bytes",
		(unsigned long) size);
  return ret;
}

void
omp_free (void *ptr, omp_allocator_handle_t allocator)
{
  struct omp_mem_header *data;
  omp_memspace_handle_t memspace = omp_default_mem_space;
  int pinned = false;

  if (ptr == NULL)
    return;
  (void) allocator;
  data = &((struct omp_mem_header *) ptr)[-1];
  if (!predefined_allocator_p (data->allocator))
    {
      struct omp_allocator_data *allocator_data
	= (struct omp_allocator_data *) (data->allocator);
      if (allocator_data->pool_size < ~(uintptr_t) 0)
	{
#ifdef HAVE_SYNC_BUILTINS
	  __atomic_add_fetch (&allocator_data->used_pool_size, -data->size,
			      MEMMODEL_RELAXED);
#else
	  gomp_mutex_lock (&allocator_data->lock);
	  allocator_data->used_pool_size -= data->size;
	  gomp_mutex_unlock (&allocator_data->lock);
#endif
	}
#ifdef LIBGOMP_USE_LIBNUMA
      if (allocator_data->memkind == GOMP_MEMKIND_LIBNUMA)
	{
	  libnuma_data->numa_free (data->ptr, data->size);
	  return;
	}
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (allocator_data->memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[allocator_data->memkind];
	  memkind_data->memkind_free (kind, data->ptr);
	  return;
	}
#endif

      memspace = allocator_data->memspace;
      pinned = allocator_data->pinned;
    }
  else
    {
#ifdef LIBGOMP_USE_MEMKIND
      enum gomp_numa_memkind_kind memkind = GOMP_MEMKIND_NONE;
      if (data->allocator == omp_high_bw_mem_alloc)
	memkind = GOMP_MEMKIND_HBW_PREFERRED;
      else if (data->allocator == omp_large_cap_mem_alloc)
	memkind = GOMP_MEMKIND_DAX_KMEM_ALL;
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  if (memkind_data->kinds[memkind])
	    {
	      void *kind = *memkind_data->kinds[memkind];
	      memkind_data->memkind_free (kind, data->ptr);
	      return;
	    }
	}
#endif

      memspace = predefined_alloc_mapping (data->allocator);
      pinned = (data->allocator == ompx_gnu_pinned_mem_alloc);
    }

  MEMSPACE_FREE (memspace, data->ptr, data->size, pinned);
}

ialias (omp_free)

void
GOMP_free (void *ptr, uintptr_t allocator)
{
  return ialias_call (omp_free) (ptr, (omp_allocator_handle_t) allocator);
}

void *
omp_aligned_calloc (size_t alignment, size_t nmemb, size_t size,
		    omp_allocator_handle_t allocator)
{
  struct omp_allocator_data *allocator_data;
  size_t new_size, size_temp, new_alignment;
  void *ptr, *ret;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
  enum gomp_numa_memkind_kind memkind;
#endif

  if (__builtin_expect (size == 0 || nmemb == 0, 0))
    return NULL;

retry:
  new_alignment = alignment;
  if (allocator == omp_null_allocator)
    {
      struct gomp_thread *thr = gomp_thread ();
      if (thr->ts.def_allocator == omp_null_allocator)
	thr->ts.def_allocator = gomp_def_allocator;
      allocator = (omp_allocator_handle_t) thr->ts.def_allocator;
    }

  if (!predefined_allocator_p (allocator))
    {
      allocator_data = (struct omp_allocator_data *) allocator;
      if (new_alignment < allocator_data->alignment)
	new_alignment = allocator_data->alignment;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      memkind = allocator_data->memkind;
#endif
    }
  else
    {
      allocator_data = NULL;
      if (new_alignment < sizeof (void *))
	new_alignment = sizeof (void *);
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      memkind = GOMP_MEMKIND_NONE;
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (allocator == omp_high_bw_mem_alloc)
	memkind = GOMP_MEMKIND_HBW_PREFERRED;
      else if (allocator == omp_large_cap_mem_alloc)
	memkind = GOMP_MEMKIND_DAX_KMEM_ALL;
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  if (!memkind_data->kinds[memkind])
	    memkind = GOMP_MEMKIND_NONE;
	}
#endif
    }

  new_size = sizeof (struct omp_mem_header);
  if (new_alignment > sizeof (void *))
    new_size += new_alignment - sizeof (void *);
  if (__builtin_mul_overflow (size, nmemb, &size_temp))
    goto fail;
  if (__builtin_add_overflow (size_temp, new_size, &new_size))
    goto fail;
#ifdef OMP_LOW_LAT_MEM_ALLOC_INVALID
  if (allocator == omp_low_lat_mem_alloc)
    goto fail;
#endif

  if (__builtin_expect (allocator_data
			&& allocator_data->pool_size < ~(uintptr_t) 0, 0))
    {
      uintptr_t used_pool_size;
      if (new_size > allocator_data->pool_size)
	goto fail;
#ifdef HAVE_SYNC_BUILTINS
      used_pool_size = __atomic_load_n (&allocator_data->used_pool_size,
					MEMMODEL_RELAXED);
      do
	{
	  uintptr_t new_pool_size;
	  if (__builtin_add_overflow (used_pool_size, new_size,
				      &new_pool_size)
	      || new_pool_size > allocator_data->pool_size)
	    goto fail;
	  if (__atomic_compare_exchange_n (&allocator_data->used_pool_size,
					   &used_pool_size, new_pool_size,
					   true, MEMMODEL_RELAXED,
					   MEMMODEL_RELAXED))
	    break;
	}
      while (1);
#else
      gomp_mutex_lock (&allocator_data->lock);
      if (__builtin_add_overflow (allocator_data->used_pool_size, new_size,
				  &used_pool_size)
	  || used_pool_size > allocator_data->pool_size)
	{
	  gomp_mutex_unlock (&allocator_data->lock);
	  goto fail;
	}
      allocator_data->used_pool_size = used_pool_size;
      gomp_mutex_unlock (&allocator_data->lock);
#endif
#ifdef LIBGOMP_USE_LIBNUMA
      if (memkind == GOMP_MEMKIND_LIBNUMA)
	/* numa_alloc_local uses mmap with MAP_ANONYMOUS, returning
	   memory that is initialized to zero.  */
	ptr = libnuma_data->numa_alloc_local (new_size);
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[memkind];
	  ptr = memkind_data->memkind_calloc (kind, 1, new_size);
	}
      else
#endif
	ptr = MEMSPACE_CALLOC (allocator_data->memspace, new_size,
			       allocator_data->pinned);
      if (ptr == NULL)
	{
#ifdef HAVE_SYNC_BUILTINS
	  __atomic_add_fetch (&allocator_data->used_pool_size, -new_size,
			      MEMMODEL_RELAXED);
#else
	  gomp_mutex_lock (&allocator_data->lock);
	  allocator_data->used_pool_size -= new_size;
	  gomp_mutex_unlock (&allocator_data->lock);
#endif
	  goto fail;
	}
    }
  else
    {
#ifdef LIBGOMP_USE_LIBNUMA
      if (memkind == GOMP_MEMKIND_LIBNUMA)
	/* numa_alloc_local uses mmap with MAP_ANONYMOUS, returning
	   memory that is initialized to zero.  */
	ptr = libnuma_data->numa_alloc_local (new_size);
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[memkind];
	  ptr = memkind_data->memkind_calloc (kind, 1, new_size);
	}
      else
#endif
	{
	  omp_memspace_handle_t memspace;
	  memspace = (allocator_data
		      ? allocator_data->memspace
		      : predefined_alloc_mapping (allocator));
	  int pinned = (allocator_data
			? allocator_data->pinned
			: allocator == ompx_gnu_pinned_mem_alloc);
	  ptr = MEMSPACE_CALLOC (memspace, new_size, pinned);
	}
      if (ptr == NULL)
	goto fail;
    }

  if (new_alignment > sizeof (void *))
    ret = (void *) (((uintptr_t) ptr
		     + sizeof (struct omp_mem_header)
		     + new_alignment - sizeof (void *))
		    & ~(new_alignment - 1));
  else
    ret = (char *) ptr + sizeof (struct omp_mem_header);
  ((struct omp_mem_header *) ret)[-1].ptr = ptr;
  ((struct omp_mem_header *) ret)[-1].size = new_size;
  ((struct omp_mem_header *) ret)[-1].allocator = allocator;
  return ret;

fail:;
  int fallback = (allocator_data
		  ? allocator_data->fallback
		  : (allocator == omp_default_mem_alloc
		     || allocator == ompx_gnu_pinned_mem_alloc)
		  ? omp_atv_null_fb
		  : omp_atv_default_mem_fb);
  switch (fallback)
    {
    case omp_atv_default_mem_fb:
      allocator = omp_default_mem_alloc;
      goto retry;
    case omp_atv_null_fb:
      break;
    default:
    case omp_atv_abort_fb:
      gomp_fatal ("Out of memory allocating %lu bytes",
		  (unsigned long) (size * nmemb));
    case omp_atv_allocator_fb:
      allocator = allocator_data->fb_data;
      goto retry;
    }
  return NULL;
}

ialias (omp_aligned_calloc)

void *
omp_calloc (size_t nmemb, size_t size, omp_allocator_handle_t allocator)
{
  return ialias_call (omp_aligned_calloc) (1, nmemb, size, allocator);
}

void *
omp_realloc (void *ptr, size_t size, omp_allocator_handle_t allocator,
	     omp_allocator_handle_t free_allocator)
{
  struct omp_allocator_data *allocator_data, *free_allocator_data;
  size_t new_size, old_size, new_alignment, old_alignment;
  void *new_ptr, *ret;
  struct omp_mem_header *data;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
  enum gomp_numa_memkind_kind memkind, free_memkind;
#endif

  if (__builtin_expect (ptr == NULL, 0))
    return ialias_call (omp_aligned_alloc) (1, size, allocator);

  if (__builtin_expect (size == 0, 0))
    {
      ialias_call (omp_free) (ptr, free_allocator);
      return NULL;
    }

  data = &((struct omp_mem_header *) ptr)[-1];
  free_allocator = data->allocator;

retry:
  new_alignment = sizeof (void *);
  if (allocator == omp_null_allocator)
    allocator = free_allocator;

  if (!predefined_allocator_p (allocator))
    {
      allocator_data = (struct omp_allocator_data *) allocator;
      if (new_alignment < allocator_data->alignment)
	new_alignment = allocator_data->alignment;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      memkind = allocator_data->memkind;
#endif
    }
  else
    {
      allocator_data = NULL;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      memkind = GOMP_MEMKIND_NONE;
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (allocator == omp_high_bw_mem_alloc)
	memkind = GOMP_MEMKIND_HBW_PREFERRED;
      else if (allocator == omp_large_cap_mem_alloc)
	memkind = GOMP_MEMKIND_DAX_KMEM_ALL;
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  if (!memkind_data->kinds[memkind])
	    memkind = GOMP_MEMKIND_NONE;
	}
#endif
    }
  if (!predefined_allocator_p (free_allocator))
    {
      free_allocator_data = (struct omp_allocator_data *) free_allocator;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      free_memkind = free_allocator_data->memkind;
#endif
    }
  else
    {
      free_allocator_data = NULL;
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
      free_memkind = GOMP_MEMKIND_NONE;
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (free_allocator == omp_high_bw_mem_alloc)
	free_memkind = GOMP_MEMKIND_HBW_PREFERRED;
      else if (free_allocator == omp_large_cap_mem_alloc)
	free_memkind = GOMP_MEMKIND_DAX_KMEM_ALL;
      if (free_memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  if (!memkind_data->kinds[free_memkind])
	    free_memkind = GOMP_MEMKIND_NONE;
	}
#endif
    }
  old_alignment = (uintptr_t) ptr - (uintptr_t) (data->ptr);

  new_size = sizeof (struct omp_mem_header);
  if (new_alignment > sizeof (void *))
    new_size += new_alignment - sizeof (void *);
  if (__builtin_add_overflow (size, new_size, &new_size))
    goto fail;
  old_size = data->size;
#ifdef OMP_LOW_LAT_MEM_ALLOC_INVALID
  if (allocator == omp_low_lat_mem_alloc)
    goto fail;
#endif

  if (__builtin_expect (allocator_data
			&& allocator_data->pool_size < ~(uintptr_t) 0, 0))
    {
      uintptr_t used_pool_size;
      size_t prev_size = 0;
      /* Check if we can use realloc.  Don't use it if extra alignment
	 was used previously or newly, because realloc might return a pointer
	 with different alignment and then we'd need to memmove the data
	 again.  */
      if (free_allocator_data
	  && free_allocator_data == allocator_data
	  && new_alignment == sizeof (void *)
	  && old_alignment == sizeof (struct omp_mem_header))
	prev_size = old_size;
      if (new_size > prev_size
	  && new_size - prev_size > allocator_data->pool_size)
	goto fail;
#ifdef HAVE_SYNC_BUILTINS
      used_pool_size = __atomic_load_n (&allocator_data->used_pool_size,
					MEMMODEL_RELAXED);
      do
	{
	  uintptr_t new_pool_size;
	  if (new_size > prev_size)
	    {
	      if (__builtin_add_overflow (used_pool_size, new_size - prev_size,
					  &new_pool_size)
		  || new_pool_size > allocator_data->pool_size)
		goto fail;
	    }
	  else
	    new_pool_size = used_pool_size + new_size - prev_size;
	  if (__atomic_compare_exchange_n (&allocator_data->used_pool_size,
					   &used_pool_size, new_pool_size,
					   true, MEMMODEL_RELAXED,
					   MEMMODEL_RELAXED))
	    break;
	}
      while (1);
#else
      gomp_mutex_lock (&allocator_data->lock);
      if (new_size > prev_size)
	{
	  if (__builtin_add_overflow (allocator_data->used_pool_size,
				      new_size - prev_size,
				      &used_pool_size)
	      || used_pool_size > allocator_data->pool_size)
	    {
	      gomp_mutex_unlock (&allocator_data->lock);
	      goto fail;
	    }
	}
      else
	used_pool_size = (allocator_data->used_pool_size
			  + new_size - prev_size);
      allocator_data->used_pool_size = used_pool_size;
      gomp_mutex_unlock (&allocator_data->lock);
#endif
#ifdef LIBGOMP_USE_LIBNUMA
      if (memkind == GOMP_MEMKIND_LIBNUMA)
	{
	  if (prev_size)
	    new_ptr = libnuma_data->numa_realloc (data->ptr, data->size,
						  new_size);
	  else
	    new_ptr = libnuma_data->numa_alloc_local (new_size);
	}
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[memkind];
	  if (prev_size)
	    new_ptr = memkind_data->memkind_realloc (kind, data->ptr,
						     new_size);
	  else
	    new_ptr = memkind_data->memkind_malloc (kind, new_size);
	}
      else
#endif
      if (prev_size)
	{
	  int was_pinned = (free_allocator_data
			    ? free_allocator_data->pinned
			    : free_allocator == ompx_gnu_pinned_mem_alloc);
	  new_ptr = MEMSPACE_REALLOC (allocator_data->memspace, data->ptr,
				      data->size, new_size, was_pinned,
				      allocator_data->pinned);
	}
      else
	new_ptr = MEMSPACE_ALLOC (allocator_data->memspace, new_size,
				  allocator_data->pinned);
      if (new_ptr == NULL)
	{
#ifdef HAVE_SYNC_BUILTINS
	  __atomic_add_fetch (&allocator_data->used_pool_size,
			      prev_size - new_size,
			      MEMMODEL_RELAXED);
#else
	  gomp_mutex_lock (&allocator_data->lock);
	  allocator_data->used_pool_size -= new_size - prev_size;
	  gomp_mutex_unlock (&allocator_data->lock);
#endif
	  goto fail;
	}
      else if (prev_size)
	{
	  ret = (char *) new_ptr + sizeof (struct omp_mem_header);
	  ((struct omp_mem_header *) ret)[-1].ptr = new_ptr;
	  ((struct omp_mem_header *) ret)[-1].size = new_size;
	  ((struct omp_mem_header *) ret)[-1].allocator = allocator;
	  return ret;
	}
    }
  else if (new_alignment == sizeof (void *)
	   && old_alignment == sizeof (struct omp_mem_header)
#if defined(LIBGOMP_USE_MEMKIND) || defined(LIBGOMP_USE_LIBNUMA)
	   && memkind == free_memkind
#endif
	   && (free_allocator_data == NULL
	       || free_allocator_data->pool_size == ~(uintptr_t) 0))
    {
#ifdef LIBGOMP_USE_LIBNUMA
      if (memkind == GOMP_MEMKIND_LIBNUMA)
	new_ptr = libnuma_data->numa_realloc (data->ptr, data->size, new_size);
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[memkind];
	  new_ptr = memkind_data->memkind_realloc (kind, data->ptr,
						   new_size);
	}
      else
#endif
	{
	  omp_memspace_handle_t memspace;
	  memspace = (allocator_data
		      ? allocator_data->memspace
		      : predefined_alloc_mapping (allocator));
	  int was_pinned = (free_allocator_data
			    ? free_allocator_data->pinned
			    : free_allocator == ompx_gnu_pinned_mem_alloc);
	  int pinned = (allocator_data
			? allocator_data->pinned
			: allocator == ompx_gnu_pinned_mem_alloc);
	  new_ptr = MEMSPACE_REALLOC (memspace, data->ptr, data->size, new_size,
				      was_pinned, pinned);
	}
      if (new_ptr == NULL)
	goto fail;

      ret = (char *) new_ptr + sizeof (struct omp_mem_header);
      ((struct omp_mem_header *) ret)[-1].ptr = new_ptr;
      ((struct omp_mem_header *) ret)[-1].size = new_size;
      ((struct omp_mem_header *) ret)[-1].allocator = allocator;
      return ret;
    }
  else
    {
#ifdef LIBGOMP_USE_LIBNUMA
      if (memkind == GOMP_MEMKIND_LIBNUMA)
	new_ptr = libnuma_data->numa_alloc_local (new_size);
# ifdef LIBGOMP_USE_MEMKIND
      else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
      if (memkind)
	{
	  struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
	  void *kind = *memkind_data->kinds[memkind];
	  new_ptr = memkind_data->memkind_malloc (kind, new_size);
	}
      else
#endif
	{
	  omp_memspace_handle_t memspace;
	  memspace = (allocator_data
		      ? allocator_data->memspace
		      : predefined_alloc_mapping (allocator));
	  int pinned = (allocator_data
			? allocator_data->pinned
			: allocator == ompx_gnu_pinned_mem_alloc);
	  new_ptr = MEMSPACE_ALLOC (memspace, new_size, pinned);
	}
      if (new_ptr == NULL)
	goto fail;
    }

  if (new_alignment > sizeof (void *))
    ret = (void *) (((uintptr_t) new_ptr
		     + sizeof (struct omp_mem_header)
		     + new_alignment - sizeof (void *))
		    & ~(new_alignment - 1));
  else
    ret = (char *) new_ptr + sizeof (struct omp_mem_header);
  ((struct omp_mem_header *) ret)[-1].ptr = new_ptr;
  ((struct omp_mem_header *) ret)[-1].size = new_size;
  ((struct omp_mem_header *) ret)[-1].allocator = allocator;
  if (old_size - old_alignment < size)
    size = old_size - old_alignment;
  memcpy (ret, ptr, size);
  if (__builtin_expect (free_allocator_data
			&& free_allocator_data->pool_size < ~(uintptr_t) 0, 0))
    {
#ifdef HAVE_SYNC_BUILTINS
      __atomic_add_fetch (&free_allocator_data->used_pool_size, -data->size,
			  MEMMODEL_RELAXED);
#else
      gomp_mutex_lock (&free_allocator_data->lock);
      free_allocator_data->used_pool_size -= data->size;
      gomp_mutex_unlock (&free_allocator_data->lock);
#endif
    }
#ifdef LIBGOMP_USE_LIBNUMA
  if (free_memkind == GOMP_MEMKIND_LIBNUMA)
    {
      libnuma_data->numa_free (data->ptr, data->size);
      return ret;
    }
# ifdef LIBGOMP_USE_MEMKIND
  else
# endif
#endif
#ifdef LIBGOMP_USE_MEMKIND
  if (free_memkind)
    {
      struct gomp_memkind_data *memkind_data = gomp_get_memkind ();
      void *kind = *memkind_data->kinds[free_memkind];
      memkind_data->memkind_free (kind, data->ptr);
      return ret;
    }
#endif
  {
    omp_memspace_handle_t was_memspace;
    was_memspace = (free_allocator_data
		    ? free_allocator_data->memspace
		    : predefined_alloc_mapping (free_allocator));
    int was_pinned = (free_allocator_data
		      ? free_allocator_data->pinned
		      : free_allocator == ompx_gnu_pinned_mem_alloc);
    MEMSPACE_FREE (was_memspace, data->ptr, data->size, was_pinned);
  }
  return ret;

fail:;
  int fallback = (allocator_data
		  ? allocator_data->fallback
		  : (allocator == omp_default_mem_alloc
		     || allocator == ompx_gnu_pinned_mem_alloc)
		  ? omp_atv_null_fb
		  : omp_atv_default_mem_fb);
  switch (fallback)
    {
    case omp_atv_default_mem_fb:
      allocator = omp_default_mem_alloc;
      goto retry;
    case omp_atv_null_fb:
      break;
    default:
    case omp_atv_abort_fb:
      gomp_fatal ("Out of memory allocating %lu bytes",
		  (unsigned long) size);
    case omp_atv_allocator_fb:
      allocator = allocator_data->fb_data;
      goto retry;
    }
  return NULL;
}
