Skip to content

Commit 4a5f26b

Browse files
committed
[Xtensa]: Add '--rtlib' option support for ESP Xtensa toolchain
1 parent 6bfff17 commit 4a5f26b

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

clang/lib/Driver/ToolChains/Xtensa.cpp

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
154159
const 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

clang/lib/Driver/ToolChains/Xtensa.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class LLVM_LIBRARY_VISIBILITY XtensaToolChain : public Generic_ELF {
3535
addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
3636
llvm::opt::ArgStringList &CC1Args) const override;
3737
CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
38+
UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const override;
39+
3840
bool IsIntegratedAssemblerDefault() const override {
3941
return (IsIntegratedAsm || (GCCToolchainName == ""));
4042
}

0 commit comments

Comments
 (0)