diff options
author | Joseph Huber <jhuber6@vols.utk.edu> | 2023-08-10 09:46:03 -0500 |
---|---|---|
committer | Joseph Huber <jhuber6@vols.utk.edu> | 2023-08-16 09:14:38 -0500 |
commit | 1e573f378c52c69231a4e0fc3d06af3aaaedf5b8 (patch) | |
tree | 24e1de62208f3a0dd4b150066f32ca9757101d77 /libc/src/stdio/gpu/fopen.cpp | |
parent | 7c4aa3b37ed1c8ab276d67eb9757e56a2f26790c (diff) | |
download | llvm-1e573f378c52c69231a4e0fc3d06af3aaaedf5b8.zip llvm-1e573f378c52c69231a4e0fc3d06af3aaaedf5b8.tar.gz llvm-1e573f378c52c69231a4e0fc3d06af3aaaedf5b8.tar.bz2 |
[libc] Implement fopen, fclose, and fread on the GPU
This patch implements the `fopen`, `fclose`, and `fread` functions on
the GPU. These are pretty much re-implemented from what existed but
using the new interface. Having this subset allows us to test the
interface a bit more strenuously since we can write and read to a file.
Reviewed By: sivachandra
Differential Revision: https://reviews.llvm.org/D157622
Diffstat (limited to 'libc/src/stdio/gpu/fopen.cpp')
-rw-r--r-- | libc/src/stdio/gpu/fopen.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/libc/src/stdio/gpu/fopen.cpp b/libc/src/stdio/gpu/fopen.cpp new file mode 100644 index 0000000..5d88b65 --- /dev/null +++ b/libc/src/stdio/gpu/fopen.cpp @@ -0,0 +1,32 @@ +//===-- GPU Implementation of fopen ---------------------------------------===// +// +// 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/stdio/fopen.h" +#include "src/__support/CPP/string_view.h" +#include "src/stdio/gpu/file.h" + +#include <stdio.h> + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(::FILE *, fopen, + (const char *__restrict path, const char *__restrict mode)) { + uintptr_t file; + rpc::Client::Port port = rpc::client.open<RPC_OPEN_FILE>(); + port.send_n(path, internal::string_length(path) + 1); + port.send_and_recv( + [=](rpc::Buffer *buffer) { + inline_memcpy(buffer->data, mode, internal::string_length(mode) + 1); + }, + [&](rpc::Buffer *buffer) { file = buffer->data[0]; }); + port.close(); + + return reinterpret_cast<FILE *>(file); +} + +} // namespace __llvm_libc |