[clang] [Clang] Add clang flag --cstdlib (PR #183254)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 4 01:26:16 PST 2026
https://github.com/quic-k updated https://github.com/llvm/llvm-project/pull/183254
>From 8a4d57a4dd50a9ce8feb0ef5603f544cd6d78b81 Mon Sep 17 00:00:00 2001
From: Kushal Pal <kushpal at qti.qualcomm.com>
Date: Tue, 24 Feb 2026 12:01:02 +0530
Subject: [PATCH] [Clang] Add clang driver option --cstdlib
Introduce clang flag --cstdlib based on RFC:
https://discourse.llvm.org/t/rfc-add-command-line-option-for-selecting-c-library/87335
This flag accepts a string i.e. the name of the C library that user
wants to use. For now, valid options are picolibc, newlib, llvm-libc.
Toolchain drivers can handle this flag as per need or ignore it.
Signed-off-by: Kushal Pal <kushpal at qti.qualcomm.com>
---
.../clang/Basic/DiagnosticDriverKinds.td | 2 ++
clang/include/clang/Driver/ToolChain.h | 13 ++++++++++
clang/include/clang/Options/Options.td | 5 ++++
clang/lib/Driver/ToolChain.cpp | 25 +++++++++++++++++++
4 files changed, 45 insertions(+)
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 3206b5c78a6f1..972cc87464769 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -187,6 +187,8 @@ def err_drv_incompatible_unwindlib : Error<
"--rtlib=libgcc requires --unwindlib=libgcc">;
def err_drv_incompatible_options : Error<
"the combination of '%0' and '%1' is incompatible">;
+def err_drv_invalid_cstdlib_name : Error<
+ "invalid C library name in argument '%0'">;
def err_drv_invalid_stdlib_name : Error<
"invalid library name in argument '%0'">;
def err_drv_invalid_output_with_multiple_archs : Error<
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 665f7f91ecfcd..5e111c43b717d 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -109,6 +109,13 @@ class ToolChain {
UNW_Libgcc
};
+ enum CStdlibType {
+ CST_Newlib,
+ CST_Picolibc,
+ CST_LLVMLibC,
+ CST_System,
+ };
+
enum class UnwindTableLevel {
None,
Synchronous,
@@ -194,6 +201,7 @@ class ToolChain {
mutable std::optional<CXXStdlibType> cxxStdlibType;
mutable std::optional<RuntimeLibType> runtimeLibType;
mutable std::optional<UnwindLibType> unwindLibType;
+ mutable std::optional<CStdlibType> cStdlibType;
protected:
MultilibSet Multilibs;
@@ -729,6 +737,11 @@ class ToolChain {
// given compilation arguments.
virtual UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const;
+ // Determine the C standard library to use with the given
+ // compilation arguments. Defaults to CST_System when no --cstdlib= flag
+ // is provided.
+ virtual CStdlibType GetCStdlibType(const llvm::opt::ArgList &Args) const;
+
// Detect the highest available version of libc++ in include path.
virtual std::string detectLibcxxVersion(StringRef IncludePath) const;
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 34ddc29f6f738..fe7169423b6bf 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -6483,6 +6483,10 @@ def std_EQ : Joined<["-", "--"], "std=">,
def stdlib_EQ : Joined<["-", "--"], "stdlib=">,
Visibility<[ClangOption, CC1Option]>,
HelpText<"C++ standard library to use">, Values<"libc++,libstdc++,platform">;
+def cstdlib_EQ : Joined<["--"], "cstdlib=">,
+ Visibility<[ClangOption]>,
+ HelpText<"C standard library to use">,
+ Values<"newlib,picolibc,llvm-libc,system">;
def stdlibxx_isystem : JoinedOrSeparate<["-"], "stdlib++-isystem">,
Group<clang_i_Group>,
HelpText<"Use directory as the C++ standard library include path">,
@@ -6735,6 +6739,7 @@ def _version : Flag<["--"], "version">,
def _signed_char : Flag<["--"], "signed-char">, Alias<fsigned_char>;
def _std : Separate<["--"], "std">, Alias<std_EQ>;
def _stdlib : Separate<["--"], "stdlib">, Alias<stdlib_EQ>;
+def _cstdlib : Separate<["--"], "cstdlib">, Alias<cstdlib_EQ>;
def _target_help : Flag<["--"], "target-help">;
def _trace_includes : Flag<["--"], "trace-includes">, Alias<H>;
def _undefine_macro_EQ : Joined<["--"], "undefine-macro=">, Alias<U>;
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 4b902b4db0c23..ac66ccbae6f39 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1413,6 +1413,31 @@ ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
return *cxxStdlibType;
}
+ToolChain::CStdlibType ToolChain::GetCStdlibType(const ArgList &Args) const {
+ if (cStdlibType)
+ return *cStdlibType;
+
+ const Arg *A = Args.getLastArg(options::OPT_cstdlib_EQ);
+ StringRef LibName = A ? A->getValue() : "system";
+
+ if (LibName == "newlib")
+ cStdlibType = ToolChain::CST_Newlib;
+ else if (LibName == "picolibc")
+ cStdlibType = ToolChain::CST_Picolibc;
+ else if (LibName == "llvm-libc")
+ cStdlibType = ToolChain::CST_LLVMLibC;
+ else if (LibName == "system")
+ cStdlibType = ToolChain::CST_System;
+ else {
+ if (A)
+ getDriver().Diag(diag::err_drv_invalid_cstdlib_name)
+ << A->getAsString(Args);
+ cStdlibType = ToolChain::CST_System;
+ }
+
+ return *cStdlibType;
+}
+
/// Utility function to add a system framework directory to CC1 arguments.
void ToolChain::addSystemFrameworkInclude(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args,
More information about the cfe-commits
mailing list