Skip to content

Conversation

@dybv-sc
Copy link
Contributor

@dybv-sc dybv-sc commented Oct 12, 2023

When compiling for target riscv64/32-uknown-elf clang assumes that it do not use lld linker even if explicitly told ('-fuse-ld=lld').

@llvmbot llvmbot added clang Clang issues not falling into any other category backend:RISC-V clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' labels Oct 12, 2023
@llvmbot
Copy link
Member

llvmbot commented Oct 12, 2023

@llvm/pr-subscribers-clang
@llvm/pr-subscribers-backend-risc-v

@llvm/pr-subscribers-clang-driver

Author: Bushev Dmitry (dybv-sc)

Changes

When compiling for target riscv64/32-uknown-elf clang assumes that it do not use lld linker even if explicitly told ('-fuse-ld=lld').


Full diff: https://github.com/llvm/llvm-project/pull/68904.diff

3 Files Affected:

  • (modified) clang/lib/Driver/ToolChains/RISCVToolchain.cpp (+4-1)
  • (modified) clang/lib/Driver/ToolChains/RISCVToolchain.h (+3)
  • (modified) clang/test/Driver/riscv64-toolchain.c (+25)
diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp index c98f43f6e05eb4b..b5685eaeed7b275 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -49,8 +49,11 @@ bool RISCVToolChain::hasGCCToolchain(const Driver &D, /// RISC-V Toolchain RISCVToolChain::RISCVToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) - : Generic_ELF(D, Triple, Args) { + : Generic_ELF(D, Triple, Args), UseLLD{Args.getLastArgValue( + options::OPT_fuse_ld_EQ) + .equals_insensitive("lld")} { GCCInstallation.init(Triple, Args); + if (GCCInstallation.isValid()) { Multilibs = GCCInstallation.getMultilibs(); SelectedMultilibs.assign({GCCInstallation.getMultilib()}); diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.h b/clang/lib/Driver/ToolChains/RISCVToolchain.h index de6960726f1cd77..afe98968ecd8616 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.h +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.h @@ -35,11 +35,14 @@ class LLVM_LIBRARY_VISIBILITY RISCVToolChain : public Generic_ELF { addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + bool HasNativeLLVMSupport() const override { return UseLLD; } + protected: Tool *buildLinker() const override; private: std::string computeSysRoot() const override; + bool UseLLD; }; } // end namespace toolchains diff --git a/clang/test/Driver/riscv64-toolchain.c b/clang/test/Driver/riscv64-toolchain.c index f177bff33dd4d72..275cd8dde419218 100644 --- a/clang/test/Driver/riscv64-toolchain.c +++ b/clang/test/Driver/riscv64-toolchain.c @@ -121,6 +121,31 @@ // C-RV64IMAC-BAREMETAL-MULTI-LP64: "--start-group" "-lc" "-lgloss" "--end-group" "-lgcc" // C-RV64IMAC-BAREMETAL-MULTI-LP64: "{{.*}}/Inputs/multilib_riscv_elf_sdk/lib/gcc/riscv64-unknown-elf/8.2.0/rv64imac/lp64/crtend.o" +// Check that lto works in riscv-toolchain when explicitly specified lld as linker. +// RUN: env "PATH=" %clang -### %s -fuse-ld=lld -flto \ +// RUN: --target=riscv64-unknown-elf --rtlib=platform --sysroot= \ +// RUN: -march=rv64imac -mabi=lp64\ +// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk 2>&1 \ +// RUN: | FileCheck -check-prefix=C-RV64IMAC-BAREMETAL-LTO-LP64 %s + +// C-RV64IMAC-BAREMETAL-LTO-LP64: "{{.*}}lld" +// C-RV64IMAC-BAREMETAL-LTO-LP64: "-m" "elf64lriscv" +// C-RV64IMAC-BAREMETAL-LTO-LP64: "{{.*}}/Inputs/multilib_riscv_elf_sdk/lib/gcc/riscv64-unknown-elf/8.2.0/../../..{{/|\\\\}}..{{/|\\\\}}riscv64-unknown-elf/lib/crt0.o" +// C-RV64IMAC-BAREMETAL-LTO-LP64: "{{.*}}/Inputs/multilib_riscv_elf_sdk/lib/gcc/riscv64-unknown-elf/8.2.0/crtbegin.o" +// C-RV64IMAC-BAREMETAL-LTO-LP64: "-L{{.*}}/Inputs/multilib_riscv_elf_sdk/lib/gcc/riscv64-unknown-elf/8.2.0" +// C-RV64IMAC-BAREMETAL-LTO-LP64: "-L{{.*}}/Inputs/multilib_riscv_elf_sdk/lib/gcc/riscv64-unknown-elf/8.2.0/../../..{{/|\\\\}}..{{/|\\\\}}riscv64-unknown-elf/lib" +// C-RV64IMAC-BAREMETAL-LTO-LP64: "--start-group" "-lc" "-lgloss" "--end-group" "-lgcc" +// C-RV64IMAC-BAREMETAL-LTO-LP64: "{{.*}}/Inputs/multilib_riscv_elf_sdk/lib/gcc/riscv64-unknown-elf/8.2.0/crtend.o" + +// Check driver error when lto is used without specified lld linker. +// RUN: env "PATH=" %clang -### %s -flto \ +// RUN: --target=riscv64-unknown-elf --rtlib=platform --sysroot= \ +// RUN: -march=rv64imac -mabi=lp64\ +// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk 2>&1 \ +// RUN: | FileCheck -check-prefix=C-RV64IMAC-BAREMETAL-LTO-FAIL-LP64 %s + +// C-RV64IMAC-BAREMETAL-LTO-FAIL-LP64: clang-16: error: 'riscv64-unknown-unknown-elf': unable to pass LLVM bit-code files to linker + // RUN: env "PATH=" %clang -### %s -fuse-ld=ld \ // RUN: --target=riscv64-unknown-elf --rtlib=platform --unwindlib=platform --sysroot= \ // RUN: -march=rv64imafdc -mabi=lp64d \ 
@github-actions
Copy link

github-actions bot commented Oct 12, 2023

⚠️ C/C++ code formatter, clang-format found issues in your code. ⚠️

You can test this locally with the following command:
git-clang-format --diff 8b73be5f57106348a622e36ad3aa0734c6038a8d 3c33c4b902a41a414769be7079e8847e41fb5912 -- clang/lib/Driver/ToolChains/RISCVToolchain.cpp clang/lib/Driver/ToolChains/RISCVToolchain.h clang/test/Driver/riscv64-toolchain.c
View the diff from clang-format here.
diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp index d87af6b4cb..931d3f4922 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -49,9 +49,9 @@ bool RISCVToolChain::hasGCCToolchain(const Driver &D, /// RISC-V Toolchain RISCVToolChain::RISCVToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) - : Generic_ELF(D, Triple, Args), UseLLD{Args.getLastArgValue( - options::OPT_fuse_ld_EQ) - .equals_insensitive("lld")} { + : Generic_ELF(D, Triple, Args), + UseLLD{Args.getLastArgValue(options::OPT_fuse_ld_EQ) + .equals_insensitive("lld")} { GCCInstallation.init(Triple, Args); if (GCCInstallation.isValid()) { Multilibs = GCCInstallation.getMultilibs(); 
@dybv-sc dybv-sc force-pushed the clang-fuse-lld branch 2 times, most recently from eca69cd to 087d229 Compare October 13, 2023 10:52
@dybv-sc
Copy link
Contributor Author

dybv-sc commented Oct 13, 2023

Encountered code formatting check failure seems to be not reproducible locally:

$ git-clang-format --diff 7025ff6fa3dfe2ce8d3d7fcb0ec9de9a357d2c6f 087d22970d1d2eea6dd0dd79eedd49ed69bc49c3 -- clang/lib/Driver/ToolChains/RISCVToolchain.cpp clang/lib/Driver/ToolChains/RISCVToolchain.h clang/test/Driver/riscv64-toolchain.c $ echo $? 0 
@dybv-sc dybv-sc requested a review from topperc October 13, 2023 12:09
@dybv-sc dybv-sc force-pushed the clang-fuse-lld branch 4 times, most recently from 51a150e to d61eacc Compare October 16, 2023 13:22
@dybv-sc dybv-sc requested a review from MaskRay October 16, 2023 13:26
@dybv-sc
Copy link
Contributor Author

dybv-sc commented Oct 20, 2023

@MaskRay, could you please look into this?

@MaskRay
Copy link
Member

MaskRay commented Nov 9, 2023

@MaskRay, could you please look into this?

Sorry for my late reply. I am still adapting to the github pr workflow.

Related to the linker question you have, I am puzzled by RISCVToolChain's choices: #71803 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend:RISC-V clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang Clang issues not falling into any other category

3 participants