================ @@ -545,9 +545,27 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Arch == llvm::Triple::aarch64_be ? "-EB" : "-EL"); } - if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles, - options::OPT_r)) { - CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o"))); + bool WantCRTs = + !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); + + const char *crtbegin, *crtend; + if (WantCRTs) { + if (!Args.hasArg(options::OPT_r)) + CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt0.o"))); + if (TC.hasValidGCCInstallation() || hasGCCToolChainAlongSideClang(D)) { + auto RuntimeLib = TC.GetRuntimeLibType(Args); + if (RuntimeLib == ToolChain::RLT_Libgcc) { + crtbegin = "crtbegin.o"; + crtend = "crtend.o"; + } else { + assert(RuntimeLib == ToolChain::RLT_CompilerRT); + crtbegin = + TC.getCompilerRTArgString(Args, "crtbegin", ToolChain::FT_Object); + crtend = + TC.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object); ---------------- petrhosek wrote:
I think a `switch` is a better fit here: ```suggestion auto RuntimeLib = TC.GetRuntimeLibType(Args); switch (TC.GetRuntimeLibType(Args)) { case ToolChain::RLT_Libgcc) { crtbegin = "crtbegin.o"; crtend = "crtend.o"; break; } case ToolChain::RLT_CompilerRT: { crtbegin = TC.getCompilerRTArgString(Args, "crtbegin", ToolChain::FT_Object); crtend = TC.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object); break; } ``` https://github.com/llvm/llvm-project/pull/121830 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits