#include "base/memory/aligned_memory.h"
#include <bit>
#include "base/check.h"
#include "base/check_op.h"
#include "base/logging.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_ANDROID)
#include <malloc.h>
#endif
namespace base {
void* AlignedAlloc(size_t size, size_t alignment) {
DCHECK_GT(size, 0U);
DCHECK(std::has_single_bit(alignment));
DCHECK_EQ(alignment % sizeof(void*), 0U);
void* ptr = nullptr;
#if defined(COMPILER_MSVC)
ptr = _aligned_malloc(size, alignment);
#elif BUILDFLAG(IS_ANDROID)
ptr = memalign(alignment, size);
#else
int ret = posix_memalign(&ptr, alignment, size);
if (ret != 0) {
DLOG(ERROR) << "posix_memalign() returned with error " << ret;
ptr = nullptr;
}
#endif
CHECK(ptr) << "If you crashed here, your aligned allocation is incorrect: "
<< "size=" << size << ", alignment=" << alignment;
DCHECK(IsAligned(ptr, alignment));
return ptr;
}
}