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