Skip to content

Commit

Permalink
[clang] recognize any *-ld.lld variant
Browse files Browse the repository at this point in the history
If we create a cross toolchain with a ${triple}-ld.lld symlink, clang finds
that symlink and when it uses it, it's not recognized as "lld".  Let's
resolve that symlink and consider it when determining lld-ness.

For example, clang provides hexagon-link specific link arguments such as
`-mcpu=hexagonv65` and `-march=hexagon` when hexagon-unknown-linux-musl-ld.lld
is found.  lld rejects this with the following error:

    hexagon-unknown-linux-musl-ld.lld: error: unknown emulation: cpu=hexagonv65
  • Loading branch information
androm3da committed Nov 22, 2024
1 parent ce66b56 commit 40e018a
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 6 deletions.
12 changes: 9 additions & 3 deletions clang/lib/Driver/ToolChain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -964,7 +964,7 @@ std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD) const {
StringRef UseLinker = A ? A->getValue() : CLANG_DEFAULT_LINKER;

// --ld-path= takes precedence over -fuse-ld= and specifies the executable
// name. -B, COMPILER_PATH and PATH and consulted if the value does not
// name. -B, COMPILER_PATH and PATH are consulted if the value does not
// contain a path component separator.
// -fuse-ld=lld can be used with --ld-path= to inform clang that the binary
// that --ld-path= points to is lld.
Expand All @@ -974,8 +974,11 @@ std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD) const {
if (llvm::sys::path::parent_path(Path).empty())
Path = GetProgramPath(A->getValue());
if (llvm::sys::fs::can_execute(Path)) {
SmallString<1024> RealPath;
if (llvm::sys::fs::real_path(Path, RealPath))
RealPath = llvm::sys::path::stem(RealPath);
if (LinkerIsLLD)
*LinkerIsLLD = UseLinker == "lld";
*LinkerIsLLD = UseLinker == "lld" || RealPath == "lld";
return std::string(Path);
}
}
Expand Down Expand Up @@ -1014,8 +1017,11 @@ std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD) const {

std::string LinkerPath(GetProgramPath(LinkerName.c_str()));
if (llvm::sys::fs::can_execute(LinkerPath)) {
SmallString<1024> RealPath;
if (llvm::sys::fs::real_path(LinkerPath, RealPath))
RealPath = llvm::sys::path::stem(RealPath);
if (LinkerIsLLD)
*LinkerIsLLD = UseLinker == "lld";
*LinkerIsLLD = UseLinker == "lld" || RealPath == "lld";
return LinkerPath;
}
}
Expand Down
8 changes: 5 additions & 3 deletions clang/lib/Driver/ToolChains/Hexagon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -294,9 +294,11 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
bool UseG0 = false;
const char *Exec = Args.MakeArgString(HTC.GetLinkerPath());
bool UseLLD = (llvm::sys::path::filename(Exec).equals_insensitive("ld.lld") ||
llvm::sys::path::stem(Exec).equals_insensitive("ld.lld"));
bool UseLLD = false;
const char *Exec = Args.MakeArgString(HTC.GetLinkerPath(&UseLLD));
UseLLD = UseLLD ||
llvm::sys::path::filename(Exec).equals_insensitive("ld.lld") ||
llvm::sys::path::stem(Exec).equals_insensitive("ld.lld");
bool UseShared = IsShared && !IsStatic;
StringRef CpuVer = toolchains::HexagonToolChain::GetTargetCPUVersion(Args);

Expand Down

0 comments on commit 40e018a

Please sign in to comment.