mirror of
https://github.com/intel/llvm.git
synced 2026-02-07 07:39:11 +08:00
[mingw] Add support for -rtlib option and -stdlib option to the mingw driver
Now clang should be able to use compiler-rt and libc++ on mingw. Based on a patch by Martell Malone. Differential Revision: http://reviews.llvm.org/D11237 llvm-svn: 242905
This commit is contained in:
@@ -192,16 +192,18 @@ void MinGW::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
||||
if (DriverArgs.hasArg(options::OPT_nostdlibinc))
|
||||
return;
|
||||
|
||||
llvm::SmallString<1024> IncludeDir(GccLibDir);
|
||||
llvm::sys::path::append(IncludeDir, "include");
|
||||
addSystemInclude(DriverArgs, CC1Args, IncludeDir.c_str());
|
||||
IncludeDir += "-fixed";
|
||||
if (GetRuntimeLibType(DriverArgs) == ToolChain::RLT_Libgcc) {
|
||||
llvm::SmallString<1024> IncludeDir(GccLibDir);
|
||||
llvm::sys::path::append(IncludeDir, "include");
|
||||
addSystemInclude(DriverArgs, CC1Args, IncludeDir.c_str());
|
||||
IncludeDir += "-fixed";
|
||||
#ifdef LLVM_ON_UNIX
|
||||
// openSUSE
|
||||
addSystemInclude(DriverArgs, CC1Args,
|
||||
"/usr/x86_64-w64-mingw32/sys-root/mingw/include");
|
||||
// openSUSE
|
||||
addSystemInclude(DriverArgs, CC1Args,
|
||||
"/usr/x86_64-w64-mingw32/sys-root/mingw/include");
|
||||
#endif
|
||||
addSystemInclude(DriverArgs, CC1Args, IncludeDir.c_str());
|
||||
addSystemInclude(DriverArgs, CC1Args, IncludeDir.c_str());
|
||||
}
|
||||
addSystemInclude(DriverArgs, CC1Args, Base + Arch + "include");
|
||||
addSystemInclude(DriverArgs, CC1Args, Base + "include");
|
||||
}
|
||||
@@ -212,19 +214,29 @@ void MinGW::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
|
||||
DriverArgs.hasArg(options::OPT_nostdincxx))
|
||||
return;
|
||||
|
||||
llvm::SmallVector<llvm::SmallString<1024>, 4> CppIncludeBases;
|
||||
CppIncludeBases.emplace_back(Base);
|
||||
llvm::sys::path::append(CppIncludeBases[0], Arch, "include", "c++");
|
||||
CppIncludeBases.emplace_back(Base);
|
||||
llvm::sys::path::append(CppIncludeBases[1], Arch, "include", "c++", Ver);
|
||||
CppIncludeBases.emplace_back(Base);
|
||||
llvm::sys::path::append(CppIncludeBases[2], "include", "c++", Ver);
|
||||
CppIncludeBases.emplace_back(GccLibDir);
|
||||
llvm::sys::path::append(CppIncludeBases[3], "include", "c++");
|
||||
for (auto &CppIncludeBase : CppIncludeBases) {
|
||||
CppIncludeBase += llvm::sys::path::get_separator();
|
||||
addSystemInclude(DriverArgs, CC1Args, CppIncludeBase);
|
||||
addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + Arch);
|
||||
addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + "backward");
|
||||
switch (GetCXXStdlibType(DriverArgs)) {
|
||||
case ToolChain::CST_Libcxx:
|
||||
addSystemInclude(DriverArgs, CC1Args, Base + "include" +
|
||||
llvm::sys::path::get_separator() + "c++" +
|
||||
llvm::sys::path::get_separator() + "v1");
|
||||
break;
|
||||
|
||||
case ToolChain::CST_Libstdcxx:
|
||||
llvm::SmallVector<llvm::SmallString<1024>, 4> CppIncludeBases;
|
||||
CppIncludeBases.emplace_back(Base);
|
||||
llvm::sys::path::append(CppIncludeBases[0], Arch, "include", "c++");
|
||||
CppIncludeBases.emplace_back(Base);
|
||||
llvm::sys::path::append(CppIncludeBases[1], Arch, "include", "c++", Ver);
|
||||
CppIncludeBases.emplace_back(Base);
|
||||
llvm::sys::path::append(CppIncludeBases[2], "include", "c++", Ver);
|
||||
CppIncludeBases.emplace_back(GccLibDir);
|
||||
llvm::sys::path::append(CppIncludeBases[3], "include", "c++");
|
||||
for (auto &CppIncludeBase : CppIncludeBases) {
|
||||
CppIncludeBase += llvm::sys::path::get_separator();
|
||||
addSystemInclude(DriverArgs, CC1Args, CppIncludeBase);
|
||||
addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + Arch);
|
||||
addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + "backward");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2247,8 +2247,7 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
|
||||
|
||||
// Until ARM libraries are build separately, we have them all in one library
|
||||
static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
|
||||
if (TC.getTriple().isOSWindows() &&
|
||||
!TC.getTriple().isWindowsItaniumEnvironment() &&
|
||||
if (TC.getTriple().isWindowsMSVCEnvironment() &&
|
||||
TC.getArch() == llvm::Triple::x86)
|
||||
return "i386";
|
||||
if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
|
||||
@@ -2274,10 +2273,12 @@ SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
|
||||
: "";
|
||||
|
||||
bool IsOSWindows = TC.getTriple().isOSWindows();
|
||||
bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
|
||||
TC.getTriple().isWindowsItaniumEnvironment();
|
||||
StringRef Arch = getArchNameForCompilerRTLib(TC);
|
||||
const char *Prefix = IsOSWindows ? "" : "lib";
|
||||
const char *Prefix = IsITANMSVCWindows ? "" : "lib";
|
||||
const char *Suffix =
|
||||
Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
|
||||
Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
|
||||
|
||||
SmallString<128> Path = getCompilerRTLibDir(TC);
|
||||
llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
|
||||
@@ -7840,6 +7841,7 @@ void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
|
||||
ArgStringList &CmdArgs, const ArgList &Args) {
|
||||
bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
|
||||
bool isCygMing = Triple.isOSCygMing();
|
||||
bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
|
||||
Args.hasArg(options::OPT_static);
|
||||
if (!D.CCCIsCXX())
|
||||
@@ -7849,10 +7851,10 @@ static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
|
||||
if (D.CCCIsCXX())
|
||||
CmdArgs.push_back("-lgcc");
|
||||
} else {
|
||||
if (!D.CCCIsCXX())
|
||||
if (!D.CCCIsCXX() && !isCygMing)
|
||||
CmdArgs.push_back("--as-needed");
|
||||
CmdArgs.push_back("-lgcc_s");
|
||||
if (!D.CCCIsCXX())
|
||||
if (!D.CCCIsCXX() && !isCygMing)
|
||||
CmdArgs.push_back("--no-as-needed");
|
||||
}
|
||||
|
||||
@@ -8934,15 +8936,10 @@ void MinGW::Linker::AddLibGCC(const ArgList &Args,
|
||||
if (Args.hasArg(options::OPT_mthreads))
|
||||
CmdArgs.push_back("-lmingwthrd");
|
||||
CmdArgs.push_back("-lmingw32");
|
||||
if (Args.hasArg(options::OPT_shared) ||
|
||||
Args.hasArg(options::OPT_shared_libgcc) ||
|
||||
!Args.hasArg(options::OPT_static_libgcc)) {
|
||||
CmdArgs.push_back("-lgcc_s");
|
||||
CmdArgs.push_back("-lgcc");
|
||||
} else {
|
||||
CmdArgs.push_back("-lgcc");
|
||||
CmdArgs.push_back("-lgcc_eh");
|
||||
}
|
||||
|
||||
// Add libgcc or compiler-rt.
|
||||
AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
|
||||
|
||||
CmdArgs.push_back("-lmoldname");
|
||||
CmdArgs.push_back("-lmingwex");
|
||||
CmdArgs.push_back("-lmsvcrt");
|
||||
|
||||
Reference in New Issue
Block a user