//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_SRC_ALIGNED_ALLOC_H
#define _LIBCPP_SRC_ALIGNED_ALLOC_H

#include <__config>
#include <cstdlib>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

_LIBCPP_BEGIN_NAMESPACE_STD

#if _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION

// Low-level helpers to call the aligned allocation and deallocation functions
// on the target platform. This is used to implement libc++'s own memory
// allocation routines -- if you need to allocate memory inside the library,
// chances are that you want to use `__libcpp_allocate` instead.
//
// Returns the allocated memory, or `nullptr` on failure.
inline _LIBCPP_HIDE_FROM_ABI void* __libcpp_aligned_alloc(std::size_t __alignment, std::size_t __size) {
#  ifdef _WIN32
  return ::_aligned_malloc(__size, __alignment);

// Android only provides aligned_alloc when targeting API 28 or higher.
#  elif !defined(__ANDROID__) || __ANDROID_API__ >= 28
  // aligned_alloc() requires that __size is a multiple of __alignment,
  // but for C++ [new.delete.general], only states "if the value of an
  // alignment argument passed to any of these functions is not a valid
  // alignment value, the behavior is undefined".
  // To handle calls such as ::operator new(1, std::align_val_t(128)), we
  // round __size up to the next multiple of __alignment.
  size_t __rounded_size = (__size + __alignment - 1) & ~(__alignment - 1);
  // Rounding up could have wrapped around to zero, so we have to add another
  // max() ternary to the actual call site to avoid succeeded in that case.
  return ::aligned_alloc(__alignment, __size > __rounded_size ? __size : __rounded_size);
#  else
  void* __result = nullptr;
  (void)::posix_memalign(&__result, __alignment, __size);
  // If posix_memalign fails, __result is unmodified so we still return `nullptr`.
  return __result;
#  endif
}

inline _LIBCPP_HIDE_FROM_ABI void __libcpp_aligned_free(void* __ptr) {
#  ifdef _WIN32
  ::_aligned_free(__ptr);
#  else
  ::free(__ptr);
#  endif
}

#endif // _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION

_LIBCPP_END_NAMESPACE_STD

#endif // _LIBCPP_SRC_ALIGNED_ALLOC_H
