Index: lib/Driver/ToolChains.cpp
===================================================================
--- lib/Driver/ToolChains.cpp	(revision 161037)
+++ lib/Driver/ToolChains.cpp	(working copy)
@@ -1574,6 +1574,10 @@
     getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
 }
 
+bool FreeBSD::HasNativeLLVMSupport() const {
+  return true;
+}
+
 Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
                           const ActionList &Inputs) const {
   Action::ActionClass Key;
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp	(revision 161037)
+++ lib/Driver/Tools.cpp	(working copy)
@@ -5086,6 +5086,17 @@
   for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
        i != e; ++i)
     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
+
+  // Tell the linker to load the plugin. This has to come before AddLinkerInputs
+  // as gold requires -plugin to come before any -plugin-opt that -Wl might
+  // forward.
+  const bool UseGold = D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin);
+  if (UseGold) {
+    CmdArgs.push_back("-plugin");
+    std::string Plugin = getToolChain().getDriver().Dir + "/../lib/LLVMgold.so";
+    CmdArgs.push_back(Args.MakeArgString(Plugin));
+  }
+
   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   Args.AddAllArgs(CmdArgs, options::OPT_e);
   Args.AddAllArgs(CmdArgs, options::OPT_s);
@@ -5163,8 +5174,9 @@
 
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
 
+  const char *Linker = UseGold? "ld.gold":"ld";
   const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+    Args.MakeArgString(getToolChain().GetProgramPath(Linker));
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
Index: lib/Driver/ToolChains.h
===================================================================
--- lib/Driver/ToolChains.h	(revision 161037)
+++ lib/Driver/ToolChains.h	(working copy)
@@ -449,6 +449,7 @@
 public:
   FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
 
+  virtual bool HasNativeLLVMSupport() const;
   virtual bool IsMathErrnoDefault() const { return false; }
   virtual bool IsObjCNonFragileABIDefault() const { return true; }
 
