Author: tyan0
Date: 2026-08-30T23:32:58+03:00
New Revision: 9946f44da536cdf096866005d3da932a86a97b00

URL: 
https://github.com/llvm/llvm-project/commit/9946f44da536cdf096866005d3da932a86a97b00
DIFF: 
https://github.com/llvm/llvm-project/commit/9946f44da536cdf096866005d3da932a86a97b00.diff

LOG: [Clang][Driver] Revise Cygwin ToolChain to call linker directly (#147960)

...so that `libc++`, `compiler-rt`, and `libunwind` can be used by the
options: `-stdlib=libc++`, `-rtlib=compiler-rt`, and
`-unwindlib=libunwind` respectively. Along with this change, the test
for this driver is also trimmed a bit.

This is a followup patch for
https://github.com/llvm/llvm-project/commit/52924a2d7255cdd280b2b82dad8616e01fe065da.

---------

Signed-off-by: Takashi Yano <[email protected]>
Co-authored-by: Jeremy Drake <[email protected]>
Co-authored-by: Tomohiro Kashiwada <[email protected]>

Added: 
    clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/lib/crt0.o
    clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/crt0.o
    
clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/i686-pc-msys/10/crtend.o
    
clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/x86_64-pc-cygwin/10/crtend.o
    
clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/lib/crt0.o
    clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/crt0.o
    
clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtend.o
    
clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtend.o

Modified: 
    clang/lib/Driver/ToolChains/Cygwin.cpp
    clang/lib/Driver/ToolChains/Cygwin.h
    clang/test/Driver/cygwin.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/Cygwin.cpp 
b/clang/lib/Driver/ToolChains/Cygwin.cpp
index 55438125ce0f1..1a9f32b4586ce 100644
--- a/clang/lib/Driver/ToolChains/Cygwin.cpp
+++ b/clang/lib/Driver/ToolChains/Cygwin.cpp
@@ -9,6 +9,7 @@
 #include "Cygwin.h"
 #include "clang/Config/config.h"
 #include "clang/Driver/CommonArgs.h"
+#include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Options/Options.h"
 #include "llvm/Support/Path.h"
@@ -30,6 +31,8 @@ Cygwin::Cygwin(const Driver &D, const llvm::Triple &Triple, 
const ArgList &Args)
   Generic_GCC::PushPPaths(PPaths);
 
   path_list &Paths = getFilePaths();
+  if (GCCInstallation.isValid())
+    Paths.push_back(GCCInstallation.getInstallPath().str());
 
   Generic_GCC::AddMultiarchPaths(D, SysRoot, "lib", Paths);
 
@@ -107,3 +110,275 @@ void Cygwin::AddClangSystemIncludeArgs(const ArgList 
&DriverArgs,
   addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
   addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + 
"/usr/include/w32api");
 }
