They all look mostly the same: a bunch of defines, typedefs and compiler intrinsics or extensions. I indeed re-used clang's version to some degree, basically because I don't really like __extension__, __auto_type and other magic present in gcc. Also, gcc's stdatomic.h is totally incompatible with C++, which is per se a good reason to avoid it. So, as for copyrights, I believe it's close to impossible to implement atomics other way than in gcc/clang/msvc/any-other-compiler. I simply followed the most simplistic model. I can mention that we follow the same model, though.
ср, 27 янв. 2021 г., 00:42 Elijah Stone <elro...@elronnd.net>: > This looks like this is a slightly pruned version of the llvm/clang > stdatomic.h. If so, it needs a copyright notice. (Though I don't know > why it would be better to use someone else's header for this purpose > rather than vendoring one.) > > -E > > On Tue, 26 Jan 2021, Dmitry Selyutin wrote: > > > --- > > include/stdatomic.h | 121 ++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 121 insertions(+) > > create mode 100644 include/stdatomic.h > > > > diff --git a/include/stdatomic.h b/include/stdatomic.h > > new file mode 100644 > > index 0000000..2088252 > > --- /dev/null > > +++ b/include/stdatomic.h > > @@ -0,0 +1,121 @@ > > +#include <stddef.h> > > +#include <stdint.h> > > + > > +#ifdef __cplusplus > > +extern "C" { > > +#endif > > + > > +/* Memory ordering */ > > +typedef enum { > > + memory_order_relaxed = __ATOMIC_RELAXED, > > + memory_order_consume = __ATOMIC_CONSUME, > > + memory_order_acquire = __ATOMIC_ACQUIRE, > > + memory_order_release = __ATOMIC_RELEASE, > > + memory_order_acq_rel = __ATOMIC_ACQ_REL, > > + memory_order_seq_cst = __ATOMIC_SEQ_CST, > > +} memory_order; > > + > > +/* Atomic typedefs */ > > +#ifdef __cplusplus > > +typedef _Atomic(bool) atomic_bool; > > +#else > > +typedef _Atomic(_Bool) atomic_bool; > > +#endif > > +typedef _Atomic(char) atomic_char; > > +typedef _Atomic(signed char) atomic_schar; > > +typedef _Atomic(unsigned char) atomic_uchar; > > +typedef _Atomic(short) atomic_short; > > +typedef _Atomic(unsigned short) atomic_ushort; > > +typedef _Atomic(int) atomic_int; > > +typedef _Atomic(unsigned int) atomic_uint; > > +typedef _Atomic(long) atomic_long; > > +typedef _Atomic(unsigned long) atomic_ulong; > > +typedef _Atomic(long long) atomic_llong; > > +typedef _Atomic(unsigned long long) atomic_ullong; > > +typedef _Atomic(uint_least16_t) atomic_char16_t; > > +typedef _Atomic(uint_least32_t) atomic_char32_t; > > +typedef _Atomic(wchar_t) atomic_wchar_t; > > +typedef _Atomic(int_least8_t) atomic_int_least8_t; > > +typedef _Atomic(uint_least8_t) atomic_uint_least8_t; > > +typedef _Atomic(int_least16_t) atomic_int_least16_t; > > +typedef _Atomic(uint_least16_t) atomic_uint_least16_t; > > +typedef _Atomic(int_least32_t) atomic_int_least32_t; > > +typedef _Atomic(uint_least32_t) atomic_uint_least32_t; > > +typedef _Atomic(int_least64_t) atomic_int_least64_t; > > +typedef _Atomic(uint_least64_t) atomic_uint_least64_t; > > +typedef _Atomic(int_fast8_t) atomic_int_fast8_t; > > +typedef _Atomic(uint_fast8_t) atomic_uint_fast8_t; > > +typedef _Atomic(int_fast16_t) atomic_int_fast16_t; > > +typedef _Atomic(uint_fast16_t) atomic_uint_fast16_t; > > +typedef _Atomic(int_fast32_t) atomic_int_fast32_t; > > +typedef _Atomic(uint_fast32_t) atomic_uint_fast32_t; > > +typedef _Atomic(int_fast64_t) atomic_int_fast64_t; > > +typedef _Atomic(uint_fast64_t) atomic_uint_fast64_t; > > +typedef _Atomic(intptr_t) atomic_intptr_t; > > +typedef _Atomic(uintptr_t) atomic_uintptr_t; > > +typedef _Atomic(size_t) atomic_size_t; > > +typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t; > > +typedef _Atomic(intmax_t) atomic_intmax_t; > > +typedef _Atomic(uintmax_t) atomic_uintmax_t; > > + > > +/* Atomic flag */ > > +typedef struct { > > + atomic_bool value; > > +} atomic_flag; > > + > > +#define ATOMIC_FLAG_INIT { 0 } > > + > > +#define atomic_flag_test_and_set(object) \ > > + __c11_atomic_exchange(&(object)->value, 1, __ATOMIC_SEQ_CST) > > +#define atomic_flag_test_and_set_explicit(object, order) \ > > + __c11_atomic_exchange(&(object)->value, 1, order) > > + > > +#define atomic_flag_clear(object) \ > > + __c11_atomic_store(&(object)->value, 0, __ATOMIC_SEQ_CST) > > +#define atomic_flag_clear_explicit(object, order) \ > > + __c11_atomic_store(&(object)->value, 0, order) > > + > > +/* Generic routines */ > > +#define atomic_store(object, desired) \ > > + __atomic_store(object, desired, __ATOMIC_SEQ_CST) > > +#define atomic_store_explicit __atomic_store > > + > > +#define atomic_load(object) \ > > + __atomic_load(object, __ATOMIC_SEQ_CST) > > +#define atomic_load_explicit __atomic_load > > + > > +#define atomic_exchange(object, desired) \ > > + __atomic_exchange(object, desired, __ATOMIC_SEQ_CST) > > +#define atomic_exchange_explicit __atomic_exchange > > + > > +#define atomic_compare_exchange_strong(object, expected, desired) \ > > + __atomic_compare_exchange_strong(object, expected, desired, > > __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) > > +#define atomic_compare_exchange_strong_explicit > > __atomic_compare_exchange_strong > > + > > +#define atomic_compare_exchange_weak(object, expected, desired) \ > > + __atomic_compare_exchange_weak(object, expected, desired, > > __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) > > +#define atomic_compare_exchange_weak_explicit > __atomic_compare_exchange_weak > > + > > +#define atomic_fetch_add(object, operand) \ > > + __atomic_fetch_add(object, operand, __ATOMIC_SEQ_CST) > > +#define atomic_fetch_add_explicit __atomic_fetch_add > > + > > +#define atomic_fetch_sub(object, operand) \ > > + __atomic_fetch_sub(object, operand, __ATOMIC_SEQ_CST) > > +#define atomic_fetch_sub_explicit __atomic_fetch_sub > > + > > +#define atomic_fetch_or(object, operand) \ > > + __atomic_fetch_or(object, operand, __ATOMIC_SEQ_CST) > > +#define atomic_fetch_or_explicit __atomic_fetch_or > > + > > +#define atomic_fetch_xor(object, operand) \ > > + __atomic_fetch_xor(object, operand, __ATOMIC_SEQ_CST) > > +#define atomic_fetch_xor_explicit __atomic_fetch_xor > > + > > +#define atomic_fetch_and(object, operand) \ > > + __atomic_fetch_and(object, operand, __ATOMIC_SEQ_CST) > > +#define atomic_fetch_and_explicit __atomic_fetch_and > > + > > +#ifdef __cplusplus > > +} /* extern "C" */ > > +#endif > > -- > > 2.30.0 > > > > -- > > Best regards, > > Dmitry Selyutin > > > > _______________________________________________ > > Tinycc-devel mailing list > > Tinycc-devel@nongnu.org > > https://lists.nongnu.org/mailman/listinfo/tinycc-devel > > _______________________________________________ > Tinycc-devel mailing list > Tinycc-devel@nongnu.org > https://lists.nongnu.org/mailman/listinfo/tinycc-devel >
_______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel