language-c icon indicating copy to clipboard operation
language-c copied to clipboard

Add support for GCC legacy __sync_XXX builtins

Open lambdageek opened this issue 8 years ago • 1 comments

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 long or their unsigned counterparts. GCC allows any scalar type that is 1, 2, 4 or 8 bytes in size other than the C type _Bool or the C++ type bool. Operations on pointer arguments are performed as if the operands were of the uintptr_t type. 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, ...)

lambdageek avatar Feb 14 '17 23:02 lambdageek

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).

lambdageek avatar Feb 17 '17 18:02 lambdageek