lewis-revill created this revision. lewis-revill added reviewers: efriedma, lenary, jrtc27, asb. Herald added subscribers: sunshaoce, VincentWu, luke957, ormris, StephenFan, vkmr, frasercrmck, evandro, luismarques, apazos, sameer.abuasal, simoncook, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, steven_wu, edward-jones, zzheng, shiva0217, kito-cheng, niosHD, sabuasal, johnrusso, rbar, hiraditya, arichardson, inglorion. Herald added a project: All. lewis-revill requested review of this revision. Herald added subscribers: cfe-commits, pcwang-thead, eopXD, MaskRay. Herald added a project: clang.
This patch fixes an issue whereby the LTO linker would not receive any information about target features, so things like architecture extensions would not be accounted for during codegen. There is perhaps an outstanding question as to why this is required versus obtaining the target features from bitcode. This is the approach I implemented for now, but would be happy to look into whether I can make it work via bitcode if desired. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D132843 Files: clang/lib/Driver/ToolChains/Arch/RISCV.cpp clang/lib/Driver/ToolChains/Arch/RISCV.h clang/lib/Driver/ToolChains/CommonArgs.cpp clang/test/Driver/lto.c Index: clang/test/Driver/lto.c =================================================================== --- clang/test/Driver/lto.c +++ 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" Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ 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; } } Index: clang/lib/Driver/ToolChains/Arch/RISCV.h =================================================================== --- clang/lib/Driver/ToolChains/Arch/RISCV.h +++ 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 Index: clang/lib/Driver/ToolChains/Arch/RISCV.cpp =================================================================== --- clang/lib/Driver/ToolChains/Arch/RISCV.cpp +++ 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<StringRef> Features; + riscv::getRISCVTargetFeatures(D, ToolChain.getTriple(), Args, Features); + for (StringRef F : Features) + CmdArgs.push_back(Args.MakeArgString("-plugin-opt=-mattr=" + F)); +}
Index: clang/test/Driver/lto.c =================================================================== --- clang/test/Driver/lto.c +++ 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" Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ 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; } } Index: clang/lib/Driver/ToolChains/Arch/RISCV.h =================================================================== --- clang/lib/Driver/ToolChains/Arch/RISCV.h +++ 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 Index: clang/lib/Driver/ToolChains/Arch/RISCV.cpp =================================================================== --- clang/lib/Driver/ToolChains/Arch/RISCV.cpp +++ 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<StringRef> Features; + riscv::getRISCVTargetFeatures(D, ToolChain.getTriple(), Args, Features); + for (StringRef F : Features) + CmdArgs.push_back(Args.MakeArgString("-plugin-opt=-mattr=" + F)); +}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits