Skip to content

Commit

Permalink
[MSP430] Actualize the toolchain description
Browse files Browse the repository at this point in the history
Reviewed By: krisb

Differential Revision: https://reviews.llvm.org/D81676
  • Loading branch information
atrosinenko committed Jul 17, 2020
1 parent fd02a86 commit 16a4350
Show file tree
Hide file tree
Showing 46 changed files with 385 additions and 93 deletions.
5 changes: 3 additions & 2 deletions clang/include/clang/Driver/Options.td
Expand Up @@ -2193,6 +2193,7 @@ def municode : Joined<["-"], "municode">, Group<m_Group>, Flags<[DriverOption]>;
def mthreads : Joined<["-"], "mthreads">, Group<m_Group>, Flags<[DriverOption]>;
def mcpu_EQ : Joined<["-"], "mcpu=">, Group<m_Group>;
def mmcu_EQ : Joined<["-"], "mmcu=">, Group<m_Group>;
def msim : Flag<["-"], "msim">, Group<m_Group>;
def mdynamic_no_pic : Joined<["-"], "mdynamic-no-pic">, Group<m_Group>;
def mfix_and_continue : Flag<["-"], "mfix-and-continue">, Group<clang_ignored_m_Group>;
def mieee_fp : Flag<["-"], "mieee-fp">, Group<clang_ignored_m_Group>;
Expand Down Expand Up @@ -2278,9 +2279,9 @@ def m_seses : Flag<["-"], "mseses">, Group<m_Group>, Flags<[CoreOption, DriverOp
def mno_seses : Flag<["-"], "mno-seses">, Group<m_Group>, Flags<[CoreOption, DriverOption]>,
HelpText<"Disable speculative execution side effect suppression (SESES)">;

def mrelax : Flag<["-"], "mrelax">, Group<m_riscv_Features_Group>,
def mrelax : Flag<["-"], "mrelax">, Group<m_Group>,
HelpText<"Enable linker relaxation">;
def mno_relax : Flag<["-"], "mno-relax">, Group<m_riscv_Features_Group>,
def mno_relax : Flag<["-"], "mno-relax">, Group<m_Group>,
HelpText<"Disable linker relaxation">;
def msmall_data_limit_EQ : Joined<["-"], "msmall-data-limit=">, Group<m_Group>,
Alias<G>,
Expand Down
1 change: 1 addition & 0 deletions clang/lib/Basic/Targets/MSP430.cpp
Expand Up @@ -29,5 +29,6 @@ void MSP430TargetInfo::getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const {
Builder.defineMacro("MSP430");
Builder.defineMacro("__MSP430__");
Builder.defineMacro("__ELF__");
// FIXME: defines for different 'flavours' of MCU
}
10 changes: 8 additions & 2 deletions clang/lib/Driver/ToolChains/Gnu.cpp
Expand Up @@ -1552,15 +1552,21 @@ static bool findMSP430Multilibs(const Driver &D,
StringRef Path, const ArgList &Args,
DetectedMultilibs &Result) {
FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Multilib MSP430Multilib = makeMultilib("/430");
Multilib WithoutExceptions = makeMultilib("/430").flag("-exceptions");
Multilib WithExceptions = makeMultilib("/430/exceptions").flag("+exceptions");

// FIXME: when clang starts to support msp430x ISA additional logic
// to select between multilib must be implemented
// Multilib MSP430xMultilib = makeMultilib("/large");

Result.Multilibs.push_back(MSP430Multilib);
Result.Multilibs.push_back(WithoutExceptions);
Result.Multilibs.push_back(WithExceptions);
Result.Multilibs.FilterOut(NonExistent);

Multilib::flags_list Flags;
addMultilibFlag(Args.hasFlag(options::OPT_fexceptions,
options::OPT_fno_exceptions, false),
"exceptions", Flags);
if (Result.Multilibs.select(Flags, Result.SelectedMultilib))
return true;

Expand Down
153 changes: 119 additions & 34 deletions clang/lib/Driver/ToolChains/MSP430.cpp
Expand Up @@ -128,7 +128,7 @@ MSP430ToolChain::MSP430ToolChain(const Driver &D, const llvm::Triple &Triple,
}

SmallString<128> SysRootDir(computeSysRoot());
llvm::sys::path::append(SysRootDir, "lib", MultilibSuf);
llvm::sys::path::append(SysRootDir, "msp430-elf", "lib", MultilibSuf);
addPathIfExists(D, SysRootDir, getFilePaths());
}

Expand All @@ -138,10 +138,9 @@ std::string MSP430ToolChain::computeSysRoot() const {

SmallString<128> Dir;
if (GCCInstallation.isValid())
llvm::sys::path::append(Dir, GCCInstallation.getParentLibPath(), "..",
GCCInstallation.getTriple().str());
llvm::sys::path::append(Dir, GCCInstallation.getParentLibPath(), "..");
else
llvm::sys::path::append(Dir, getDriver().Dir, "..", getTriple().str());
llvm::sys::path::append(Dir, getDriver().Dir, "..");

return std::string(Dir.str());
}
Expand All @@ -153,7 +152,7 @@ void MSP430ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
return;

SmallString<128> Dir(computeSysRoot());
llvm::sys::path::append(Dir, "include");
llvm::sys::path::append(Dir, "msp430-elf", "include");
addSystemInclude(DriverArgs, CC1Args, Dir.str());
}

