================ @@ -107,3 +110,282 @@ 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"); + } + + 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"); ---------------- kikairoya wrote:
`GlobalDecl` isn't accessible from this context. The `Driver` component can reference only the `Basic` component. However, I found a way to see what `size_t` does mean on target triple (see diff). <details> <summary>diff</summary> ```diff diff --git a/clang/lib/Driver/ToolChains/Cygwin.cpp b/clang/lib/Driver/ToolChains/Cygwin.cpp index 079911b0f0ac..e2561172d386 100644 --- a/clang/lib/Driver/ToolChains/Cygwin.cpp +++ b/clang/lib/Driver/ToolChains/Cygwin.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "Cygwin.h" +#include "clang/Basic/TargetInfo.h" #include "clang/Config/config.h" #include "clang/Driver/CommonArgs.h" #include "clang/Driver/Compilation.h" @@ -177,24 +178,32 @@ void cygwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, 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"); + auto TI = targets::AllocateTarget(ToolChain.getTriple(), {}); + const auto TypeChar = [&]() { + switch (TI->getSizeType()) { + case TransferrableTargetInfo::UnsignedShort: + return 't'; + case TransferrableTargetInfo::UnsignedInt: + return 'j'; + case TransferrableTargetInfo::UnsignedLong: + return 'm'; + case TransferrableTargetInfo::UnsignedLongLong: + return 'y'; + default: + llvm_unreachable("Invalid SizeType"); + } + }(); + const auto *const LabelPrefix = TI->getUserLabelPrefix(); + std::string WrapPrefix = "--wrap="; + if (LabelPrefix) + WrapPrefix += LabelPrefix; + for (std::string S : {"_Znw%", "_Zna%", "_ZdlPv", "_ZdaPv", + "_Znw%RKSt9nothrow_t", "_Zna%RKSt9nothrow_t", + "_ZdlPvRKSt9nothrow_t", "_ZdaPvRKSt9nothrow_t"}) { + auto Pos = S.find('%'); + if (Pos != S.npos) + S[Pos] = TypeChar; + CmdArgs.push_back(Args.MakeArgString(WrapPrefix + S)); } if (Args.hasArg(options::OPT_mdll)) ``` </details> BTW, `gcc -m32` doesn't wrap `new` properly (perhaps the old i686-native gcc can?) and the different mangling rule between `new` and `delete` is found from `libstdxx_wrapper.cc` in `cygwin1.dll`. ``` $ echo 'int main() { auto p = new int(3); delete p; }' | g++ -m64 -xc++ - -nostartfiles -nodefaultlibs -Wl,--no-demangle,--entry, -shared -fno-sized-deallocation /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccc30TZw.o:<stdin>:(.text+0x9): undefined reference to `__main' /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccc30TZw.o:<stdin>:(.text+0x13): undefined reference to `__wrap__Znwm' /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccc30TZw.o:<stdin>:(.text+0x2e): undefined reference to `__wrap__ZdlPv' /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccc30TZw.o:<stdin>:(.text+0x3f): undefined reference to `__wrap__ZdlPv' collect2: エラー: ld はステータス 1 で終了しました $ echo 'int main() { auto p = new int(3); delete p; }' | g++ -m32 -xc++ - -nostartfiles -nodefaultlibs -Wl,--no-demangle,--entry, -shared -fno-sized-deallocation /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccAA6tBm.o:<stdin>:(.text+0x7): undefined reference to `___main' /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccAA6tBm.o:<stdin>:(.text+0x13): undefined reference to `__Znwj' /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccAA6tBm.o:<stdin>:(.text+0x2d): undefined reference to `___wrap__ZdlPv' /usr/lib/gcc/x86_64-pc-cygwin/16/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccAA6tBm.o:<stdin>:(.text+0x3c): undefined reference to `___wrap__ZdlPv' collect2: エラー: ld はステータス 1 で終了しました ``` https://github.com/llvm/llvm-project/pull/147960 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits