diff --git a/libc/src/__support/RPC/rpc.h b/libc/src/__support/RPC/rpc.h --- a/libc/src/__support/RPC/rpc.h +++ b/libc/src/__support/RPC/rpc.h @@ -34,6 +34,7 @@ NOOP = 0, PRINT_TO_STDERR = 1, EXIT = 2, + TEST_INCREMENT = 3, }; /// A fixed size channel used to communicate between the RPC client and server. diff --git a/libc/test/integration/startup/gpu/CMakeLists.txt b/libc/test/integration/startup/gpu/CMakeLists.txt --- a/libc/test/integration/startup/gpu/CMakeLists.txt +++ b/libc/test/integration/startup/gpu/CMakeLists.txt @@ -12,3 +12,12 @@ FRANCE=Paris GERMANY=Berlin ) + +add_integration_test( + startup_rpc_test + SUITE libc-startup-tests + SRCS + rpc_test.cpp + DEPENDS + libc.src.__support.RPC.rpc_client +) diff --git a/libc/test/integration/startup/gpu/rpc_test.cpp b/libc/test/integration/startup/gpu/rpc_test.cpp new file mode 100644 --- /dev/null +++ b/libc/test/integration/startup/gpu/rpc_test.cpp @@ -0,0 +1,34 @@ +//===-- Loader test to check the RPC interface with the loader ------------===// +// +// 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 "src/__support/RPC/rpc_client.h" +#include "test/IntegrationTest/test.h" + +using namespace __llvm_libc; + +static void test_add_simple() { + constexpr int num_additions = 10000; + uint64_t cnt = 0; + for (int i = 0; i < num_additions; ++i) { + rpc::Port port = rpc::client.open(rpc::TEST_INCREMENT); + port.send_and_recv( + [=](rpc::Buffer *buffer) { + reinterpret_cast(buffer->data)[0] = cnt; + }, + [&](rpc::Buffer *buffer) { + cnt = reinterpret_cast(buffer->data)[0]; + }); + port.close(); + } + ASSERT_TRUE(cnt == num_additions && "Incorrect sum"); +} + +TEST_MAIN(int argc, char **argv, char **envp) { + test_add_simple(); + return 0; +} diff --git a/libc/utils/gpu/loader/Server.h b/libc/utils/gpu/loader/Server.h --- a/libc/utils/gpu/loader/Server.h +++ b/libc/utils/gpu/loader/Server.h @@ -42,6 +42,12 @@ }); break; } + case __llvm_libc::rpc::Opcode::TEST_INCREMENT: { + port->recv_and_send([](__llvm_libc::rpc::Buffer *buffer) { + reinterpret_cast(buffer->data)[0] += 1; + }); + break; + } default: port->recv([](__llvm_libc::rpc::Buffer *) { /* no-op */ }); return;