blob: 4831d4cbacb2488c0b4eadcef14556d061954c5a [file] [log] [blame] [edit]
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include <amdhsa_abi.h>
#define OFFSET 8
// Atomically reserves space to the printf data buffer and returns a pointer to
// it
__global char *__printf_alloc(uint bytes) {
__constant amdhsa_implicit_kernarg_v5 *args =
(__constant amdhsa_implicit_kernarg_v5 *)
__builtin_amdgcn_implicitarg_ptr();
__global char *ptr = (__global char *)args->printf_buffer;
uint size = ((__global uint *)ptr)[1];
uint offset = __scoped_atomic_load_n((__global uint *)ptr, __ATOMIC_RELAXED,
__MEMORY_SCOPE_DEVICE);
for (;;) {
if (OFFSET + offset + bytes > size)
return NULL;
if (__scoped_atomic_compare_exchange_n(
(__global uint *)ptr, &offset, offset + bytes, false,
__ATOMIC_RELAXED, __ATOMIC_RELAXED, __MEMORY_SCOPE_DEVICE))
break;
}
return ptr + OFFSET + offset;
}