1e5b93994SPetr Hosek //===---------- Baremetal implementation of IO utils ------------*- C++ -*-===// 2e5b93994SPetr Hosek // 3e5b93994SPetr Hosek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5b93994SPetr Hosek // See https://llvm.org/LICENSE.txt for license information. 5e5b93994SPetr Hosek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5b93994SPetr Hosek // 7e5b93994SPetr Hosek //===----------------------------------------------------------------------===// 8e5b93994SPetr Hosek 9e5b93994SPetr Hosek #include "io.h" 10e5b93994SPetr Hosek 11e5b93994SPetr Hosek #include "src/__support/CPP/string_view.h" 125ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 13e5b93994SPetr Hosek 145ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 15be9b1de1SPetr Hosek 1600895efaSPetr Hosek // These are intended to be provided by the vendor. 1700895efaSPetr Hosek // 1800895efaSPetr Hosek // The signature of these types and functions intentionally match `fopencookie` 1900895efaSPetr Hosek // which allows the following: 2000895efaSPetr Hosek // 2100895efaSPetr Hosek // ``` 2200895efaSPetr Hosek // struct __llvm_libc_stdio_cookie { ... }; 2300895efaSPetr Hosek // ... 2400895efaSPetr Hosek // struct __llvm_libc_stdio_cookie __llvm_libc_stdin_cookie; 2500895efaSPetr Hosek // cookie_io_functions_t stdin_func = { .read = __llvm_libc_stdio_read }; 2600895efaSPetr Hosek // FILE *stdin = fopencookie(&__llvm_libc_stdin_cookie, "r", stdin_func); 2700895efaSPetr Hosek // ... 2800895efaSPetr Hosek // struct __llvm_libc_stdio_cookie __llvm_libc_stdout_cookie; 2900895efaSPetr Hosek // cookie_io_functions_t stdout_func = { .write = __llvm_libc_stdio_write }; 3000895efaSPetr Hosek // FILE *stdout = fopencookie(&__llvm_libc_stdout_cookie, "w", stdout_func); 3100895efaSPetr Hosek // ... 3200895efaSPetr Hosek // struct __llvm_libc_stdio_cookie __llvm_libc_stderr_cookie; 3300895efaSPetr Hosek // cookie_io_functions_t stderr_func = { .write = __llvm_libc_stdio_write }; 3400895efaSPetr Hosek // FILE *stderr = fopencookie(&__llvm_libc_stderr_cookie, "w", stderr_func); 3500895efaSPetr Hosek // ``` 3600895efaSPetr Hosek // 3700895efaSPetr Hosek // At the same time, implementation of functions like `printf` and `scanf` can 3800895efaSPetr Hosek // use `__llvm_libc_stdio_read` and `__llvm_libc_stdio_write` directly to avoid 3900895efaSPetr Hosek // the extra indirection. 4000895efaSPetr Hosek // 4100895efaSPetr Hosek // All three symbols `__llvm_libc_stdin_cookie`, `__llvm_libc_stdout_cookie`, 4200895efaSPetr Hosek // and `__llvm_libc_stderr_cookie` must be provided, even if they don't point 4300895efaSPetr Hosek // at anything. 44cfa2d7dfSPetr Hosek 4500895efaSPetr Hosek struct __llvm_libc_stdio_cookie; 46cfa2d7dfSPetr Hosek 47*9ba9e480SPetr Hosek extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stdin_cookie; 48*9ba9e480SPetr Hosek extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stdout_cookie; 49*9ba9e480SPetr Hosek extern "C" struct __llvm_libc_stdio_cookie __llvm_libc_stderr_cookie; 5000895efaSPetr Hosek 5100895efaSPetr Hosek extern "C" ssize_t __llvm_libc_stdio_read(void *cookie, char *buf, size_t size); 5200895efaSPetr Hosek extern "C" ssize_t __llvm_libc_stdio_write(void *cookie, const char *buf, 5300895efaSPetr Hosek size_t size); 54e5b93994SPetr Hosek 55cfa2d7dfSPetr Hosek ssize_t read_from_stdin(char *buf, size_t size) { 5600895efaSPetr Hosek return __llvm_libc_stdio_read(static_cast<void *>(&__llvm_libc_stdin_cookie), 57cfa2d7dfSPetr Hosek buf, size); 58cfa2d7dfSPetr Hosek } 59cfa2d7dfSPetr Hosek 6000895efaSPetr Hosek void write_to_stdout(cpp::string_view msg) { 6100895efaSPetr Hosek __llvm_libc_stdio_write(static_cast<void *>(&__llvm_libc_stdout_cookie), 6200895efaSPetr Hosek msg.data(), msg.size()); 6300895efaSPetr Hosek } 6400895efaSPetr Hosek 65e5b93994SPetr Hosek void write_to_stderr(cpp::string_view msg) { 6600895efaSPetr Hosek __llvm_libc_stdio_write(static_cast<void *>(&__llvm_libc_stderr_cookie), 6700895efaSPetr Hosek msg.data(), msg.size()); 68e5b93994SPetr Hosek } 69e5b93994SPetr Hosek 705ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 71