On 16/07/2021 12:15, Mark Millard via freebsd-toolchain wrote:
As far as I know the /usr/bin/clang++ related FreeBSD
toolchain never has a file aarch64-unknown-freebsd14.0-ld
in FreeBSD. (And similarly fr other suffices than ld.)

There is nothing FreeBSD-specific in this behaviour in clang. If someone wanted to provide a different search behaviour for the clang in the base system then that would be possible, but in general I am strongly opposed to any special casing of behaviour in the system compiler. It's already incredibly annoying that the system compiler doesn't search /usr/local/include and /usr/local/lib so everything I build on FreeBSD needs to be explicitly told 'yes please do actually search the place where the system installed libraries, thanks'.

In other words, why is aarch64-unknown-freebsd14.0-ld
even listed in TargetSpecificExecutables for the system
toolchain's clang++ ?

It isn't. It is part of the generic search logic. The search logic says, when compiling for {target triple}, prefer {target triple}-{tool name} over {tool name}. When the clang driver looks for ld, it looks for

I would argue that the default FreeBSD system toolchain
configuration/operation should be adjusted/patched to not
have automatic defaults that cause parts of that toolchain
to not be used even though they are present, just because
some unrelated/independent port(s) have been installed that
are a different toolchain. (Explicitly enabling/allowing
alternate matches may well be reasonable.)

The only way of doing this would be to completely remove all search logic and hard-code the paths.


As far as I know, there is no guarantee of compatibility
with the gcc/g++/gnu related toolchain, with the error
message that I reported being an example for attempted
-flto use.

-flto requires LLD. You can force that with -fuse-ld=lld. Clang then will only find things called [{target triple}-]ld.lld

See the Driver::GetProgramPath() function:
https://github.com/llvm/llvm-project/blob/release/12.x/clang/lib/Driver/Driver.cpp#L4981
It looks like if there was an implcit/automatic -B /usr/bin
when /usr/bin/clang++ is the native FreeBSD toolchain one,
that the problem would be avoided.

But, as, stands, that has to be done explicitly on the
command lines in order to tell clang++ to use its own
related FreeBSD toolchain instead of using one from
ports.

But then we'd have a divergence between the system compiler and clang installed any other way. It is expected behaviour that if I install a tool prefixed by the target triple then it will be used in preference to the system one.


Note that the native binutils package does not cause these problems,
since it prefixes its tools with $arch-portbld-freebsd14.0. E.g., the
'vendor' field of the triple is set to "portbld", not "unknown".

I guess the flavored binutils packages do use the "unknown" vendor field
to avoid installation conflicts. But at some point this should be
resolved: either all binutils ports should use the "portbld" vendor, or
all of them should use "unknown", but this mixing is causing trouble, in
my opinion.
It has been all portbld at times in the past. That mix is also a
problem. 3 distinct naming structures are needed, not just 2, in
order to prevent mixing from occurring without some form of
explicit request for a mix.

Setting the default target triple in the base system compiler to use freebsd as the vendor would avoid this problem: Unless you explicitly install something as {arch}-freebsd-freebsd[version]-{tool} then the base system clang won't use it.

David


Reply via email to