gollvm: make ld "--wrap=pthread_create" conditional on split stack

Pass "--wrap=pthread_create" to the linker when linking Go programs
only if the target supports -fsplit-stack (based on the
configuration).

Change-Id: Ia40a8f0c3a8829f940c313f638ca6f3eda51ac17
Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/212237
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/driver-main/llvm-goc.cpp b/driver-main/llvm-goc.cpp
index 1299be9..6167db3 100644
--- a/driver-main/llvm-goc.cpp
+++ b/driver-main/llvm-goc.cpp
@@ -67,6 +67,12 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#ifdef USING_SPLIT_STACK
+constexpr bool using_splitstack = true;
+#else
+constexpr bool using_splitstack = false;
+#endif
+
 using namespace llvm;
 using namespace gollvm::driver;
 
@@ -204,7 +210,7 @@
     return 1;
 
   // Create driver.
-  Driver driver(clp.args(), opts.get(), argv[0]);
+  Driver driver(clp.args(), opts.get(), argv[0], using_splitstack);
 
   // Set up driver, select target and toolchain.
   ToolChain *toolchain = driver.setup();
diff --git a/driver/Driver.cpp b/driver/Driver.cpp
index e00d3bc..dc65e5b 100644
--- a/driver/Driver.cpp
+++ b/driver/Driver.cpp
@@ -28,10 +28,12 @@
 
 Driver::Driver(opt::InputArgList &args,
                opt::OptTable *optTable,
-               const char *argv0)
+               const char *argv0,
+               bool using_splitstack)
     : args_(args),
       opts_(optTable),
-      progname_(argv0)
+      progname_(argv0),
+      usingSplitStack_(using_splitstack)
 {
   if (const opt::Arg *arg = args.getLastArg(gollvm::options::OPT_sysroot_EQ))
     sysroot_ = arg->getValue();
diff --git a/driver/Driver.h b/driver/Driver.h
index 1b62faa..173f53a 100644
--- a/driver/Driver.h
+++ b/driver/Driver.h
@@ -45,7 +45,8 @@
  public:
   Driver(llvm::opt::InputArgList &args,
          llvm::opt::OptTable *optTable,
-         const char *argv0);
+         const char *argv0,
+         bool using_splitstack);
   ~Driver();
 
   // Set up target and select toolchain. Returns nullptr on error.
@@ -104,6 +105,7 @@
   llvm::PIELevel::Level getPieLevel();
   bool picIsPIE();
   bool isPIE();
+  bool usingSplitStack() const { return usingSplitStack_; }
   template<typename IT>
   llvm::Optional<IT> getLastArgAsInteger(gollvm::options::ID id,
                                          IT defaultValue);
@@ -132,6 +134,7 @@
   // Maps non-input actions to output artifacts.
   std::unordered_map<Action *, Artifact*> artmap_;
   std::vector<std::string> prefixes_;
+  bool usingSplitStack_;
 
   bool processAction(Action *act, Compilation &compilation, bool lastAct);
   ArtifactList collectInputArtifacts(Action *act, InternalTool *it);
diff --git a/driver/GnuTools.cpp b/driver/GnuTools.cpp
index 38b69f6..4d99232 100644
--- a/driver/GnuTools.cpp
+++ b/driver/GnuTools.cpp
@@ -266,7 +266,8 @@
   cmdArgs.push_back("-lm");
   cmdArgs.push_back("-u");
   cmdArgs.push_back("pthread_create");
-  cmdArgs.push_back("--wrap=pthread_create");
+  if (toolchain().driver().usingSplitStack())
+    cmdArgs.push_back("--wrap=pthread_create");
 
   // Libgcc and libc.
   cmdArgs.push_back("--start-group");
@@ -291,7 +292,8 @@
   if (isStaticLibgo || havePthreadFlag)
     cmdArgs.push_back("-lpthread");
   cmdArgs.push_back("-lm");
-  cmdArgs.push_back("--wrap=pthread_create");
+  if (toolchain().driver().usingSplitStack())
+    cmdArgs.push_back("--wrap=pthread_create");
 
   // Libgcc and libc.
   addLibGcc(args, cmdArgs);