gollvm: add support for -static-libgcc command line flag

Support -static-libgcc. Also with this patch are a couple of tweaks
to insure that -lphread is properly positioned on the link command
line (mainly for compatibility with gccgo).

Change-Id: I71fb52eba2207c2ca6c4b844ea6d44bff7478df5
Reviewed-on: https://go-review.googlesource.com/115596
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/driver/GnuTools.cpp b/driver/GnuTools.cpp
index bfcfaa5..6393bba 100644
--- a/driver/GnuTools.cpp
+++ b/driver/GnuTools.cpp
@@ -258,6 +258,7 @@
   cmdArgs.push_back("-lgobegin");
   cmdArgs.push_back("-lgo");
   addFilePathArgs(cmdArgs);
+  cmdArgs.push_back("-lpthread");
   cmdArgs.push_back("-lm");
   cmdArgs.push_back("-u");
   cmdArgs.push_back("pthread_create");
@@ -265,9 +266,7 @@
 
   // Libgcc and libc.
   cmdArgs.push_back("--start-group");
-  cmdArgs.push_back("-lgcc");
-  cmdArgs.push_back("-lgcc_eh");
-  cmdArgs.push_back("-lpthread");
+  addLibGcc(args, cmdArgs);
   cmdArgs.push_back("-lc");
   cmdArgs.push_back("--end-group");
 }
@@ -285,17 +284,30 @@
     cmdArgs.push_back("-Bdynamic");
 
   addFilePathArgs(cmdArgs);
+  if (isStaticLibgo || havePthreadFlag)
+    cmdArgs.push_back("-lpthread");
   cmdArgs.push_back("-lm");
   cmdArgs.push_back("--wrap=pthread_create");
 
   // Libgcc and libc.
-  bool isShared = args.hasArg(gollvm::options::OPT_shared);
-  cmdArgs.push_back("-lgcc_s");
-  if (!isShared)
-    cmdArgs.push_back("-lgcc");
-  if (isStaticLibgo || havePthreadFlag)
-    cmdArgs.push_back("-lpthread");
+  addLibGcc(args, cmdArgs);
   cmdArgs.push_back("-lc");
+  addLibGcc(args, cmdArgs);
+}
+
+void Linker::addLibGcc(llvm::opt::ArgList &args,
+                       llvm::opt::ArgStringList &cmdArgs)
+{
+  bool isStaticLibgcc = args.hasArg(gollvm::options::OPT_static_libgcc);
+  bool isStatic = args.hasArg(gollvm::options::OPT_static);
+  bool isShared = args.hasArg(gollvm::options::OPT_shared);
+
+  if (isStatic || isStaticLibgcc) {
+    cmdArgs.push_back("-lgcc");
+    cmdArgs.push_back("-lgcc_eh");
+    return;
+  }
+
   cmdArgs.push_back("-lgcc_s");
   if (!isShared)
     cmdArgs.push_back("-lgcc");
diff --git a/driver/GnuTools.h b/driver/GnuTools.h
index b3210b9..aa8451b 100644
--- a/driver/GnuTools.h
+++ b/driver/GnuTools.h
@@ -62,6 +62,8 @@
                         llvm::opt::ArgStringList &cmdArgs);
   void addSysLibsShared(llvm::opt::ArgList &args,
                         llvm::opt::ArgStringList &cmdArgs);
+  void addLibGcc(llvm::opt::ArgList &args,
+                 llvm::opt::ArgStringList &cmdArgs);
   void addSharedAndOrStaticFlags(llvm::opt::ArgStringList &cmdArgs);
   void addFilePathArgs(llvm::opt::ArgStringList &cmdArgs);
 };
diff --git a/driver/GollvmOptions.td b/driver/GollvmOptions.td
index 9686261..d07de73 100644
--- a/driver/GollvmOptions.td
+++ b/driver/GollvmOptions.td
@@ -209,6 +209,7 @@
 def nostdlib : Flag<["-"], "nostdlib">;
 
 def static_libgo : Flag<["-", "--"], "static-libgo">;
+def static_libgcc : Flag<["-", "--"], "static-libgcc">;
 
 def pthreads : Flag<["-"], "pthreads">,
   HelpText<"Support POSIX threads in generated code">;