[libc-commits] [libc] cfa2d7d - [libc] Provide baremetal implementation of getchar (#98059)

via libc-commits libc-commits at lists.llvm.org
Tue Jul 9 01:45:32 PDT 2024


Author: Petr Hosek
Date: 2024-07-09T01:45:27-07:00
New Revision: cfa2d7df11f1a930ebae5a7bdbea924bb129f55e

URL: https://github.com/llvm/llvm-project/commit/cfa2d7df11f1a930ebae5a7bdbea924bb129f55e
DIFF: https://github.com/llvm/llvm-project/commit/cfa2d7df11f1a930ebae5a7bdbea924bb129f55e.diff

LOG: [libc] Provide baremetal implementation of getchar (#98059)

This introduces opaque type `struct __llvm_libc_stdin` and a symbol
`__llvm_libc_stdin_read` that's intended to be provided by the vendor.

`__llvm_libc_stdin_read` intentionally has the same signature as
`cookie_read_function_t` so it can be used with `fopencookie` to
represent `stdin` as `FILE *` in the future.

Added: 
    libc/src/stdio/baremetal/getchar.cpp

Modified: 
    libc/config/baremetal/arm/entrypoints.txt
    libc/config/baremetal/riscv/entrypoints.txt
    libc/src/__support/OSUtil/baremetal/io.cpp
    libc/src/__support/OSUtil/baremetal/io.h
    libc/src/stdio/baremetal/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index f2ed5025872dd..a67772b4507fc 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -83,6 +83,7 @@ set(TARGET_LIBC_ENTRYPOINTS
     libc.src.inttypes.strtoumax
 
     # stdio.h entrypoints
+    libc.src.stdio.getchar
     libc.src.stdio.printf
     libc.src.stdio.putchar
     libc.src.stdio.puts

diff  --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 948395560fade..eaa028c09dcda 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -79,6 +79,7 @@ set(TARGET_LIBC_ENTRYPOINTS
     libc.src.inttypes.strtoumax
 
     # stdio.h entrypoints
+    libc.src.stdio.getchar
     libc.src.stdio.printf
     libc.src.stdio.putchar
     libc.src.stdio.puts

diff  --git a/libc/src/__support/OSUtil/baremetal/io.cpp b/libc/src/__support/OSUtil/baremetal/io.cpp
index 347c7d405b0a9..5dd92e4a56ce4 100644
--- a/libc/src/__support/OSUtil/baremetal/io.cpp
+++ b/libc/src/__support/OSUtil/baremetal/io.cpp
@@ -11,10 +11,19 @@
 #include "src/__support/CPP/string_view.h"
 
 // This is intended to be provided by the vendor.
+
+extern struct __llvm_libc_stdin __llvm_libc_stdin;
+extern "C" ssize_t __llvm_libc_stdin_read(void *cookie, char *buf, size_t size);
+
 extern "C" void __llvm_libc_log_write(const char *msg, size_t len);
 
 namespace LIBC_NAMESPACE {
 
+ssize_t read_from_stdin(char *buf, size_t size) {
+  return __llvm_libc_stdin_read(reinterpret_cast<void *>(&__llvm_libc_stdin),
+                                buf, size);
+}
+
 void write_to_stderr(cpp::string_view msg) {
   __llvm_libc_log_write(msg.data(), msg.size());
 }

diff  --git a/libc/src/__support/OSUtil/baremetal/io.h b/libc/src/__support/OSUtil/baremetal/io.h
index 87534641b1fa4..b9ae0bde502be 100644
--- a/libc/src/__support/OSUtil/baremetal/io.h
+++ b/libc/src/__support/OSUtil/baremetal/io.h
@@ -9,10 +9,13 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_BAREMETAL_IO_H
 #define LLVM_LIBC_SRC___SUPPORT_OSUTIL_BAREMETAL_IO_H
 
+#include "include/llvm-libc-types/size_t.h"
+#include "include/llvm-libc-types/ssize_t.h"
 #include "src/__support/CPP/string_view.h"
 
 namespace LIBC_NAMESPACE {
 
+ssize_t read_from_stdin(char *buf, size_t size);
 void write_to_stderr(cpp::string_view msg);
 
 } // namespace LIBC_NAMESPACE

diff  --git a/libc/src/stdio/baremetal/CMakeLists.txt b/libc/src/stdio/baremetal/CMakeLists.txt
index 4acd8873ab753..5ace85d009040 100644
--- a/libc/src/stdio/baremetal/CMakeLists.txt
+++ b/libc/src/stdio/baremetal/CMakeLists.txt
@@ -1,3 +1,14 @@
+add_entrypoint_object(
+  getchar
+  SRCS
+    getchar.cpp
+  HDRS
+    ../getchar.h
+  DEPENDS
+    libc.src.__support.OSUtil.osutil
+    libc.src.__support.CPP.string_view
+)
+
 add_entrypoint_object(
   remove
   SRCS

diff  --git a/libc/src/stdio/baremetal/getchar.cpp b/libc/src/stdio/baremetal/getchar.cpp
new file mode 100644
index 0000000000000..bbd5ba7a954fb
--- /dev/null
+++ b/libc/src/stdio/baremetal/getchar.cpp
@@ -0,0 +1,24 @@
+//===-- Baremetal implementation of getchar -------------------------------===//
+//
+// 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/getchar.h"
+#include "src/__support/OSUtil/io.h"
+
+#include <stdio.h>
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, getchar, ()) {
+  char buf[1];
+  auto result = read_from_stdin(buf, sizeof(buf));
+  if (result < 0)
+    return EOF;
+  return buf[0];
+}
+
+} // namespace LIBC_NAMESPACE


        


More information about the libc-commits mailing list