From: Saleem Abdulrasool Date: Tue, 30 Dec 2014 02:10:36 +0000 (+0000) Subject: Driver: unify addClangRT{Linux,Windows} X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=43e0fd173c5925b461d9f84b92539a74a794ee12;p=clang Driver: unify addClangRT{Linux,Windows} The differences are pretty superficial: - .lib vs .a extensions - whether or not to link (potentially) incorrectly against libgcc_s git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224975 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 5212d46345..6ee9a9204c 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2124,25 +2124,23 @@ static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) { // This adds the static libclang_rt.builtins-arch.a directly to the command line // FIXME: Make sure we can also emit shared objects if they're requested // and available, check for possible errors, etc. -static void addClangRTLinux( - const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { - SmallString<128> LibClangRT = getCompilerRTLibDir(TC); - llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") + - getArchNameForCompilerRTLib(TC) + - ".a"); +static void addClangRT(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + bool IsOSWindows = TC.getTriple().isOSWindows(); + StringRef Arch = getArchNameForCompilerRTLib(TC); + const char *Suffix = IsOSWindows ? ".lib" : ".a"; - CmdArgs.push_back(Args.MakeArgString(LibClangRT)); - CmdArgs.push_back("-lgcc_s"); - if (TC.getDriver().CCCIsCXX()) - CmdArgs.push_back("-lgcc_eh"); -} - -static void addClangRTWindows(const ToolChain &TC, const ArgList &Args, - ArgStringList &CmdArgs) { SmallString<128> LibClangRT = getCompilerRTLibDir(TC); - llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") + - getArchNameForCompilerRTLib(TC) + ".lib"); + llvm::sys::path::append(LibClangRT, + Twine("libclang_rt.builtins-") + Arch + Suffix); + CmdArgs.push_back(Args.MakeArgString(LibClangRT)); + if (!IsOSWindows) { + // FIXME: why do we link against gcc when we are using compiler-rt? + CmdArgs.push_back("-lgcc_s"); + if (TC.getDriver().CCCIsCXX()) + CmdArgs.push_back("-lgcc_eh"); + } } static void addProfileRT( @@ -7298,15 +7296,13 @@ static void AddRunTimeLibs(const ToolChain &TC, const Driver &D, // Make use of compiler-rt if --rtlib option is used ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args); - switch(RLT) { + switch (RLT) { case ToolChain::RLT_CompilerRT: switch (TC.getTriple().getOS()) { default: llvm_unreachable("unsupported OS"); case llvm::Triple::Win32: - addClangRTWindows(TC, Args, CmdArgs); - break; case llvm::Triple::Linux: - addClangRTLinux(TC, Args, CmdArgs); + addClangRT(TC, Args, CmdArgs); break; } break;