[clang] [clang] Add option for -nolibc in Driver/ToolChains/Baremetal.cpp (PR #145700)

William Huynh via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 3 02:10:27 PDT 2025


https://github.com/saturn691 updated https://github.com/llvm/llvm-project/pull/145700

>From 97c87ceb781eee0a04bd93299a341e03cbe68ddd Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Wed, 25 Jun 2025 14:25:22 +0100
Subject: [PATCH 1/5] [clang] Add option for -nolibc in
 Driver/ToolChains/Baremetal.cpp

Some tests in LLVM-libc require this flag, so compiler-rt is still
linked in, but not the C library. With this change, it will not be
ignored.

Minor changes: clang-format
---
 clang/lib/Driver/ToolChains/BareMetal.cpp | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index d8168ed15febd..b87427110d7de 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -339,15 +339,15 @@ void BareMetal::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
   };
 
   switch (GetCXXStdlibType(DriverArgs)) {
-    case ToolChain::CST_Libcxx: {
-      SmallString<128> P(D.Dir);
-      llvm::sys::path::append(P, "..", "include");
-      AddCXXIncludePath(P);
-      break;
-    }
-    case ToolChain::CST_Libstdcxx:
-      // We only support libc++ toolchain installation.
-      break;
+  case ToolChain::CST_Libcxx: {
+    SmallString<128> P(D.Dir);
+    llvm::sys::path::append(P, "..", "include");
+    AddCXXIncludePath(P);
+    break;
+  }
+  case ToolChain::CST_Libstdcxx:
+    // We only support libc++ toolchain installation.
+    break;
   }
 
   std::string SysRoot(computeSysRoot());
@@ -498,7 +498,9 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
     AddRunTimeLibs(TC, D, CmdArgs, Args);
 
-    CmdArgs.push_back("-lc");
+    if (!Args.hasArg(options::OPT_nolibc)) {
+      CmdArgs.push_back("-lc");
+    }
   }
 
   if (D.isUsingLTO())

>From a433cb779d5b49baba32bae1ce63f151b5cea423 Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Thu, 26 Jun 2025 10:19:16 +0100
Subject: [PATCH 2/5] Add lit tests in clang/test/Driver/baremetal.cpp

---
 clang/test/Driver/baremetal.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/clang/test/Driver/baremetal.cpp b/clang/test/Driver/baremetal.cpp
index a80aa9b437117..6dd1ec13d689b 100644
--- a/clang/test/Driver/baremetal.cpp
+++ b/clang/test/Driver/baremetal.cpp
@@ -143,6 +143,20 @@
 // RUN:   | FileCheck %s --check-prefix=CHECK-RTLIB-GCC
 // CHECK-RTLIB-GCC: -lgcc
 
+// RUN: %clang -### --target=arm-none-eabi -nolibc %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NOLIBC
+// CHECK-NOLIBC-NOT: "-lc"
+// CHECK-NOLIBC-NOT: "-lm"
+// CHECK-NOLIBC-NOT: "-lc++"
+// CHECK-NOLIBC: "{{[^"]*}}libclang_rt.builtins.a"
+
+// RUN: %clang -### --target=arm-none-eabi -nostdlib %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NOSTDLIB
+// CHECK-NOSTDLIB-NOT: "-lc"
+// CHECK-NOSTDLIB-NOT: "-lm"
+// CHECK-NOSTDLIB-NOT: "-lc++"
+// CHECK-NOSTDLIB-NOT: "{{[^"]*}}libclang_rt.builtins.a"
+
 // RUN: %clang -### --target=arm-none-eabi -v %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-SYSROOT-INC
 // CHECK-SYSROOT-INC-NOT: "-internal-isystem" "include"

>From 36f933f4b53b730afd0458d31a31eec4c3682ec1 Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Wed, 2 Jul 2025 11:49:22 +0100
Subject: [PATCH 3/5] Reapply suggestions from Petr

---
 clang/test/Driver/baremetal.cpp | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/clang/test/Driver/baremetal.cpp b/clang/test/Driver/baremetal.cpp
index 471854aaa7b4b..7b78d71ad5de0 100644
--- a/clang/test/Driver/baremetal.cpp
+++ b/clang/test/Driver/baremetal.cpp
@@ -166,15 +166,11 @@
 // RUN: %clang -### --target=arm-none-eabi -nolibc %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-NOLIBC
 // CHECK-NOLIBC-NOT: "-lc"
-// CHECK-NOLIBC-NOT: "-lm"
-// CHECK-NOLIBC-NOT: "-lc++"
 // CHECK-NOLIBC: "{{[^"]*}}libclang_rt.builtins.a"
 
 // RUN: %clang -### --target=arm-none-eabi -nostdlib %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-NOSTDLIB
 // CHECK-NOSTDLIB-NOT: "-lc"
-// CHECK-NOSTDLIB-NOT: "-lm"
-// CHECK-NOSTDLIB-NOT: "-lc++"
 // CHECK-NOSTDLIB-NOT: "{{[^"]*}}libclang_rt.builtins.a"
 
 // RUN: %clang -### --target=arm-none-eabi -v %s 2>&1 \

>From f4170d8b2c0cdf8c987ff5835070fd14acecec8a Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Wed, 2 Jul 2025 11:50:24 +0100
Subject: [PATCH 4/5] Delete trivial brace

---
 clang/lib/Driver/ToolChains/BareMetal.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index dce3248b7587e..9145e8f5d5343 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -674,9 +674,8 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
     CmdArgs.push_back("--start-group");
     AddRunTimeLibs(TC, D, CmdArgs, Args);
-    if (!Args.hasArg(options::OPT_nolibc)) {
+    if (!Args.hasArg(options::OPT_nolibc))
       CmdArgs.push_back("-lc");
-    }
     if (TC.hasValidGCCInstallation() || detectGCCToolchainAdjacent(D))
       CmdArgs.push_back("-lgloss");
     CmdArgs.push_back("--end-group");

>From 68b2eda3762c60f1c0d2af118b2a13fae4fc951f Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Thu, 3 Jul 2025 10:10:13 +0100
Subject: [PATCH 5/5] Add -rtlib=compiler-rt to tests in baremetal.cpp

---
 clang/test/Driver/baremetal.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/Driver/baremetal.cpp b/clang/test/Driver/baremetal.cpp
index 7b78d71ad5de0..5c86cac4d3f3c 100644
--- a/clang/test/Driver/baremetal.cpp
+++ b/clang/test/Driver/baremetal.cpp
@@ -163,12 +163,12 @@
 // RUN:   | FileCheck %s --check-prefix=CHECK-RTLIB-GCC
 // CHECK-RTLIB-GCC: -lgcc
 
-// RUN: %clang -### --target=arm-none-eabi -nolibc %s 2>&1 \
+// RUN: %clang -### --target=arm-none-eabi -nolibc -rtlib=compiler-rt %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-NOLIBC
 // CHECK-NOLIBC-NOT: "-lc"
 // CHECK-NOLIBC: "{{[^"]*}}libclang_rt.builtins.a"
 
-// RUN: %clang -### --target=arm-none-eabi -nostdlib %s 2>&1 \
+// RUN: %clang -### --target=arm-none-eabi -nostdlib -rtlib=compiler-rt %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-NOSTDLIB
 // CHECK-NOSTDLIB-NOT: "-lc"
 // CHECK-NOSTDLIB-NOT: "{{[^"]*}}libclang_rt.builtins.a"



More information about the cfe-commits mailing list