@@ -151,6 +151,11 @@ XtensaToolChain::GetCXXStdlibType(const ArgList &Args) const {
151151 return ToolChain::CST_Libstdcxx;
152152}
153153
154+ ToolChain::UnwindLibType
155+ XtensaToolChain::GetUnwindLibType (const llvm::opt::ArgList &Args) const {
156+ return ToolChain::UNW_None;
157+ }
158+
154159const StringRef XtensaToolChain::GetTargetCPUVersion (const ArgList &Args) {
155160 if (Arg *A = Args.getLastArg (clang::driver::options::OPT_mcpu_EQ)) {
156161 StringRef CPUName = A->getValue ();
@@ -208,33 +213,62 @@ void xtensa::Linker::ConstructJob(Compilation &C, const JobAction &JA,
208213 const InputInfoList &Inputs,
209214 const ArgList &Args,
210215 const char *LinkingOutput) const {
211- const auto &TC =
212- static_cast <const toolchains::XtensaToolChain &>(getToolChain ());
216+ ArgStringList CmdArgs;
217+ bool WantCRTs =
218+ !Args.hasArg (options::OPT_nostdlib, options::OPT_nostartfiles);
219+ const auto &ToolChain =
220+ static_cast <const toolchains::XtensaToolChain &>(getToolChain ());
213221
214- if (TC .GCCToolchainName == " " )
222+ if (ToolChain .GCCToolchainName == " " )
215223 llvm_unreachable (" Unable to find Xtensa GCC linker" );
216224
217- SmallString<128 > Linker (TC .GCCToolchainDir );
225+ SmallString<128 > Linker (ToolChain .GCCToolchainDir );
218226 llvm::sys::path::append (Linker, " bin" ,
219- TC.GCCToolchainName + " -" + getShortName ());
220- ArgStringList CmdArgs;
227+ ToolChain.GCCToolchainName + " -" + getShortName ());
221228
222- Args.AddAllArgs (CmdArgs, options::OPT_L);
223- TC.AddFilePathLibArgs (Args, CmdArgs);
229+ const char *crtbegin, *crtend;
230+ auto RuntimeLib = ToolChain.GetRuntimeLibType (Args);
231+ if (RuntimeLib == ToolChain::RLT_Libgcc) {
232+ crtbegin = " crtbegin.o" ;
233+ crtend = " crtend.o" ;
234+ } else {
235+ assert (RuntimeLib == ToolChain::RLT_CompilerRT);
236+ crtbegin = ToolChain.getCompilerRTArgString (Args, " crtbegin" ,
237+ ToolChain::FT_Object);
238+ crtend = ToolChain.getCompilerRTArgString (Args, " crtend" ,
239+ ToolChain::FT_Object);
240+ }
224241
242+ if (WantCRTs) {
243+ // TODO: The crt0.o is not used for esp targets, but maybe used in
244+ // future for other vendors
245+ // CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
246+ CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (crtbegin)));
247+ }
248+
249+ AddLinkerInputs (getToolChain (), Inputs, Args, CmdArgs, JA);
250+
251+ Args.AddAllArgs (CmdArgs, options::OPT_L);
252+ ToolChain.AddFilePathLibArgs (Args, CmdArgs);
225253 Args.AddAllArgs (CmdArgs,
226254 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
227255 options::OPT_t, options::OPT_u_Group});
256+
257+ if (!Args.hasArg (options::OPT_nostdlib) &&
258+ !Args.hasArg (options::OPT_nodefaultlibs)) {
259+ if (ToolChain.ShouldLinkCXXStdlib (Args))
260+ ToolChain.AddCXXStdlibLibArgs (Args, CmdArgs);
261+ AddRunTimeLibs (ToolChain, ToolChain.getDriver (), CmdArgs, Args);
262+ }
228263
229- AddLinkerInputs (getToolChain (), Inputs, Args, CmdArgs, JA);
230-
231- CmdArgs.push_back (" -lgcc" );
264+ if (WantCRTs)
265+ CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (crtend)));
232266
233267 CmdArgs.push_back (" -o" );
234268 CmdArgs.push_back (Output.getFilename ());
235- C.addCommand (
236- std::make_unique<Command>( JA, *this , ResponseFileSupport::AtFileCurCP (),
237- Args. MakeArgString (Linker), CmdArgs, Inputs));
269+ C.addCommand (std::make_unique<Command>(
270+ JA, *this , ResponseFileSupport::AtFileCurCP (), Args. MakeArgString (Linker),
271+ CmdArgs, Inputs));
238272}
239273
240274// Get features by CPU name
0 commit comments