[clang] [Hexagon] Add sanitizer-aware library paths for Linux/musl targets (PR #190267)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 2 14:49:47 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-hexagon
Author: Brian Cain (androm3da)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/190267.diff
2 Files Affected:
- (modified) clang/lib/Driver/ToolChains/Hexagon.cpp (+36)
- (modified) clang/test/Driver/hexagon-toolchain-linux.c (+33)
``````````diff
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"
``````````
</details>
https://github.com/llvm/llvm-project/pull/190267
More information about the cfe-commits
mailing list