From: Saleem Abdulrasool Date: Thu, 27 Mar 2014 22:50:18 +0000 (+0000) Subject: Use the new Windows environment for target detection X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1e57f17debf628742e9bb9872f7621dfc4c0b2fa;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204978 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index afc038c15f..560026b5b9 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -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"]>; diff --git a/lib/AST/ItaniumCXXABI.cpp b/lib/AST/ItaniumCXXABI.cpp index 90e5bb94db..ffa2ddc337 100644 --- a/lib/AST/ItaniumCXXABI.cpp +++ b/lib/AST/ItaniumCXXABI.cpp @@ -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; diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp index e661c66ca0..01eced2093 100644 --- a/lib/Basic/TargetInfo.cpp +++ b/lib/Basic/TargetInfo.cpp @@ -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); diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index fa1fb83845..a4be2891bd 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -5889,12 +5889,18 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { return new MinixTargetInfo(Triple); case llvm::Triple::Solaris: return new SolarisTargetInfo(Triple); - case llvm::Triple::Cygwin: - return new CygwinX86_32TargetInfo(Triple); - case llvm::Triple::MinGW32: - return new MinGWX86_32TargetInfo(Triple); - case llvm::Triple::Win32: - return new VisualStudioWindowsX86_32TargetInfo(Triple); + 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::GNU: + return new MinGWX86_32TargetInfo(Triple); + 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(Triple); case llvm::Triple::Solaris: return new SolarisTargetInfo(Triple); - case llvm::Triple::MinGW32: - return new MinGWX86_64TargetInfo(Triple); - case llvm::Triple::Win32: // This is what Triple.h supports now. - return new VisualStudioWindowsX86_64TargetInfo(Triple); + 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::MSVC: + return new VisualStudioWindowsX86_64TargetInfo(Triple); + } + } case llvm::Triple::NaCl: return new NaClTargetInfo(Triple); default: diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index c0c4fc45e6..7bac5121b1 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -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)); - } } diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 5cc19f5f8e..914efa638d 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -1948,10 +1948,29 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, TC = new toolchains::Solaris(*this, Target, Args); break; case llvm::Triple::Win32: - TC = new toolchains::Windows(*this, Target, Args); + 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; + } break; - case llvm::Triple::MinGW32: - // FIXME: We need a MinGW toolchain. Fallthrough for now. default: // TCE is an OSless target if (Target.getArchName() == "tce") { diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 756815147c..3106e1506b 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -681,11 +681,9 @@ 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; - D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft"; + 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,33 +3453,30 @@ 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 && - getToolChain().getArch() != llvm::Triple::hexagon && - getToolChain().getArch() != llvm::Triple::xcore) || + 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) CmdArgs.push_back("-fno-use-cxa-atexit"); // -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, - options::OPT_fno_ms_extensions, - true)))) + (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 diff --git a/lib/Driver/WindowsToolChain.cpp b/lib/Driver/WindowsToolChain.cpp index c9328e6825..a32a7bfe07 100644 --- a/lib/Driver/WindowsToolChain.cpp +++ b/lib/Driver/WindowsToolChain.cpp @@ -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; diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp index 31921b5b94..b043dd21e8 100644 --- a/lib/Frontend/InitHeaderSearch.cpp +++ b/lib/Frontend/InitHeaderSearch.cpp @@ -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: - AddPath("/usr/include/w32api", System, false); - break; - case llvm::Triple::MinGW32: { + 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::GNU: // mingw-w64 crt include paths // /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,37 +384,40 @@ 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: - // Cygwin-1.7 - AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.7.3"); - AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.5.3"); - AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.3.4"); - // g++-4 / Cygwin-1.5 - AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.3.2"); - break; - case llvm::Triple::MinGW32: - // 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"); - AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.2"); - AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.3"); - AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.8.0"); - AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.8.1"); - AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.8.2"); - // mingw.org C++ include paths + 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"); + AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.3.4"); + // g++-4 / Cygwin-1.5 + AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.3.2"); + break; + 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"); + AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.2"); + AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.3"); + AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.8.0"); + AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.8.1"); + AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.8.2"); + // mingw.org C++ include paths #if defined(LLVM_ON_WIN32) - AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.0"); - AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.1"); - AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.2"); - AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.3"); - AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.8.0"); - AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.8.1"); - AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.8.2"); + AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.0"); + AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.1"); + AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.2"); + AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.7.3"); + AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.8.0"); + AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.8.1"); + AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.8.2"); #endif - break; + 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 && diff --git a/test/CodeGenCXX/microsoft-interface.cpp b/test/CodeGenCXX/microsoft-interface.cpp index e60e0a0175..c030d1d0b3 100644 --- a/test/CodeGenCXX/microsoft-interface.cpp +++ b/test/CodeGenCXX/microsoft-interface.cpp @@ -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() { diff --git a/test/Driver/clang-translation.c b/test/Driver/clang-translation.c index f0c44c5f06..54e5bbec02 100644 --- a/test/Driver/clang-translation.c +++ b/test/Driver/clang-translation.c @@ -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 \ diff --git a/unittests/ASTMatchers/ASTMatchersTest.cpp b/unittests/ASTMatchers/ASTMatchersTest.cpp index 787f81992d..6082c2b90a 100644 --- a/unittests/ASTMatchers/ASTMatchersTest.cpp +++ b/unittests/ASTMatchers/ASTMatchersTest.cpp @@ -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.