7#include "core/fxcrt/fx_memory.h"
16#include "build/build_config.h"
17#include "core/fxcrt/check_op.h"
18#include "core/fxcrt/debug/alias.h"
24#if BUILDFLAG(IS_ANDROID)
33template <
typename T,
typename = std::enable_if<std::is_integral<T>::value>>
34constexpr inline bool IsPowerOfTwo(T value) {
41 return value > 0 && (value & (value - 1)) == 0;
45#define SUPPORTS_BUILTIN_IS_ALIGNED (__has_builtin(__builtin_is_aligned))
47#define SUPPORTS_BUILTIN_IS_ALIGNED 0
50inline bool IsAligned(
void* val, size_t alignment) {
52#if SUPPORTS_BUILTIN_IS_ALIGNED
53 return __builtin_is_aligned(
reinterpret_cast<uintptr_t>(val), alignment);
55 DCHECK(IsPowerOfTwo(alignment));
56 return (
reinterpret_cast<uintptr_t>(val) & (alignment - 1)) == 0;
60#undef SUPPORTS_BUILTIN_IS_ALIGNED
67 return pdfium::internal::Alloc(byte_size, 1);
71 return pdfium::internal::Calloc(num_elems, byte_size);
75 return pdfium::internal::Realloc(pointer, new_size, 1);
85 static int make_this_function_aliased = 0xbd;
90 constexpr DWORD kOomExceptionCode = 0xe0000008;
91 ULONG_PTR exception_args[] = {size};
92 ::RaiseException(kOomExceptionCode, EXCEPTION_NONCONTINUABLE,
93 std::size(exception_args), exception_args);
102 DCHECK(IsPowerOfTwo(alignment));
103 DCHECK_EQ(alignment %
sizeof(
void*), 0u);
106 ptr = _aligned_malloc(size, alignment);
107#elif BUILDFLAG(IS_ANDROID)
113 ptr = memalign(alignment, size);
115 int ret = posix_memalign(&ptr, alignment, size);
128 DCHECK(IsAligned(ptr, alignment));
134void*
Alloc2D(size_t w, size_t h, size_t member_size) {
135 if (w >= std::numeric_limits<size_t>::max() / h) {
139 return Alloc(w * h, member_size);
143 void* result = Alloc(num_members, member_size);
151 if (w >= std::numeric_limits<size_t>::max() / h)
154 return AllocOrDie(w * h, member_size);
157 void* result = Calloc(num_members, member_size);
165 if (w >= std::numeric_limits<size_t>::max() / h)
168 return CallocOrDie(w * h, member_size);
172 void* result = Realloc(ptr, num_members, member_size);
180 void* result = StringAlloc(num_members, member_size);
NOINLINE void FX_OutOfMemoryTerminate(size_t size)
void * FXMEM_DefaultAlloc(size_t byte_size)
void * FXMEM_DefaultCalloc(size_t num_elems, size_t byte_size)
void * FX_AlignedAlloc(size_t size, size_t alignment)
void * FXMEM_DefaultRealloc(void *pointer, size_t new_size)
void FXMEM_DefaultFree(void *pointer)
void * CallocOrDie2D(size_t w, size_t h, size_t member_size)
void * AllocOrDie2D(size_t w, size_t h, size_t member_size)
void * StringAllocOrDie(size_t num_members, size_t member_size)
void * ReallocOrDie(void *ptr, size_t num_members, size_t member_size)
void * AllocOrDie(size_t num_members, size_t member_size)
void * Alloc2D(size_t w, size_t h, size_t member_size)
void * CallocOrDie(size_t num_members, size_t member_size)
void Alias(const void *var)