xref: /aosp_15_r20/external/llvm-libc/src/__support/OSUtil/baremetal/io.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===---------- Baremetal implementation of IO utils ------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "io.h"
10 
11 #include "src/__support/CPP/string_view.h"
12 #include "src/__support/macros/config.h"
13 
14 namespace LIBC_NAMESPACE_DECL {
15 
16 // These are intended to be provided by the vendor.
17 //
18 // The signature of these types and functions intentionally match `fopencookie`
19 // which allows the following:
20 //
21 // ```
22 // struct __llvm_libc_stdio_cookie { ... };
23 // ...
24 // struct __llvm_libc_stdio_cookie __llvm_libc_stdin_cookie;
25 // cookie_io_functions_t stdin_func = { .read = __llvm_libc_stdio_read };
26 // FILE *stdin = fopencookie(&__llvm_libc_stdin_cookie, "r", stdin_func);
27 // ...
28 // struct __llvm_libc_stdio_cookie __llvm_libc_stdout_cookie;
29 // cookie_io_functions_t stdout_func = { .write = __llvm_libc_stdio_write };
30 // FILE *stdout = fopencookie(&__llvm_libc_stdout_cookie, "w", stdout_func);
31 // ...
32 // struct __llvm_libc_stdio_cookie __llvm_libc_stderr_cookie;
33 // cookie_io_functions_t stderr_func = { .write = __llvm_libc_stdio_write };
34 // FILE *stderr = fopencookie(&__llvm_libc_stderr_cookie, "w", stderr_func);
35 // ```
36 //
37 // At the same time, implementation of functions like `printf` and `scanf` can
38 // use `__llvm_libc_stdio_read` and `__llvm_libc_stdio_write` directly to avoid
39 // the extra indirection.
40 //
41 // All three symbols `__llvm_libc_stdin_cookie`, `__llvm_libc_stdout_cookie`,
42 // and `__llvm_libc_stderr_cookie` must be provided, even if they don't point
43 // at anything.
44 
45 struct __llvm_libc_stdio_cookie;
46 
47 extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stdin_cookie;
48 extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stdout_cookie;
49 extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stderr_cookie;
50 
51 extern "C" ssize_t __llvm_libc_stdio_read(void *cookie, char *buf, size_t size);
52 extern "C" ssize_t __llvm_libc_stdio_write(void *cookie, const char *buf,
53                                            size_t size);
54 
read_from_stdin(char * buf,size_t size)55 ssize_t read_from_stdin(char *buf, size_t size) {
56   return __llvm_libc_stdio_read(static_cast<void *>(&__llvm_libc_stdin_cookie),
57                                 buf, size);
58 }
59 
write_to_stdout(cpp::string_view msg)60 void write_to_stdout(cpp::string_view msg) {
61   __llvm_libc_stdio_write(static_cast<void *>(&__llvm_libc_stdout_cookie),
62                           msg.data(), msg.size());
63 }
64 
write_to_stderr(cpp::string_view msg)65 void write_to_stderr(cpp::string_view msg) {
66   __llvm_libc_stdio_write(static_cast<void *>(&__llvm_libc_stderr_cookie),
67                           msg.data(), msg.size());
68 }
69 
70 } // namespace LIBC_NAMESPACE_DECL
71