Expand All @@ -180,6 +179,87 @@ Tool *MSP430ToolChain::buildLinker() const {
return new tools::msp430::Linker(*this);
}

void msp430::Linker::AddStartFiles(bool UseExceptions, const ArgList &Args,
ArgStringList &CmdArgs) const {
const ToolChain &ToolChain = getToolChain();

CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
const char *crtbegin = UseExceptions ? "crtbegin.o" : "crtbegin_no_eh.o";
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
}

void msp430::Linker::AddDefaultLibs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const {
const ToolChain &ToolChain = getToolChain();
const Driver &D = ToolChain.getDriver();

CmdArgs.push_back("--start-group");
CmdArgs.push_back(Args.MakeArgString(getHWMultLib(Args)));
CmdArgs.push_back("-lc");
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
CmdArgs.push_back("-lcrt");

if (Args.hasArg(options::OPT_msim)) {
CmdArgs.push_back("-lsim");

// msp430-sim.ld relies on __crt0_call_exit being implicitly .refsym-ed
// in main() by msp430-gcc.
// This workaround should work seamlessly unless the compilation unit that
// contains main() is compiled by clang and then passed to
// gcc compiler driver for linkage.
CmdArgs.push_back("--undefined=__crt0_call_exit");
} else
CmdArgs.push_back("-lnosys");

CmdArgs.push_back("--end-group");
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
}

void msp430::Linker::AddEndFiles(bool UseExceptions, const ArgList &Args,
ArgStringList &CmdArgs) const {
const ToolChain &ToolChain = getToolChain();
const Driver &D = ToolChain.getDriver();

const char *crtend = UseExceptions ? "crtend.o" : "crtend_no_eh.o";
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
}

static void AddSspArgs(const ArgList &Args, ArgStringList &CmdArgs) {
Arg *SspFlag = Args.getLastArg(
options::OPT_fno_stack_protector, options::OPT_fstack_protector,
options::OPT_fstack_protector_all, options::OPT_fstack_protector_strong);

if (SspFlag &&
!SspFlag->getOption().matches(options::OPT_fno_stack_protector)) {
CmdArgs.push_back("-lssp_nonshared");
CmdArgs.push_back("-lssp");
}
}

static void AddImplicitLinkerScript(const std::string SysRoot,
const ArgList &Args,
ArgStringList &CmdArgs) {
if (Args.hasArg(options::OPT_T))
return;

if (Args.hasArg(options::OPT_msim)) {
CmdArgs.push_back("-Tmsp430-sim.ld");
return;
}

const Arg *MCUArg = Args.getLastArg(options::OPT_mmcu_EQ);
if (!MCUArg)
return;

SmallString<128> MCULinkerScriptPath(SysRoot);
llvm::sys::path::append(MCULinkerScriptPath, "include");
// -L because <mcu>.ld INCLUDEs <mcu>_symbols.ld
CmdArgs.push_back(Args.MakeArgString("-L" + MCULinkerScriptPath));
CmdArgs.push_back(
Args.MakeArgString("-T" + StringRef(MCUArg->getValue()) + ".ld"));
}

void msp430::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
Expand All @@ -189,44 +269,49 @@ void msp430::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const Driver &D = ToolChain.getDriver();
std::string Linker = ToolChain.GetProgramPath(getShortName());
ArgStringList CmdArgs;

if (!D.SysRoot.empty())
CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
bool UseExceptions = Args.hasFlag(options::OPT_fexceptions,
options::OPT_fno_exceptions, false);
bool UseStartAndEndFiles = !Args.hasArg(options::OPT_nostdlib, options::OPT_r,
options::OPT_nostartfiles);

if (Args.hasArg(options::OPT_mrelax))
CmdArgs.push_back("--relax");
if (!Args.hasArg(options::OPT_r, options::OPT_g_Group))
CmdArgs.push_back("--gc-sections");

Args.AddAllArgs(CmdArgs, {
options::OPT_e,
options::OPT_n,
options::OPT_s,
options::OPT_t,
options::OPT_u,
});

if (UseStartAndEndFiles)
AddStartFiles(UseExceptions, Args, CmdArgs);

Args.AddAllArgs(CmdArgs, options::OPT_L);
ToolChain.AddFilePathLibArgs(Args, CmdArgs);

if (!Args.hasArg(options::OPT_T)) {
if (const Arg *MCUArg = Args.getLastArg(options::OPT_mmcu_EQ))
CmdArgs.push_back(
Args.MakeArgString("-T" + StringRef(MCUArg->getValue()) + ".ld"));
} else {
Args.AddAllArgs(CmdArgs, options::OPT_T);
}

if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
}

AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);

CmdArgs.push_back("--start-group");
CmdArgs.push_back(Args.MakeArgString(getHWMultLib(Args)));
CmdArgs.push_back("-lgcc");
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
CmdArgs.push_back("-lc");
CmdArgs.push_back("-lcrt");
CmdArgs.push_back("-lnosys");
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_r,
options::OPT_nodefaultlibs)) {
AddSspArgs(Args, CmdArgs);
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
if (!Args.hasArg(options::OPT_nolibc)) {
AddDefaultLibs(Args, CmdArgs);
AddImplicitLinkerScript(D.SysRoot, Args, CmdArgs);
}
}
CmdArgs.push_back("--end-group");

if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
}
if (UseStartAndEndFiles)
AddEndFiles(UseExceptions, Args, CmdArgs);

CmdArgs.push_back("-o");
CmdArgs.push_back(Output.getFilename());

Args.AddAllArgs(CmdArgs, options::OPT_T);

C.addCommand(
std::make_unique<Command>(JA, *this, ResponseFileSupport::AtFileCurCP(),
Args.MakeArgString(Linker), CmdArgs, Inputs));
Expand Down
13 changes: 13 additions & 0 deletions clang/lib/Driver/ToolChains/MSP430.h
Expand Up @@ -40,6 +40,11 @@ class LLVM_LIBRARY_VISIBILITY MSP430ToolChain : public Generic_ELF {
bool isPIEDefault() const override { return false; }
bool isPICDefaultForced() const override { return true; }

UnwindLibType
GetUnwindLibType(const llvm::opt::ArgList &Args) const override {
return UNW_None;
}

protected:
Tool *buildLinker() const override;

Expand All @@ -61,6 +66,14 @@ class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
const InputInfo &Output, const InputInfoList &Inputs,
const llvm::opt::ArgList &TCArgs,
const char *LinkingOutput) const override;

private:
void AddStartFiles(bool UseExceptions, const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
void AddDefaultLibs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
void AddEndFiles(bool UseExceptions, const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
};

void getMSP430TargetFeatures(const Driver &D, const llvm::opt::ArgList &Args,
Expand Down
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.

0 comments on commit 16a4350

Please sign in to comment.