gollvm: search sysroot for libraries

Currently sysroot is only used for finding GCC installation. But
on some system, sysroot doesn't contain GCC installation but only
libraries such as libc, libm, and crtbegin.o. This CL changes the
OS library search paths to honor sysroot.

Change-Id: I9e3a1914ab1eea54e4955b8e69fe45500b48d9af
Reviewed-on: https://go-review.googlesource.com/116218
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/driver/GnuTools.cpp b/driver/GnuTools.cpp
index 6393bba..0525b52 100644
--- a/driver/GnuTools.cpp
+++ b/driver/GnuTools.cpp
@@ -337,6 +337,10 @@
   cmdArgs.push_back("-o");
   cmdArgs.push_back(output.file());
 
+  // Pass --sysroot to the linker.
+  if (!toolchain().driver().sysRoot().empty())
+    cmdArgs.push_back(args.MakeArgString(llvm::StringRef("--sysroot=") + toolchain().driver().sysRoot()));
+
   bool useStdLib = !args.hasArg(gollvm::options::OPT_nostdlib);
 
   if (useStdLib) {
diff --git a/driver/LinuxToolChain.cpp b/driver/LinuxToolChain.cpp
index f01c0bc..65769f5 100644
--- a/driver/LinuxToolChain.cpp
+++ b/driver/LinuxToolChain.cpp
@@ -61,10 +61,13 @@
   // File paths
   pathlist &fpaths = filePaths();
   addIfPathExists(fpaths, gccDetector_.getLibPath());
-  const std::string osLibDir = getOSLibDir(targetTriple);
+  std::string osLibDir = getOSLibDir(targetTriple);
+  if (!driver.sysRoot().empty())
+    osLibDir = driver.sysRoot() + "/" + osLibDir;
   addIfPathExists(fpaths, llvm::Twine(gccDetector_.getParentLibPath() +
                                       "/../" + ftrip).str());
-  addIfPathExists(fpaths, llvm::Twine(osLibDir + ftrip).str());
+  addIfPathExists(fpaths, llvm::Twine(osLibDir).str());
+  addIfPathExists(fpaths, llvm::Twine(osLibDir + "/" + ftrip).str());
 
   // Include program and file paths in verbose output.
   if (driver.args().hasArg(gollvm::options::OPT_v)) {