[libc-commits] [libc] [libc] Add support for std::cout on embedded (PR #156330)

William Huynh via libc-commits libc-commits at lists.llvm.org
Mon Sep 1 07:04:00 PDT 2025


https://github.com/saturn691 created https://github.com/llvm/llvm-project/pull/156330

Fixes an bug with external linkage in stdout/stderr. Adds the required entrypoints for std::cout.

>From c1ba4d6f827a2128bc3cd0aa98f5b91d704b68b7 Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Mon, 1 Sep 2025 15:02:06 +0100
Subject: [PATCH] [libc] Add support for std::cout on embedded

Fixes an bug with external linkage in stdout/stderr.
Adds the required entrypoints for std::cout.
---
 libc/config/baremetal/aarch64/entrypoints.txt | 8 ++++++++
 libc/config/baremetal/arm/entrypoints.txt     | 8 ++++++++
 libc/config/baremetal/riscv/entrypoints.txt   | 8 ++++++++
 libc/src/__support/File/baremetal/stderr.cpp  | 8 ++++----
 libc/src/__support/File/baremetal/stdin.cpp   | 8 ++++----
 5 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index 90d0a7a9adc6a..31449e0c8b831 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -124,8 +124,11 @@ set(TARGET_LIBC_ENTRYPOINTS
 
     # stdio.h entrypoints
     libc.src.stdio.asprintf
+    libc.src.stdio.fflush
     libc.src.stdio.fopencookie
     libc.src.stdio.fprintf
+    libc.src.stdio.fwrite
+    libc.src.stdio.getc
     libc.src.stdio.getchar
     libc.src.stdio.printf
     libc.src.stdio.putchar
@@ -135,7 +138,12 @@ set(TARGET_LIBC_ENTRYPOINTS
     libc.src.stdio.snprintf
     libc.src.stdio.sprintf
     libc.src.stdio.sscanf
+    libc.src.stdio.stderr
+    libc.src.stdio.stdin
+    libc.src.stdio.stdout
+    libc.src.stdio.ungetc
     libc.src.stdio.vasprintf
+    libc.src.stdio.vfprintf
     libc.src.stdio.vprintf
     libc.src.stdio.vscanf
     libc.src.stdio.vsnprintf
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index d838a485b6c89..d61ca2c7faa7a 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -124,8 +124,11 @@ set(TARGET_LIBC_ENTRYPOINTS
 
     # stdio.h entrypoints
     libc.src.stdio.asprintf
+    libc.src.stdio.fflush
     libc.src.stdio.fopencookie
     libc.src.stdio.fprintf
+    libc.src.stdio.fwrite
+    libc.src.stdio.getc
     libc.src.stdio.getchar
     libc.src.stdio.printf
     libc.src.stdio.putchar
@@ -135,7 +138,12 @@ set(TARGET_LIBC_ENTRYPOINTS
     libc.src.stdio.snprintf
     libc.src.stdio.sprintf
     libc.src.stdio.sscanf
+    libc.src.stdio.stderr
+    libc.src.stdio.stdin
+    libc.src.stdio.stdout
+    libc.src.stdio.ungetc
     libc.src.stdio.vasprintf
+    libc.src.stdio.vfprintf
     libc.src.stdio.vprintf
     libc.src.stdio.vscanf
     libc.src.stdio.vsnprintf
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index db65d6115cdbb..53cb61faf50d3 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -124,8 +124,11 @@ set(TARGET_LIBC_ENTRYPOINTS
 
     # stdio.h entrypoints
     libc.src.stdio.asprintf
+    libc.src.stdio.fflush
     libc.src.stdio.fopencookie
     libc.src.stdio.fprintf
+    libc.src.stdio.fwrite
+    libc.src.stdio.getc
     libc.src.stdio.getchar
     libc.src.stdio.printf
     libc.src.stdio.putchar
@@ -135,7 +138,12 @@ set(TARGET_LIBC_ENTRYPOINTS
     libc.src.stdio.snprintf
     libc.src.stdio.sprintf
     libc.src.stdio.sscanf
+    libc.src.stdio.stderr
+    libc.src.stdio.stdin
+    libc.src.stdio.stdout
+    libc.src.stdio.ungetc
     libc.src.stdio.vasprintf
+    libc.src.stdio.vfprintf
     libc.src.stdio.vprintf
     libc.src.stdio.vscanf
     libc.src.stdio.vsnprintf
diff --git a/libc/src/__support/File/baremetal/stderr.cpp b/libc/src/__support/File/baremetal/stderr.cpp
index 0a67771f034aa..bca866a73120b 100644
--- a/libc/src/__support/File/baremetal/stderr.cpp
+++ b/libc/src/__support/File/baremetal/stderr.cpp
@@ -14,10 +14,10 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
-cookie_io_functions_t io_func = {.read = nullptr,
-                                 .write = __llvm_libc_stdio_write,
-                                 .seek = nullptr,
-                                 .close = nullptr};
+static cookie_io_functions_t io_func = {.read = nullptr,
+                                        .write = __llvm_libc_stdio_write,
+                                        .seek = nullptr,
+                                        .close = nullptr};
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 // Buffering is implementation defined. Therefore to save RAM, we use no
diff --git a/libc/src/__support/File/baremetal/stdin.cpp b/libc/src/__support/File/baremetal/stdin.cpp
index 569d924749eec..e0bc0ec6a6378 100644
--- a/libc/src/__support/File/baremetal/stdin.cpp
+++ b/libc/src/__support/File/baremetal/stdin.cpp
@@ -14,10 +14,10 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
-cookie_io_functions_t io_func = {.read = __llvm_libc_stdio_read,
-                                 .write = nullptr,
-                                 .seek = nullptr,
-                                 .close = nullptr};
+static cookie_io_functions_t io_func = {.read = __llvm_libc_stdio_read,
+                                        .write = nullptr,
+                                        .seek = nullptr,
+                                        .close = nullptr};
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wglobal-constructors"
 // Buffering is implementation defined. Therefore to save RAM, we use no



More information about the libc-commits mailing list