Author: Brian Cain
Date: 2026-04-06T13:58:43-05:00
New Revision: ab43cb8520c065cddbb5ce59a29987602255a2f5

URL: 
https://github.com/llvm/llvm-project/commit/ab43cb8520c065cddbb5ce59a29987602255a2f5
DIFF: 
https://github.com/llvm/llvm-project/commit/ab43cb8520c065cddbb5ce59a29987602255a2f5.diff

LOG: [Hexagon] Pass -pie to linker when PIE is the toolchain default (#189723)

The Hexagon driver only checked for an explicit -pie flag when
constructing the link command, ignoring the toolchain's PIE default. For
linux-musl targets, isPIEDefault() returns true (via the Linux toolchain
base class), so the compiler generates PIC/PIE code (-pic-level 2
-pic-is-pie) but the linker never received -pie.

This mismatch caused LTO failures: without -pie the linker sets
Reloc::Static for the LTO backend, which generates GP-relative
(small-data) references that lld cannot resolve.

Use hasFlag() to respect the toolchain default, and guard the -pie
emission against -shared and -r (relocatable) modes.

Added: 
    

Modified: 
    clang/lib/Driver/ToolChains/Hexagon.cpp
    clang/test/Driver/hexagon-toolchain-linux.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/Hexagon.cpp 
b/clang/lib/Driver/ToolChains/Hexagon.cpp
index 0148e1f9ac22a..9076b91a2fd2c 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -273,7 +273,8 @@ constructHexagonLinkArgs(Compilation &C, const JobAction 
&JA,
   
//----------------------------------------------------------------------------
   bool IsStatic = Args.hasArg(options::OPT_static);
   bool IsShared = Args.hasArg(options::OPT_shared);
-  bool IsPIE = Args.hasArg(options::OPT_pie);
+  bool IsPIE = Args.hasFlag(options::OPT_pie, options::OPT_no_pie,
+                            HTC.isPIEDefault(Args));
   bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
   bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
   bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
@@ -323,7 +324,7 @@ constructHexagonLinkArgs(Compilation &C, const JobAction 
&JA,
   if (IsStatic)
     CmdArgs.push_back("-static");
 
-  if (IsPIE && !IsShared)
+  if (IsPIE && !IsShared && !Args.hasArg(options::OPT_r))
     CmdArgs.push_back("-pie");
 
   if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args))

diff  --git a/clang/test/Driver/hexagon-toolchain-linux.c 
b/clang/test/Driver/hexagon-toolchain-linux.c
index 92d387a13b2dc..7653624e32b9b 100644
--- a/clang/test/Driver/hexagon-toolchain-linux.c
+++ b/clang/test/Driver/hexagon-toolchain-linux.c
@@ -149,3 +149,34 @@
 // CHECK013-NOT:  "-lgcc_eh"
 // CHECK013-NOT:  "-lgcc_s"
 // CHECK013-NOT:  "-lunwind"
+
+// 
-----------------------------------------------------------------------------
+// PIE is the default for linux-musl
+// 
-----------------------------------------------------------------------------
+// RUN: %clang -### --target=hexagon-unknown-linux-musl \
+// RUN:   -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN:   -mcpu=hexagonv60 \
+// RUN:   --sysroot=%S/Inputs/basic_linux_libcxx_tree %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-PIE-DEFAULT %s
+// CHECK-PIE-DEFAULT:      "-pie"
+
+// RUN: %clang -### --target=hexagon-unknown-linux-musl \
+// RUN:   -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN:   -mcpu=hexagonv60 \
+// RUN:   --sysroot=%S/Inputs/basic_linux_libcxx_tree -no-pie %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-NO-PIE %s
+// CHECK-NO-PIE-NOT:  "-pie"
+
+// RUN: %clang -### --target=hexagon-unknown-linux-musl \
+// RUN:   -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN:   -mcpu=hexagonv60 \
+// RUN:   --sysroot=%S/Inputs/basic_linux_libcxx_tree -shared %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-PIE-SHARED %s
+// CHECK-PIE-SHARED-NOT:  "-pie"
+
+// RUN: %clang -### --target=hexagon-unknown-linux-musl \
+// RUN:   -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
+// RUN:   -mcpu=hexagonv60 \
+// RUN:   --sysroot=%S/Inputs/basic_linux_libcxx_tree -r %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-PIE-RELOCATABLE %s
+// CHECK-PIE-RELOCATABLE-NOT:  "-pie"


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to