[clang] [llvm] [Clang][Hexagon] Driver changes for H2+Picolibc (PR #195795)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 4 23:00:31 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-hexagon
Author: quic-k
<details>
<summary>Changes</summary>
depends on https://github.com/llvm/llvm-project/pull/195621
---
Full diff: https://github.com/llvm/llvm-project/pull/195795.diff
11 Files Affected:
- (modified) clang/lib/Basic/Targets.cpp (+2)
- (modified) clang/lib/Basic/Targets/OSTargets.h (+13)
- (modified) clang/lib/Driver/ToolChains/Hexagon.cpp (+15-3)
- (added) clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/.keep ()
- (added) clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/.keep ()
- (added) clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/c++/.keep ()
- (added) clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/c++/v1/.keep ()
- (modified) clang/test/Driver/hexagon-toolchain-picolibc.c (+118)
- (modified) clang/test/Preprocessor/hexagon-predefines.c (+6)
- (modified) llvm/include/llvm/TargetParser/Triple.h (+5-1)
- (modified) llvm/lib/TargetParser/Triple.cpp (+3)
``````````diff
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index d9cac93fd2906..6fab36b88067a 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -128,6 +128,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
return std::make_unique<LinuxTargetInfo<HexagonTargetInfo>>(Triple, Opts);
if (Triple.isOSQurt())
return std::make_unique<QURTTargetInfo<HexagonTargetInfo>>(Triple, Opts);
+ if (Triple.isOSH2())
+ return std::make_unique<H2TargetInfo<HexagonTargetInfo>>(Triple, Opts);
return std::make_unique<HexagonTargetInfo>(Triple, Opts);
case llvm::Triple::lanai:
diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h
index 9e2916eace079..28e3de2e7d20f 100644
--- a/clang/lib/Basic/Targets/OSTargets.h
+++ b/clang/lib/Basic/Targets/OSTargets.h
@@ -1104,6 +1104,19 @@ class LLVM_LIBRARY_VISIBILITY QURTTargetInfo : public OSTargetInfo<Target> {
using OSTargetInfo<Target>::OSTargetInfo;
};
+// H2 Target
+template <typename Target>
+class LLVM_LIBRARY_VISIBILITY H2TargetInfo : public OSTargetInfo<Target> {
+protected:
+ void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
+ MacroBuilder &Builder) const override {
+ Builder.defineMacro("__h2__");
+ }
+
+public:
+ using OSTargetInfo<Target>::OSTargetInfo;
+};
+
// SerenityOS target
template <typename Target>
class LLVM_LIBRARY_VISIBILITY SerenityTargetInfo : public OSTargetInfo<Target> {
diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp
index e0e5ab5c1fde7..41f03e01b69c1 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -414,8 +414,14 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
if (!IsShared) {
if (HTC.GetCStdlibType(Args) == ToolChain::CST_Picolibc) {
SmallString<128> Crt0 = LibraryDir;
- llvm::sys::path::append(Crt0, "crt0-semihost.o");
- CmdArgs.push_back(Args.MakeArgString(Crt0));
+ if (HTC.getTriple().isOSH2()) {
+ llvm::sys::path::append(Crt0, "crt0-noflash-hosted.o");
+ CmdArgs.push_back(Args.MakeArgString(Crt0));
+ } else if (HTC.getTriple().isOSUnknown()) {
+ llvm::sys::path::append(Crt0, "crt0-semihost.o");
+ CmdArgs.push_back(Args.MakeArgString(Crt0));
+ }
+ // Known OS other than H2: no semihost crt0; OS provides its own.
} else {
if (HasStandalone) {
SmallString<128> Crt0SA = LibraryDir;
@@ -468,7 +474,13 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
if (!IsShared) {
if (HTC.GetCStdlibType(Args) == ToolChain::CST_Picolibc) {
- CmdArgs.push_back("-lsemihost");
+ if (HTC.getTriple().isOSH2()) {
+ CmdArgs.push_back("-lh2");
+ CmdArgs.push_back("-lsyscall_wrapper");
+ } else if (HTC.getTriple().isOSUnknown()) {
+ CmdArgs.push_back("-lsemihost");
+ }
+ // Known OS other than H2: no semihost lib; OS provides its own.
} else {
for (StringRef Lib : OsLibs)
CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
diff --git a/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/.keep b/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/.keep b/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/c++/.keep b/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/c++/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/c++/v1/.keep b/clang/test/Driver/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-h2-elf/include/c++/v1/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/hexagon-toolchain-picolibc.c b/clang/test/Driver/hexagon-toolchain-picolibc.c
index b8ac8a9c5c88d..8282a4da81636 100644
--- a/clang/test/Driver/hexagon-toolchain-picolibc.c
+++ b/clang/test/Driver/hexagon-toolchain-picolibc.c
@@ -118,3 +118,121 @@
// CHECK-LIBPATHS-PIC: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}G0{{/|\\\\}}pic"
// CHECK-LIBPATHS-PIC: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}G0"
// CHECK-LIBPATHS-PIC: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68"
+
+// =============================================================================
+// H2 OS tests (--target=hexagon-h2-elf --cstdlib=picolibc)
+// Differences from hexagon-none-elf: crt0-noflash-hosted.o, -lh2 -lsyscall_wrapper
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// Test standard include paths for H2
+// -----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin %s 2>&1 | FileCheck -check-prefix=CHECK-H2-C-INCLUDES %s
+// CHECK-H2-C-INCLUDES: "-cc1" {{.*}} "-internal-isystem" "{{.*}}{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{[0-9]+}}{{/|\\\\}}include"
+// CHECK-H2-C-INCLUDES: "-internal-externc-isystem" "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}include"
+
+// RUN: %clangxx -### --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin %s 2>&1 | FileCheck -check-prefix=CHECK-H2-CXX-INCLUDES %s
+// CHECK-H2-CXX-INCLUDES: "-cc1" {{.*}} "-internal-isystem" "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1"
+// CHECK-H2-CXX-INCLUDES: "-internal-isystem" "{{.*}}{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{[0-9]+}}{{/|\\\\}}include"
+// CHECK-H2-CXX-INCLUDES: "-internal-externc-isystem" "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}include"
+
+// -----------------------------------------------------------------------------
+// H2 start files: crt0-noflash-hosted.o (not crt0-semihost.o)
+// -----------------------------------------------------------------------------
+// RUN: %clang --target=hexagon-h2-elf --cstdlib=picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-STARTUP
+// CHECK-H2-STARTUP: "{{.*}}crt0-noflash-hosted.o"
+// CHECK-H2-STARTUP-NOT: "{{.*}}crt0-semihost.o"
+
+// RUN: %clang --target=hexagon-h2-elf --cstdlib=picolibc -nostartfiles -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-NOSTART
+// CHECK-H2-NOSTART-NOT: "{{.*}}crt0-noflash-hosted.o"
+
+// -----------------------------------------------------------------------------
+// H2: -nostdlib, -nostartfiles, -nodefaultlibs, -nolibc
+// -----------------------------------------------------------------------------
+// RUN: %clangxx -### --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 \
+// RUN: -nostdlib %s 2>&1 | FileCheck -check-prefix=CHECK-H2-NOSTDLIB %s
+// CHECK-H2-NOSTDLIB: "-cc1"
+// CHECK-H2-NOSTDLIB: {{hexagon-link|ld}}
+// CHECK-H2-NOSTDLIB-NOT: "{{.*}}crt0-noflash-hosted.o"
+// CHECK-H2-NOSTDLIB-NOT: "-lc++"
+// CHECK-H2-NOSTDLIB-NOT: "-lm"
+// CHECK-H2-NOSTDLIB-NOT: "--start-group"
+// CHECK-H2-NOSTDLIB-NOT: "-lh2"
+// CHECK-H2-NOSTDLIB-NOT: "-lsyscall_wrapper"
+// CHECK-H2-NOSTDLIB-NOT: "-lc"
+// CHECK-H2-NOSTDLIB-NOT: "-lclang_rt.builtins"
+// CHECK-H2-NOSTDLIB-NOT: "--end-group"
+
+// RUN: %clangxx -### --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 \
+// RUN: -nostartfiles %s 2>&1 | FileCheck -check-prefix=CHECK-H2-NOSTARTFILES %s
+// CHECK-H2-NOSTARTFILES: "-cc1"
+// CHECK-H2-NOSTARTFILES: {{hexagon-link|ld}}
+// CHECK-H2-NOSTARTFILES-NOT: "{{.*}}crt0-noflash-hosted.o"
+// CHECK-H2-NOSTARTFILES: "-lc++" "-lc++abi" "-lunwind" "-lm" "--start-group" "-lh2" "-lsyscall_wrapper" "-lc" "-lclang_rt.builtins" "--end-group"
+
+// RUN: %clangxx -### --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 \
+// RUN: -nodefaultlibs %s 2>&1 | FileCheck -check-prefix=CHECK-H2-NODEFAULTLIBS %s
+// CHECK-H2-NODEFAULTLIBS: "-cc1"
+// CHECK-H2-NODEFAULTLIBS: {{hexagon-link|ld}}
+// CHECK-H2-NODEFAULTLIBS: "{{.*}}crt0-noflash-hosted.o"
+// CHECK-H2-NODEFAULTLIBS-NOT: "-lc++"
+// CHECK-H2-NODEFAULTLIBS-NOT: "-lm"
+// CHECK-H2-NODEFAULTLIBS-NOT: "--start-group"
+// CHECK-H2-NODEFAULTLIBS-NOT: "-lh2"
+// CHECK-H2-NODEFAULTLIBS-NOT: "-lsyscall_wrapper"
+// CHECK-H2-NODEFAULTLIBS-NOT: "-lc"
+// CHECK-H2-NODEFAULTLIBS-NOT: "-lclang_rt.builtins"
+// CHECK-H2-NODEFAULTLIBS-NOT: "--end-group"
+
+// RUN: %clangxx -### --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 \
+// RUN: -nolibc %s 2>&1 | FileCheck -check-prefix=CHECK-H2-NOLIBC %s
+// CHECK-H2-NOLIBC: "-cc1"
+// CHECK-H2-NOLIBC: {{hexagon-link|ld}}
+// CHECK-H2-NOLIBC: "{{.*}}crt0-noflash-hosted.o"
+// CHECK-H2-NOLIBC-SAME: "-lc++"
+// CHECK-H2-NOLIBC-SAME: "-lm"
+// CHECK-H2-NOLIBC-SAME: "--start-group"
+// CHECK-H2-NOLIBC-SAME: "-lh2"
+// CHECK-H2-NOLIBC-SAME: "-lsyscall_wrapper"
+// CHECK-H2-NOLIBC-NOT: "-lc"
+// CHECK-H2-NOLIBC-SAME: "-lclang_rt.builtins"
+// CHECK-H2-NOLIBC-SAME: "--end-group"
+
+// -----------------------------------------------------------------------------
+// H2: compiler-rt is forced (not -lgcc)
+// -----------------------------------------------------------------------------
+// RUN: %clang --target=hexagon-h2-elf --cstdlib=picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-RTLIB
+// RUN: %clangxx --target=hexagon-h2-elf --cstdlib=picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-RTLIB
+// CHECK-H2-RTLIB: "-lclang_rt.builtins"
+// CHECK-H2-RTLIB-NOT: "-lgcc"
+
+// -----------------------------------------------------------------------------
+// H2: libunwind linked for C++ but not C
+// -----------------------------------------------------------------------------
+// RUN: %clangxx --target=hexagon-h2-elf --cstdlib=picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-CXX-UNWIND
+// CHECK-H2-CXX-UNWIND: "-lunwind"
+
+// -----------------------------------------------------------------------------
+// H2: library search paths use target/picolibc/hexagon-unknown-h2-elf/
+// -----------------------------------------------------------------------------
+// RUN: %clang --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 -### %s 2>&1 | FileCheck -check-prefix=CHECK-H2-LIBPATHS %s
+// CHECK-H2-LIBPATHS: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68"
+// CHECK-H2-LIBPATHS-NOT: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}G0"
+
+// RUN: %clang --target=hexagon-h2-elf --cstdlib=picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 -G0 -### %s 2>&1 | FileCheck -check-prefix=CHECK-H2-LIBPATHS-G0 %s
+// CHECK-H2-LIBPATHS-G0: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}G0"
+// CHECK-H2-LIBPATHS-G0: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68"
diff --git a/clang/test/Preprocessor/hexagon-predefines.c b/clang/test/Preprocessor/hexagon-predefines.c
index 7652e4169a63c..cb3e9492ea07e 100644
--- a/clang/test/Preprocessor/hexagon-predefines.c
+++ b/clang/test/Preprocessor/hexagon-predefines.c
@@ -255,3 +255,9 @@
// CHECK-QURT: #define __hexagon__ 1
// CHECK-QURT: #define __qurt__ 1
// CHECK-QURT-NOT: #define __linux__
+
+// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-h2 %s | FileCheck \
+// RUN: %s -check-prefix CHECK-H2
+// CHECK-H2: #define __h2__ 1
+// CHECK-H2: #define __hexagon__ 1
+// CHECK-H2-NOT: #define __linux__
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 6e26f14ab8448..d5a42d9646c18 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -260,7 +260,8 @@ class Triple {
ChipStar,
Firmware,
QURT,
- LastOSType = QURT
+ H2,
+ LastOSType = H2
};
enum EnvironmentType {
UnknownEnvironment,
@@ -774,6 +775,9 @@ class Triple {
/// Tests whether the OS is QURT.
bool isOSQurt() const { return getOS() == Triple::QURT; }
+ /// Tests whether the OS is H2.
+ bool isOSH2() const { return getOS() == Triple::H2; }
+
/// Tests whether the OS uses the ELF binary format.
bool isOSBinFormatELF() const { return getObjectFormat() == Triple::ELF; }
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 80f7ef063c908..c6515425b7eb5 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -495,6 +495,8 @@ StringRef Triple::getOSTypeName(OSType Kind) {
return "firmware";
case QURT:
return "qurt";
+ case H2:
+ return "h2";
}
llvm_unreachable("Invalid OSType");
@@ -965,6 +967,7 @@ static Triple::OSType parseOS(StringRef OSName) {
.StartsWith("chipstar", Triple::ChipStar)
.StartsWith("firmware", Triple::Firmware)
.StartsWith("qurt", Triple::QURT)
+ .StartsWith("h2", Triple::H2)
.Default(Triple::UnknownOS);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/195795
More information about the cfe-commits
mailing list