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);