gollvm: support -print-prog-name and -print-file-name

Add support for the -print-prog-name=<prog> and -print-file-name=<file>
command line options.

Change-Id: Ic2a0588f07028f0b050d0e5803f64b94beaac304
Reviewed-on: https://go-review.googlesource.com/117435
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/driver/Driver.cpp b/driver/Driver.cpp
index 3b31b7f..9485616 100644
--- a/driver/Driver.cpp
+++ b/driver/Driver.cpp
@@ -93,6 +93,12 @@
       return candidate.str();
   }
 
+  // System install dir
+  llvm::SmallString<256> installed(installedLibDir());
+  llvm::sys::path::append(installed, name);
+  if (llvm::sys::fs::exists(llvm::Twine(installed)))
+    return installed.str();
+
   return name;
 }
 
@@ -301,6 +307,34 @@
     exit(0);
   }
 
+  // Look up toolchain.
+  auto &tc = toolchains_[triple_.str()];
+  if (!tc) {
+    switch (triple_.getOS()) {
+      case Triple::Linux:
+        tc = make_unique<toolchains::Linux>(*this, triple_);
+        break;
+      default:
+        errs() << progname_ << ": error: unsupported target "
+               << triple_.str() << ", unable to create toolchain\n";
+        return nullptr;
+    }
+  }
+
+  // Honor -print-file-name=...
+  opt::Arg *pfnarg = args_.getLastArg(gollvm::options::OPT_print_file_name_EQ);
+  if (pfnarg) {
+    llvm::outs() << getFilePath(pfnarg->getValue(), *tc) << "\n";
+    exit(0);
+  }
+
+  // Honor -print-prog-name=...
+  opt::Arg *ppnarg = args_.getLastArg(gollvm::options::OPT_print_prog_name_EQ);
+  if (ppnarg) {
+    llvm::outs() << getProgramPath(ppnarg->getValue(), *tc) << "\n";
+    exit(0);
+  }
+
   // Check for existence of input files.
   for (opt::Arg *arg : args_) {
     if (arg->getOption().getKind() == opt::Option::InputClass) {
@@ -326,20 +360,6 @@
     return nullptr;
   }
 
-  // Look up toolchain.
-  auto &tc = toolchains_[triple_.str()];
-  if (!tc) {
-    switch (triple_.getOS()) {
-      case Triple::Linux:
-        tc = make_unique<toolchains::Linux>(*this, triple_);
-        break;
-      default:
-        errs() << progname_ << ": error: unsupported target "
-               << triple_.str() << ", unable to create toolchain\n";
-        return nullptr;
-    }
-  }
-
   // FIXME: add code to weed out unknown architectures (ex:
   // SomethingWeird-unknown-linux-gnu).
 
diff --git a/driver/GollvmOptions.td b/driver/GollvmOptions.td
index d4d8199..f11eac4 100644
--- a/driver/GollvmOptions.td
+++ b/driver/GollvmOptions.td
@@ -174,6 +174,12 @@
 def dumpmachine : Flag<["-"], "dumpmachine">,
   HelpText<"Emit target machine and exit.">;
 
+def print_file_name_EQ : Joined<["-", "--"], "print-file-name=">,
+  HelpText<"Print the full library path of <file>">, MetaVarName<"<file>">;
+
+def print_prog_name_EQ : Joined<["-", "--"], "print-prog-name=">,
+  HelpText<"Print the full program path of <name>">, MetaVarName<"<name>">;
+
 def print_multi_lib : Flag<["--"], "print-multi-lib">,
   HelpText<"Emit the mapping from multilib directory names to compiler "
            "flags that enable them">;