https://github.com/androm3da created https://github.com/llvm/llvm-project/pull/190267
When compiling with -fsanitize=memory or -fsanitize=address on hexagon-unknown-linux-musl, the driver now prepends sanitizer-specific library paths (e.g. $SYSROOT/usr/lib/msan/) before the normal $SYSROOT/usr/lib/ so that instrumented libraries (libc, libc++, etc.) are found first by the linker. >From 3d68622ce51167a45a58e9ebfcba4b4906424aee Mon Sep 17 00:00:00 2001 From: Brian Cain <[email protected]> Date: Thu, 2 Apr 2026 14:46:55 -0700 Subject: [PATCH] [Hexagon] Add sanitizer-aware library paths for Linux/musl targets When compiling with -fsanitize=memory or -fsanitize=address on hexagon-unknown-linux-musl, the driver now prepends sanitizer-specific library paths (e.g. $SYSROOT/usr/lib/msan/) before the normal $SYSROOT/usr/lib/ so that instrumented libraries (libc, libc++, etc.) are found first by the linker. --- clang/lib/Driver/ToolChains/Hexagon.cpp | 36 +++++++++++++++++++++ clang/test/Driver/hexagon-toolchain-linux.c | 33 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp index 1f39b94e2afa3..f959169c5569b 100644 --- a/clang/lib/Driver/ToolChains/Hexagon.cpp +++ b/clang/lib/Driver/ToolChains/Hexagon.cpp @@ -11,6 +11,8 @@ #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" #include "clang/Driver/InputInfo.h" +#include "clang/Driver/MultilibBuilder.h" +#include "clang/Driver/SanitizerArgs.h" #include "clang/Options/Options.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/FileSystem.h" @@ -346,6 +348,12 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA, !Args.hasArg(options::OPT_nostartfiles, options::OPT_nostdlib)) CmdArgs.push_back(Args.MakeArgString(D.SysRoot + "/usr/lib/crti.o")); + if (!HTC.getSelectedMultilibs().empty() && + !HTC.getSelectedMultilibs().back().isDefault()) { + CmdArgs.push_back( + Args.MakeArgString(StringRef("-L") + D.SysRoot + "/usr/lib" + + HTC.getSelectedMultilibs().back().gccSuffix())); + } CmdArgs.push_back( Args.MakeArgString(StringRef("-L") + D.SysRoot + "/usr/lib")); Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s, @@ -600,6 +608,34 @@ HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple, // support 'linux' we'll need to fix this up LibPaths.clear(); getHexagonLibraryPaths(Args, LibPaths); + + if (getTriple().isMusl()) { + Multilibs.push_back(Multilib()); + Multilibs.push_back(MultilibBuilder("msan", {}, {}) + .flag("-fsanitize=memory") + .makeMultilib()); + Multilibs.push_back(MultilibBuilder("asan", {}, {}) + .flag("-fsanitize=address") + .makeMultilib()); + + Multilib::flags_list Flags; + addMultilibFlag(getSanitizerArgs(Args).needsMsanRt(), "-fsanitize=memory", + Flags); + addMultilibFlag(getSanitizerArgs(Args).needsAsanRt(), "-fsanitize=address", + Flags); + + if (Multilibs.select(D, Flags, SelectedMultilibs)) { + Multilib LastSelected = SelectedMultilibs.back(); + SelectedMultilibs = {LastSelected}; + + if (!SelectedMultilibs.back().isDefault()) { + SmallString<128> SanLibPath(D.SysRoot); + llvm::sys::path::append(SanLibPath, "usr", "lib"); + SanLibPath += SelectedMultilibs.back().gccSuffix(); + LibPaths.insert(LibPaths.begin(), std::string(SanLibPath)); + } + } + } } HexagonToolChain::~HexagonToolChain() {} diff --git a/clang/test/Driver/hexagon-toolchain-linux.c b/clang/test/Driver/hexagon-toolchain-linux.c index e791353cca07f..b800157c4cde4 100644 --- a/clang/test/Driver/hexagon-toolchain-linux.c +++ b/clang/test/Driver/hexagon-toolchain-linux.c @@ -153,3 +153,36 @@ // CHECK013-NOT: "-lgcc_eh" // CHECK013-NOT: "-lgcc_s" // CHECK013-NOT: "-lunwind" + +// ----------------------------------------------------------------------------- +// Sanitizer library paths: -fsanitize=memory +// ----------------------------------------------------------------------------- +// RUN: %clang -### --target=hexagon-unknown-linux-musl \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ +// RUN: -mcpu=hexagonv60 \ +// RUN: -fuse-ld=lld \ +// RUN: -fsanitize=memory \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree %s 2>&1 | FileCheck -check-prefix=CHECK-MSAN %s +// CHECK-MSAN: "-L{{[^"]*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}msan" +// CHECK-MSAN-SAME: "-L{{[^"]*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib" +// ----------------------------------------------------------------------------- +// Sanitizer library paths: -fsanitize=address +// ----------------------------------------------------------------------------- +// RUN: %clang -### --target=hexagon-unknown-linux-musl \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ +// RUN: -mcpu=hexagonv60 \ +// RUN: -fuse-ld=lld \ +// RUN: -fsanitize=address \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree %s 2>&1 | FileCheck -check-prefix=CHECK-ASAN %s +// CHECK-ASAN: "-L{{[^"]*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}asan" +// CHECK-ASAN-SAME: "-L{{[^"]*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib" +// ----------------------------------------------------------------------------- +// No sanitizer: no msan/asan library paths +// ----------------------------------------------------------------------------- +// RUN: %clang -### --target=hexagon-unknown-linux-musl \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ +// RUN: -mcpu=hexagonv60 \ +// RUN: -fuse-ld=lld \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree %s 2>&1 | FileCheck -check-prefix=CHECK-NOSAN %s +// CHECK-NOSAN-NOT: "-L{{.*}}{{/|\\\\}}msan" +// CHECK-NOSAN-NOT: "-L{{.*}}{{/|\\\\}}asan" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
