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