diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.h b/clang/lib/Driver/ToolChains/Arch/RISCV.h --- a/clang/lib/Driver/ToolChains/Arch/RISCV.h +++ b/clang/lib/Driver/ToolChains/Arch/RISCV.h @@ -30,6 +30,10 @@ void addRISCVTargetABIArgs(const ToolChain &ToolChain, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs); + +void addRISCVTargetFeatureArgs(const ToolChain &ToolChain, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); } // end namespace riscv } // namespace tools } // end namespace driver diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp --- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp +++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp @@ -313,3 +313,15 @@ CmdArgs.push_back( Args.MakeArgString(Twine("-plugin-opt=-target-abi=") + ABIName)); } + +void riscv::addRISCVTargetFeatureArgs(const ToolChain &ToolChain, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) { + const Driver &D = ToolChain.getDriver(); + + // Pass a plugin-opt for each of the target features to the LTO linker. + std::vector Features; + riscv::getRISCVTargetFeatures(D, ToolChain.getTriple(), Args, Features); + for (StringRef F : Features) + CmdArgs.push_back(Args.MakeArgString("-plugin-opt=-mattr=" + F)); +} diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -637,6 +637,7 @@ case llvm::Triple::riscv32: case llvm::Triple::riscv64: { riscv::addRISCVTargetABIArgs(ToolChain, Args, CmdArgs); + riscv::addRISCVTargetFeatureArgs(ToolChain, Args, CmdArgs); break; } } diff --git a/clang/test/Driver/lto.c b/clang/test/Driver/lto.c --- a/clang/test/Driver/lto.c +++ b/clang/test/Driver/lto.c @@ -155,3 +155,8 @@ // RISCV-SPEC-ABI-2: "-plugin-opt=-target-abi=ilp32d" // RISCV-SPEC-ABI-3: "-plugin-opt=-target-abi=lp64" // RISCV-SPEC-ABI-4: "-plugin-opt=-target-abi=lp64f" + +// RUN: %clang -target riscv32-unknown-elf %s -fuse-ld=gold -flto -mrelax \ +// RUN: -### 2>&1 | FileCheck %s --check-prefix=RV32-RELAX-ATTR +// +// RV32-RELAX-ATTR: "-plugin-opt=-mattr=+relax"