================ @@ -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:
``` $ echo _Znwy _Znwn _Znwt | c++filt operator new(unsigned long long) operator new(__int128) operator new(unsigned short) ``` 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