xref: /llvm-project/libc/src/__support/GPU/allocator.cpp (revision a6ef0debb1d60966b5bcc69f7d58a2b75c9c621d)
1ea697dccSJoseph Huber //===-- GPU memory allocator implementation ---------------------*- C++ -*-===//
2ea697dccSJoseph Huber //
3ea697dccSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ea697dccSJoseph Huber // See https://llvm.org/LICENSE.txt for license information.
5ea697dccSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ea697dccSJoseph Huber //
7ea697dccSJoseph Huber //===----------------------------------------------------------------------===//
8ea697dccSJoseph Huber 
9ea697dccSJoseph Huber #include "allocator.h"
10ea697dccSJoseph Huber 
11ea697dccSJoseph Huber #include "src/__support/GPU/utils.h"
12ea697dccSJoseph Huber #include "src/__support/RPC/rpc_client.h"
135ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
14ea697dccSJoseph Huber 
155ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
16ea697dccSJoseph Huber namespace {
17ea697dccSJoseph Huber 
18ea697dccSJoseph Huber void *rpc_allocate(uint64_t size) {
19ea697dccSJoseph Huber   void *ptr = nullptr;
20*a6ef0debSJoseph Huber   rpc::Client::Port port = rpc::client.open<LIBC_MALLOC>();
21be0c67c9SJoseph Huber   port.send_and_recv(
22be0c67c9SJoseph Huber       [=](rpc::Buffer *buffer, uint32_t) { buffer->data[0] = size; },
23be0c67c9SJoseph Huber       [&](rpc::Buffer *buffer, uint32_t) {
24ea697dccSJoseph Huber         ptr = reinterpret_cast<void *>(buffer->data[0]);
25ea697dccSJoseph Huber       });
26ea697dccSJoseph Huber   port.close();
27ea697dccSJoseph Huber   return ptr;
28ea697dccSJoseph Huber }
29ea697dccSJoseph Huber 
30ea697dccSJoseph Huber void rpc_free(void *ptr) {
31*a6ef0debSJoseph Huber   rpc::Client::Port port = rpc::client.open<LIBC_FREE>();
32be0c67c9SJoseph Huber   port.send([=](rpc::Buffer *buffer, uint32_t) {
33ea697dccSJoseph Huber     buffer->data[0] = reinterpret_cast<uintptr_t>(ptr);
34ea697dccSJoseph Huber   });
35ea697dccSJoseph Huber   port.close();
36ea697dccSJoseph Huber }
37ea697dccSJoseph Huber 
38ea697dccSJoseph Huber } // namespace
39ea697dccSJoseph Huber 
40ea697dccSJoseph Huber namespace gpu {
41ea697dccSJoseph Huber 
42ea697dccSJoseph Huber void *allocate(uint64_t size) { return rpc_allocate(size); }
43ea697dccSJoseph Huber 
44ea697dccSJoseph Huber void deallocate(void *ptr) { rpc_free(ptr); }
45ea697dccSJoseph Huber 
46ea697dccSJoseph Huber } // namespace gpu
475ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
48