https://github.com/jeremyd2019 updated https://github.com/llvm/llvm-project/pull/135691
>From 949ec2a683faf53652b21a4c90206befa498bf4e Mon Sep 17 00:00:00 2001 From: Jeremy Drake <git...@jdrake.com> Date: Mon, 14 Apr 2025 10:37:59 -0700 Subject: [PATCH 1/2] [Clang] [Driver] add a Cygwin ToolChain Add a new Cygwin toolchain that just goes through the motions to initialize the Generic_GCC base properly. This allows removing some old, almost certainly wrong hard-coded paths from Lex/InitHeaderSearch.cpp Signed-off-by: Jeremy Drake <git...@jdrake.com> --- clang/lib/Driver/CMakeLists.txt | 1 + clang/lib/Driver/Driver.cpp | 4 + clang/lib/Driver/ToolChains/Cygwin.cpp | 109 +++++++++++++++++++++++++ clang/lib/Driver/ToolChains/Cygwin.h | 36 ++++++++ clang/lib/Driver/ToolChains/Gnu.cpp | 21 +++++ clang/lib/Lex/InitHeaderSearch.cpp | 86 +------------------ 6 files changed, 174 insertions(+), 83 deletions(-) create mode 100644 clang/lib/Driver/ToolChains/Cygwin.cpp create mode 100644 clang/lib/Driver/ToolChains/Cygwin.h diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt index 5bdb6614389cf..e72525e99d517 100644 --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt @@ -51,6 +51,7 @@ add_clang_library(clangDriver ToolChains/CrossWindows.cpp ToolChains/CSKYToolChain.cpp ToolChains/Cuda.cpp + ToolChains/Cygwin.cpp ToolChains/Darwin.cpp ToolChains/DragonFly.cpp ToolChains/Flang.cpp diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 90d8e823d1d02..9b2264bbc9eaa 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -17,6 +17,7 @@ #include "ToolChains/Clang.h" #include "ToolChains/CrossWindows.h" #include "ToolChains/Cuda.h" +#include "ToolChains/Cygwin.h" #include "ToolChains/Darwin.h" #include "ToolChains/DragonFly.h" #include "ToolChains/FreeBSD.h" @@ -6849,6 +6850,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, case llvm::Triple::GNU: TC = std::make_unique<toolchains::MinGW>(*this, Target, Args); break; + case llvm::Triple::Cygnus: + TC = std::make_unique<toolchains::Cygwin>(*this, Target, Args); + break; case llvm::Triple::Itanium: TC = std::make_unique<toolchains::CrossWindowsToolChain>(*this, Target, Args); diff --git a/clang/lib/Driver/ToolChains/Cygwin.cpp b/clang/lib/Driver/ToolChains/Cygwin.cpp new file mode 100644 index 0000000000000..c310f096a5d74 --- /dev/null +++ b/clang/lib/Driver/ToolChains/Cygwin.cpp @@ -0,0 +1,109 @@ +//===--- Cygwin.cpp - Cygwin ToolChain Implementations ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "Cygwin.h" +#include "CommonArgs.h" +#include "clang/Config/config.h" +#include "clang/Driver/Driver.h" +#include "clang/Driver/Options.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/VirtualFileSystem.h" + +using namespace clang::driver; +using namespace clang::driver::toolchains; +using namespace clang; +using namespace llvm::opt; + +using tools::addPathIfExists; + +Cygwin::Cygwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) + : Generic_GCC(D, Triple, Args) { + GCCInstallation.init(Triple, Args); + std::string SysRoot = computeSysRoot(); + ToolChain::path_list &PPaths = getProgramPaths(); + + Generic_GCC::PushPPaths(PPaths); + + path_list &Paths = getFilePaths(); + + Generic_GCC::AddMultiarchPaths(D, SysRoot, "lib", Paths); + + // Similar to the logic for GCC above, if we are currently running Clang + // inside of the requested system root, add its parent library path to those + // searched. + // FIXME: It's not clear whether we should use the driver's installed + // directory ('Dir' below) or the ResourceDir. + if (StringRef(D.Dir).starts_with(SysRoot)) + addPathIfExists(D, D.Dir + "/../lib", Paths); + + addPathIfExists(D, SysRoot + "/lib", Paths); + addPathIfExists(D, SysRoot + "/usr/lib", Paths); + addPathIfExists(D, SysRoot + "/usr/lib/w32api", Paths); +} + +llvm::ExceptionHandling Cygwin::GetExceptionModel(const ArgList &Args) const { + if (getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::aarch64 || + getArch() == llvm::Triple::arm || getArch() == llvm::Triple::thumb) + return llvm::ExceptionHandling::WinEH; + return llvm::ExceptionHandling::DwarfCFI; +} + +void Cygwin::AddClangSystemIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + const Driver &D = getDriver(); + std::string SysRoot = computeSysRoot(); + + if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc)) + return; + + if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) + addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include"); + + if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { + SmallString<128> P(D.ResourceDir); + llvm::sys::path::append(P, "include"); + addSystemInclude(DriverArgs, CC1Args, P); + } + + if (DriverArgs.hasArg(options::OPT_nostdlibinc)) + return; + + // Check for configure-time C include directories. + StringRef CIncludeDirs(C_INCLUDE_DIRS); + if (CIncludeDirs != "") { + SmallVector<StringRef, 5> Dirs; + CIncludeDirs.split(Dirs, ":"); + for (StringRef Dir : Dirs) { + StringRef Prefix = + llvm::sys::path::is_absolute(Dir) ? "" : StringRef(SysRoot); + addExternCSystemInclude(DriverArgs, CC1Args, Prefix + Dir); + } + return; + } + + // Lacking those, try to detect the correct set of system includes for the + // target triple. + + AddMultilibIncludeArgs(DriverArgs, CC1Args); + + // On systems using multiarch, add /usr/include/$triple before + // /usr/include. + std::string MultiarchIncludeDir = getTriple().str(); + if (!MultiarchIncludeDir.empty() && + D.getVFS().exists(SysRoot + "/usr/include/" + MultiarchIncludeDir)) + addExternCSystemInclude(DriverArgs, CC1Args, + SysRoot + "/usr/include/" + MultiarchIncludeDir); + + // Add an include of '/include' directly. This isn't provided by default by + // system GCCs, but is often used with cross-compiling GCCs, and harmless to + // add even when Clang is acting as-if it were a system compiler. + addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include"); + + addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include"); + addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/w32api"); +} diff --git a/clang/lib/Driver/ToolChains/Cygwin.h b/clang/lib/Driver/ToolChains/Cygwin.h new file mode 100644 index 0000000000000..a4c0ee86a3c97 --- /dev/null +++ b/clang/lib/Driver/ToolChains/Cygwin.h @@ -0,0 +1,36 @@ +//===--- Cygwin.h - Cygwin ToolChain Implementations ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Cygwin_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Cygwin_H + +#include "Gnu.h" +#include "clang/Driver/ToolChain.h" + +namespace clang { +namespace driver { +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY Cygwin : public Generic_GCC { +public: + Cygwin(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + + llvm::ExceptionHandling + GetExceptionModel(const llvm::opt::ArgList &Args) const override; + + void + AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; +}; + +} // end namespace toolchains +} // end namespace driver +} // end namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Cygwin_H diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index d53039f6302d2..a1fdb7a803c20 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -2632,6 +2632,27 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( return; } + if (TargetTriple.isWindowsCygwinEnvironment()) { + static const char *const CygwinX86Triples[] = {"i686-pc-cygwin", + "i686-pc-msys"}; + static const char *const CygwinX86_64Triples[] = {"x86_64-pc-cygwin", + "x86_64-pc-msys"}; + LibDirs.push_back("/lib"); + switch (TargetTriple.getArch()) { + case llvm::Triple::x86_64: + TripleAliases.append(begin(CygwinX86_64Triples), + end(CygwinX86_64Triples)); + break; + case llvm::Triple::x86: + TripleAliases.append(begin(CygwinX86Triples), end(CygwinX86Triples)); + break; + default: + break; + } + + return; + } + switch (TargetTriple.getArch()) { case llvm::Triple::aarch64: LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs)); diff --git a/clang/lib/Lex/InitHeaderSearch.cpp b/clang/lib/Lex/InitHeaderSearch.cpp index bb2a21356fa8f..45bca1834e888 100644 --- a/clang/lib/Lex/InitHeaderSearch.cpp +++ b/clang/lib/Lex/InitHeaderSearch.cpp @@ -74,20 +74,10 @@ class InitHeaderSearch { SystemHeaderPrefixes.emplace_back(std::string(Prefix), IsSystemHeader); } - /// Add the necessary paths to support a MinGW libstdc++. - void AddMinGWCPlusPlusIncludePaths(StringRef Base, - StringRef Arch, - StringRef Version); - /// Add paths that should always be searched. void AddDefaultCIncludePaths(const llvm::Triple &triple, const HeaderSearchOptions &HSOpts); - /// Add paths that should be searched when compiling c++. - void AddDefaultCPlusPlusIncludePaths(const LangOptions &LangOpts, - const llvm::Triple &triple, - const HeaderSearchOptions &HSOpts); - /// Returns true iff AddDefaultIncludePaths should do anything. If this /// returns false, include paths should instead be handled in the driver. bool ShouldAddDefaultIncludePaths(const llvm::Triple &triple); @@ -180,35 +170,14 @@ bool InitHeaderSearch::AddUnmappedPath(const Twine &Path, IncludeDirGroup Group, return false; } -void InitHeaderSearch::AddMinGWCPlusPlusIncludePaths(StringRef Base, - StringRef Arch, - StringRef Version) { - AddPath(Base + "/" + Arch + "/" + Version + "/include/c++", - CXXSystem, false); - AddPath(Base + "/" + Arch + "/" + Version + "/include/c++/" + Arch, - CXXSystem, false); - AddPath(Base + "/" + Arch + "/" + Version + "/include/c++/backward", - CXXSystem, false); -} - void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, const HeaderSearchOptions &HSOpts) { if (!ShouldAddDefaultIncludePaths(triple)) llvm_unreachable("Include management is handled in the driver."); - llvm::Triple::OSType os = triple.getOS(); - if (HSOpts.UseStandardSystemIncludes) { - switch (os) { - case llvm::Triple::Win32: - if (triple.getEnvironment() != llvm::Triple::Cygnus) - break; - [[fallthrough]]; - default: - // FIXME: temporary hack: hard-coded paths. - AddPath("/usr/local/include", System, false); - break; - } + // FIXME: temporary hack: hard-coded paths. + AddPath("/usr/local/include", System, false); } // Builtin includes use #include_next directives and should be positioned @@ -236,51 +205,9 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, return; } - switch (os) { - 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: - break; - } - break; - default: - break; - } - AddPath("/usr/include", ExternCSystem, false); } -void InitHeaderSearch::AddDefaultCPlusPlusIncludePaths( - const LangOptions &LangOpts, const llvm::Triple &triple, - const HeaderSearchOptions &HSOpts) { - if (!ShouldAddDefaultIncludePaths(triple)) - llvm_unreachable("Include management is handled in the driver."); - - // FIXME: temporary hack: hard-coded paths. - llvm::Triple::OSType os = triple.getOS(); - switch (os) { - 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; - } - break; - default: - break; - } -} - bool InitHeaderSearch::ShouldAddDefaultIncludePaths( const llvm::Triple &triple) { switch (triple.getOS()) { @@ -303,15 +230,10 @@ bool InitHeaderSearch::ShouldAddDefaultIncludePaths( case llvm::Triple::Solaris: case llvm::Triple::UEFI: case llvm::Triple::WASI: + case llvm::Triple::Win32: case llvm::Triple::ZOS: return false; - case llvm::Triple::Win32: - if (triple.getEnvironment() != llvm::Triple::Cygnus || - triple.isOSBinFormatMachO()) - return false; - break; - case llvm::Triple::UnknownOS: if (triple.isWasm() || triple.isAppleMachO()) return false; @@ -355,8 +277,6 @@ void InitHeaderSearch::AddDefaultIncludePaths( HSOpts.UseStandardCXXIncludes && HSOpts.UseStandardSystemIncludes) { if (HSOpts.UseLibcxx) { AddPath("/usr/include/c++/v1", CXXSystem, false); - } else { - AddDefaultCPlusPlusIncludePaths(Lang, triple, HSOpts); } } >From 1478096339a85df1bbf096fab8763ad8a4415335 Mon Sep 17 00:00:00 2001 From: Jeremy Drake <git...@jdrake.com> Date: Tue, 22 Apr 2025 22:30:14 -0700 Subject: [PATCH 2/2] [Clang][Driver] add test for new Cygwin driver --- .../usr/i686-pc-msys/bin/as | 0 .../usr/i686-pc-msys/bin/ld | 0 .../usr/i686-pc-msys/lib/.keep | 0 .../usr/lib/gcc/i686-pc-msys/10/crtbegin.o | 0 .../lib/gcc/x86_64-pc-cygwin/10/crtbegin.o | 0 .../usr/x86_64-pc-cygwin/bin/as | 0 .../usr/x86_64-pc-cygwin/bin/ld | 0 .../usr/x86_64-pc-cygwin/lib/.keep | 0 .../Inputs/basic_cygwin_tree/include/.keep | 0 .../Driver/Inputs/basic_cygwin_tree/lib/.keep | 0 .../usr/include/c++/10/.keep | 0 .../usr/include/i686-pc-cygwin/.keep | 0 .../usr/include/i686-pc-cygwin/c++/10/.keep | 0 .../usr/include/x86_64-pc-msys/.keep | 0 .../usr/include/x86_64-pc-msys/c++/10/.keep | 0 .../usr/lib/gcc/i686-pc-cygwin/10/crtbegin.o | 0 .../usr/lib/gcc/i686-pc-cygwin/10/crtbeginS.o | 0 .../usr/lib/gcc/x86_64-pc-msys/10/crtbegin.o | 0 .../usr/lib/gcc/x86_64-pc-msys/10/crtbeginS.o | 0 .../usr/lib/i686-pc-cygwin/.keep | 0 .../usr/lib/x86_64-pc-msys/.keep | 0 clang/test/Driver/cygwin.cpp | 77 +++++++++++++++++++ 22 files changed, 77 insertions(+) create mode 100755 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/bin/as create mode 100755 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/bin/ld create mode 100644 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/lib/.keep create mode 100644 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/i686-pc-msys/10/crtbegin.o create mode 100644 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/x86_64-pc-cygwin/10/crtbegin.o create mode 100755 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/bin/as create mode 100755 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/bin/ld create mode 100644 clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/lib/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/include/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/lib/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/c++/10/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/i686-pc-cygwin/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/i686-pc-cygwin/c++/10/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/x86_64-pc-msys/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/x86_64-pc-msys/c++/10/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtbegin.o create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtbeginS.o create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtbegin.o create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtbeginS.o create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/i686-pc-cygwin/.keep create mode 100644 clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/x86_64-pc-msys/.keep create mode 100644 clang/test/Driver/cygwin.cpp diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/bin/as b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/bin/as new file mode 100755 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/bin/ld b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/bin/ld new file mode 100755 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/lib/.keep b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/lib/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/i686-pc-msys/10/crtbegin.o b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/i686-pc-msys/10/crtbegin.o new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/x86_64-pc-cygwin/10/crtbegin.o b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/x86_64-pc-cygwin/10/crtbegin.o new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/bin/as b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/bin/as new file mode 100755 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/bin/ld b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/bin/ld new file mode 100755 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/lib/.keep b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/lib/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/include/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/include/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/lib/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/lib/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/c++/10/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/c++/10/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/i686-pc-cygwin/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/i686-pc-cygwin/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/i686-pc-cygwin/c++/10/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/i686-pc-cygwin/c++/10/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/x86_64-pc-msys/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/x86_64-pc-msys/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/x86_64-pc-msys/c++/10/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/include/x86_64-pc-msys/c++/10/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtbegin.o b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtbegin.o new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtbeginS.o b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtbeginS.o new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtbegin.o b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtbegin.o new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtbeginS.o b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtbeginS.o new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/i686-pc-cygwin/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/i686-pc-cygwin/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/x86_64-pc-msys/.keep b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/x86_64-pc-msys/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/cygwin.cpp b/clang/test/Driver/cygwin.cpp new file mode 100644 index 0000000000000..f906fe28dfe21 --- /dev/null +++ b/clang/test/Driver/cygwin.cpp @@ -0,0 +1,77 @@ +// RUN: %clang -### %s --target=i686-pc-windows-cygnus --sysroot=%S/Inputs/basic_cygwin_tree \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --stdlib=platform 2>&1 | FileCheck --check-prefix=CHECK %s +// CHECK: "-cc1" +// CHECK-SAME: "-resource-dir" "[[RESOURCE:[^"]+]]" +// CHECK-SAME: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/i686-pc-cygwin/10/../../../../include/c++/10" +// CHECK-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/i686-pc-cygwin/10/../../../../include/i686-pc-cygwin/c++/10" +// CHECK-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/i686-pc-cygwin/10/../../../../include/c++/10/backward" +// CHECK-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// CHECK-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]{{[/\\]}}include" +// CHECK-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/i686-pc-cygwin/10/../../../../i686-pc-cygwin/include" +// CHECK-SAME: "-internal-externc-isystem" "[[SYSROOT]]/include" +// CHECK-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/usr/include" +// CHECK-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/usr/include/w32api" +// CHECK-SAME: "-femulated-tls" +// CHECK-SAME: "-exception-model=dwarf" +// CHECK: "{{.*}}gcc" +// CHECK-SAME: "-m32" + +// RUN: %clang -### %s --target=i686-pc-cygwin --sysroot=%S/Inputs/basic_cygwin_tree \ +// RUN: --stdlib=platform -static 2>&1 | FileCheck --check-prefix=CHECK-STATIC %s +// CHECK-STATIC: "-cc1" "-triple" "i686-pc-windows-cygnus" +// CHECK-STATIC-SAME: "-static-define" +// CHECK-STATIC: "{{.*}}gcc" +// CHECK-STATIC-SAME: "-static" + +// RUN: %clang -### %s --target=i686-pc-cygwin --sysroot=%S/Inputs/basic_cygwin_tree \ +// RUN: -shared 2>&1 | FileCheck --check-prefix=CHECK-SHARED %s +// CHECK-SHARED: "{{.*}}gcc" +// CHECK-SHARED-SAME: "-shared" + +// RUN: %clang -### -o %t %s 2>&1 -no-integrated-as -fuse-ld=ld \ +// RUN: --gcc-toolchain=%S/Inputs/basic_cross_cygwin_tree/usr \ +// RUN: --target=i686-pc-cygwin \ +// RUN: | FileCheck --check-prefix=CHECK-CROSS %s +// CHECK-CROSS: "-cc1" "-triple" "i686-pc-windows-cygnus" +// CHECK-CROSS: "{{.*}}/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/i686-pc-msys/10/../../../../i686-pc-msys/bin/as" "--32" + +// RUN: %clang -### %s --target=x86_64-pc-windows-cygnus --sysroot=%S/Inputs/basic_cygwin_tree \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --stdlib=platform 2>&1 | FileCheck --check-prefix=CHECK-64 %s +// CHECK-64: "-cc1" +// CHECK-64-SAME: "-resource-dir" "[[RESOURCE:[^"]+]]" +// CHECK-64-SAME: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-pc-msys/10/../../../../include/c++/10" +// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-pc-msys/10/../../../../include/x86_64-pc-msys/c++/10" +// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-pc-msys/10/../../../../include/c++/10/backward" +// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// CHECK-64-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]{{[/\\]}}include" +// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-pc-msys/10/../../../../x86_64-pc-msys/include" +// CHECK-64-SAME: "-internal-externc-isystem" "[[SYSROOT]]/include" +// CHECK-64-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/usr/include" +// CHECK-64-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/usr/include/w32api" +// CHECK-64-SAME: "-femulated-tls" +// CHECK-64-SAME: "-exception-model=seh" +// CHECK-64: "{{.*}}gcc" +// CHECK-64-SAME: "-m64" + +// RUN: %clang -### %s --target=x86_64-pc-cygwin --sysroot=%S/Inputs/basic_cygwin_tree \ +// RUN: --stdlib=platform -static 2>&1 | FileCheck --check-prefix=CHECK-64-STATIC %s +// CHECK-64-STATIC: "-cc1" "-triple" "x86_64-pc-windows-cygnus" +// CHECK-64-STATIC-SAME: "-static-define" +// CHECK-64-STATIC: "{{.*}}gcc" +// CHECK-64-STATIC-SAME: "-static" + +// RUN: %clang -### %s --target=x86_64-pc-cygwin --sysroot=%S/Inputs/basic_cygwin_tree \ +// RUN: -shared 2>&1 | FileCheck --check-prefix=CHECK-64-SHARED %s +// CHECK-64-SHARED: "{{.*}}gcc" +// CHECK-64-SHARED-SAME: "-shared" + +// RUN: %clang -### -o %t %s 2>&1 -no-integrated-as -fuse-ld=ld \ +// RUN: --gcc-toolchain=%S/Inputs/basic_cross_cygwin_tree/usr \ +// RUN: --target=x86_64-pc-cygwin \ +// RUN: | FileCheck --check-prefix=CHECK-64-CROSS %s +// CHECK-64-CROSS: "-cc1" "-triple" "x86_64-pc-windows-cygnus" +// CHECK-64-CROSS: "{{.*}}/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/x86_64-pc-cygwin/10/../../../../x86_64-pc-cygwin/bin/as" "--64" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits