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
