spi_flash_generic_timeout is currently defined in the header file,
which makes it a common symbol between translation units where this
header file is included. It is also defined in
spi_flash_chip_generic.c.
Add an explicit `extern` to prevent multiple definition errors.
Clang warns that the original code wouldn't have any effect:
warning: indirection of non-volatile null pointer will be deleted,
not trap [-Wnull-dereference]
note: consider using __builtin_trap() or qualifying pointer
with 'volatile'
__builtin_trap translates to 'break 1, 15' instruction on Xtensa,
which might be okay in this case. However to absolutely certainly not
break anything for GCC builds, add 'volatile' instead.
Toolchain CMake files for clang currently pass -ffreestanding option
to prevent clang from picking the wrong copy of stdint.h. This is a
temporary hack until we fix clang distributions to not include the
GCC version of stdint.h. This hack, however, results in setting
__STDC_HOSTED__=0, which is being checked by cbor header files,
making some required functions unavailable as a result.
Undefine __STDC_HOSTED__ as a workaround. This flag is only passed
when compiling cbor itself.
We will likely need to check clang version as well, eventually.
However at the moment clang builds change too often for such check
to be maintainable. Disable it for clang.
This feature was added when we thought that target components might be
added out of IDF tree. That never became possible, and with recent
changes in IDF architecture it is unlikely that this feature will be
necessary any time soon. Remove it, simplifying the code.
This is an experimental feature intended at the moment for ESP-IDF
developers only.
If IDF_TOOLCHAIN=clang environment variable or CMake variable is set,
use toolchain-clang-esp32xx.cmake instead of toolchain-esp32xx.cmake.
These changes aren't sufficient to actually build any IDF project with
clang; subsequent commits add a few workarounds required to do this.
Toolchain files are added for esp32 and esp32s2, which are the targets
supported in our llvm-project fork at the moment.
Since these functions receive the pointer to reent structure, they
should set errno in it rather than using thread-local errno.
This didn't cause practical issues because console functions in IDF
are only called from threads, and in that case 'r' is a pointer to
the thread-local structure, so &errno is the same thing as
&__errno_r(r). Still, fixing this for consistency.
When CONFIG_VFS_SUPPORT_IO is disabled, _read_r and _write_r
implementations in syscalls.c are used to provide console I/O via
esp_rom_uart_tx_one_char/esp_rom_uart_rx_one_char.
When newlib opens a (FILE*) stream, it calls fstat to check if the
underlying file is character-oriented. In this case, it configures the
stream to use line buffering. Otherwise (or if fstat fails) the stream
is opened as block buffered.
Since fstat wasn't provided, stdin/stdout/stderr streams got opened in
block buffered mode. For console, we need line buffered output so that
the stream buffer is flushed each time a complete line (ending with
'\n') is sent to stdout or stderr.
Fix by implementing _fstat_r stub, setting st->st_mdoe=S_IFCHR.