diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp index 0148e1f9ac22..9076b91a2fd2 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 92d387a13b2d..7653624e32b9 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"