https://github.com/quic-k updated https://github.com/llvm/llvm-project/pull/201326
>From fafc011ecd5a60615f2fe9b64912f1504eb30250 Mon Sep 17 00:00:00 2001 From: Kushal Pal <[email protected]> Date: Mon, 25 May 2026 16:41:40 +0530 Subject: [PATCH] [Clang][Hexagon] Use flat library directory layout for Picolibc For the non-Picolibc Hexagon ELF toolchain, variant libraries are organized in a nested directory hierarchy: lib/<cpu>/G0/pic/ For Picolibc, switch to a flat parallel layout where the CPU version, G0, and pic qualifiers are encoded as a single hyphen-separated directory name: <hexagon-tree>/target/picolibc/lib/<cpu>-G0-pic/ (PIC + G0) <hexagon-tree>/target/picolibc/lib/<cpu>-G0/ (G0 only) <hexagon-tree>/target/picolibc/lib/<cpu>/ (base) This applies to both the library search paths (-L flags, via getHexagonLibraryPaths) and the start-file directory (crt0 lookup, via getLibraryDir). The non-Picolibc toolchain is unaffected. The flat layout is easier to package (no deeply nested install trees), self-documenting, and closer to how other embedded toolchains expose multilib variants as parallel directories. Update hexagon-toolchain-picolibc.c to reflect the new paths, and add --sysroot tests that verify include paths, library search paths, and start-file selection for the base, G0, and G0-pic variants. Signed-off-by: Kushal Pal <[email protected]> --- clang/lib/Driver/ToolChains/Hexagon.cpp | 80 ++++++++++---- .../test/Driver/hexagon-toolchain-picolibc.c | 103 +++++++++++++++--- 2 files changed, 142 insertions(+), 41 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp index fd2ec694abb2f..6f21a99307990 100644 --- a/clang/lib/Driver/ToolChains/Hexagon.cpp +++ b/clang/lib/Driver/ToolChains/Hexagon.cpp @@ -428,18 +428,20 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA, HTC.getLibraryDir(Args, LibraryDir); if (IncStdLib && IncStartFiles) { - if (!IsShared) { - if (HTC.GetCStdlibType(Args) == ToolChain::CST_Picolibc) { - SmallString<128> Crt0 = LibraryDir; - 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 (HTC.GetCStdlibType(Args) == ToolChain::CST_Picolibc) { + SmallString<128> Crt0 = LibraryDir; + 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)); + } else if (HTC.getTriple().isOSQurt()) { + // QURT provides its own crt0. + } + // Known OS other than H2/QURT: no semihost crt0; OS provides its own. + } else { + if (!IsShared) { if (HasStandalone) { SmallString<128> Crt0SA = LibraryDir; llvm::sys::path::append(Crt0SA, "crt0_standalone.o"); @@ -599,14 +601,29 @@ void HexagonToolChain::getLibraryDir(const ArgList &Args, llvm::sys::path::append(Dir, "lib"); } std::string CpuVer = GetTargetCPUVersion(Args).str(); - llvm::sys::path::append(Dir, CpuVer); - if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) - if (*G == 0) - llvm::sys::path::append(Dir, "G0"); + bool IsPicolibc = GetCStdlibType(Args) == ToolChain::CST_Picolibc; + bool IsG0 = + toolchains::HexagonToolChain::getSmallDataThreshold(Args).value_or(1) == + 0; bool IsStatic = Args.hasArg(options::OPT_static); bool IsShared = Args.hasArg(options::OPT_shared); - if (IsShared && !IsStatic) - llvm::sys::path::append(Dir, "pic"); + bool IsPic = Args.hasArg(options::OPT_fpic, options::OPT_fPIC); + if (IsPicolibc) { + // Flat layout: lib/v68-G0-pic, lib/v68-G0, lib/v68 + std::string Variant = CpuVer; + if (IsG0) + Variant += "-G0"; + if (IsPic || IsShared) + Variant += "-pic"; + llvm::sys::path::append(Dir, Variant); + } else { + // Nested layout (non-Picolibc): lib/v68/G0/pic + llvm::sys::path::append(Dir, CpuVer); + if (IsG0) + llvm::sys::path::append(Dir, "G0"); + if (IsShared && !IsStatic) + llvm::sys::path::append(Dir, "pic"); + } } void HexagonToolChain::getBaseIncludeDir(const ArgList &Args, @@ -676,16 +693,33 @@ void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args, if (auto G = getSmallDataThreshold(Args)) HasG0 = *G == 0; + bool IsPicolibc = GetCStdlibType(Args) == ToolChain::CST_Picolibc; const std::string CpuVer = GetTargetCPUVersion(Args).str(); for (auto &Dir : RootDirs) { std::string LibDir = Dir + "/lib"; std::string LibDirCpu = LibDir + '/' + CpuVer; - if (HasG0) { - if (HasPIC) - LibPaths.push_back(LibDirCpu + "/G0/pic"); - LibPaths.push_back(LibDirCpu + "/G0"); + if (IsPicolibc) { + // Flat layout: push only the single most-specific variant dir, then lib. + // Base case (no G0/pic): lib/v68, lib. + // -shared also implies -pic for Picolibc library search paths. + bool HasPICOrShared = HasPIC || Args.hasArg(options::OPT_shared); + if (HasG0) { + std::string Variant = CpuVer + "-G0"; + if (HasPICOrShared) + Variant += "-pic"; + LibPaths.push_back(LibDir + "/" + Variant); + } else { + LibPaths.push_back(LibDirCpu); + } + } else { + // Nested layout (non-Picolibc): lib/v68/G0/pic, lib/v68/G0 + if (HasG0) { + if (HasPIC) + LibPaths.push_back(LibDirCpu + "/G0/pic"); + LibPaths.push_back(LibDirCpu + "/G0"); + } + LibPaths.push_back(LibDirCpu); } - LibPaths.push_back(LibDirCpu); LibPaths.push_back(LibDir); } } diff --git a/clang/test/Driver/hexagon-toolchain-picolibc.c b/clang/test/Driver/hexagon-toolchain-picolibc.c index 5d56ae8ff56ed..85ead7da4cf26 100644 --- a/clang/test/Driver/hexagon-toolchain-picolibc.c +++ b/clang/test/Driver/hexagon-toolchain-picolibc.c @@ -20,11 +20,18 @@ // ----------------------------------------------------------------------------- // Passing start files for Picolibc // ----------------------------------------------------------------------------- -// RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-STARTUP -// CHECK-STARTUP: "{{.*}}crt0-semihost.o" +// RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin -mcpu=hexagonv68 \ +// RUN: -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-STARTUP +// CHECK-STARTUP: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}crt0-semihost.o" // // RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc -nostartfiles -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NOSTART // CHECK-NOSTART-NOT: "{{.*}}crt0-semihost.o" +// +// RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin -mcpu=hexagonv68 -G0 \ +// RUN: -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-STARTUP-G0 +// CHECK-STARTUP-G0: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0{{/|\\\\}}crt0-semihost.o" // ----------------------------------------------------------------------------- // Passing -nostdlib, -nostartfiles, -nodefaultlibs, -nolibc // ----------------------------------------------------------------------------- @@ -58,7 +65,7 @@ // 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: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v60{{/|\\\\}}crt0-semihost.o" // CHECK-NODEFAULTLIBS-NOT: "-lc++" // CHECK-NODEFAULTLIBS-NOT: "-lm" // CHECK-NODEFAULTLIBS-NOT: "--start-group" @@ -72,7 +79,7 @@ // RUN: -nolibc %s 2>&1 | FileCheck -check-prefix=CHECK-NOLIBC %s // CHECK-NOLIBC: "-cc1" // CHECK-NOLIBC: {{hexagon-link|ld}} -// CHECK-NOLIBC: "{{.*}}crt0-semihost.o" +// CHECK-NOLIBC: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v60{{/|\\\\}}crt0-semihost.o" // CHECK-NOLIBC-SAME: "-lc++" // CHECK-NOLIBC-SAME: "-lm" // CHECK-NOLIBC-SAME: "--start-group" @@ -108,20 +115,18 @@ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv68 -### %s 2>&1 | FileCheck -check-prefix=CHECK-LIBPATHS %s // CHECK-LIBPATHS: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68" -// CHECK-LIBPATHS-NOT: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}G0" +// CHECK-LIBPATHS-NOT: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0" // RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc \ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv68 -G0 -### %s 2>&1 | FileCheck -check-prefix=CHECK-LIBPATHS-G0 %s -// CHECK-LIBPATHS-G0: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}G0" -// CHECK-LIBPATHS-G0: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68" +// CHECK-LIBPATHS-G0: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0" // RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc \ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv68 -fpic -### %s 2>&1 | FileCheck -check-prefix=CHECK-LIBPATHS-PIC %s -// 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" +// CHECK-LIBPATHS-PIC: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0-pic{{/|\\\\}}crt0-semihost.o" +// CHECK-LIBPATHS-PIC: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0-pic" // ============================================================================= // H2 OS tests (--target=hexagon-h2-elf --cstdlib=picolibc) @@ -145,12 +150,19 @@ // ----------------------------------------------------------------------------- // 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" +// RUN: %clang --target=hexagon-h2-elf --cstdlib=picolibc \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin -mcpu=hexagonv68 \ +// RUN: -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-STARTUP +// CHECK-H2-STARTUP: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}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" +// +// RUN: %clang --target=hexagon-h2-elf --cstdlib=picolibc \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin -mcpu=hexagonv68 -G0 \ +// RUN: -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-STARTUP-G0 +// CHECK-H2-STARTUP-G0: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0{{/|\\\\}}crt0-noflash-hosted.o" // ----------------------------------------------------------------------------- // H2: -nostdlib, -nostartfiles, -nodefaultlibs, -nolibc @@ -186,7 +198,7 @@ // 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: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}crt0-noflash-hosted.o" // CHECK-H2-NODEFAULTLIBS-NOT: "-lc++" // CHECK-H2-NODEFAULTLIBS-NOT: "-lm" // CHECK-H2-NODEFAULTLIBS-NOT: "--start-group" @@ -202,7 +214,7 @@ // 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: "{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}crt0-noflash-hosted.o" // CHECK-H2-NOLIBC-SAME: "-lc++" // CHECK-H2-NOLIBC-SAME: "-lm" // CHECK-H2-NOLIBC-SAME: "--start-group" @@ -221,7 +233,7 @@ // CHECK-H2-RTLIB-NOT: "-lgcc" // ----------------------------------------------------------------------------- -// H2: libunwind linked for C++ but not C +// H2: libunwind linked for C++ by default // ----------------------------------------------------------------------------- // RUN: %clangxx --target=hexagon-h2-elf --cstdlib=picolibc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-H2-CXX-UNWIND // CHECK-H2-CXX-UNWIND: "-lunwind" @@ -233,10 +245,65 @@ // 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" +// 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" +// CHECK-H2-LIBPATHS-G0: "-L{{.*}}{{/|\\\\}}Inputs{{/|\\\\}}hexagon_tree{{/|\\\\}}Tools{{/|\\\\}}bin{{/|\\\\}}..{{/|\\\\}}target{{/|\\\\}}picolibc{{/|\\\\}}hexagon-unknown-h2-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0" + +// ============================================================================= +// --sysroot tests: verify includes, library paths, and start files when an +// explicit sysroot is provided together with --cstdlib=picolibc. +// The sysroot path is synthetic (/my/picolibc/sysroot); no real directory is +// needed because the driver emits the paths unconditionally. +// ============================================================================= + +// ----------------------------------------------------------------------------- +// Base (no G0 / no pic): include paths (C and C++), lib/v68, crt0-semihost.o +// Use the existing Inputs sysroot so that include/c++/v1 exists on disk and +// the driver emits the C++ include path. +// ----------------------------------------------------------------------------- +// RUN: %clangxx --target=hexagon-none-elf --cstdlib=picolibc \ +// RUN: --sysroot=%S/Inputs/hexagon_tree/Tools/target/picolibc/hexagon-unknown-none-elf \ +// RUN: -mcpu=hexagonv68 -### %s 2>&1 | FileCheck -check-prefix=CHECK-SYSROOT %s +// CHECK-SYSROOT: "-isysroot" "{{.*}}{{/|\\\\}}hexagon-unknown-none-elf" +// CHECK-SYSROOT: "-internal-isystem" "{{.*}}{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1" +// CHECK-SYSROOT: "-internal-externc-isystem" "{{.*}}{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}include" +// CHECK-SYSROOT: "{{.*}}{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68{{/|\\\\}}crt0-semihost.o" +// CHECK-SYSROOT: "-L{{.*}}{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68" +// CHECK-SYSROOT: "-L{{.*}}{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib" +// CHECK-SYSROOT-NOT: "-L{{.*}}{{/|\\\\}}hexagon-unknown-none-elf{{/|\\\\}}lib{{/|\\\\}}v68-G0" + +// ----------------------------------------------------------------------------- +// G0: crt0-semihost.o from lib/v68-G0, search paths lib/v68-G0 then lib/v68 +// ----------------------------------------------------------------------------- +// RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc \ +// RUN: --sysroot=/my/picolibc/sysroot \ +// RUN: -mcpu=hexagonv68 -G0 -### %s 2>&1 | FileCheck -check-prefix=CHECK-SYSROOT-G0 %s +// CHECK-SYSROOT-G0: "/my/picolibc/sysroot{{/|\\\\}}lib{{/|\\\\}}v68-G0{{/|\\\\}}crt0-semihost.o" +// CHECK-SYSROOT-G0: "-L/my/picolibc/sysroot{{/|\\\\}}lib{{/|\\\\}}v68-G0" +// CHECK-SYSROOT-G0: "-L/my/picolibc/sysroot{{/|\\\\}}lib" +// CHECK-SYSROOT-G0-NOT: "-L/my/picolibc/sysroot{{/|\\\\}}lib{{/|\\\\}}v68-G0-pic" + +// ----------------------------------------------------------------------------- +// G0-pic (-fpic): search paths lib/v68-G0-pic, lib/v68-G0, lib/v68 +// -fpic implies both G0 and pic, so crt0 comes from lib/v68-G0-pic +// ----------------------------------------------------------------------------- +// RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc \ +// RUN: --sysroot=/my/picolibc/sysroot \ +// RUN: -mcpu=hexagonv68 -fpic -### %s 2>&1 | FileCheck -check-prefix=CHECK-SYSROOT-PIC %s +// CHECK-SYSROOT-PIC: "/my/picolibc/sysroot{{/|\\\\}}lib{{/|\\\\}}v68-G0-pic{{/|\\\\}}crt0-semihost.o" +// CHECK-SYSROOT-PIC: "-L/my/picolibc/sysroot{{/|\\\\}}lib{{/|\\\\}}v68-G0-pic" +// CHECK-SYSROOT-PIC: "-L/my/picolibc/sysroot{{/|\\\\}}lib" + +// ----------------------------------------------------------------------------- +// -shared: crt0 comes from lib/v68-G0-pic (G0 and pic both implied by +// -shared); search paths lib/v68-G0-pic, lib/v68-G0, lib/v68 +// ----------------------------------------------------------------------------- +// RUN: %clang --target=hexagon-none-elf --cstdlib=picolibc \ +// RUN: --sysroot=/my/picolibc/sysroot \ +// RUN: -mcpu=hexagonv68 -shared -### %s 2>&1 | FileCheck -check-prefix=CHECK-SYSROOT-SHARED %s +// CHECK-SYSROOT-SHARED: "/my/picolibc/sysroot{{/|\\\\}}lib{{/|\\\\}}v68-G0-pic{{/|\\\\}}crt0-semihost.o" +// CHECK-SYSROOT-SHARED: "-L/my/picolibc/sysroot{{/|\\\\}}lib{{/|\\\\}}v68-G0-pic" +// CHECK-SYSROOT-SHARED: "-L/my/picolibc/sysroot{{/|\\\\}}lib" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
