[clang] [Clang][Driver] Fix the missing Target-Triple-Level include path resolution in Baremetal Driver (PR #165321)
Simi Pallipurath via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 3 08:21:13 PST 2025
https://github.com/simpal01 updated https://github.com/llvm/llvm-project/pull/165321
>From c664b02fc81fda697b09abb5987312097d63618b Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Mon, 27 Oct 2025 14:44:20 +0000
Subject: [PATCH 1/4] [Clang][Driver] Fix the missing Target-Triple-Level
include path resolution in Baremetal Driver
The current baremetal driver implementation does not have a way to
derive the target-triple-level include path within the sysroot.
This feature is especially useful in setups where header paths
deviate from the default bare-metal assumptions. For example,
when headers are shared across target triples, it becomes necessary
to organize them under target-triple-specific directories to ensure
correct resolution..
---
clang/lib/Driver/ToolChains/BareMetal.cpp | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 9b7f58c392885..d048f228f4572 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -408,6 +408,8 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
if (DriverArgs.hasArg(options::OPT_nostdlibinc))
return;
+ const Driver &D = getDriver();
+
if (std::optional<std::string> Path = getStdlibIncludePath())
addSystemInclude(DriverArgs, CC1Args, *Path);
@@ -418,6 +420,13 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
llvm::sys::path::append(Dir, M.includeSuffix());
llvm::sys::path::append(Dir, "include");
addSystemInclude(DriverArgs, CC1Args, Dir.str());
+
+ Dir = SysRootDir;
+ llvm::sys::path::append(Dir, getTripleString());
+ if (D.getVFS().exists(Dir)) {
+ llvm::sys::path::append(Dir, "include");
+ addSystemInclude(DriverArgs, CC1Args, Dir.str());
+ }
}
}
}
@@ -498,9 +507,13 @@ void BareMetal::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
addSystemInclude(DriverArgs, CC1Args, TargetDir.str());
break;
}
- // Add generic path if nothing else succeeded so far.
+ // Add generic paths if nothing else succeeded so far.
llvm::sys::path::append(Dir, "include", "c++", "v1");
addSystemInclude(DriverArgs, CC1Args, Dir.str());
+ Dir = SysRootDir;
+ llvm::sys::path::append(Dir, Target, "include", "c++", "v1");
+ if (D.getVFS().exists(Dir))
+ addSystemInclude(DriverArgs, CC1Args, Dir.str());
break;
}
case ToolChain::CST_Libstdcxx: {
>From a1e7c03f93be9cb121e0609ba2fd3ed5307fed28 Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Mon, 17 Nov 2025 21:03:57 +0000
Subject: [PATCH 2/4] fixup! [Clang][Driver] Fix the missing
Target-Triple-Level include path resolution in Baremetal Driver
---
clang/lib/Driver/ToolChains/BareMetal.cpp | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index d048f228f4572..617f934176112 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -420,13 +420,12 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
llvm::sys::path::append(Dir, M.includeSuffix());
llvm::sys::path::append(Dir, "include");
addSystemInclude(DriverArgs, CC1Args, Dir.str());
-
- Dir = SysRootDir;
- llvm::sys::path::append(Dir, getTripleString());
- if (D.getVFS().exists(Dir)) {
- llvm::sys::path::append(Dir, "include");
- addSystemInclude(DriverArgs, CC1Args, Dir.str());
- }
+ }
+ SmallString<128> Dir = SysRootDir;
+ llvm::sys::path::append(Dir, getTripleString());
+ if (D.getVFS().exists(Dir)) {
+ llvm::sys::path::append(Dir, "include");
+ addSystemInclude(DriverArgs, CC1Args, Dir.str());
}
}
}
>From bf83ffdbac4daedcbc0f6527286d20aa7cd36fc2 Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Wed, 3 Dec 2025 16:12:19 +0000
Subject: [PATCH 3/4] fixup! [Clang][Driver] Fix the missing
Target-Triple-Level include path resolution in Baremetal Driver
---
clang/lib/Driver/ToolChains/BareMetal.cpp | 11 ++++++-----
.../aarch64-unknown-none-elf/include/c++/v1/.keep | 0
.../arm-unknown-none-eabi/include/c++/v1/.keep | 0
clang/test/Driver/baremetal.cpp | 12 ++++++++++++
4 files changed, 18 insertions(+), 5 deletions(-)
create mode 100644 clang/test/Driver/Inputs/multiarch-sysroot-tree/aarch64-unknown-none-elf/include/c++/v1/.keep
create mode 100644 clang/test/Driver/Inputs/multiarch-sysroot-tree/arm-unknown-none-eabi/include/c++/v1/.keep
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 617f934176112..85ca33a52c264 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -494,8 +494,13 @@ void BareMetal::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
if (SysRootDir.empty())
return;
+ SmallString<128> Dir(SysRootDir);
+ llvm::sys::path::append(Dir, Target, "include", "c++", "v1");
+ if (D.getVFS().exists(Dir))
+ addSystemInclude(DriverArgs, CC1Args, Dir.str());
+
for (const Multilib &M : getOrderedMultilibs()) {
- SmallString<128> Dir(SysRootDir);
+ Dir = SysRootDir;
llvm::sys::path::append(Dir, M.gccSuffix());
switch (GetCXXStdlibType(DriverArgs)) {
case ToolChain::CST_Libcxx: {
@@ -509,10 +514,6 @@ void BareMetal::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
// Add generic paths if nothing else succeeded so far.
llvm::sys::path::append(Dir, "include", "c++", "v1");
addSystemInclude(DriverArgs, CC1Args, Dir.str());
- Dir = SysRootDir;
- llvm::sys::path::append(Dir, Target, "include", "c++", "v1");
- if (D.getVFS().exists(Dir))
- addSystemInclude(DriverArgs, CC1Args, Dir.str());
break;
}
case ToolChain::CST_Libstdcxx: {
diff --git a/clang/test/Driver/Inputs/multiarch-sysroot-tree/aarch64-unknown-none-elf/include/c++/v1/.keep b/clang/test/Driver/Inputs/multiarch-sysroot-tree/aarch64-unknown-none-elf/include/c++/v1/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/multiarch-sysroot-tree/arm-unknown-none-eabi/include/c++/v1/.keep b/clang/test/Driver/Inputs/multiarch-sysroot-tree/arm-unknown-none-eabi/include/c++/v1/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/baremetal.cpp b/clang/test/Driver/baremetal.cpp
index 7d929fe122465..986aaff5b630d 100644
--- a/clang/test/Driver/baremetal.cpp
+++ b/clang/test/Driver/baremetal.cpp
@@ -4,6 +4,18 @@
// RUN: | FileCheck -check-prefixes=CHECK-STATIC-LIB %s
// CHECK-STATIC-LIB: {{.*}}llvm-ar{{.*}}" "rcsD"
+// RUN: %clang %s -### --target=arm-none-eabi -o %t.out 2>&1 \
+// RUN: --sysroot=%S/Inputs/multiarch-sysroot-tree \
+// RUN: | FileCheck --check-prefix=CHECK-ARM %s
+// CHECK-ARM: "-internal-isystem" "{{[^"]+}}multiarch-sysroot-tree{{[/\\]+}}arm-unknown-none-eabi{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
+// CHECK-ARM: "-internal-isystem" "{{[^"]+}}multiarch-sysroot-tree{{[/\\]+}}arm-unknown-none-eabi{{[/\\]+}}include"
+
+// RUN: %clang %s -### --target=aarch64-none-elf -o %t.out 2>&1 \
+// RUN: --sysroot=%S/Inputs/multiarch-sysroot-tree \
+// RUN: | FileCheck --check-prefix=CHECK-AARCH64 %s
+// CHECK-AARCH64: "-internal-isystem" "{{[^"]+}}multiarch-sysroot-tree{{[/\\]+}}aarch64-unknown-none-elf{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
+// CHECK-AARCH64: "-internal-isystem" "{{[^"]+}}multiarch-sysroot-tree{{[/\\]+}}aarch64-unknown-none-elf{{[/\\]+}}include"
+
// RUN: %clang %s -### --target=armv6m-none-eabi -o %t.out 2>&1 \
// RUN: -T semihosted.lds \
// RUN: -L some/directory/user/asked/for \
>From df9dab24aa7fd3b2c5ef44c6805ab0866825d07e Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Wed, 3 Dec 2025 16:20:43 +0000
Subject: [PATCH 4/4] fixup! fixup! [Clang][Driver] Fix the missing
Target-Triple-Level include path resolution in Baremetal Driver
---
clang/lib/Driver/ToolChains/BareMetal.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 85ca33a52c264..730109a02ef4a 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -421,7 +421,7 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
llvm::sys::path::append(Dir, "include");
addSystemInclude(DriverArgs, CC1Args, Dir.str());
}
- SmallString<128> Dir = SysRootDir;
+ SmallString<128> Dir(SysRootDir);
llvm::sys::path::append(Dir, getTripleString());
if (D.getVFS().exists(Dir)) {
llvm::sys::path::append(Dir, "include");
More information about the cfe-commits
mailing list