Merge branch 'fix/no_inline__atomic_test_and_set' into 'master'

fix(newlib): add missing __atomic_test_and_set for RISCV chips wo 'a' extension

Closes IDFGH-14383

See merge request espressif/esp-idf!36387
This commit is contained in:
Alexey Lapshin 2025-01-15 19:29:33 +08:00
commit 66cf5184ff
2 changed files with 24 additions and 3 deletions

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -32,6 +32,14 @@ ATOMIC_FUNCTIONS(1, unsigned char)
ATOMIC_FUNCTIONS(2, short unsigned int)
ATOMIC_FUNCTIONS(4, unsigned int)
#ifndef __clang__
/* LLVM automatically replaces __atomic_test_and_set -> __atomic_exchange_1 call when compiling */
bool __atomic_test_and_set(volatile void *ptr, int memorder)
{
return __atomic_exchange_1(ptr, true, memorder);
}
#endif
#elif __riscv_atomic == 1
bool CLANG_ATOMIC_SUFFIX(__atomic_always_lock_free)(unsigned int size, const volatile void *)

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@ -26,6 +26,19 @@ atomic_uint *g_atomic32;
atomic_ushort *g_atomic16;
atomic_uchar *g_atomic8;
TEST_CASE("stdatomic - test_atomic_flag", "[newlib_stdatomic]")
{
bool x8 = 0;
g_atomic8 = heap_caps_calloc(sizeof(*g_atomic8), 1, MALLOC_CAP_DEFAULT);
x8 = atomic_flag_test_and_set(g_atomic8);
TEST_ASSERT_EQUAL_HEX8(0x00, x8);
TEST_ASSERT_EQUAL_HEX8(0x01, *g_atomic8);
atomic_flag_clear(g_atomic8);
TEST_ASSERT_EQUAL_HEX8(0x00, *g_atomic8);
free(g_atomic8);
}
TEST_CASE("stdatomic - test_64bit_atomics", "[newlib_stdatomic]")
{
unsigned long long x64 = 0;
@ -262,7 +275,7 @@ TEST_CASE("stdatomic - test_" #NAME, "[newlib_stdatomic]")
free(var_##NAME); \
}
// Note that the assert at the end is doing an excat bitwise comparison.
// Note that the assert at the end is doing an exact bitwise comparison.
// This easily can fail due to rounding errors. However, there is currently
// no corresponding Unity assert macro for long double. USE THIS WITH CARE!
#define TEST_RACE_OPERATION_LONG_DOUBLE(NAME, LHSTYPE, PRE, POST, INIT, FINAL) \