From owner-svn-src-stable-9@FreeBSD.ORG Wed Feb 25 22:41:29 2015 Return-Path: Delivered-To: svn-src-stable-9@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 84FE6C15; Wed, 25 Feb 2015 22:41:29 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 6CFE7771; Wed, 25 Feb 2015 22:41:29 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t1PMfT7L075348; Wed, 25 Feb 2015 22:41:29 GMT (envelope-from emaste@FreeBSD.org) Received: (from emaste@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t1PMfRmL075342; Wed, 25 Feb 2015 22:41:27 GMT (envelope-from emaste@FreeBSD.org) Message-Id: <201502252241.t1PMfRmL075342@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: emaste set sender to emaste@FreeBSD.org using -f From: Ed Maste Date: Wed, 25 Feb 2015 22:41:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r279303 - in stable/9/contrib/llvm/tools/clang: include/clang/Basic include/clang/Driver lib/Driver X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-9@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for only the 9-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2015 22:41:29 -0000 Author: emaste Date: Wed Feb 25 22:41:27 2015 New Revision: 279303 URL: https://svnweb.freebsd.org/changeset/base/279303 Log: Merge upstream Clang revision 211785: This commit implements the -fuse-ld= option, so that the user can specify -fuse-ld=bfd to use ld.bfd. This commit re-applies r194328 with some test case changes. It seems that r194328 was breaking macosx or mingw build because clang can't find ld.bfd or ld.gold in the given sysroot. We should use -B to specify the executable search path instead. Patch originally by David Chisnall. This is a merge from stable/10 rather than MFC as this is change was already included in Clang 3.5 in HEAD. MFS-10: r279302 Sponsored by: The FreeBSD Foundation Modified: stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td stable/9/contrib/llvm/tools/clang/include/clang/Driver/Options.td stable/9/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp stable/9/contrib/llvm/tools/clang/lib/Driver/Tools.cpp Directory Properties: stable/9/contrib/llvm/tools/clang/ (props changed) Modified: stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td ============================================================================== --- stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td Wed Feb 25 22:32:32 2015 (r279302) +++ stable/9/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticDriverKinds.td Wed Feb 25 22:41:27 2015 (r279303) @@ -20,6 +20,8 @@ def err_drv_unknown_stdin_type : Error< def err_drv_unknown_language : Error<"language not recognized: '%0'">; def err_drv_invalid_arch_name : Error< "invalid arch name '%0'">; +def err_drv_invalid_linker_name : Error< + "invalid linker name in argument '%0'">; def err_drv_invalid_rtlib_name : Error< "invalid runtime library name in argument '%0'">; def err_drv_unsupported_rtlib_for_platform : Error< Modified: stable/9/contrib/llvm/tools/clang/include/clang/Driver/Options.td ============================================================================== --- stable/9/contrib/llvm/tools/clang/include/clang/Driver/Options.td Wed Feb 25 22:32:32 2015 (r279302) +++ stable/9/contrib/llvm/tools/clang/include/clang/Driver/Options.td Wed Feb 25 22:41:27 2015 (r279303) @@ -1451,7 +1451,7 @@ def fprofile_dir : Joined<["-"], "fprofi defm profile_use : BooleanFFlag<"profile-use">, Group; def fprofile_use_EQ : Joined<["-"], "fprofile-use=">, Group; -def fuse_ld_EQ : Joined<["-"], "fuse-ld=">, Group; +def fuse_ld_EQ : Joined<["-"], "fuse-ld=">, Group; defm align_functions : BooleanFFlag<"align-functions">, Group; def falign_functions_EQ : Joined<["-"], "falign-functions=">, Group; Modified: stable/9/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h ============================================================================== --- stable/9/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h Wed Feb 25 22:32:32 2015 (r279302) +++ stable/9/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h Wed Feb 25 22:41:27 2015 (r279303) @@ -150,6 +150,10 @@ public: std::string GetFilePath(const char *Name) const; std::string GetProgramPath(const char *Name) const; + /// Returns the linker path, respecting the -fuse-ld= argument to determine + /// the linker suffix or name. + std::string GetLinkerPath() const; + /// \brief Dispatch to the specific toolchain for verbose printing. /// /// This is used when handling the verbose option to print detailed, Modified: stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp ============================================================================== --- stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp Wed Feb 25 22:32:32 2015 (r279302) +++ stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChain.cpp Wed Feb 25 22:41:27 2015 (r279303) @@ -15,6 +15,7 @@ #include "clang/Driver/Options.h" #include "clang/Driver/SanitizerArgs.h" #include "clang/Driver/ToolChain.h" +#include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" @@ -146,6 +147,30 @@ std::string ToolChain::GetProgramPath(co return D.GetProgramPath(Name, *this); } +std::string ToolChain::GetLinkerPath() const { + if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) { + StringRef Suffix = A->getValue(); + + // If we're passed -fuse-ld= with no argument, or with the argument ld, + // then use whatever the default system linker is. + if (Suffix.empty() || Suffix == "ld") + return GetProgramPath("ld"); + + llvm::SmallString<8> LinkerName("ld."); + LinkerName.append(Suffix); + + std::string LinkerPath(GetProgramPath(LinkerName.c_str())); + if (llvm::sys::fs::exists(LinkerPath)) + return LinkerPath; + + getDriver().Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args); + return ""; + } + + return GetProgramPath("ld"); +} + + types::ID ToolChain::LookupTypeForExtension(const char *Ext) const { return types::lookupTypeForExtension(Ext); } Modified: stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp ============================================================================== --- stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp Wed Feb 25 22:32:32 2015 (r279302) +++ stable/9/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp Wed Feb 25 22:41:27 2015 (r279303) @@ -2420,7 +2420,7 @@ Linux::Linux(const Driver &D, const llvm PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin").str()); - Linker = GetProgramPath("ld"); + Linker = GetLinkerPath(); Distro Distro = DetectDistro(Arch); Modified: stable/9/contrib/llvm/tools/clang/lib/Driver/Tools.cpp ============================================================================== --- stable/9/contrib/llvm/tools/clang/lib/Driver/Tools.cpp Wed Feb 25 22:32:32 2015 (r279302) +++ stable/9/contrib/llvm/tools/clang/lib/Driver/Tools.cpp Wed Feb 25 22:41:27 2015 (r279303) @@ -5087,7 +5087,7 @@ void darwin::Link::ConstructJob(Compilat Args.AddAllArgs(CmdArgs, options::OPT_F); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath("ld")); + Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -5284,7 +5284,7 @@ void solaris::Link::ConstructJob(Compila addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath("ld")); + Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -5396,7 +5396,7 @@ void auroraux::Link::ConstructJob(Compil addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath("ld")); + Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -5586,7 +5586,7 @@ void openbsd::Link::ConstructJob(Compila } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath("ld")); + Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -5726,7 +5726,7 @@ void bitrig::Link::ConstructJob(Compilat } const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath("ld")); + Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -6015,7 +6015,7 @@ void freebsd::Link::ConstructJob(Compila addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple()); const char *Exec = - Args.MakeArgString(ToolChain.GetProgramPath("ld")); + Args.MakeArgString(ToolChain.GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -6203,7 +6203,7 @@ void netbsd::Link::ConstructJob(Compilat addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); - const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld")); + const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -6748,7 +6748,7 @@ void minix::Link::ConstructJob(Compilati Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); } - const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld")); + const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } @@ -6932,7 +6932,7 @@ void dragonfly::Link::ConstructJob(Compi addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); const char *Exec = - Args.MakeArgString(getToolChain().GetProgramPath("ld")); + Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(new Command(JA, *this, Exec, CmdArgs)); }