From 81617f85009b4bf5f7eb45f9ff0db53dc1bdf310 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Mon, 4 Mar 2024 19:44:15 -0500 Subject: [PATCH] =?UTF-8?q?[Driver][RISCV]=20Forward=20--no-relax=20option?= =?UTF-8?q?=20to=20linker=20for=20RISC-V=20on=20*BS=E2=80=A6=20(#83216)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …D, Fuchsia and Haiku Based on https://github.com/llvm/llvm-project/pull/76432 --- clang/lib/Driver/ToolChains/FreeBSD.cpp | 11 ++++++++--- clang/lib/Driver/ToolChains/Fuchsia.cpp | 5 ++++- clang/lib/Driver/ToolChains/Haiku.cpp | 7 +++++-- clang/lib/Driver/ToolChains/NetBSD.cpp | 5 ++++- clang/lib/Driver/ToolChains/OpenBSD.cpp | 6 +++++- clang/test/Driver/freebsd.c | 4 ++++ clang/test/Driver/fuchsia.c | 5 +++++ clang/test/Driver/haiku.c | 5 +++++ clang/test/Driver/netbsd.c | 7 +++++++ clang/test/Driver/openbsd.c | 8 ++++---- 10 files changed, 51 insertions(+), 12 deletions(-) diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index 9d698f77583950..c5757ddebb0f3e 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -133,6 +133,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, const char *LinkingOutput) const { const auto &ToolChain = static_cast(getToolChain()); const Driver &D = ToolChain.getDriver(); + const llvm::Triple &Triple = ToolChain.getTriple(); const llvm::Triple::ArchType Arch = ToolChain.getArch(); const bool IsPIE = !Args.hasArg(options::OPT_shared) && @@ -165,8 +166,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-dynamic-linker"); CmdArgs.push_back("/libexec/ld-elf.so.1"); } - const llvm::Triple &T = ToolChain.getTriple(); - if (Arch == llvm::Triple::arm || T.isX86()) + if (Arch == llvm::Triple::arm || Triple.isX86()) CmdArgs.push_back("--hash-style=both"); CmdArgs.push_back("--enable-new-dtags"); } @@ -212,12 +212,17 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, case llvm::Triple::riscv64: CmdArgs.push_back("-m"); CmdArgs.push_back("elf64lriscv"); - CmdArgs.push_back("-X"); break; default: break; } + if (Triple.isRISCV64()) { + CmdArgs.push_back("-X"); + if (Args.hasArg(options::OPT_mno_relax)) + CmdArgs.push_back("--no-relax"); + } + if (Arg *A = Args.getLastArg(options::OPT_G)) { if (ToolChain.getTriple().isMIPS()) { StringRef v = A->getValue(); diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp b/clang/lib/Driver/ToolChains/Fuchsia.cpp index 9123ddf2fe991f..598289f48ff430 100644 --- a/clang/lib/Driver/ToolChains/Fuchsia.cpp +++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -119,8 +119,11 @@ void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Args.MakeArgString(Dyld)); } - if (ToolChain.getArch() == llvm::Triple::riscv64) + if (Triple.isRISCV64()) { CmdArgs.push_back("-X"); + if (Args.hasArg(options::OPT_mno_relax)) + CmdArgs.push_back("--no-relax"); + } CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); diff --git a/clang/lib/Driver/ToolChains/Haiku.cpp b/clang/lib/Driver/ToolChains/Haiku.cpp index ca7faa68765abf..30464e2229e65b 100644 --- a/clang/lib/Driver/ToolChains/Haiku.cpp +++ b/clang/lib/Driver/ToolChains/Haiku.cpp @@ -25,7 +25,7 @@ void haiku::Linker::ConstructJob(Compilation &C, const JobAction &JA, const char *LinkingOutput) const { const auto &ToolChain = static_cast(getToolChain()); const Driver &D = ToolChain.getDriver(); - const llvm::Triple::ArchType Arch = ToolChain.getArch(); + const llvm::Triple &Triple = ToolChain.getTriple(); const bool Static = Args.hasArg(options::OPT_static); const bool Shared = Args.hasArg(options::OPT_shared); ArgStringList CmdArgs; @@ -61,8 +61,11 @@ void haiku::Linker::ConstructJob(Compilation &C, const JobAction &JA, if (!Shared) CmdArgs.push_back("--no-undefined"); - if (Arch == llvm::Triple::riscv64) + if (Triple.isRISCV64()) { CmdArgs.push_back("-X"); + if (Args.hasArg(options::OPT_mno_relax)) + CmdArgs.push_back("--no-relax"); + } assert((Output.isFilename() || Output.isNothing()) && "Invalid output."); if (Output.isFilename()) { diff --git a/clang/lib/Driver/ToolChains/NetBSD.cpp b/clang/lib/Driver/ToolChains/NetBSD.cpp index 645d0311641f34..0eec8fddabd5db 100644 --- a/clang/lib/Driver/ToolChains/NetBSD.cpp +++ b/clang/lib/Driver/ToolChains/NetBSD.cpp @@ -240,8 +240,11 @@ void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, break; } - if (Triple.isRISCV()) + if (Triple.isRISCV()) { CmdArgs.push_back("-X"); + if (Args.hasArg(options::OPT_mno_relax)) + CmdArgs.push_back("--no-relax"); + } assert((Output.isFilename() || Output.isNothing()) && "Invalid output."); if (Output.isFilename()) { diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp index 97f88b7b79dfbe..6da6728585df93 100644 --- a/clang/lib/Driver/ToolChains/OpenBSD.cpp +++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp @@ -111,6 +111,7 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, const char *LinkingOutput) const { const auto &ToolChain = static_cast(getToolChain()); const Driver &D = ToolChain.getDriver(); + const llvm::Triple &Triple = ToolChain.getTriple(); const llvm::Triple::ArchType Arch = ToolChain.getArch(); const bool Static = Args.hasArg(options::OPT_static); const bool Shared = Args.hasArg(options::OPT_shared); @@ -160,8 +161,11 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, if (Nopie || Profiling) CmdArgs.push_back("-nopie"); - if (Arch == llvm::Triple::riscv64) + if (Triple.isRISCV64()) { CmdArgs.push_back("-X"); + if (Args.hasArg(options::OPT_mno_relax)) + CmdArgs.push_back("--no-relax"); + } assert((Output.isFilename() || Output.isNothing()) && "Invalid output."); if (Output.isFilename()) { diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c index e1ce8889459f97..10fe155fee8744 100644 --- a/clang/test/Driver/freebsd.c +++ b/clang/test/Driver/freebsd.c @@ -203,3 +203,7 @@ // RELOCATABLE-NOT: "-l // RELOCATABLE-NOT: crt{{[^./\\]+}}.o +// Check that the -X and --no-relax flags are passed to the linker on riscv64 +// RUN: %clang --target=riscv64-unknown-freebsd -mno-relax -### %s 2>&1 \ +// RUN: | FileCheck -check-prefix=RISCV64-FLAGS %s +// RISCV64-FLAGS: "-X" "--no-relax" diff --git a/clang/test/Driver/fuchsia.c b/clang/test/Driver/fuchsia.c index ca53f0d107a005..c67f7f8c005b39 100644 --- a/clang/test/Driver/fuchsia.c +++ b/clang/test/Driver/fuchsia.c @@ -292,3 +292,8 @@ // RUN: | FileCheck %s -check-prefix=CHECK-PROFRT-X86_64 // CHECK-PROFRT-X86_64: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-PROFRT-X86_64: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}x86_64-unknown-fuchsia{{/|\\\\}}libclang_rt.profile.a" + +// Check that the -X and --no-relax flags are passed to the linker on riscv64 +// RUN: %clang --target=riscv64-unknown-fuchsia -mno-relax -### %s 2>&1 \ +// RUN: | FileCheck -check-prefix=RISCV64-FLAGS %s +// RISCV64-FLAGS: "-X" "--no-relax" diff --git a/clang/test/Driver/haiku.c b/clang/test/Driver/haiku.c index e907c34b29b995..060a56b3c70e56 100644 --- a/clang/test/Driver/haiku.c +++ b/clang/test/Driver/haiku.c @@ -76,6 +76,11 @@ // RUN: | FileCheck --check-prefix=CHECK-ARM-CPU %s // CHECK-ARM-CPU: "-target-cpu" "arm1176jzf-s" +// Check that the -X and --no-relax flags are passed to the linker on riscv64 +// RUN: %clang --target=riscv64-unknown-haiku -mno-relax -### %s 2>&1 \ +// RUN: | FileCheck -check-prefix=RISCV64-FLAGS %s +// RISCV64-FLAGS: "-X" "--no-relax" + // Check passing LTO flags to the linker // RUN: %clang --target=x86_64-unknown-haiku -flto -### %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK-LTO-FLAGS %s diff --git a/clang/test/Driver/netbsd.c b/clang/test/Driver/netbsd.c index 73777e7a3e38fa..1b7c674e18af67 100644 --- a/clang/test/Driver/netbsd.c +++ b/clang/test/Driver/netbsd.c @@ -342,3 +342,10 @@ // DRIVER-PASS-INCLUDES: "-cc1" {{.*}}"-resource-dir" "[[RESOURCE:[^"]+]]" // DRIVER-PASS-INCLUDES-SAME: "-internal-isystem" "[[RESOURCE]]{{/|\\\\}}include" // DRIVER-PASS-INCLUDES-SAME: {{^}} "-internal-externc-isystem" "{{.*}}/usr/include" + +// Check that the -X and --no-relax flags are passed to the linker on riscv +// RUN: %clang --target=riscv32-unknown-netbsd -mno-relax -### %s 2>&1 \ +// RUN: | FileCheck -check-prefix=RISCV-FLAGS %s +// RUN: %clang --target=riscv64-unknown-netbsd -mno-relax -### %s 2>&1 \ +// RUN: | FileCheck -check-prefix=RISCV-FLAGS %s +// RISCV-FLAGS: "-X" "--no-relax" diff --git a/clang/test/Driver/openbsd.c b/clang/test/Driver/openbsd.c index 68d33c5dd01e22..672cd3adf44a69 100644 --- a/clang/test/Driver/openbsd.c +++ b/clang/test/Driver/openbsd.c @@ -127,10 +127,10 @@ // UNWIND-TABLES: "-funwind-tables=2" // NO-UNWIND-TABLES-NOT: "-funwind-tables=2" -// Check that the -X flag is passed to the linker on riscv64 -// RUN: %clang --target=riscv64-unknown-openbsd -### %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHECK-RISCV64-FLAGS %s -// CHECK-RISCV64-FLAGS: "-X" +// Check that the -X and --no-relax flags are passed to the linker on riscv64 +// RUN: %clang --target=riscv64-unknown-openbsd -mno-relax -### %s 2>&1 \ +// RUN: | FileCheck -check-prefix=RISCV64-FLAGS %s +// RISCV64-FLAGS: "-X" "--no-relax" // Check passing LTO flags to the linker // RUN: %clang --target=amd64-unknown-openbsd -flto -### %s 2>&1 \