+
+void cygwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
+                                  const InputInfo &Output,
+                                  const InputInfoList &Inputs,
+                                  const ArgList &Args,
+                                  const char *LinkingOutput) const {
+  const auto &ToolChain = getToolChain();
+  const Driver &D = ToolChain.getDriver();
+
+  const bool IsStatic = Args.hasArg(options::OPT_static);
+
+  ArgStringList CmdArgs;
+
+  // Silence warning for "clang -g foo.o -o foo"
+  Args.ClaimAllArgs(options::OPT_g_Group);
+  // and "clang -emit-llvm foo.o -o foo"
+  Args.ClaimAllArgs(options::OPT_emit_llvm);
+  // and for "clang -w foo.o -o foo". Other warning options are already
+  // handled somewhere else.
+  Args.ClaimAllArgs(options::OPT_w);
+
+  if (!D.SysRoot.empty())
+    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
+
+  if (Args.hasArg(options::OPT_s))
+    CmdArgs.push_back("-s");
+
+  CmdArgs.push_back("-m");
+  switch (ToolChain.getArch()) {
+  case llvm::Triple::x86:
+    CmdArgs.push_back("i386pe");
+    break;
+  case llvm::Triple::x86_64:
+    CmdArgs.push_back("i386pep");
+    break;
+  case llvm::Triple::arm:
+  case llvm::Triple::thumb:
+    // FIXME: this is incorrect for WinCE
+    CmdArgs.push_back("thumb2pe");
+    break;
+  case llvm::Triple::aarch64:
+    if (Args.hasArg(options::OPT_marm64x))
+      CmdArgs.push_back("arm64xpe");
+    else if (ToolChain.getEffectiveTriple().isWindowsArm64EC())
+      CmdArgs.push_back("arm64ecpe");
+    else
+      CmdArgs.push_back("arm64pe");
+    break;
+  case llvm::Triple::mipsel:
+    CmdArgs.push_back("mipspe");
+    break;
+  default:
+    D.Diag(diag::err_target_unknown_triple)
+        << ToolChain.getEffectiveTriple().str();
+  }
+
+  Arg *SubsysArg =
+      Args.getLastArg(options::OPT_mwindows, options::OPT_mconsole);
+  if (SubsysArg && SubsysArg->getOption().matches(options::OPT_mwindows)) {
+    CmdArgs.push_back("--subsystem");
+    CmdArgs.push_back("windows");
+  } else if (SubsysArg &&
+             SubsysArg->getOption().matches(options::OPT_mconsole)) {
+    CmdArgs.push_back("--subsystem");
+    CmdArgs.push_back("console");
+  }
+
+  if (ToolChain.getTriple().isArch32Bit()) {
+    CmdArgs.push_back("--wrap=_Znwj");
+    CmdArgs.push_back("--wrap=_Znaj");
+    CmdArgs.push_back("--wrap=_ZdlPv");
+    CmdArgs.push_back("--wrap=_ZdaPv");
+    CmdArgs.push_back("--wrap=_ZnwjRKSt9nothrow_t");
+    CmdArgs.push_back("--wrap=_ZnajRKSt9nothrow_t");
+    CmdArgs.push_back("--wrap=_ZdlPvRKSt9nothrow_t");
+    CmdArgs.push_back("--wrap=_ZdaPvRKSt9nothrow_t");
+  } else {
+    CmdArgs.push_back("--wrap=_Znwm");
+    CmdArgs.push_back("--wrap=_Znam");
+    CmdArgs.push_back("--wrap=_ZdlPv");
+    CmdArgs.push_back("--wrap=_ZdaPv");
+    CmdArgs.push_back("--wrap=_ZnwmRKSt9nothrow_t");
+    CmdArgs.push_back("--wrap=_ZnamRKSt9nothrow_t");
+    CmdArgs.push_back("--wrap=_ZdlPvRKSt9nothrow_t");
+    CmdArgs.push_back("--wrap=_ZdaPvRKSt9nothrow_t");
+  }
+
+  if (Args.hasArg(options::OPT_mdll))
+    CmdArgs.push_back("--dll");
+  else if (Args.hasArg(options::OPT_shared))
+    CmdArgs.push_back("--shared");
+  if (Args.hasArg(options::OPT_static))
+    CmdArgs.push_back("-Bstatic");
+  else
+    CmdArgs.push_back("-Bdynamic");
+
+  CmdArgs.push_back("--dll-search-prefix=cyg");
+  if (Args.hasArg(options::OPT_rdynamic))
+    CmdArgs.push_back("--export-all-symbols");
+
+  // Cygwin-specific linker options for executables (matching GCC behavior).
+  // These flags must be set on the main executable header rather than DLLs.
+  if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_mdll)) {
+    // 32-bit Cygwin relies heavily on a predictable memory layout to emulate
+    // fork(). Enabling '--large-address-aware' expands the virtual address
+    // space, reducing 'unable to remap' fatal errors during fork().
+    if (ToolChain.getTriple().isArch32Bit())
+      CmdArgs.push_back("--large-address-aware");
+    // Mark as Terminal Server Aware to prevent legacy Windows loader from
+    // applying file/registry virtualization, which breaks POSIX path
+    // expectations.
+    CmdArgs.push_back("--tsaware");
+  }
+
+  CmdArgs.push_back("-o");
+  // GCC implicitly adds an .exe extension if it is given an output file name
+  // that lacks an extension.
+  // GCC used to do this only when the compiler itself runs on windows, but
+  // since GCC 8 it does the same when cross compiling as well.
+  if (const char *OutputFile = Output.getFilename();
+      !llvm::sys::path::has_extension(OutputFile))
+    CmdArgs.push_back(Args.MakeArgString(Twine(OutputFile) + ".exe"));
+  else
+    CmdArgs.push_back(OutputFile);
+
+  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
+                   options::OPT_r)) {
+    const bool IsShared = Args.hasArg(options::OPT_shared);
+    if (Args.hasArg(options::OPT_mdll) || IsShared) {
+      CmdArgs.push_back("-e");
+      CmdArgs.push_back(ToolChain.getArch() == llvm::Triple::x86
+                            ? "__cygwin_dll_entry@12"
+                            : "_cygwin_dll_entry");
+      CmdArgs.push_back("--enable-auto-image-base");
+    }
+
+    if (!Args.hasArg(options::OPT_mdll) && !IsShared)
+      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
+    if (IsShared)
+      CmdArgs.push_back(
+          Args.MakeArgString(ToolChain.GetFilePath("crtbeginS.o")));
+    else
+      CmdArgs.push_back(
+          Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
+
+    // Add crtfastmath.o if available and fast math is enabled.
+    ToolChain.addFastMathRuntimeIfAvailable(Args, CmdArgs);
+  }
+
+  Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
+
+  ToolChain.AddFilePathLibArgs(Args, CmdArgs);
+
+  if (auto LTO = ToolChain.getLTOMode(Args); LTO != LTOK_None)
+    tools::addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs,
+                         LTO == LTOK_Thin);
+
+  if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
+    CmdArgs.push_back("--no-demangle");
+
+  // Default. Can be overridden by the user by explicitly
+  // passing an option after this one.
+  if (ToolChain.getTriple().isArch64Bit())
+    CmdArgs.push_back("--disable-high-entropy-va");
+  CmdArgs.push_back("--disable-nxcompat");
+
+  bool NeedsSanitizerDeps =
+      tools::addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsXRayDeps = tools::addXRayRuntime(ToolChain, Args, CmdArgs);
+  tools::addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
+  tools::AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
+
+  // The profile runtime also needs access to system libraries.
+  getToolChain().addProfileRTLibs(Args, CmdArgs);
+
+  if (D.CCCIsCXX() &&
+      !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
+                   options::OPT_r)) {
+    if (ToolChain.ShouldLinkCXXStdlib(Args)) {
+      bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
+                                 !Args.hasArg(options::OPT_static);
+      if (OnlyLibstdcxxStatic)
+        CmdArgs.push_back("-Bstatic");
+      ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
+      if (OnlyLibstdcxxStatic)
+        CmdArgs.push_back("-Bdynamic");
+    }
+    CmdArgs.push_back("-lm");
+  }
+
+  // Silence warnings when linking C code with a C++ '-stdlib' argument.
+  Args.ClaimAllArgs(options::OPT_stdlib_EQ);
+
+  // Additional linker set-up and flags for Fortran. This is required in order
+  // to generate executables. As Fortran runtime depends on the C runtime,
+  // these dependencies need to be listed before the C runtime below (i.e.
+  // AddRunTimeLibs).
+  if (D.IsFlangMode() &&
+      !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
+    ToolChain.addFortranRuntimeLibraryPath(Args, CmdArgs);
+    ToolChain.addFortranRuntimeLibs(Args, CmdArgs);
+    CmdArgs.push_back("-lm");
+  }
+
+  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_r)) {
+    if (!Args.hasArg(options::OPT_nodefaultlibs)) {
+      if (IsStatic)
+        CmdArgs.push_back("--start-group");
+
+      if (NeedsSanitizerDeps)
+        tools::linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs);
+
+      if (NeedsXRayDeps)
+        tools::linkXRayRuntimeDeps(ToolChain, Args, CmdArgs);
+
+      bool WantPthread = Args.hasArg(options::OPT_pthread) ||
+                         Args.hasArg(options::OPT_pthreads);
+
+      // Use the static OpenMP runtime with -static-openmp
+      bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
+                          !Args.hasArg(options::OPT_static);
+
+      // FIXME: Only pass GompNeedsRT = true for platforms with libgomp that
+      // require librt. Most modern Linux platforms do, but some may not.
+      if (tools::addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP,
+                                  JA.isHostOffloading(Action::OFK_OpenMP),
+                                  /* GompNeedsRT= */ true))
+        // OpenMP runtimes implies pthreads when using the GNU toolchain.
+        // FIXME: Does this really make sense for all GNU toolchains?
+        WantPthread = true;
+
+      tools::AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
+
+      if (WantPthread)
+        CmdArgs.push_back("-lpthread");
+
+      if (Args.hasArg(options::OPT_fsplit_stack))
+        CmdArgs.push_back("--wrap=pthread_create");
+
+      if (!Args.hasArg(options::OPT_nolibc))
+        CmdArgs.push_back("-lc");
+
+      // Cygwin specific
+      CmdArgs.push_back("-lcygwin");
+      if (Args.hasArg(options::OPT_mwindows)) {
+        CmdArgs.push_back("-lgdi32");
+        CmdArgs.push_back("-lcomdlg32");
+      }
+      CmdArgs.push_back("-ladvapi32");
+      CmdArgs.push_back("-lshell32");
+      CmdArgs.push_back("-luser32");
+      CmdArgs.push_back("-lkernel32");
+
+      if (IsStatic)
+        CmdArgs.push_back("--end-group");
+      else
+        tools::AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
+    }
+
+    if (!Args.hasArg(options::OPT_nostartfiles))
+      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
+  }
+
+  Args.addAllArgs(CmdArgs, {options::OPT_T, options::OPT_t});
+
+  const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
+  C.addCommand(std::make_unique<Command>(JA, *this,
+                                         ResponseFileSupport::AtFileCurCP(),
+                                         Exec, CmdArgs, Inputs, Output));
+}
+
+auto Cygwin::buildLinker() const -> Tool * { return new cygwin::Linker(*this); 
}

