mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
cee7cccfd0
`flash_<funcname>()` is implemented by `<funcname>_P()` provided by the AVR libc on AVR targets. Previously, the preprocessor was used to do the aliasing, but this causes issues with LLVM: The signatures of e.g. `printf_P()` expects `const char *`, whereas flash utils expects `FLASH_ATTR const char *`. For GCC this will just implicitly drop the `FLASH_ATTR`, while it requires an explicit cast for LLVM. To implement the explicit cast, `static inline` function wrappers where used instead where possible. But for the variadic functions (e.g. `printf(fmt, ...)`) the linker is used to provide the aliases, as there is no way to pass the variadic functions throw in C. The alternative would be to implement `flash_printf()` by calling `vprintf_P()`, but that increased ROM size quite a bit. Finally, a work around for a bug in Ubuntu's toolchain has been added: An unused function that calls to `printf_P()`, `fprintf_P()` and `snprintf_P()`. Since this function is garbage collected anyway, it has no impact on the generated ELF file. |
||
---|---|---|
.. | ||
avr_libc_extra | ||
include | ||
ldscripts | ||
avr8_cpu.c | ||
doc.txt | ||
Kconfig | ||
Makefile | ||
Makefile.dep | ||
Makefile.features | ||
Makefile.include | ||
startup.c | ||
thread_arch.c | ||
work_around_for_shitty_ubuntu_toolchain.c |