https://github.com/quic-k updated https://github.com/llvm/llvm-project/pull/183254
>From 288a1bd5f04f041795a9d2c5b7bf518fa0adeada Mon Sep 17 00:00:00 2001 From: Kushal Pal <[email protected]> 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 <[email protected]> --- .../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..9068c5477bcbd 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..23f332dc8a79b 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, _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
