diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-10-17 21:39:04 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-10-17 21:39:04 +0000 |
commit | cc354325502c5e2f68b614f6df46269e5f039c7e (patch) | |
tree | 4138cae9b409179e69cc6d60a0c26664d5f9bea9 /clang/lib/Driver/Tools.cpp | |
parent | 30abeb1680a6b50b25d60f8cce2de4eeff266f70 (diff) | |
download | bcm5719-llvm-cc354325502c5e2f68b614f6df46269e5f039c7e.tar.gz bcm5719-llvm-cc354325502c5e2f68b614f6df46269e5f039c7e.zip |
Implement -static-libgcc on linux and refactor the code responsible for adding
libgcc to the link line into a helper function.
llvm-svn: 142269
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 58 |
1 files changed, 27 insertions, 31 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 4b4ff25e281..a71015307dd 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -4233,6 +4233,30 @@ void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA, C.addCommand(new Command(JA, *this, Exec, CmdArgs)); } +static void AddLibgcc(const Driver &D, ArgStringList &CmdArgs, + const ArgList &Args) { + bool StaticLibgcc = Args.hasArg(options::OPT_static) || + Args.hasArg(options::OPT_static_libgcc); + if (!D.CCCIsCXX) + CmdArgs.push_back("-lgcc"); + + if (StaticLibgcc) { + if (D.CCCIsCXX) + CmdArgs.push_back("-lgcc"); + } else { + if (!D.CCCIsCXX) + CmdArgs.push_back("--as-needed"); + CmdArgs.push_back("-lgcc_s"); + if (!D.CCCIsCXX) + CmdArgs.push_back("--no-as-needed"); + } + + if (StaticLibgcc) + CmdArgs.push_back("-lgcc_eh"); + else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX) + CmdArgs.push_back("-lgcc"); +} + void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, @@ -4359,24 +4383,7 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasArg(options::OPT_static)) CmdArgs.push_back("--start-group"); - if (!D.CCCIsCXX) - CmdArgs.push_back("-lgcc"); - - if (Args.hasArg(options::OPT_static)) { - if (D.CCCIsCXX) - CmdArgs.push_back("-lgcc"); - } else { - if (!D.CCCIsCXX) - CmdArgs.push_back("--as-needed"); - CmdArgs.push_back("-lgcc_s"); - if (!D.CCCIsCXX) - CmdArgs.push_back("--no-as-needed"); - } - - if (Args.hasArg(options::OPT_static)) - CmdArgs.push_back("-lgcc_eh"); - else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX) - CmdArgs.push_back("-lgcc"); + AddLibgcc(D, CmdArgs, Args); if (Args.hasArg(options::OPT_pthread) || Args.hasArg(options::OPT_pthreads)) @@ -4386,19 +4393,8 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasArg(options::OPT_static)) CmdArgs.push_back("--end-group"); - else { - if (!D.CCCIsCXX) - CmdArgs.push_back("-lgcc"); - - if (!D.CCCIsCXX) - CmdArgs.push_back("--as-needed"); - CmdArgs.push_back("-lgcc_s"); - if (!D.CCCIsCXX) - CmdArgs.push_back("--no-as-needed"); - - if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX) - CmdArgs.push_back("-lgcc"); - } + else + AddLibgcc(D, CmdArgs, Args); if (!Args.hasArg(options::OPT_nostartfiles)) { |