Use the new Windows environment for target detection
This follows the LLVM change to canonicalise the Windows target triple spellings. Rather than treating each Windows environment as a single entity, the environments are now modelled properly as an environment. This is a mechanical change to convert the triple use to reflect that change. llvm-svn: 204978
This commit is contained in:
parent
edbdd2e5df
commit
377066a5f5
|
@ -234,7 +234,7 @@ def TargetARM : TargetArch<["arm", "thumb"]>;
|
|||
def TargetMSP430 : TargetArch<["msp430"]>;
|
||||
def TargetX86 : TargetArch<["x86"]>;
|
||||
def TargetX86Win : TargetArch<["x86", "x86_64"]> {
|
||||
let OSes = ["Win32", "MinGW32"];
|
||||
let OSes = ["Win32"];
|
||||
}
|
||||
def TargetMips : TargetArch<["mips", "mipsel"]>;
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ public:
|
|||
|
||||
CallingConv getDefaultMethodCallConv(bool isVariadic) const override {
|
||||
const llvm::Triple &T = Context.getTargetInfo().getTriple();
|
||||
if (!isVariadic && T.getOS() == llvm::Triple::MinGW32 &&
|
||||
if (!isVariadic && T.isWindowsGNUEnvironment() &&
|
||||
T.getArch() == llvm::Triple::x86)
|
||||
return CC_X86ThisCall;
|
||||
return CC_C;
|
||||
|
|
|
@ -83,7 +83,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) {
|
|||
ComplexLongDoubleUsesFP2Ret = false;
|
||||
|
||||
// Set the C++ ABI based on the triple.
|
||||
TheCXXABI.set(Triple.getOS() == llvm::Triple::Win32
|
||||
TheCXXABI.set(Triple.isKnownWindowsMSVCEnvironment()
|
||||
? TargetCXXABI::Microsoft
|
||||
: TargetCXXABI::GenericItanium);
|
||||
|
||||
|
|
|
@ -5889,12 +5889,18 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
|
|||
return new MinixTargetInfo<X86_32TargetInfo>(Triple);
|
||||
case llvm::Triple::Solaris:
|
||||
return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
|
||||
case llvm::Triple::Cygwin:
|
||||
case llvm::Triple::Win32: {
|
||||
switch (Triple.getEnvironment()) {
|
||||
default:
|
||||
return new X86_32TargetInfo(Triple);
|
||||
case llvm::Triple::Cygnus:
|
||||
return new CygwinX86_32TargetInfo(Triple);
|
||||
case llvm::Triple::MinGW32:
|
||||
case llvm::Triple::GNU:
|
||||
return new MinGWX86_32TargetInfo(Triple);
|
||||
case llvm::Triple::Win32:
|
||||
case llvm::Triple::MSVC:
|
||||
return new VisualStudioWindowsX86_32TargetInfo(Triple);
|
||||
}
|
||||
}
|
||||
case llvm::Triple::Haiku:
|
||||
return new HaikuX86_32TargetInfo(Triple);
|
||||
case llvm::Triple::RTEMS:
|
||||
|
@ -5906,7 +5912,7 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
|
|||
}
|
||||
|
||||
case llvm::Triple::x86_64:
|
||||
if (Triple.isOSDarwin() || Triple.getObjectFormat() == llvm::Triple::MachO)
|
||||
if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
|
||||
return new DarwinX86_64TargetInfo(Triple);
|
||||
|
||||
switch (os) {
|
||||
|
@ -5928,10 +5934,16 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
|
|||
return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
|
||||
case llvm::Triple::Solaris:
|
||||
return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
|
||||
case llvm::Triple::MinGW32:
|
||||
case llvm::Triple::Win32: {
|
||||
switch (Triple.getEnvironment()) {
|
||||
default:
|
||||
return new X86_64TargetInfo(Triple);
|
||||
case llvm::Triple::GNU:
|
||||
return new MinGWX86_64TargetInfo(Triple);
|
||||
case llvm::Triple::Win32: // This is what Triple.h supports now.
|
||||
case llvm::Triple::MSVC:
|
||||
return new VisualStudioWindowsX86_64TargetInfo(Triple);
|
||||
}
|
||||
}
|
||||
case llvm::Triple::NaCl:
|
||||
return new NaClTargetInfo<X86_64TargetInfo>(Triple);
|
||||
default:
|
||||
|
|
|
@ -2732,7 +2732,7 @@ ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, bool IsReturnType) const {
|
|||
return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
|
||||
|
||||
// FIXME: mingw-w64-gcc emits 128-bit struct as i128
|
||||
if (Size == 128 && getTarget().getTriple().getOS() == llvm::Triple::MinGW32)
|
||||
if (Size == 128 && getTarget().getTriple().isWindowsGNUEnvironment())
|
||||
return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
|
||||
Size));
|
||||
|
||||
|
@ -4768,15 +4768,22 @@ bool X86_32TargetCodeGenInfo::isStructReturnInRegABI(
|
|||
return true;
|
||||
|
||||
switch (Triple.getOS()) {
|
||||
case llvm::Triple::Cygwin:
|
||||
case llvm::Triple::MinGW32:
|
||||
case llvm::Triple::AuroraUX:
|
||||
case llvm::Triple::DragonFly:
|
||||
case llvm::Triple::FreeBSD:
|
||||
case llvm::Triple::OpenBSD:
|
||||
case llvm::Triple::Bitrig:
|
||||
case llvm::Triple::Win32:
|
||||
return true;
|
||||
case llvm::Triple::Win32:
|
||||
switch (Triple.getEnvironment()) {
|
||||
case llvm::Triple::UnknownEnvironment:
|
||||
case llvm::Triple::Cygnus:
|
||||
case llvm::Triple::GNU:
|
||||
case llvm::Triple::MSVC:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -5847,7 +5854,7 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
|
|||
bool IsDarwinVectorABI = Triple.isOSDarwin();
|
||||
bool IsSmallStructInRegABI =
|
||||
X86_32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
|
||||
bool IsWin32FloatStructABI = (Triple.getOS() == llvm::Triple::Win32);
|
||||
bool IsWin32FloatStructABI = Triple.isWindowsMSVCEnvironment();
|
||||
|
||||
if (Triple.getOS() == llvm::Triple::Win32) {
|
||||
return *(TheTargetCodeGenInfo =
|
||||
|
@ -5886,6 +5893,5 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
|
|||
return *(TheTargetCodeGenInfo = new SparcV9TargetCodeGenInfo(Types));
|
||||
case llvm::Triple::xcore:
|
||||
return *(TheTargetCodeGenInfo = new XCoreTargetCodeGenInfo(Types));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1948,10 +1948,29 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
|
|||
TC = new toolchains::Solaris(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::Win32:
|
||||
switch (Target.getEnvironment()) {
|
||||
default:
|
||||
if (Target.isOSBinFormatELF())
|
||||
TC = new toolchains::Generic_ELF(*this, Target, Args);
|
||||
else if (Target.isOSBinFormatMachO())
|
||||
TC = new toolchains::MachO(*this, Target, Args);
|
||||
else
|
||||
TC = new toolchains::Generic_GCC(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::GNU:
|
||||
// FIXME: We need a MinGW toolchain. Use the default Generic_GCC
|
||||
// toolchain for now as the default case would below otherwise.
|
||||
if (Target.isOSBinFormatELF())
|
||||
TC = new toolchains::Generic_ELF(*this, Target, Args);
|
||||
else
|
||||
TC = new toolchains::Generic_GCC(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::MSVC:
|
||||
case llvm::Triple::UnknownEnvironment:
|
||||
TC = new toolchains::Windows(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::MinGW32:
|
||||
// FIXME: We need a MinGW toolchain. Fallthrough for now.
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// TCE is an OSless target
|
||||
if (Target.getArchName() == "tce") {
|
||||
|
|
|
@ -681,10 +681,8 @@ StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
|
|||
default:
|
||||
// Assume "soft", but warn the user we are guessing.
|
||||
FloatABI = "soft";
|
||||
// *-macho defaults to "soft"
|
||||
if (Triple.getOS() == llvm::Triple::UnknownOS &&
|
||||
Triple.getObjectFormat() == llvm::Triple::MachO)
|
||||
break;
|
||||
if (Triple.getOS() != llvm::Triple::UnknownOS ||
|
||||
!Triple.isOSBinFormatMachO())
|
||||
D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
|
||||
break;
|
||||
}
|
||||
|
@ -2103,6 +2101,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
const Driver &D = getToolChain().getDriver();
|
||||
ArgStringList CmdArgs;
|
||||
|
||||
bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
|
||||
bool IsWindowsCygnus = getToolChain().getTriple().isWindowsCygwinEnvironment();
|
||||
bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
|
||||
|
||||
assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
|
||||
|
||||
// Invoke ourselves in -cc1 mode.
|
||||
|
@ -2211,7 +2213,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
|
||||
CmdArgs.push_back("-analyzer-checker=core");
|
||||
|
||||
if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
|
||||
if (!IsWindowsMSVC)
|
||||
CmdArgs.push_back("-analyzer-checker=unix");
|
||||
|
||||
if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
|
||||
|
@ -2961,7 +2963,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
if (!types::isCXX(InputType))
|
||||
Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
|
||||
"-std=", /*Joined=*/true);
|
||||
else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
|
||||
else if (IsWindowsMSVC)
|
||||
CmdArgs.push_back("-std=c++11");
|
||||
|
||||
Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
|
||||
|
@ -3451,10 +3453,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
CmdArgs.push_back("-fno-threadsafe-statics");
|
||||
|
||||
// -fuse-cxa-atexit is default.
|
||||
if (!Args.hasFlag(
|
||||
options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
|
||||
getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
|
||||
getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
|
||||
if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
|
||||
options::OPT_fno_use_cxa_atexit,
|
||||
!IsWindowsCygnus && !IsWindowsGNU &&
|
||||
getToolChain().getArch() != llvm::Triple::hexagon &&
|
||||
getToolChain().getArch() != llvm::Triple::xcore) ||
|
||||
KernelOrKext)
|
||||
|
@ -3462,22 +3463,20 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
// -fms-extensions=0 is default.
|
||||
if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
|
||||
getToolChain().getTriple().getOS() == llvm::Triple::Win32))
|
||||
IsWindowsMSVC))
|
||||
CmdArgs.push_back("-fms-extensions");
|
||||
|
||||
// -fms-compatibility=0 is default.
|
||||
if (Args.hasFlag(options::OPT_fms_compatibility,
|
||||
options::OPT_fno_ms_compatibility,
|
||||
(getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
|
||||
Args.hasFlag(options::OPT_fms_extensions,
|
||||
(IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
|
||||
options::OPT_fno_ms_extensions,
|
||||
true))))
|
||||
CmdArgs.push_back("-fms-compatibility");
|
||||
|
||||
// -fmsc-version=1700 is default.
|
||||
if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
|
||||
getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
|
||||
Args.hasArg(options::OPT_fmsc_version)) {
|
||||
IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
|
||||
StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
|
||||
if (msc_ver.empty())
|
||||
CmdArgs.push_back("-fmsc-version=1700");
|
||||
|
@ -3494,8 +3493,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
// -fno-delayed-template-parsing is default, except for Windows where MSVC STL
|
||||
// needs it.
|
||||
if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
|
||||
options::OPT_fno_delayed_template_parsing,
|
||||
getToolChain().getTriple().getOS() == llvm::Triple::Win32))
|
||||
options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
|
||||
CmdArgs.push_back("-fdelayed-template-parsing");
|
||||
|
||||
// -fgnu-keywords default varies depending on language; only pass if
|
||||
|
|
|
@ -43,7 +43,7 @@ Tool *Windows::buildLinker() const {
|
|||
}
|
||||
|
||||
Tool *Windows::buildAssembler() const {
|
||||
if (getTriple().getObjectFormat() == llvm::Triple::MachO)
|
||||
if (getTriple().isOSBinFormatMachO())
|
||||
return new tools::darwin::Assemble(*this);
|
||||
getDriver().Diag(clang::diag::err_no_external_assembler);
|
||||
return NULL;
|
||||
|
|
|
@ -268,7 +268,6 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
|
|||
|
||||
switch (os) {
|
||||
case llvm::Triple::Linux:
|
||||
case llvm::Triple::Win32:
|
||||
llvm_unreachable("Include management is handled in the driver.");
|
||||
|
||||
case llvm::Triple::Haiku:
|
||||
|
@ -307,10 +306,13 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
|
|||
break;
|
||||
case llvm::Triple::RTEMS:
|
||||
break;
|
||||
case llvm::Triple::Cygwin:
|
||||
case llvm::Triple::Win32:
|
||||
switch (triple.getEnvironment()) {
|
||||
default: llvm_unreachable("Include management is handled in the driver.");
|
||||
case llvm::Triple::Cygnus:
|
||||
AddPath("/usr/include/w32api", System, false);
|
||||
break;
|
||||
case llvm::Triple::MinGW32: {
|
||||
case llvm::Triple::GNU:
|
||||
// mingw-w64 crt include paths
|
||||
// <sysroot>/i686-w64-mingw32/include
|
||||
SmallString<128> P = StringRef(HSOpts.ResourceDir);
|
||||
|
@ -331,9 +333,9 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
|
|||
#if defined(LLVM_ON_WIN32)
|
||||
AddPath("c:/mingw/include", System, false);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -382,10 +384,12 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
|
|||
|
||||
switch (os) {
|
||||
case llvm::Triple::Linux:
|
||||
case llvm::Triple::Win32:
|
||||
llvm_unreachable("Include management is handled in the driver.");
|
||||
|
||||
case llvm::Triple::Cygwin:
|
||||
case llvm::Triple::Win32:
|
||||
switch (triple.getEnvironment()) {
|
||||
default: llvm_unreachable("Include management is handled in the driver.");
|
||||
case llvm::Triple::Cygnus:
|
||||
// Cygwin-1.7
|
||||
AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.7.3");
|
||||
AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.5.3");
|
||||
|
@ -393,7 +397,7 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
|
|||
// g++-4 / Cygwin-1.5
|
||||
AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.3.2");
|
||||
break;
|
||||
case llvm::Triple::MinGW32:
|
||||
case llvm::Triple::GNU:
|
||||
// mingw-w64 C++ include paths (i686-w64-mingw32 and x86_64-w64-mingw32)
|
||||
AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.0");
|
||||
AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.1");
|
||||
|
@ -413,6 +417,7 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
|
|||
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.8.2");
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case llvm::Triple::DragonFly:
|
||||
if (llvm::sys::fs::exists("/usr/lib/gcc47"))
|
||||
AddPath("/usr/include/c++/4.7", CXXSystem, false);
|
||||
|
@ -457,8 +462,13 @@ void InitHeaderSearch::AddDefaultIncludePaths(const LangOptions &Lang,
|
|||
break; // Everything else continues to use this routine's logic.
|
||||
|
||||
case llvm::Triple::Linux:
|
||||
case llvm::Triple::Win32:
|
||||
return;
|
||||
|
||||
case llvm::Triple::Win32:
|
||||
if (triple.getEnvironment() == llvm::Triple::MSVC ||
|
||||
triple.getEnvironment() == llvm::Triple::Itanium)
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
if (Lang.CPlusPlus && HSOpts.UseStandardCXXIncludes &&
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -fms-extensions -Wno-microsoft -triple=i386-pc-mingw32 -emit-llvm %s -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -std=c++11 -fms-extensions -Wno-microsoft -triple=i386-pc-windows-gnu -emit-llvm %s -o - | FileCheck %s
|
||||
|
||||
__interface I {
|
||||
int test() {
|
||||
|
|
|
@ -203,7 +203,7 @@
|
|||
// AMD64-MINGW: clang
|
||||
// AMD64-MINGW: "-cc1"
|
||||
// AMD64-MINGW: "-triple"
|
||||
// AMD64-MINGW: "amd64--mingw32"
|
||||
// AMD64-MINGW: "amd64--windows-gnu"
|
||||
// AMD64-MINGW: "-munwind-tables"
|
||||
|
||||
// RUN: %clang -target i686-linux-android -### -S %s 2>&1 \
|
||||
|
|
|
@ -105,8 +105,9 @@ TEST(NameableDeclaration, REMatchesVariousDecls) {
|
|||
|
||||
TEST(DeclarationMatcher, MatchClass) {
|
||||
DeclarationMatcher ClassMatcher(recordDecl());
|
||||
if (llvm::Triple(llvm::sys::getDefaultTargetTriple()).getOS() !=
|
||||
llvm::Triple::Win32)
|
||||
llvm::Triple Triple(llvm::sys::getDefaultTargetTriple());
|
||||
if (Triple.getOS() != llvm::Triple::Win32 ||
|
||||
Triple.getEnvironment() != llvm::Triple::MSVC)
|
||||
EXPECT_FALSE(matches("", ClassMatcher));
|
||||
else
|
||||
// Matches class type_info.
|
||||
|
|
Loading…
Reference in New Issue