-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Description
| Bugzilla Link | 51223 |
| Resolution | FIXED |
| Resolved on | Sep 02, 2021 23:15 |
| Version | trunk |
| OS | MacOS X |
| Reporter | LLVM Bugzilla Contributor |
| CC | @benshi001,@zygoloid |
Extended Description
$ clang -v
clang version 13.0.0 (https://github.com/llvm/llvm-project.git 4e52a04)
A common AVR toolchain setup on macOS is to use /opt/local/ as the "prefix" and /opt/local/avr/ as the "sysroot" where the headers and libraries live. Under this scheme:
- avr-gcc lives at /opt/local/bin/avr-gcc (the cc1s live in /opt/local/libexec/gcc/...),
- the AVR binutils live in /opt/local/avr/bin/ (hardlinked to avr-prefixed versions in /opt/local/bin/), and
- avr-libc (including the crt0s) lives in /opt/local/avr/lib/.
In clang 13.0.0, I can't find any way to get the driver to link an AVR program with this setup. I'm using (see NOTE below):
$ clang -v -o build/foo -mmcu=atmega644p -target avr --sysroot /opt/local/ -I '=avr/include' build/foo.o
which produces
clang-13: warning: no avr-libc installation can be found on the system, cannot link standard libraries [-Wavr-rtlib-linking-quirks]
clang-13: warning: standard library not linked and so no interrupt vector table or compiler runtime routines will be linked [-Wavr-rtlib-linking-quirks]
followed by the expected linker failures because libc is missing.
I think I tracked this down to the fact that PossibleAVRLibcLocations (in Driver/ToolChains/AVR.cpp) consists of "/usr/avr" and "/usr/lib/avr", neither of which (even when prepended with the given --sysroot) is a directory that exists.
If I add simply "avr" to that array, things work great. But as far as I know there's no way to control that without rebuilding clang.
===
NOTE: In that clang invocation above, I believe it would be more correct for me to use
--sysroot /opt/local/avr/ -I '=include'
If I do that, however, I get a different weird warning (notice it's complaining about avr-gcc, not avr-libc):
clang: warning: no avr-gcc installation can be found on the system, cannot link standard libraries [-Wavr-rtlib-linking-quirks]
I don't understand this warning -- surely clang shouldn't need to invoke avr-gcc itself, right? Why would knowing where avr-gcc is be important to find the avr-libc libraries?
In any case, the PossibleAVRLibcLocations situation described above means that the driver tries looking for avr-libc in /opt/local/avr/usr/avr and /opt/local/avr/usr/lib/avr, neither of which exist.
===
Patch I used to make my setup work, for posterity:
diff --git a/clang/lib/Driver/ToolChains/AVR.cpp b/clang/lib/Driver/ToolChains/AVR.cpp
index ea35abb86f45..85edf905dcc7 100644
--- a/clang/lib/Driver/ToolChains/AVR.cpp
+++ b/clang/lib/Driver/ToolChains/AVR.cpp
@@ -298,6 +298,7 @@ llvm::Optional GetMCUSectionAddressData(StringRef MCUName) {
}
const StringRef PossibleAVRLibcLocations[] = {
- "/avr",
"/usr/avr",
"/usr/lib/avr",
};