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 @@ -491,6 +491,14 @@ if (!StatsFile.empty()) CmdArgs.push_back( Args.MakeArgString(Twine("-plugin-opt=stats-file=") + StatsFile)); + + // Pass vector library setting for LTO-time vectorization + if (Arg *A = Args.getLastArg(options::OPT_fveclib)) { + StringRef Name = A->getValue(); + if (!Name.empty()) + CmdArgs.push_back( + Args.MakeArgString(Twine("-plugin-opt=vector-library=") + Name)); + } } void tools::addArchSpecificRPath(const ToolChain &TC, const ArgList &Args, diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -13,6 +13,7 @@ #include "llvm/ADT/MapVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" +#include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/Support/CachePruning.h" #include "llvm/Support/CodeGen.h" @@ -128,6 +129,7 @@ llvm::MapVector, uint64_t> callGraphProfile; + llvm::TargetLibraryInfoImpl::VectorLibrary VectLib; bool allowMultipleDefinition; bool allowShlibUndefined; bool androidPackDynRelocs; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -704,6 +704,20 @@ return OrphanHandlingPolicy::Place; } +static llvm::TargetLibraryInfoImpl::VectorLibrary +getVectLib(opt::InputArgList &args) { + StringRef s = args.getLastArgValue(OPT_lto_vector_library); + if (s == "Accelerate") + return llvm::TargetLibraryInfoImpl::Accelerate; + if (s == "MASSV") + return llvm::TargetLibraryInfoImpl::MASSV; + if (s == "SVML") + return llvm::TargetLibraryInfoImpl::SVML; + if (!s.empty() && s != "none") + error("unknown --vector-library type: " + s); + return llvm::TargetLibraryInfoImpl::NoLibrary; +} + // Parse --build-id or --build-id=