Frontend driver patch from Edward O'Callaghan

https://llvm.org/bugs/show_bug.cgi?id=21538

Index: include/clang/Driver/Driver.h
===================================================================
--- cfe-3.6.1.src/include/clang/Driver/Driver.h	(revision 211898)
+++ cfe-3.6.1.src/include/clang/Driver/Driver.h	(working copy)
@@ -325,6 +325,14 @@
   // FIXME: This should be in CompilationInfo.
   std::string GetFilePath(const char *Name, const ToolChain &TC) const;
 
+  /// GetCompilerRTPath - Find Compiler-RT library path
+  ///
+  /// \param TC - The provided tool chain for additional information on
+  /// directories to search.
+  //
+  // FIXME: This should be in CompilationInfo.
+  std::string GetCompilerRTPath(const ToolChain &TC) const;
+
   /// GetProgramPath - Lookup \p Name in the list of program search paths.
   ///
   /// \param TC - The provided tool chain for additional information on
Index: include/clang/Driver/Options.td
===================================================================
--- cfe-3.6.1.src/include/clang/Driver/Options.td	(revision 211898)
+++ cfe-3.6.1.src/include/clang/Driver/Options.td	(working copy)
@@ -1269,6 +1269,8 @@
   HelpText<"Enable Objective-C Ivar layout bitmap print trace">;
 def print_libgcc_file_name : Flag<["-", "--"], "print-libgcc-file-name">,
   HelpText<"Print the library path for \"libgcc.a\"">;
+def print_librt_file_name : Flag<["-", "--"], "print-librt-file-name">,
+  HelpText<"Print the library path for \"libclang_rt.builtins-ARCH.a\"">;
 def print_multi_directory : Flag<["-", "--"], "print-multi-directory">;
 def print_multi_lib : Flag<["-", "--"], "print-multi-lib">;
 def print_multi_os_directory : Flag<["-", "--"], "print-multi-os-directory">;
Index: lib/Driver/Driver.cpp
===================================================================
--- cfe-3.6.1.src/lib/Driver/Driver.cpp	(revision 211898)
+++ cfe-3.6.1.src/lib/Driver/Driver.cpp	(working copy)
@@ -756,6 +756,11 @@
     return false;
   }
 
+  if (C.getArgs().hasArg(options::OPT_print_librt_file_name)) {
+    llvm::outs() << GetCompilerRTPath(TC) << "\n";
+    return false;
+  }
+
   if (C.getArgs().hasArg(options::OPT_print_multi_lib)) {
     const MultilibSet &Multilibs = TC.getMultilibs();
 
@@ -1820,6 +1825,26 @@
   return Name;
 }
 
+std::string Driver::GetCompilerRTPath(const ToolChain &TC) const {
+  // The runtimes are located in the OS-specific resource directory.
+  SmallString<128> Res(TC.getDriver().ResourceDir);
+  const llvm::Triple &Triple = TC.getTriple();
+
+  // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
+  StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
+    "freebsd" : TC.getOS();
+  llvm::sys::path::append(Res, "lib", OSLibName);
+
+  StringRef archName = TC.getArchName();
+  // Until ARM libraries are build separately, we have them all in one library
+  if (TC.getArch() == llvm::Triple::arm ||
+      TC.getArch() == llvm::Triple::armeb)
+    archName = "arm";
+
+  llvm::sys::path::append(Res, Twine("libclang_rt.builtins-") + archName + ".a");
+  return Res.str();
+}
+
 std::string Driver::GetProgramPath(const char *Name,
                                    const ToolChain &TC) const {
   // FIXME: Needs a better variable than DefaultTargetTriple