diff  --git a/clang/lib/Driver/ToolChains/Cygwin.h 
b/clang/lib/Driver/ToolChains/Cygwin.h
index d2f72c10c3b01..0701d41a63608 100644
--- a/clang/lib/Driver/ToolChains/Cygwin.h
+++ b/clang/lib/Driver/ToolChains/Cygwin.h
@@ -27,7 +27,25 @@ class LLVM_LIBRARY_VISIBILITY Cygwin : public Generic_GCC {
   void
   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                             llvm::opt::ArgStringList &CC1Args) const override;
+
+protected:
+  Tool *buildLinker() const override;
+};
+
+namespace cygwin {
+class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
+public:
+  Linker(const ToolChain &TC) : Tool("cygwin::Linker", "linker", TC) {}
+
+  bool hasIntegratedCPP() const override { return false; }
+  bool isLinkJob() const override { return true; }
+
+  void ConstructJob(Compilation &C, const JobAction &JA,
+                    const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::opt::ArgList &TCArgs,
+                    const char *LinkingOutput) const override;
 };
+} // end namespace cygwin
 
 } // end namespace toolchains
 } // end namespace driver

diff  --git 
a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/lib/crt0.o 
b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/i686-pc-msys/lib/crt0.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/crt0.o 
b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/crt0.o
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/crtend.o
 
b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/i686-pc-msys/10/crtend.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/crtend.o
 
b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/lib/gcc/x86_64-pc-cygwin/10/crtend.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git 
a/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/lib/crt0.o
 
b/clang/test/Driver/Inputs/basic_cross_cygwin_tree/usr/x86_64-pc-cygwin/lib/crt0.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/crt0.o 
b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/crt0.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/crtend.o
 
b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/i686-pc-cygwin/10/crtend.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/crtend.o
 
b/clang/test/Driver/Inputs/basic_cygwin_tree/usr/lib/gcc/x86_64-pc-msys/10/crtend.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/cygwin.cpp b/clang/test/Driver/cygwin.cpp
index dd75c48ddc6b3..c9197cd99290c 100644
--- a/clang/test/Driver/cygwin.cpp
+++ b/clang/test/Driver/cygwin.cpp
@@ -15,20 +15,24 @@
 // CHECK-SAME: {{^}} "-internal-externc-isystem" 
"[[SYSROOT]]/usr/include/w32api"
 // CHECK-SAME: "-femulated-tls"
 // CHECK-SAME: "-exception-model=dwarf"
-// CHECK:      "{{.*}}gcc{{(\.exe)?}}"
-// CHECK-SAME: "-m32"
+// CHECK:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-SAME: "-m" "i386pe"
+// CHECK-SAME: "{{.*}}{{/|\\\\}}crt0.o"
+// CHECK-SAME: "{{.*}}i686-pc-cygwin{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtbegin.o"
+// CHECK-SAME: "{{.*}}i686-pc-cygwin{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtend.o"
 
 // 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{{(\.exe)?}}"
-// CHECK-STATIC-SAME: "-static"
+// CHECK-STATIC:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-STATIC-SAME: "-Bstatic"
 
 // 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{{(\.exe)?}}"
-// CHECK-SHARED-SAME: "-shared"
+// CHECK-SHARED:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-SHARED-SAME: "--shared"
+// CHECK-SHARED-SAME: "-e" "__cygwin_dll_entry@12"
 
 // RUN: %clang -### -o %t %s 2>&1 -no-integrated-as -fuse-ld=ld \
 // RUN:     --gcc-toolchain=%S/Inputs/basic_cross_cygwin_tree/usr \
@@ -36,6 +40,10 @@
 // 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"
+// CHECK-CROSS:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-CROSS-SAME: "{{.*}}{{/|\\\\}}crt0.o"
+// CHECK-CROSS-SAME: 
"{{.*}}i686-pc-msys{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtbegin.o"
+// CHECK-CROSS-SAME: 
"{{.*}}i686-pc-msys{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtend.o"
 
 // RUN: %clang -### %s --target=x86_64-pc-windows-cygnus 
--sysroot=%S/Inputs/basic_cygwin_tree \
 // RUN:   -resource-dir=%S/Inputs/resource_dir \
@@ -54,20 +62,24 @@
 // CHECK-64-SAME: {{^}} "-internal-externc-isystem" 
"[[SYSROOT]]/usr/include/w32api"
 // CHECK-64-SAME: "-femulated-tls"
 // CHECK-64-SAME: "-exception-model=seh"
-// CHECK-64:      "{{.*}}gcc{{(\.exe)?}}"
-// CHECK-64-SAME: "-m64"
+// CHECK-64:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-SAME: "-m" "i386pep"
+// CHECK-64-SAME: "{{.*}}{{/|\\\\}}crt0.o"
+// CHECK-64-SAME: 
"{{.*}}x86_64-pc-msys{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtbegin.o"
+// CHECK-64-SAME: "{{.*}}x86_64-pc-msys{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtend.o"
 
 // 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{{(\.exe)?}}"
-// CHECK-64-STATIC-SAME: "-static"
+// CHECK-64-STATIC:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-STATIC-SAME: "-Bstatic"
 
 // 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{{(\.exe)?}}"
-// CHECK-64-SHARED-SAME: "-shared"
+// CHECK-64-SHARED:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-SHARED-SAME: "--shared"
+// CHECK-64-SHARED-SAME: "-e" "_cygwin_dll_entry"
 
 // RUN: %clang -### -o %t %s 2>&1 -no-integrated-as -fuse-ld=ld \
 // RUN:     --gcc-toolchain=%S/Inputs/basic_cross_cygwin_tree/usr \
@@ -75,3 +87,91 @@
 // 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"
