[clang] [llvm] [Clang][Hexagon] Use Picolibc environment in Hexagon toolchain (PR #171611)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 10 04:56:32 PST 2025
https://github.com/quic-k created https://github.com/llvm/llvm-project/pull/171611
Depends on #169613
>From 767ef0ae4193335ebf5bf0a9a01a94d3c64052b2 Mon Sep 17 00:00:00 2001
From: Kushal Pal <kushpal at qti.qualcomm.com>
Date: Tue, 9 Dec 2025 11:37:25 +0530
Subject: [PATCH 1/2] [Clang] Add Picolibc environment type for triples
Introduce `EnvironmentType::Picolibc` so that LLVM triples can
explicitly represent targets using Picolibc.
Signed-off-by: Kushal Pal <kushpal at qti.qualcomm.com>
---
llvm/include/llvm/TargetParser/Triple.h | 4 ++++
llvm/lib/TargetParser/Triple.cpp | 3 +++
2 files changed, 7 insertions(+)
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 11b76cd183108..8728288f3538a 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -280,6 +280,7 @@ class Triple {
MuslX32,
MuslWALI,
LLVM,
+ Picolibc,
MSVC,
Itanium,
@@ -866,6 +867,9 @@ class Triple {
getEnvironment() == Triple::OpenHOS || isOSLiteOS();
}
+ // Tests whether the environment is picolibc
+ bool isPicolibc() const { return getEnvironment() == Triple::Picolibc; }
+
/// Tests whether the target is OHOS
/// LiteOS default enviroment is also OHOS, but omited on triple.
bool isOHOSFamily() const { return isOpenHOS() || isOSLiteOS(); }
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 11ba9ee32f66a..de9ea67bde939 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -378,6 +378,8 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
case MuslWALI:
return "muslwali";
case Simulator: return "simulator";
+ case Picolibc:
+ return "picolibc";
case Pixel: return "pixel";
case Vertex: return "vertex";
case Geometry: return "geometry";
@@ -747,6 +749,7 @@ static Triple::OSType parseOS(StringRef OSName) {
static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
return StringSwitch<Triple::EnvironmentType>(EnvironmentName)
+ .StartsWith("picolibc", Triple::Picolibc)
.StartsWith("eabihf", Triple::EABIHF)
.StartsWith("eabi", Triple::EABI)
.StartsWith("gnuabin32", Triple::GNUABIN32)
>From 56c0dc91c7f4a9b2204750a4c444abc733f2ef67 Mon Sep 17 00:00:00 2001
From: Kushal Pal <kushpal at qti.qualcomm.com>
Date: Tue, 9 Dec 2025 11:42:18 +0530
Subject: [PATCH 2/2] [Clang][Hexagon] Enable Picolibc environment in Hexagon
toolchain
Update the Hexagon toolchain to recognize and handle triples
with `EnvironmentType::Picolibc`. This allows proper selection
of Picolibc runtime and libraries when targeting Hexagon environments.
Signed-off-by: Kushal Pal <kushpal at qti.qualcomm.com>
---
clang/lib/Driver/ToolChains/Hexagon.cpp | 184 ++++++++++++++++--
clang/lib/Driver/ToolChains/Hexagon.h | 8 +
.../test/Driver/hexagon-toolchain-picolibc.c | 133 +++++++++++++
3 files changed, 312 insertions(+), 13 deletions(-)
create mode 100644 clang/test/Driver/hexagon-toolchain-picolibc.c
diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp
index 084f51721315c..f4aa3a94a9a72 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -13,6 +13,7 @@
#include "clang/Driver/InputInfo.h"
#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
+#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/VirtualFileSystem.h"
@@ -273,6 +274,97 @@ void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
ArgStringList &CmdArgs) const {
}
+static void constructHexagonPicolibcLinkArgs(
+ Compilation &C, const JobAction &JA,
+ const toolchains::HexagonToolChain &HTC, const InputInfo &Output,
+ const InputInfoList &Inputs, const ArgList &Args, ArgStringList &CmdArgs,
+ const char *LinkingOutput) {
+ const Driver &D = HTC.getDriver();
+ bool IsShared = Args.hasArg(options::OPT_shared);
+ bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
+ bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
+ bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
+ StringRef CpuVer = toolchains::HexagonToolChain::GetTargetCPUVersion(Args);
+ // Use G0 for Picolibc
+ bool UseG0 = true;
+ auto OsType = HTC.getOS();
+
+ CmdArgs.push_back("--eh-frame-hdr");
+ // Propagate arch flags to the linker when not using LLD, to match
+ // upstream Hexagon driver behavior validated by tests.
+ bool UseLLD = false;
+ const char *LinkerPath = Args.MakeArgString(HTC.GetLinkerPath(&UseLLD));
+ UseLLD = UseLLD ||
+ llvm::sys::path::filename(LinkerPath).ends_with("ld.lld") ||
+ llvm::sys::path::stem(LinkerPath).ends_with("ld.lld");
+ if (!UseLLD) {
+ CmdArgs.push_back("-march=hexagon");
+ CmdArgs.push_back(Args.MakeArgString("-mcpu=hexagon" + CpuVer));
+ }
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(Output.getFilename());
+
+ // Inputs
+ Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,
+ options::OPT_t, options::OPT_u_Group});
+ AddLinkerInputs(HTC, Inputs, Args, CmdArgs, JA);
+
+ //----------------------------------------------------------------------------
+ // Start Files
+ //----------------------------------------------------------------------------
+ const std::string MCpuSuffix = "/" + CpuVer.str();
+ const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
+ const std::string RootDir =
+ HTC.getHexagonTargetDir(D.Dir, D.PrefixDirs) + "/";
+ std::string NormalizedTriple =
+ HTC.getTriple().normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
+ const std::string StartSubDir =
+ NormalizedTriple + "/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
+
+ if (IncStdLib && IncStartFiles) {
+ if (!IsShared) {
+ if (OsType == "none" || OsType == "unknown") {
+ std::string Crt0 = RootDir + StartSubDir + "/crt0-semihost.o";
+ CmdArgs.push_back(Args.MakeArgString(Crt0));
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------------
+ // Library Search Paths
+ //----------------------------------------------------------------------------
+ const ToolChain::path_list &LibPaths = HTC.getFilePaths();
+ for (const auto &LibPath : LibPaths)
+ CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
+ //----------------------------------------------------------------------------
+ // Libraries
+ //----------------------------------------------------------------------------
+ if (IncStdLib && IncDefLibs) {
+ if (D.CCCIsCXX()) {
+ if (HTC.ShouldLinkCXXStdlib(Args))
+ HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
+ CmdArgs.push_back("-lm");
+ }
+
+ CmdArgs.push_back("--start-group");
+
+ if (!IsShared) {
+ // add OS libraries to link
+ std::vector<std::string> OsLibs{};
+ if (OsType == "none" || OsType == "unknown") {
+ OsLibs.push_back("semihost");
+ }
+ for (StringRef Lib : OsLibs)
+ CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
+ if (!Args.hasArg(options::OPT_nolibc))
+ CmdArgs.push_back("-lc");
+ }
+ // Force compiler-rt for Picolibc
+ CmdArgs.push_back("-lclang_rt.builtins");
+ CmdArgs.push_back("--end-group");
+ }
+}
+
static void
constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
const toolchains::HexagonToolChain &HTC,
@@ -437,8 +529,8 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
CmdArgs.push_back(Args.MakeArgString(Crt0));
}
std::string Init = UseShared
- ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
- : Find(RootDir, StartSubDir, "/init.o");
+ ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
+ : Find(RootDir, StartSubDir, "/init.o");
CmdArgs.push_back(Args.MakeArgString(Init));
}
@@ -500,8 +592,12 @@ void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
ArgStringList CmdArgs;
- constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
- LinkingOutput);
+ if (HTC.getTriple().isPicolibc())
+ constructHexagonPicolibcLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
+ LinkingOutput);
+ else
+ constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
+ LinkingOutput);
const char *Exec = Args.MakeArgString(HTC.GetLinkerPath());
C.addCommand(std::make_unique<Command>(JA, *this,
@@ -583,16 +679,38 @@ void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
HasG0 = *G == 0;
const std::string CpuVer = GetTargetCPUVersion(Args).str();
- for (auto &Dir : RootDirs) {
- std::string LibDir = Dir + "/hexagon/lib";
- std::string LibDirCpu = LibDir + '/' + CpuVer;
+ // Special-case Picolibc baremetal layout:
+ // <install>/../target/<normalized-triple>/lib/<vXX>/G0[/pic]
+ if (getTriple().isPicolibc()) {
+ std::string SubDir = '/' + CpuVer;
+ // Force G0 for Picolibc
+ HasG0 = true;
if (HasG0) {
if (HasPIC)
- LibPaths.push_back(LibDirCpu + "/G0/pic");
- LibPaths.push_back(LibDirCpu + "/G0");
+ SubDir += "/G0/pic";
+ else
+ SubDir += "/G0";
+ }
+ if (getTriple().getOS() != llvm::Triple::Linux) {
+ for (auto &Dir : RootDirs) {
+ auto NormalizedTriple = getTriple().normalize();
+ std::string LibDir = Dir + '/' + NormalizedTriple + "/lib";
+ LibPaths.push_back(LibDir + SubDir);
+ }
+ }
+ return;
+ } else {
+ for (auto &Dir : RootDirs) {
+ std::string LibDir = Dir + "/hexagon/lib";
+ std::string LibDirCpu = LibDir + '/' + CpuVer;
+ if (HasG0) {
+ if (HasPIC)
+ LibPaths.push_back(LibDirCpu + "/G0/pic");
+ LibPaths.push_back(LibDirCpu + "/G0");
+ }
+ LibPaths.push_back(LibDirCpu);
+ LibPaths.push_back(LibDir);
}
- LibPaths.push_back(LibDirCpu);
- LibPaths.push_back(LibDir);
}
}
@@ -637,7 +755,9 @@ void HexagonToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
if (Args.hasArg(options::OPT_fexperimental_library))
CmdArgs.push_back("-lc++experimental");
CmdArgs.push_back("-lc++abi");
- if (UNW != ToolChain::UNW_None)
+ // For Picolibc baremetal, always link libunwind with libc++ regardless of
+ // -unwindlib setting; libunwind is the only supported unwinding library.
+ if (UNW != ToolChain::UNW_None || getTriple().isPicolibc())
CmdArgs.push_back("-lunwind");
break;
@@ -711,6 +831,16 @@ void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
const Driver &D = getDriver();
SmallString<128> ResourceDirInclude(D.ResourceDir);
+ // Picolibc baremetal headers live under the normalized triple tree.
+ if (getTriple().isPicolibc()) {
+ if (DriverArgs.hasArg(options::OPT_nostdlibinc))
+ return;
+ std::string TargetDir = getHexagonTargetDir(D.Dir, D.PrefixDirs);
+ std::string Target = getTriple().normalize();
+ addExternCSystemInclude(DriverArgs, CC1Args,
+ TargetDir + "/" + Target + "/include");
+ return;
+ }
if (!IsELF) {
llvm::sys::path::append(ResourceDirInclude, "include");
if (!DriverArgs.hasArg(options::OPT_nobuiltininc) &&
@@ -769,11 +899,39 @@ void HexagonToolChain::addLibStdCxxIncludePaths(
DriverArgs, CC1Args);
}
+void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
+ const llvm::opt::ArgList &DriverArgs,
+ llvm::opt::ArgStringList &CC1Args) const {
+ if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
+ DriverArgs.hasArg(options::OPT_nostdincxx))
+ return;
+ // For Picolibc baremetal, add libc++ headers via extern C system include
+ // from the normalized triple tree to match driver tests.
+ const Driver &D = getDriver();
+ if (getTriple().isPicolibc() && getTriple().getOS() != llvm::Triple::Linux) {
+ StringRef InstallDir = D.Dir;
+ addExternCSystemInclude(DriverArgs, CC1Args,
+ InstallDir + "/../target/" +
+ getTriple().normalize() + "/include/c++/v1");
+ return;
+ }
+ // Otherwise delegate to the chosen C++ stdlib include path helper.
+ switch (GetCXXStdlibType(DriverArgs)) {
+ case ToolChain::CST_Libcxx:
+ addLibCxxIncludePaths(DriverArgs, CC1Args);
+ break;
+ case ToolChain::CST_Libstdcxx:
+ addLibStdCxxIncludePaths(DriverArgs, CC1Args);
+ break;
+ llvm_unreachable("Unexpected C++ stdlib type");
+ }
+}
+
ToolChain::CXXStdlibType
HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
if (!A) {
- if (getTriple().isMusl())
+ if (getTriple().isMusl() || getTriple().isPicolibc())
return ToolChain::CST_Libcxx;
else
return ToolChain::CST_Libstdcxx;
diff --git a/clang/lib/Driver/ToolChains/Hexagon.h b/clang/lib/Driver/ToolChains/Hexagon.h
index 033d9b48cae10..446c7cea2264b 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.h
+++ b/clang/lib/Driver/ToolChains/Hexagon.h
@@ -33,6 +33,11 @@ class LLVM_LIBRARY_VISIBILITY Assembler final : public Tool {
const InputInfo &Output, const InputInfoList &Inputs,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;
+ void ConstructJobForPicolibc(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
+ const llvm::opt::ArgList &TCArgs,
+ const char *LinkingOutput) const;
};
class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
@@ -78,6 +83,9 @@ class LLVM_LIBRARY_VISIBILITY HexagonToolChain : public Linux {
void
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const override;
+ void AddClangCXXStdlibIncludeArgs(
+ const llvm::opt::ArgList &DriverArgs,
+ llvm::opt::ArgStringList &CC1Args) const override;
void addLibStdCxxIncludePaths(
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) const override;
diff --git a/clang/test/Driver/hexagon-toolchain-picolibc.c b/clang/test/Driver/hexagon-toolchain-picolibc.c
new file mode 100644
index 0000000000000..00b092358006b
--- /dev/null
+++ b/clang/test/Driver/hexagon-toolchain-picolibc.c
@@ -0,0 +1,133 @@
+// UNSUPPORTED: system-windows
+// REQUIRES: hexagon-registered-target
+
+// -----------------------------------------------------------------------------
+// Test standard include paths
+// -----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin %s 2>&1 | FileCheck -check-prefix=CHECK-C-INCLUDES %s
+// CHECK-C-INCLUDES: "-cc1" {{.*}} "-internal-externc-isystem" "{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon-unknown-none-picolibc/include"
+
+// RUN: %clangxx -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin %s 2>&1 | FileCheck -check-prefix=CHECK-CXX-INCLUDES %s
+// CHECK-CXX-INCLUDES: "-cc1" {{.*}} "-internal-externc-isystem" "{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon-unknown-none-picolibc/include/c++/v1"
+// CHECK-CXX-INCLUDES: "-internal-externc-isystem" "{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon-unknown-none-picolibc/include"
+// -----------------------------------------------------------------------------
+// Passing start files for Picolibc
+// -----------------------------------------------------------------------------
+// RUN: %clang -target hexagon-none-picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-STARTUP
+// CHECK-STARTUP: "{{.*}}crt0-semihost.o"
+//
+// RUN: %clang -target hexagon-none-picolibc -nostartfiles -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NOSTART
+// CHECK-NOSTART-NOT: "{{.*}}crt0-semihost.o"
+// -----------------------------------------------------------------------------
+// Passing -nostdlib, -nostartfiles, -nodefaultlibs, -nolibc
+// -----------------------------------------------------------------------------
+// RUN: %clangxx -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv60 \
+// RUN: -nostdlib %s 2>&1 | FileCheck -check-prefix=CHECK-NOSTDLIB %s
+// CHECK-NOSTDLIB: "-cc1"
+// CHECK-NOSTDLIB: {{hexagon-link|ld}}
+// CHECK-NOSTDLIB-NOT: {{.*}}crt0-semihost.o
+// CHECK-NOSTDLIB-NOT: "-lc++"
+// CHECK-NOSTDLIB-NOT: "-lm"
+// CHECK-NOSTDLIB-NOT: "--start-group"
+// CHECK-NOSTDLIB-NOT: "-lsemihost"
+// CHECK-NOSTDLIB-NOT: "-lc"
+// CHECK-NOSTDLIB-NOT: "-lclang_rt.builtins"
+// CHECK-NOSTDLIB-NOT: "--end-group"
+
+// RUN: %clangxx -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv60 \
+// RUN: -nostartfiles %s 2>&1 | FileCheck -check-prefix=CHECK-NOSTARTFILES %s
+// CHECK-NOSTARTFILES: "-cc1"
+// CHECK-NOSTARTFILES: {{hexagon-link|ld}}
+// CHECK-NOSTARTFILES-NOT: {{.*}}crt0-semihost.o
+// CHECK-NOSTARTFILES: "-lc++" "-lc++abi" "-lunwind" "-lm" "--start-group" "-lsemihost" "-lc" "-lclang_rt.builtins" "--end-group"
+
+// RUN: %clangxx -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv60 \
+// RUN: -nodefaultlibs %s 2>&1 | FileCheck -check-prefix=CHECK-NODEFAULTLIBS %s
+// CHECK-NODEFAULTLIBS: "-cc1"
+// CHECK-NODEFAULTLIBS: {{hexagon-link|ld}}
+// CHECK-NODEFAULTLIBS: "{{.*}}crt0-semihost.o"
+// CHECK-NODEFAULTLIBS-NOT: "-lc++"
+// CHECK-NODEFAULTLIBS-NOT: "-lm"
+// CHECK-NODEFAULTLIBS-NOT: "--start-group"
+// CHECK-NODEFAULTLIBS-NOT: "-lsemihost"
+// CHECK-NODEFAULTLIBS-NOT: "-lc"
+// CHECK-NODEFAULTLIBS-NOT: "-lclang_rt.builtins"
+// CHECK-NODEFAULTLIBS-NOT: "--end-group"
+
+// RUN: %clangxx -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin -mcpu=hexagonv60 \
+// RUN: -nolibc %s 2>&1 | FileCheck -check-prefix=CHECK-NOLIBC %s
+// CHECK-NOLIBC: "-cc1"
+// CHECK-NOLIBC: hexagon-link
+// CHECK-NOLIBC-SAME: "{{.*}}crt0-semihost.o"
+// CHECK-NOLIBC-SAME: "-lc++"
+// CHECK-NOLIBC-SAME: "-lm"
+// CHECK-NOLIBC-SAME: "--start-group"
+// CHECK-NOLIBC-SAME: "-lsemihost"
+// CHECK-NOLIBC-NOT: "-lc"
+// CHECK-NOLIBC-SAME: "-lclang_rt.builtins"
+// CHECK-NOLIBC-SAME: "--end-group"
+// -----------------------------------------------------------------------------
+// Force compiler-rt when Picolibc is selected
+// -----------------------------------------------------------------------------
+// RUN: %clang -target hexagon-none-picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-RTLIB
+// RUN: %clangxx -target hexagon-none-picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-RTLIB
+// CHECK-RTLIB: "-lclang_rt.builtins"
+// -----------------------------------------------------------------------------
+// Force libunwind when Picolibc is selected
+// -----------------------------------------------------------------------------
+// RUN: %clang -target hexagon-none-picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-C-UNWIND
+// RUN: %clangxx -target hexagon-none-picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-CXX-UNWIND
+// CHECK-C-UNWIND-NOT: "-lunwind"
+// CHECK-CXX-UNWIND: "-lunwind"
+// -----------------------------------------------------------------------------
+// Force G0 for Picolibc
+// -----------------------------------------------------------------------------
+// RUN: %clang -target hexagon-none-picolibc -### \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 %s 2>&1 | FileCheck %s --check-prefix=CHECK-G0
+// RUN: %clangxx -target hexagon-none-picolibc -### \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN: -mcpu=hexagonv68 %s 2>&1 | FileCheck %s --check-prefix=CHECK-G0
+// CHECK-G0: "{{.*}}/G0/crt0-semihost.o"
+// CHECK-G0-SAME: "-L{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon-unknown-none-picolibc/lib/v68/G0"
+// -----------------------------------------------------------------------------
+// Libc++ experimental library linkage
+// -----------------------------------------------------------------------------
+// RUN: %clangxx -### --target=hexagon-none-picolibc -fexperimental-library %s 2>&1 | FileCheck %s --check-prefix=CHECK-EXPERIMENTAL
+// CHECK-EXPERIMENTAL: "-lc++experimental"
+// -----------------------------------------------------------------------------
+// Custom -L forwarding
+// -----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-none-picolibc -L/foo/bar %s 2>&1 | FileCheck %s --check-prefix=CHECK-CUSTOM-L
+// CHECK-CUSTOM-L: "-L/foo/bar"
+// -----------------------------------------------------------------------------
+// Link arch flags propagation
+// -----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-none-picolibc -mcpu=hexagonv68 %s 2>&1 | FileCheck %s --check-prefix=CHECK-LINK-ARCH
+// CHECK-LINK-ARCH: "-march=hexagon"
+// CHECK-LINK-ARCH: "-mcpu=hexagonv68"
+// -----------------------------------------------------------------------------
+// No standard includes when -nostdinc (C only); -nostdinc++ blocks C++ headers
+// -----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin -nostdinc %s 2>&1 | FileCheck %s --check-prefix=CHECK-NOSTDINC-C
+// CHECK-NOSTDINC-C-NOT: "{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon-unknown-none-picolibc/include"
+// RUN: %clangxx -### --target=hexagon-none-picolibc \
+// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin -nostdinc++ %s 2>&1 | FileCheck %s --check-prefix=CHECK-NOSTDINCXX
+// CHECK-NOSTDINCXX-NOT: "{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon-unknown-none-picolibc/include/c++/v1"
+// CHECK-NOSTDINCXX: "-internal-externc-isystem" "{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon-unknown-none-picolibc/include"
+// -----------------------------------------------------------------------------
+// C linking does not include -lm by default
+// -----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-none-picolibc %s 2>&1 | FileCheck %s --check-prefix=CHECK-C-NO-LM
+// CHECK-C-NO-LM-NOT: "-lm"
+// -----------------------------------------------------------------------------
More information about the llvm-commits
mailing list