summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Fix test_atomic failure caused unaligned AO_double_t access on x86Ivan Maidanski2017-01-242-0/+8
| | | | | | | | | | | | | The failure is caused by violation of an assertion that checks AO_double_t variable is 8-byte aligned on x86. * doc/README.txt (AO_double_t): Add note about required alignment. * src/atomic_ops/sysdeps/standard_ao_double_t.h (AO_double_t): Add comment about alignment. * src/atomic_ops_stack.h (AO_stack_t): Likewise. * tests/test_atomic_include.template (test_atomicXX): Define old_w, w local variables as static (as otherwise, e.g., they could have 4-byte alignment on x86); add comment.
* Revert "Fix test_atomic fail caused unaligned AO_double_t access (VC/x86)"Ivan Maidanski2017-01-244-22/+1
| | | | | | | | | | This reverts commit 69c4010c1b3d43e2e179421e27379aaa5aeeb6d8. The failure is actually caused by the fact that default alignment of stack on x86 is 4 bytes. So, another solution should be proposed to fix the issue for other compilers (and, potentially, other targets). E.g. do not place AO_double_t volatile variables on stack.
* Implement char CAS and char/short add for msftc X86[_64] (VS 2013+)Ivan Maidanski2017-01-243-2/+75
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>=1800] (_InterlockedCompareExchange8): Declare intrinsic. * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>=1800 && !AO_PREFER_GENERALIZED && !_M_ARM] (_InterlockedExchangeAdd16, _InterlockedExchangeAdd8): Likewise. * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>=1800] (_InterlockedCompareExchange8): Likewise. * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>=1800 && !AO_PREFER_GENERALIZED] (_InterlockedExchangeAdd16, _InterlockedExchangeAdd8): Likewise. * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>=1800] (AO_char_fetch_compare_and_swap_full): Implement using intrinsic. * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>=1800 && !AO_PREFER_GENERALIZED && !_M_ARM] (AO_char_fetch_and_add_full, AO_short_fetch_and_add_full): Likewise. * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>=1800] (AO_char_fetch_compare_and_swap_full): Likewise. * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>=1800 && !AO_PREFER_GENERALIZED] (AO_char_fetch_and_add_full, AO_short_fetch_and_add_full): Likewise. * src/atomic_ops/sysdeps/msftc/x86.h [!AO_NO_ASM_XADD] (AO_char_fetch_and_add_full, AO_short_fetch_and_add_full): Do not define if AO_HAVE_char_fetch_and_add_full. * src/atomic_ops/sysdeps/msftc/x86_64.h [AO_ASM_X64_AVAILABLE] (AO_char_fetch_and_add_full, AO_short_fetch_and_add_full): Do not use asm-based implementation if _MSC_VER>=1800.
* Implement short inc/dec directly for msftc ARM and X86[_64]Ivan Maidanski2017-01-242-0/+36
| | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>1400 && !AO_PREFER_GENERALIZED] (_InterlockedIncrement16, _InterlockedDecrement16): Declare intrinsic. * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>1400 && !AO_PREFER_GENERALIZED] (_InterlockedIncrement16, _InterlockedDecrement16): Likewise. * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>1400 && !AO_PREFER_GENERALIZED] (AO_short_fetch_and_add1_full, AO_short_fetch_and_sub1_full): Implement using intrinsic. * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>=1800 && !AO_PREFER_GENERALIZED] (AO_char_fetch_and_add_full, AO_short_fetch_and_add_full): Likewise.
* Really implement char and/or/xor and short CAS for msftc ARM (VS 2013+)Ivan Maidanski2017-01-241-1/+1
| | | | | | | | | | | | (fix commit 9182c62) * src/atomic_ops/sysdeps/msftc/common32_defs.h [_M_ARM] (_InterlockedAnd8, _InterlockedCompareExchange16, _InterlockedOr8, _InterlockedXor8): Declare intrinsic if _MSC_VER>=1800. * src/atomic_ops/sysdeps/msftc/common32_defs.h [_M_ARM] (AO_char_and_full, AO_char_or_full, AO_char_xor_full, AO_short_fetch_compare_and_swap_full): Implement (using intrinsic) if _MSC_VER>=1800.
* Implement char and/or/xor and short CAS for msftc ARM and X86[_64]Ivan Maidanski2017-01-232-0/+79
| | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>1400 && !_M_ARM] (_InterlockedAnd8, _InterlockedCompareExchange16, _InterlockedOr8, _InterlockedXor8): Declare intrinsic. * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>1400] (_InterlockedAnd8, _InterlockedCompareExchange16, _InterlockedOr8, _InterlockedXor8): Likewise. * src/atomic_ops/sysdeps/msftc/common32_defs.h [_MSC_VER>1400 && !_M_ARM] (AO_char_and_full, AO_char_or_full, AO_char_xor_full, AO_short_fetch_compare_and_swap_full): Implement (using intrinsic). * src/atomic_ops/sysdeps/msftc/x86_64.h [_MSC_VER>1400] (AO_char_and_full, AO_char_or_full, AO_char_xor_full, AO_short_fetch_compare_and_swap_full): Likewise.
* Remove redundant include windows.h from headers (msftc/x86[_64])Ivan Maidanski2017-01-202-23/+20
| | | | | | | | | | | | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/msftc/common32_defs.h: Do not include windows.h if _MSC_VER > 1400 && AO_USE_INTERLOCKED_INTRINSICS && !_WIN32_WCE. * src/atomic_ops/sysdeps/msftc/common32_defs.h [!AO_PREFER_GENERALIZED || !AO_ASSUME_WINDOWS98] (AO_fetch_and_add_full, AO_fetch_and_add1_full, AO_fetch_and_sub1_full): Replace LONG to long; remove unnecessary cast to LONG. * src/atomic_ops/sysdeps/msftc/common32_defs.h [AO_ASSUME_WINDOWS98] (AO_fetch_compare_and_swap_full): Likewise. * src/atomic_ops/sysdeps/msftc/x86_64.h (AO_int_fetch_compare_and_swap_full): Likewise. * src/atomic_ops/sysdeps/msftc/x86_64.h [!AO_PREFER_GENERALIZED] (AO_int_fetch_and_add_full, AO_int_fetch_and_add1_full, AO_int_fetch_and_sub1_full): Likewise. * src/atomic_ops/sysdeps/msftc/common32_defs.h [AO_ASSUME_WINDOWS98] (AO_fetch_compare_and_swap_full): Replace PVOID to void*; remove unnecessary cast to AO_t. * src/atomic_ops/sysdeps/msftc/x86_64.h: Remove include windows.h. * src/atomic_ops/sysdeps/msftc/x86_64.h [!AO_PREFER_GENERALIZED] (AO_fetch_and_add_full, AO_fetch_and_add1_full, AO_fetch_and_sub1_full): Replace LONGLONG to __int64; remove unnecessary cast to LONGLONG. * src/atomic_ops/sysdeps/msftc/x86_64.h (AO_fetch_compare_and_swap_full): Likewise.
* Always define word-wide CAS for x86 (MS VC++ 8 or later)Ivan Maidanski2017-01-202-9/+5
| | | | | | | | | | | | | | | | | | | Visual Studio 2005 (MS VC++ 8.0) discontinued support of Windows 95. This patch deprecates AO_ASSUME_WINDOWS98 macro. * configure.ac (AO_ASSUME_WINDOWS98): Remove AH template. * doc/README.txt (AO_ASSUME_WINDOWS98): Remove documentation (as relates only to Win95). * doc/README_win32.txt (AO_ASSUME_WINDOWS98): Likwise. * doc/README_win32.txt (AO_ASSUME_VISTA): Update documentation. * src/Makefile.msft (CFLAGS): Remove "-D AO_ASSUME_WINDOWS98". * src/Makefile.msft (test_atomic_w95): Remove target. * src/Makefile.msft (check): Do not call test_atomic_w95; remove the corresponding printed message. * src/atomic_ops/sysdeps/msftc/x86.h: Remove AO_ASSUME_WINDOWS98 from comment. * src/atomic_ops/sysdeps/msftc/x86.h (AO_ASSUME_WINDOWS98): Define (implicitly) if _MSC_VER >= 1400.
* Fix test_atomic failure caused unaligned AO_double_t access on x86 (VC++)Ivan Maidanski2017-01-204-1/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Passing an unaligned AO_double_t pointer to AO double-wide primitives results in an undefined behavior of the latter when running on x86 (or violation of the corresponding assertion on the alignment). MS VC++/x86 aligns AO_double_t values on a 4-byte boundary by default. For the proper alignment, __declspec(align(8)) should be applied to variables defined in the client code (which uses double-wide AO primitives). Unfortunately, the attribute cannot be added to AO_double_t definition itself because the compiler does not allow the attribute for function arguments. This patch introduces AO_DOUBLE_ALIGN attribute for use by clients of the double-wide AO primitives (and, thus, AO_stack clients). Matters only Visual Studio compiler for X86. The inner clients (atomic_ops_malloc, test_atomic, test_stack) are updated to use this attribute. * doc/README_win32.txt [x86] (AO_DOUBLE_ALIGN): Document. * src/atomic_ops/sysdeps/generic_pthread.h (AO_DOUBLE_ALIGN): Define (as empty). * src/atomic_ops/sysdeps/standard_ao_double_t.h [!_WIN64 && _WIN32 && !__GNUC__ && _MSC_VER] (AO_DOUBLE_ALIGN): Define as declspec align(8); document it. * src/atomic_ops/sysdeps/standard_ao_double_t.h [!AO_DOUBLE_ALIGN] (AO_DOUBLE_ALIGN): Define as empty (otherwise). * src/atomic_ops_stack.h [AO_USE_ALMOST_LOCK_FREE && !AO_DOUBLE_ALIGN] (AO_DOUBLE_ALIGN): Likewise. * src/atomic_ops_malloc.c (AO_free_list): Use AO_DOUBLE_ALIGN attribute. * tests/test_stack.c (the_list): Likewise. * src/atomic_ops_stack.h [!AO_USE_ALMOST_LOCK_FREE] (AO_stack_t): Document AO_DOUBLE_ALIGN usage (by clients). * tests/test_atomic_include.template (test_atomicXX): Use AO_DOUBLE_ALIGN attribute for old_w and w double-wide local variables (to avoid alignment assertion violation or AO primitives undefined behavior on x86 if the test code is compiled by VC++).
* Add assertion that double-wide CAS target is aligned (msftc/x86[_64])Ivan Maidanski2017-01-202-0/+3
| | | | | | | | * src/atomic_ops/sysdeps/msftc/x86.h [AO_ASSUME_VISTA] (AO_double_compare_and_swap_full): Add assert() that addr pointer is aligned according to the size of AO_double_t. * src/atomic_ops/sysdeps/msftc/x86_64.h [AO_CMPXCHG16B_AVAILABLE && _MSC_VER>=1500] (AO_compare_double_and_swap_double_full): Likewise.
* Add asm-based char/short/int CAS implementation for gcc/x86[_64]Ivan Maidanski2017-01-171-1/+63
| | | | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/gcc/x86.h [!AO_GCC_ATOMIC_TEST_AND_SET] (AO_char_and_full, AO_char_or_full, AO_char_xor_full, AO_short_and_full, AO_short_or_full, AO_short_xor_full): Do not define if AO_PREFER_GENERALIZED. * src/atomic_ops/sysdeps/gcc/x86.h [!AO_GCC_ATOMIC_TEST_AND_SET] (AO_char_fetch_compare_and_swap_full, AO_short_fetch_compare_and_swap_full): Implement. * src/atomic_ops/sysdeps/gcc/x86.h [!AO_GCC_ATOMIC_TEST_AND_SET && __x86_64__ && !__ILP32__] (AO_int_fetch_compare_and_swap_full): Likewise. * src/atomic_ops/sysdeps/gcc/x86.h [!AO_GCC_ATOMIC_TEST_AND_SET && __x86_64__ && !__ILP32__] (AO_int_fetch_and_add_full, AO_int_and_full, AO_int_or_full, AO_int_xor_full): Do not define if AO_PREFER_GENERALIZED.
* Implement int CAS/inc/dec for msftc/x86_64Ivan Maidanski2017-01-171-1/+28
| | | | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/msftc/x86_64.h (_InterlockedExchangeAdd): Declare (as intrinsic) only unless AO_PREFER_GENERALIZED. * src/atomic_ops/sysdeps/msftc/x86_64.h (_InterlockedCompareExchange): Declare intrinsic. * src/atomic_ops/sysdeps/msftc/x86_64.h [!AO_PREFER_GENERALIZED] (_InterlockedIncrement, _InterlockedDecrement): Likewise. * src/atomic_ops/sysdeps/msftc/x86_64.h (AO_int_fetch_compare_and_swap_full): Define inline function (using _InterlockedCompareExchange). * src/atomic_ops/sysdeps/msftc/x86_64.h (AO_int_fetch_and_add_full): Do not define if AO_PREFER_GENERALIZED. * src/atomic_ops/sysdeps/msftc/x86_64.h [!AO_PREFER_GENERALIZED] (AO_int_fetch_and_add1_full, AO_int_fetch_and_sub1_full): Define inline function _InterlockedIncrement/Decrement).
* Remove outdated FIXME in msftc/arm.h about _InterlockedOps memory barrierIvan Maidanski2017-01-161-2/+0
| | | | | * src/atomic_ops/sysdeps/msftc/arm.h: Remove FIXME about memory barrier of _InterlockedOps (they have the correct one according to the MSDN).
* Fix 'atomic_load/store symbols undefined' error on OS X 10.8 i386Ivan Maidanski2017-01-121-0/+15
| | | | | | | | | | | | | Issue #23 (libatomic_ops). * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && !__x86_64__ && __APPLE__ && __MACH__]: Include AvailabilityMacros.h unless MAC_OS_X_VERSION_MIN_REQUIRED already defined. * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && !__x86_64__ && __APPLE__ && __MACH__ && MAC_OS_X_VERSION_MIN_REQUIRED < 1090] (AO_SKIPATOMIC_double_load, AO_SKIPATOMIC_double_load_acquire, AO_SKIPATOMIC_double_store, AO_SKIPATOMIC_double_store_release): Define.
* Fix AO_stack build failure on OS X 10.7 because of missing CAS (x86)Ivan Maidanski2016-12-291-1/+4
| | | | | | | | | | (fix commit 7a6a7cc) Issue #23 (libatomic_ops). * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && __APPLE_CC__] (AO_GCC_FORCE_HAVE_CAS): Define also for arch i386; refine comment.
* Fix AO_stack build failure on OS X 10.7 because of missing CAS (x86_64)Ivan Maidanski2016-12-281-0/+3
| | | | | | | | | Issue #23 (libatomic_ops). * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && __APPLE_CC__ && __x86_64__] (AO_GCC_FORCE_HAVE_CAS): Define (to workaround missing __GCC_HAVE_SYNC_COMPARE_AND_SWAP_<n> predefined macro in Apple clang-425/x86_64); add comment.
* Support CFLAGS_EXTRA to pass extra user-defined compiler flags (configure)Ivan Maidanski2016-12-101-0/+2
| | | | | | * configure.ac: Add AC_SUBST(CFLAGS_EXTRA). * src/Makefile.am (CFLAGS): Append $(CFLAGS_EXTRA). * tests/Makefile.am (CFLAGS): Likewise.
* Eliminate 'printf format specifies type void*' GCC pedantic warningsIvan Maidanski2016-12-071-4/+4
| | | | | | | | | | | | | | | This commit also eliminates 'cast from pointer to integer' compiler warnings and '32-bit value shift followed by expansion to 64-bit' static analysis tool warning. * src/atomic_ops_malloc.c [AO_TRACE_MALLOC] (AO_malloc, AO_free): Use %p (instead of %x) format specifier to print pthread_self() value (and cast pthread_self() to void*). * src/atomic_ops_malloc.c [AO_TRACE_MALLOC] (AO_malloc): Cast result+1 to void* (to match %p printf format specifier). * src/atomic_ops_malloc.c [AO_TRACE_MALLOC] (AO_free): Use "UL" suffix for 1 and remove the cast to unsigned long (instead of performing left shift of an integer value and extending the result to unsigned long).
* Workaround a bug in double-wide intrinsics of Clang/x64 with ASan enabledIvan Maidanski2016-11-242-2/+13
| | | | | | | | | | | | | | | As of clang-3.8, double-wide arguments are incorrectly passed to atomic intrinsic operations for x64 target if Address Sanitizer is enabled. * src/atomic_ops.h [__has_feature(address_sanitizer)] (AO_ADDRESS_SANITIZER): New internal macro. * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && __clang__ && __x86_64__ && !__ILP32__] (AO_SKIPATOMIC_double_compare_and_swap_ANY, AO_SKIPATOMIC_double_load, AO_SKIPATOMIC_double_load_acquire, AO_SKIPATOMIC_double_store, AO_SKIPATOMIC_double_store_release): Define also if AO_ADDRESS_SANITIZER; update comment.
* Code refactoring of Clang double-wide intrinsic workarounds (gcc/x86)Ivan Maidanski2016-11-242-28/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | (fix commits 9803386, f6a1b68, eb6d4fd) * src/atomic_ops/sysdeps/gcc/generic.h [AO_HAVE_DOUBLE_PTR_STORAGE && !AO_HAVE_double_store] (AO_double_store): Do not define if AO_SKIPATOMIC_double_store. * src/atomic_ops/sysdeps/gcc/generic.h [AO_HAVE_DOUBLE_PTR_STORAGE && !AO_HAVE_double_store_release] (AO_double_store_release): Do not define if AO_SKIPATOMIC_double_load. * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && __clang__ && !__x86_64__ && !__APPLE_CC__ && !__CYGWIN__ && !AO_PREFER_BUILTIN_ATOMICS] (AO_SKIPATOMIC_double_load, AO_SKIPATOMIC_double_load_acquire, AO_SKIPATOMIC_double_store, AO_SKIPATOMIC_double_store_release): Define internal macro (undefined at the end of file). * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && (__clang__ && !__x86_64__ && !__APPLE_CC__ && !__CYGWIN__ && !AO_PREFER_BUILTIN_ATOMICS) || (__APPLE_CC__ && __x86_64__))] (AO_SKIPATOMIC_double_compare_and_swap_ANY): Move definition here (remove at other places in this file); undefine at the end of the file. * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET]: Check AO_SKIPATOMIC_double_compare_and_swap_ANY instead of checking multiple macros to detect whether a workaround for the CAS (and others) double-wide operations is needed.
* Undefine internal macros that are defined solely for generic.hIvan Maidanski2016-11-232-0/+14
| | | | | | | | | | | | | (fix commits 03a0465f, 3c52619c, 66f7a4d3) * src/atomic_ops/sysdeps/gcc/aarch64.h (AO_SKIPATOMIC_double_load, AO_SKIPATOMIC_double_load_acquire): Undefine at the end of file. * src/atomic_ops/sysdeps/gcc/arm.h (AO_SKIPATOMIC_ANY_and_ANY, AO_SKIPATOMIC_ANY_or_ANY, AO_SKIPATOMIC_ANY_xor_ANY, AO_SKIPATOMIC_char_store, AO_SKIPATOMIC_char_store_release, AO_SKIPATOMIC_int_store, AO_SKIPATOMIC_int_store_release, AO_SKIPATOMIC_short_store, AO_SKIPATOMIC_short_store_release, AO_SKIPATOMIC_store, AO_SKIPATOMIC_store_release): Likewise.
* Refine AO_nop_write comment for ARM big.LITTLE architectureIvan Maidanski2016-11-181-1/+2
| | | | | | * src/atomic_ops/sysdeps/gcc/arm.h [!AO_UNIPROCESSOR && AO_ARM_HAVE_DMB && !AO_PREFER_BUILTIN_ATOMICS] (AO_nop_write): Refine comment about "dmb ishst" for big.LITTLE architecture.
* Fix powerpc detection on AIX (gcc)Tobias Leich2016-11-181-1/+2
| | | | | | | | GCC/powerpc-ibm-aix does not define any of __powerpc__, __ppc__, __PPC__, __powerpc64__, __ppc64__; but it does define _ARCH_PPC (and _POWER). * src/atomic_ops.h [_ARCH_PPC]: Include gcc/powerpc.h.
* Fix indentation of #endif in s390.hIvan Maidanski2016-11-121-1/+1
| | | | | | | (fix commit c2edeab) * src/atomic_ops/sysdeps/gcc/s390.h (AO_fetch_compare_and_swap_full): Adjust indentation of #endif.
* Implement fetch-CAS for s390[x] (gcc)Tobias Leich2016-11-101-1/+18
| | | | | | | * src/atomic_ops/sysdeps/gcc/s390.h (AO_compare_and_swap_full): Do not define if AO_GENERALIZE_ASM_BOOL_CAS. * src/atomic_ops/sysdeps/gcc/s390.h (AO_fetch_compare_and_swap_full): Implement; remove TODO item.
* Remove spaces at EOLn in asm codeIvan Maidanski2016-11-082-32/+32
| | | | | | | | | | * src/atomic_ops/sysdeps/gcc/hexagon.h (AO_test_and_set, AO_compare_and_swap, AO_fetch_compare_and_swap): Remove spaces preceding "\n". * src/atomic_ops/sysdeps/gcc/mips.h (AO_nop_full, AO_fetch_and_add, AO_test_and_set, AO_compare_and_swap): Likewise. * src/atomic_ops/sysdeps/gcc/hexagon.h (AO_fetch_and_add, AO_test_and_set, AO_fetch_compare_and_swap): Align comments.
* Fix missing double_compare_and_swap_dd_acquire_readIvan Maidanski2016-11-011-0/+16
| | | | | | | | | | This matters only if AO_double_compare_and_swap[_acquire_read] actually defined in generalize.h too. * src/atomic_ops/generalize.h [!AO_HAVE_double_compare_and_swap_dd_acquire_read] (AO_double_compare_and_swap_dd_acquire_read): Define (same as definition as auto-generated in generalize-small.h).
* Workaround 'value of MAP_ANON unknown' cppcheck info messageIvan Maidanski2016-10-261-1/+3
| | | | | | | | (fix commit 4c303bc) * src/atomic_ops_malloc.c [USE_MMAP_ANON && CPPCHECK] (OPT_MAP_ANON): Define to immediate non-zero value (taken from Linux libc) instead of MAP_ANON (because the latter is used in ifdef).
* Suppress 'ISO C does not support __int128 type' GCC/Clang pedantic warningIvan Maidanski2016-10-251-1/+15
| | | | | | * src/atomic_ops/sysdeps/standard_ao_double_t.h [!__ILP32__ && (__GNUC__ >= 4.7 || __clang__ >= 3.6)] (double_ptr_storage): Turn off pedantic warnings reporting (for this typedef only).
* Fix test_malloc failure if CPPCHECK is definedIvan Maidanski2016-10-251-2/+2
| | | | | | | (fix commit c1a7aad) * src/atomic_ops_malloc.c [USE_MMAP_ANON && MAP_ANONYMOUS] (OPT_MAP_ANON): Define to MAP_ANON (instead of 0) if CPPCHECK.
* Workaround 'function is never used' cppcheck style warningsIvan Maidanski2016-10-251-2/+2
| | | | | | | | | | | * src/atomic_ops.h [AO_CAN_EMUL_CAS]: Include emul_cas.h also if CPPCHECK (to define AO_store_full as AO_store_full_emulation). * tests/test_atomic_include.template [CPPCHECK] (list_atomicXX, char_list_atomicXX, short_list_atomicXX, int_list_atomicXX, double_list_atomicXX): Declare function. * tests/test_atomic_include.template test_atomicXX (test_atomicXX): Call list_atomicXX, char_list_atomicXX, short_list_atomicXX, int_list_atomicXX and double_list_atomicXX if CPPCHECK.
* Hide AO_locks symbolIvan Maidanski2016-10-251-1/+1
| | | | | * src/atomic_ops.c [!_MSC_VER && !__MINGW32__] (AO_locks): Define as static.
* Workaround 'value of macro is unknown' cppcheck information messagesIvan Maidanski2016-10-181-2/+2
| | | | | | | * src/atomic_ops_malloc.c [USE_MMAP_ANON] (OPT_MAP_ANON): Define to 0 (do not use MAP_ANONYMOUS value) if CPPCHECK. * src/atomic_ops_malloc.c [SIZE_MAX] (AO_SIZE_MAX): Do not use SIZE_MAX value if CPPCHECK.
* Merge branch 'ppc-aix'Ivan Maidanski2016-10-171-104/+77
|\
| * Support AIX/ppc (gcc)Jean Girardet2016-10-101-16/+34
| | | | | | | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/gcc/powerpc.h (AO_PPC_L, AO_PPC_BR_A): New internal macros (undefined at the end of file); definition depends on _AIX macro presence. * src/atomic_ops/sysdeps/gcc/powerpc.h (AO_load_acquire, AO_test_and_set, AO_compare_and_swap, AO_fetch_compare_and_swap, AO_fetch_and_add): Use AO_PPC_L for label definitions; use AO_PPC_BR_A to specify jump target.
| * Code refactoring of gcc/powerpc.h to avoid code duplicationIvan Maidanski2016-10-071-96/+51
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * src/atomic_ops/sysdeps/gcc/powerpc.h (AO_PPC_LD, AO_PPC_LxARX, AO_PPC_CMPx, AO_PPC_STxCXd, AO_PPC_LOAD_CLOBBER): New internal macros (undefined at the end of the file). * src/atomic_ops/sysdeps/gcc/powerpc.h (AO_T_IS_INT): Move definition upper (to have single check of __ppc64__). * src/atomic_ops/sysdeps/gcc/powerpc.h (AO_load_acquire): Use AO_PPC_LD, AO_PPC_LOAD_CLOBBER (and eliminate code duplication). * src/atomic_ops/sysdeps/gcc/powerpc.h (AO_test_and_set, AO_compare_and_swap, AO_fetch_compare_and_swap, AO_fetch_and_add): Use AO_PPC_LxARX, AO_PPC_CMPx, AO_PPC_STxCXd (and eliminate code duplication).
* | Workaround 'overflow in pointer subtraction' cppcheck warningIvan Maidanski2016-10-171-3/+5
| | | | | | | | | | | | * src/atomic_ops_malloc.c (AO_free): Do not perform subtraction from "p" argument if its value is null; change type of "base" local variable from char* to AO_t*.
* | Eliminate 'scope of variable can be reduced' cppcheck warning in AO_stackIvan Maidanski2016-10-111-1/+2
|/ | | | | | * src/atomic_ops_stack.c [AO_HAVE_compare_and_swap_double] (AO_stack_push_release): Move local variable declaration to the inner scope where the variable is actually used.
* Fix 'visibility' of some CPU-specific internal macrosIvan Maidanski2016-10-078-0/+32
| | | | | | | | | | | | | | | | | | | | | Undefine internal macros that are defined and used solely in a single CPU-specific file. * src/atomic_ops/sysdeps/gcc/arm.h (AO_BR_ALIGN, AO_MASK_PTR, AO_THUMB_GO_ARM, AO_THUMB_RESTORE_MODE, AO_THUMB_SWITCH_CLOBBERS): Undefine at the end of file. * src/atomic_ops/sysdeps/gcc/hppa.h (AO_PA_LDCW_ALIGNMENT, AO_ldcw, AO_ldcw_align): Likewise. * src/atomic_ops/sysdeps/gcc/ia64.h (AO_IN_ADDR, AO_LEN, AO_MASK, AO_OUT_ADDR, AO_SWIZZLE): Likewise. * src/atomic_ops/sysdeps/gcc/mips.h (AO_MIPS_LL, AO_MIPS_LL_1, AO_MIPS_SC, AO_MIPS_SET_ISA): Likewise. * src/atomic_ops/sysdeps/hpc/hppa.h (AO_PA_LDCW_ALIGNMENT, AO_ldcw, AO_ldcw_align): Likewise. * src/atomic_ops/sysdeps/hpc/ia64.h (AO_T_FASIZE, AO_T_SIZE): Likewise. * src/atomic_ops/sysdeps/icc/ia64.h (AO_INTEL_PTR_t): Likewise. * src/atomic_ops/sysdeps/test_and_set_t_is_char.h (AO_TS_SET_TRUEVAL): Likewise.
* Workaround '#error' cppcheck error messagesIvan Maidanski2016-10-055-7/+12
| | | | | | | | | * src/atomic_ops.h [AO_REQUIRE_CAS && !AO_CAN_EMUL_CAS]: Skip #error pragma if CPPCHECK. * src/atomic_ops/generalize.h [AO_HAVE_nop_acquire]: Likewise. * src/atomic_ops/generalize.h [AO_HAVE_nop_release]: Likewise. * src/atomic_ops/sysdeps/armcc/arm_v6.h [__TARGET_ARCH_ARM < 6]: Likewise.
* Fix typos in 'error' pragma messagesIvan Maidanski2016-10-054-5/+5
| | | | | | | | | | | | | | * src/atomic_ops.h [_HPUX_SOURCE && !__ia64] (AO_barrier_dummy): Fix typo ("do not") in comment. * src/atomic_ops/generalize.h [AO_HAVE_nop_acquire]: Fix typo ("do not") in #error message. * src/atomic_ops/generalize.h [AO_HAVE_nop_release]: Likewise. * src/atomic_ops/sysdeps/armcc/arm_v6.h [__TARGET_ARCH_ARM < 6]: Likewise. * src/atomic_ops/sysdeps/armcc/arm_v6.h [__TARGET_ARCH_ARM < 6]: Add #error pragma. * src/atomic_ops_stack.c [AO_HAVE_compare_and_swap_double]: Fix typo ("does not") in #error message.
* Fix SIZET_SAT_ADD for the case of size_t is signed (SunOS 4.X)Ivan Maidanski2016-09-161-1/+11
| | | | | | | | | | | Negative size_t value is impossible in a correct C implementation, but quite possible under SunOS 4.X. * src/atomic_ops_malloc.c: Include limits.h (unless SIZE_MAX already defined). * src/atomic_ops_malloc.c (AO_SIZE_MAX): New macro. * src/atomic_ops_malloc.c (SIZET_SAT_ADD): Use AO_SIZE_MAX instead of ~(size_t)0.
* Eliminate 'scope of variable can be reduced' cppcheck warningsIvan Maidanski2016-08-241-1/+1
| | | | | | | | * src/atomic_ops_malloc.c (msb): Declare "v" variable exactly in the scope where the variable is used in. * tests/run_parallel.h [USE_PTHREADS || USE_WINTHREADS] (run_parallel): Declare "code" variable exactly in the scope where the variable is used in.
* Fix size value wrap around in AO_malloc_largeIvan Maidanski2016-08-221-3/+6
| | | | | | | | | AO_malloc(SIZE_MAX) should return NULL now. * src/atomic_ops_malloc.c (SIZET_SAT_ADD): New macro. * src/atomic_ops_malloc.c (AO_malloc_large): Use SIZET_SAT_ADD to avoid integer overflow when computing the memory size to map (i.e., malloc should handle arguments close to SIZE_MAX correctly).
* Workaround a bug in double-wide CAS intrinsic of Apple clang-600/x64Ivan Maidanski2016-08-201-1/+7
| | | | | | | | | | | | | The bug causes test_stack failure. * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && __APPLE_CC__ && __x86_64__]: Fall-back to asm-based implementation of double-wide CAS (AO_compare_double_and_swap_double_full); add comment explaining the reason. * src/atomic_ops/sysdeps/gcc/x86.h [__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 && AO_GCC_ATOMIC_TEST_AND_SET && __APPLE_CC__] (AO_SKIPATOMIC_double_compare_and_swap_ANY): Define.
* Use C11 double-wide atomic intrinsics for Clang/x86 on Cygwin and OS XIvan Maidanski2016-08-201-1/+2
| | | | | | | | Others (e.g., NDK clang/i686) still might need -latomic linker option. * src/atomic_ops/sysdeps/gcc/x86.h [AO_GCC_ATOMIC_TEST_AND_SET && __clang__]: Do not fallback to non-intrinsic implementation if __APPLE_CC__ or __CYGWIN__.
* Code refactoring of int-wide primitives in gcc/x86.hIvan Maidanski2016-08-201-88/+86
| | | | | | * src/atomic_ops/sysdeps/gcc/x86.h (AO_int_fetch_and_add_full, AO_int_and_full, AO_int_or_full, AO_int_xor_full, AO_T_IS_INT): Move to separate 'ifdef' block (inside AO_DISABLE_GCC_ATOMICS case).
* Avoid extra nop_full in stack_pop_acquire if atomic intrinsics used (x86)Ivan Maidanski2016-08-191-0/+34
| | | | | | | | | * src/atomic_ops/generalize.h [AO_HAVE_double_compare_and_swap_acquire] (AO_compare_double_and_swap_double_acquire): Implement (by redirecting to AO_double_compare_and_swap_acquire). * src/atomic_ops/generalize.h [AO_HAVE_double_compare_and_swap_release] (AO_compare_double_and_swap_double_release): Implement (by redirecting to AO_double_compare_and_swap_release).
* Add asm-based and/or/xor implementation for char/short/int (gcc/x86)Ivan Maidanski2016-08-181-0/+81
| | | | | | | | | | * src/atomic_ops/sysdeps/gcc/x86.h [AO_DISABLE_GCC_ATOMICS] (AO_char_and_full, AO_char_or_full, AO_char_xor_full, AO_short_and_full, AO_short_or_full, AO_short_xor_full): New inline function. * src/atomic_ops/sysdeps/gcc/x86.h [AO_DISABLE_GCC_ATOMICS && !AO_T_IS_INT] (AO_int_and_full, AO_int_or_full, AO_int_xor_full): Likewise.
* Fix (delete) comment for AO_and_full (x86)Ivan Maidanski2016-08-172-2/+0
| | | | | | | | * src/atomic_ops/sysdeps/gcc/x86.h [!AO_PREFER_GENERALIZED] (AO_and_full): Remove incorrect comment (the code should work even for i386). * src/atomic_ops/sysdeps/sunc/x86.h [!AO_PREFER_GENERALIZED] (AO_and_full): Likewise.