+// CHECK-64-CROSS:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-CROSS-SAME: "{{.*}}{{/|\\\\}}crt0.o"
+// CHECK-64-CROSS-SAME: 
"{{.*}}x86_64-pc-cygwin{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtbegin.o"
+// CHECK-64-CROSS-SAME: 
"{{.*}}x86_64-pc-cygwin{{/|\\\\}}{{[0-9.]*}}{{/|\\\\}}crtend.o"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   -mdll 2>&1 | FileCheck --check-prefix=CHECK-64-DLL %s
+// CHECK-64-DLL:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-DLL-SAME: "--dll"
+// CHECK-64-DLL-SAME: "-e" "_cygwin_dll_entry"
+
+// RUN: %clang -### %s --target=i686-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   -mdll 2>&1 | FileCheck --check-prefix=CHECK-DLL %s
+// CHECK-DLL:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-DLL-SAME: "--dll"
+// CHECK-DLL-SAME: "-e" "__cygwin_dll_entry@12"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   -mwindows 2>&1 | FileCheck --check-prefix=CHECK-64-WINDOWS %s
+// CHECK-64-WINDOWS:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-WINDOWS-SAME: "--subsystem" "windows"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   -mconsole 2>&1 | FileCheck --check-prefix=CHECK-64-CONSOLE %s
+// CHECK-64-CONSOLE:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-CONSOLE-SAME: "--subsystem" "console"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   -o a 2>&1 | FileCheck --check-prefix=CHECK-64-EXENAME %s
+// CHECK-64-EXENAME:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-EXENAME-SAME: "-o" "a.exe"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   -o a.out 2>&1 | FileCheck --check-prefix=CHECK-64-EXENAME-WITH-EXT %s
+// CHECK-64-EXENAME-WITH-EXT:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-EXENAME-WITH-EXT-SAME: "-o" "a.out"
+
+// RUN: %clang -### %s --target=i686-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   2>&1 | FileCheck --check-prefix=CHECK-ASLR-DEFAULT %s
+// CHECK-ASLR-DEFAULT:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-ASLR-DEFAULT-NOT:  "--disable-high-entropy-va"
+
+// RUN: %clang -### %s --target=i686-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   2>&1 | FileCheck --check-prefix=CHECK-NXCOMPAT-DEFAULT %s
+// CHECK-NXCOMPAT-DEFAULT:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-NXCOMPAT-DEFAULT-SAME: "--disable-nxcompat"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   2>&1 | FileCheck --check-prefix=CHECK-64-ASLR-DEFAULT %s
+// CHECK-64-ASLR-DEFAULT:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-ASLR-DEFAULT-SAME: "--disable-high-entropy-va"
+// CHECK-64-ASLR-DEFAULT-SAME: "--disable-nxcompat"
+
+// RUN: %clang -### %s --target=i686-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   2>&1 | FileCheck --check-prefix=CHECK-WRAP %s
+// CHECK-WRAP:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-WRAP-SAME: "--wrap=_Znwj"
+// CHECK-WRAP-SAME: "--wrap=_Znaj"
+// CHECK-WRAP-SAME: "--wrap=_ZdlPv"
+// CHECK-WRAP-SAME: "--wrap=_ZdaPv"
+// CHECK-WRAP-SAME: "--wrap=_ZnwjRKSt9nothrow_t"
+// CHECK-WRAP-SAME: "--wrap=_ZnajRKSt9nothrow_t"
+// CHECK-WRAP-SAME: "--wrap=_ZdlPvRKSt9nothrow_t"
+// CHECK-WRAP-SAME: "--wrap=_ZdaPvRKSt9nothrow_t"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:   2>&1 | FileCheck --check-prefix=CHECK-64-WRAP %s
+// CHECK-64-WRAP:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-WRAP-SAME: "--wrap=_Znwm"
+// CHECK-64-WRAP-SAME: "--wrap=_Znam"
+// CHECK-64-WRAP-SAME: "--wrap=_ZdlPv"
+// CHECK-64-WRAP-SAME: "--wrap=_ZdaPv"
+// CHECK-64-WRAP-SAME: "--wrap=_ZnwmRKSt9nothrow_t"
+// CHECK-64-WRAP-SAME: "--wrap=_ZnamRKSt9nothrow_t"
+// CHECK-64-WRAP-SAME: "--wrap=_ZdlPvRKSt9nothrow_t"
+// CHECK-64-WRAP-SAME: "--wrap=_ZdaPvRKSt9nothrow_t"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:                -resource-dir=%S/Inputs/resource_dir -rtlib=compiler-rt 
\
+// RUN:   2>&1 | FileCheck --check-prefix=CHECK-64-RTLIB %s
+// CHECK-64-RTLIB:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-RTLIB-SAME: 
"{{.*}}{{/|\\\\}}lib{{/|\\\\}}cygwin{{/|\\\\}}libclang_rt.builtins-x86_64.a"
+
+// RUN: %clang -### %s --target=x86_64-pc-cygwin 
--sysroot=%S/Inputs/basic_cygwin_tree \
+// RUN:                
-resource-dir=%S/Inputs/resource_dir_with_per_target_subdir -rtlib=compiler-rt \
+// RUN:   2>&1 | FileCheck --check-prefix=CHECK-64-RTLIB-PER-TARGET %s
+// CHECK-64-RTLIB-PER-TARGET:      "{{.*}}ld{{(\.exe)?}}"
+// CHECK-64-RTLIB-PER-TARGET-SAME: 
"{{.*}}{{/|\\\\}}lib{{/|\\\\}}x86_64-pc-windows-cygnus{{/|\\\\}}libclang_rt.builtins.a"


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to