Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ clang/include/clang/Driver/ToolChain.h @@ -104,6 +104,8 @@ RM_Disabled, }; + enum FileType { FT_Object, FT_Static, FT_Shared }; + private: friend class RegisterEffectiveTriple; @@ -371,11 +373,11 @@ virtual std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component, - bool Shared = false) const; + FileType Type = ToolChain::FT_Static) const; - const char *getCompilerRTArgString(const llvm::opt::ArgList &Args, - StringRef Component, - bool Shared = false) const; + const char * + getCompilerRTArgString(const llvm::opt::ArgList &Args, StringRef Component, + FileType Type = ToolChain::FT_Static) const; // Returns /lib//. This is used by runtimes (such // as OpenMP) to find arch-specific libraries. Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -362,16 +362,27 @@ } std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component, - bool Shared) const { + FileType Type) const { const llvm::Triple &TT = getTriple(); bool IsITANMSVCWindows = TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment(); - const char *Prefix = IsITANMSVCWindows ? "" : "lib"; - const char *Suffix = Shared ? (Triple.isOSWindows() ? ".lib" : ".so") - : (IsITANMSVCWindows ? ".lib" : ".a"); - if (Shared && Triple.isWindowsGNUEnvironment()) - Suffix = ".dll.a"; + const char *Prefix = + IsITANMSVCWindows || Type == ToolChain::FT_Object ? "" : "lib"; + const char *Suffix; + switch (Type) { + case ToolChain::FT_Object: + Suffix = IsITANMSVCWindows ? ".obj" : ".o"; + break; + case ToolChain::FT_Static: + Suffix = IsITANMSVCWindows ? ".lib" : ".a"; + break; + case ToolChain::FT_Shared: + Suffix = Triple.isOSWindows() + ? (Triple.isWindowsGNUEnvironment() ? ".dll.a" : ".lib") + : ".so"; + break; + } for (const auto &LibPath : getLibraryPaths()) { SmallString<128> P(LibPath); @@ -390,8 +401,8 @@ const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args, StringRef Component, - bool Shared) const { - return Args.MakeArgString(getCompilerRT(Args, Component, Shared)); + FileType Type) const { + return Args.MakeArgString(getCompilerRT(Args, Component, Type)); } std::string ToolChain::getArchSpecificLibPath() const { Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -535,7 +535,8 @@ // Wrap any static runtimes that must be forced into executable in // whole-archive. if (IsWhole) CmdArgs.push_back("--whole-archive"); - CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared)); + CmdArgs.push_back(TC.getCompilerRTArgString( + Args, Sanitizer, IsShared ? ToolChain::FT_Shared : ToolChain::FT_Static)); if (IsWhole) CmdArgs.push_back("--no-whole-archive"); if (IsShared) { Index: clang/lib/Driver/ToolChains/MinGW.cpp =================================================================== --- clang/lib/Driver/ToolChains/MinGW.cpp +++ clang/lib/Driver/ToolChains/MinGW.cpp @@ -248,8 +248,8 @@ if (Sanitize.needsAsanRt()) { // MinGW always links against a shared MSVCRT. - CmdArgs.push_back( - TC.getCompilerRTArgString(Args, "asan_dynamic", true)); + CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dynamic", + ToolChain::FT_Shared)); CmdArgs.push_back( TC.getCompilerRTArgString(Args, "asan_dynamic_runtime_thunk")); CmdArgs.push_back(Args.MakeArgString("--require-defined")); Index: clang/lib/Driver/ToolChains/MipsLinux.h =================================================================== --- clang/lib/Driver/ToolChains/MipsLinux.h +++ clang/lib/Driver/ToolChains/MipsLinux.h @@ -37,8 +37,9 @@ void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; - std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component, - bool Shared = false) const override; + std::string + getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component, + FileType Type = ToolChain::FT_Static) const override; std::string computeSysRoot() const override; Index: clang/lib/Driver/ToolChains/MipsLinux.cpp =================================================================== --- clang/lib/Driver/ToolChains/MipsLinux.cpp +++ clang/lib/Driver/ToolChains/MipsLinux.cpp @@ -118,11 +118,23 @@ std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args, StringRef Component, - bool Shared) const { + FileType Type) const { SmallString<128> Path(getDriver().ResourceDir); llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix, getOS()); - llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" + - "mips" + (Shared ? ".so" : ".a"))); + const char *Suffix; + switch (Type) { + case ToolChain::FT_Object: + Suffix = ".o"; + break; + case ToolChain::FT_Static: + Suffix = ".a"; + break; + case ToolChain::FT_Shared: + Suffix = ".so"; + break; + } + llvm::sys::path::append( + Path, Twine("libclang_rt." + Component + "-" + "mips" + Suffix)); return Path.str(); }