language-c
language-c copied to clipboard
Add support for GCC legacy __sync_XXX builtins
From https://gcc.gnu.org/onlinedocs/gcc/_005f_005fsync-Builtins.html:
The following built-in functions are intended to be compatible with those described in the Intel Itanium Processor-specific Application Binary Interface, section 7.4. As such, they depart from normal GCC practice by not using the
‘__builtin_’prefix and also by being overloaded so that they work on multiple types.The definition given in the Intel documentation allows only for the use of the types
int,long,long longor theirunsignedcounterparts. GCC allows any scalar type that is 1, 2, 4 or 8 bytes in size other than the C type_Boolor the C++ typebool. Operations on pointer arguments are performed as if the operands were of theuintptr_ttype. That is, they are not scaled by the size of the type to which the pointer points.
They have about a dozen of these things, they look more or less like this one:
type __sync_fetch_and_add (type *ptr, type value, ...)
I've had some luck just #define-ing these things away in a header that I pass with a IncludeFile CppOption.
#define __sync_fetch_and_add(ptr,value,...) ({ typeof((ptr)) __hack_ptr = (ptr); typeof (*__hack_ptr) __hack_tmp = *__hack_ptr; *__hack_ptr += (value); __hack_tmp; })
Of course this forgets about the atomicity, but it at least gets the file parsed (if you use GNU extensions).