Merge pull request #11514 from kaspar030/fix_c11_atomic_definitions
core: fix c11 atomic definitions (fix gcc9 compilation)
This commit is contained in:
commit
bf000a1fa5
@ -44,7 +44,15 @@
|
|||||||
/* GCC documentation refers to the types as I1, I2, I4, I8, I16 */
|
/* GCC documentation refers to the types as I1, I2, I4, I8, I16 */
|
||||||
typedef uint8_t I1;
|
typedef uint8_t I1;
|
||||||
typedef uint16_t I2;
|
typedef uint16_t I2;
|
||||||
|
|
||||||
|
/* the builtins are declared with "unsigned int", but "uint32_t" is typedef'ed
|
||||||
|
* to "long unsigned int" on most platforms where "sizeof(int) == 4. */
|
||||||
|
#if __SIZEOF_INT__ == 4
|
||||||
|
typedef unsigned int I4;
|
||||||
|
#else
|
||||||
typedef uint32_t I4;
|
typedef uint32_t I4;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef uint64_t I8;
|
typedef uint64_t I8;
|
||||||
/* typedef __uint128_t I16; */ /* No 128 bit integer support yet */
|
/* typedef __uint128_t I16; */ /* No 128 bit integer support yet */
|
||||||
|
|
||||||
@ -54,11 +62,11 @@ typedef uint64_t I8;
|
|||||||
* @param[in] n width of the data, in bytes
|
* @param[in] n width of the data, in bytes
|
||||||
*/
|
*/
|
||||||
#define TEMPLATE_ATOMIC_LOAD_N(n) \
|
#define TEMPLATE_ATOMIC_LOAD_N(n) \
|
||||||
I##n __atomic_load_##n (I##n *ptr, int memorder) \
|
I##n __atomic_load_##n (const volatile void *ptr, int memorder) \
|
||||||
{ \
|
{ \
|
||||||
(void) memorder; \
|
(void) memorder; \
|
||||||
unsigned int mask = irq_disable(); \
|
unsigned int mask = irq_disable(); \
|
||||||
I##n old = *ptr; \
|
I##n old = *(I##n *)ptr; \
|
||||||
irq_restore(mask); \
|
irq_restore(mask); \
|
||||||
return old; \
|
return old; \
|
||||||
}
|
}
|
||||||
@ -69,11 +77,11 @@ typedef uint64_t I8;
|
|||||||
* @param[in] n width of the data, in bytes
|
* @param[in] n width of the data, in bytes
|
||||||
*/
|
*/
|
||||||
#define TEMPLATE_ATOMIC_STORE_N(n) \
|
#define TEMPLATE_ATOMIC_STORE_N(n) \
|
||||||
void __atomic_store_##n (I##n *ptr, I##n val, int memorder) \
|
void __atomic_store_##n (volatile void *ptr, I##n val, int memorder) \
|
||||||
{ \
|
{ \
|
||||||
(void) memorder; \
|
(void) memorder; \
|
||||||
unsigned int mask = irq_disable(); \
|
unsigned int mask = irq_disable(); \
|
||||||
*ptr = val; \
|
*(I##n *)ptr = val; \
|
||||||
irq_restore(mask); \
|
irq_restore(mask); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,12 +91,12 @@ typedef uint64_t I8;
|
|||||||
* @param[in] n width of the data, in bytes
|
* @param[in] n width of the data, in bytes
|
||||||
*/
|
*/
|
||||||
#define TEMPLATE_ATOMIC_EXCHANGE_N(n) \
|
#define TEMPLATE_ATOMIC_EXCHANGE_N(n) \
|
||||||
I##n __atomic_exchange_##n (I##n *ptr, I##n desired, int memorder) \
|
I##n __atomic_exchange_##n (volatile void *ptr, I##n desired, int memorder) \
|
||||||
{ \
|
{ \
|
||||||
(void) memorder; \
|
(void) memorder; \
|
||||||
unsigned int mask = irq_disable(); \
|
unsigned int mask = irq_disable(); \
|
||||||
I##n old = *ptr; \
|
I##n old = *(I##n *)ptr; \
|
||||||
*ptr = desired; \
|
*(I##n *)ptr = desired; \
|
||||||
irq_restore(mask); \
|
irq_restore(mask); \
|
||||||
return old; \
|
return old; \
|
||||||
}
|
}
|
||||||
@ -99,21 +107,21 @@ typedef uint64_t I8;
|
|||||||
* @param[in] n width of the data, in bytes
|
* @param[in] n width of the data, in bytes
|
||||||
*/
|
*/
|
||||||
#define TEMPLATE_ATOMIC_COMPARE_EXCHANGE_N(n) \
|
#define TEMPLATE_ATOMIC_COMPARE_EXCHANGE_N(n) \
|
||||||
bool __atomic_compare_exchange_##n (I##n *ptr, I##n *expected, I##n desired, \
|
bool __atomic_compare_exchange_##n (volatile void *ptr, void *expected, I##n desired, \
|
||||||
bool weak, int success_memorder, int failure_memorder) \
|
bool weak, int success_memorder, int failure_memorder) \
|
||||||
{ \
|
{ \
|
||||||
(void) weak; \
|
(void) weak; \
|
||||||
(void) success_memorder; \
|
(void) success_memorder; \
|
||||||
(void) failure_memorder; \
|
(void) failure_memorder; \
|
||||||
unsigned int mask = irq_disable(); \
|
unsigned int mask = irq_disable(); \
|
||||||
I##n cur = *ptr; \
|
I##n cur = *(I##n *)ptr; \
|
||||||
if (cur != *expected) { \
|
if (cur != *(I##n *)expected) { \
|
||||||
*expected = cur; \
|
*(I##n *)expected = cur; \
|
||||||
irq_restore(mask); \
|
irq_restore(mask); \
|
||||||
return false; \
|
return false; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
*ptr = desired; \
|
*(I##n *)ptr = desired; \
|
||||||
irq_restore(mask); \
|
irq_restore(mask); \
|
||||||
return true; \
|
return true; \
|
||||||
}
|
}
|
||||||
@ -127,12 +135,12 @@ typedef uint64_t I8;
|
|||||||
* @param[in] prefixop optional prefix unary operator (use ~ for inverting, NAND, NOR etc)
|
* @param[in] prefixop optional prefix unary operator (use ~ for inverting, NAND, NOR etc)
|
||||||
*/
|
*/
|
||||||
#define TEMPLATE_ATOMIC_FETCH_OP_N(opname, op, n, prefixop) \
|
#define TEMPLATE_ATOMIC_FETCH_OP_N(opname, op, n, prefixop) \
|
||||||
I##n __atomic_fetch_##opname##_##n(I##n *ptr, I##n val, int memmodel) \
|
I##n __atomic_fetch_##opname##_##n(volatile void *ptr, I##n val, int memmodel) \
|
||||||
{ \
|
{ \
|
||||||
unsigned int mask = irq_disable(); \
|
unsigned int mask = irq_disable(); \
|
||||||
(void)memmodel; \
|
(void)memmodel; \
|
||||||
I##n tmp = *ptr; \
|
I##n tmp = *(I##n *)ptr; \
|
||||||
*ptr = prefixop(tmp op val); \
|
*(I##n *)ptr = prefixop(tmp op val); \
|
||||||
irq_restore(mask); \
|
irq_restore(mask); \
|
||||||
return tmp; \
|
return tmp; \
|
||||||
}
|
}
|
||||||
@ -146,12 +154,12 @@ typedef uint64_t I8;
|
|||||||
* @param[in] prefixop optional prefix unary operator (use ~ for inverting, NAND, NOR etc)
|
* @param[in] prefixop optional prefix unary operator (use ~ for inverting, NAND, NOR etc)
|
||||||
*/
|
*/
|
||||||
#define TEMPLATE_ATOMIC_OP_FETCH_N(opname, op, n, prefixop) \
|
#define TEMPLATE_ATOMIC_OP_FETCH_N(opname, op, n, prefixop) \
|
||||||
I##n __atomic_##opname##_fetch_##n(I##n *ptr, I##n val, int memmodel) \
|
I##n __atomic_##opname##_fetch_##n(volatile void *ptr, I##n val, int memmodel) \
|
||||||
{ \
|
{ \
|
||||||
(void)memmodel; \
|
(void)memmodel; \
|
||||||
unsigned int mask = irq_disable(); \
|
unsigned int mask = irq_disable(); \
|
||||||
I##n tmp = prefixop((*ptr) op val); \
|
I##n tmp = prefixop((*(I##n *)ptr) op val); \
|
||||||
*ptr = tmp; \
|
*(I##n *)ptr = tmp; \
|
||||||
irq_restore(mask); \
|
irq_restore(mask); \
|
||||||
return tmp; \
|
return tmp; \
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,17 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "irq.h"
|
#include "irq.h"
|
||||||
|
|
||||||
#if !defined(__llvm__) && !defined(__clang__)
|
/* use gcc/clang implementation if available */
|
||||||
|
#if defined(__GNUC__) \
|
||||||
|
&& (__GNUC__ > 4 || \
|
||||||
|
(__GNUC__ == 4 && (__GNUC_MINOR__ > 7 || \
|
||||||
|
(__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ > 0)))) \
|
||||||
|
|| defined(__llvm__) || defined(__clang__)
|
||||||
|
#define HAVE_C11_SYNC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_C11_SYNC)
|
||||||
|
|
||||||
/* GCC documentation refers to the types as I1, I2, I4, I8, I16 */
|
/* GCC documentation refers to the types as I1, I2, I4, I8, I16 */
|
||||||
typedef uint8_t I1;
|
typedef uint8_t I1;
|
||||||
typedef uint16_t I2;
|
typedef uint16_t I2;
|
||||||
|
|||||||
@ -221,7 +221,7 @@ __attribute__((naked)) void hard_fault_default(void)
|
|||||||
"mov r3, sp \n" /* r4_to_r11_stack parameter */
|
"mov r3, sp \n" /* r4_to_r11_stack parameter */
|
||||||
"bl hard_fault_handler \n" /* hard_fault_handler(r0) */
|
"bl hard_fault_handler \n" /* hard_fault_handler(r0) */
|
||||||
:
|
:
|
||||||
: [sram] "r" (&_sram + HARDFAULT_HANDLER_REQUIRED_STACK_SPACE),
|
: [sram] "r" ((uintptr_t)&_sram + HARDFAULT_HANDLER_REQUIRED_STACK_SPACE),
|
||||||
[eram] "r" (&_eram),
|
[eram] "r" (&_eram),
|
||||||
[estack] "r" (&_estack)
|
[estack] "r" (&_estack)
|
||||||
: "r0","r4","r5","r6","r8","r9","r10","r11","lr"
|
: "r0","r4","r5","r6","r8","r9","r10","r11","lr"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user