How to disable built-in?


When building Berkeley DB (checked 4.8.30 and 5.1.25) with clang (trunk) I got the following error:

In file included from /export/home/sbn/thd/25/src/thirdparty/BerkeleyDB/5.1.25/src/src/mutex/mut_pthread.c:11:
In file included from ./db_int.h:999:
In file included from /export/home/sbn/thd/25/src/thirdparty/BerkeleyDB/5.1.25/src/src/dbinc/mutex.h:15:
In file included from /export/home/sbn/thd/25/src/thirdparty/BerkeleyDB/5.1.25/src/src/dbinc/mutex_int.h:12:
/export/home/sbn/thd/25/src/thirdparty/BerkeleyDB/5.1.25/src/src/dbinc/atomic.h:179:19: error: definition of builtin function '__atomic_compare_exchange'
static inline int __atomic_compare_exchange(
1 error generated.

AFAIU this built-in was added rather recently since I was able to build it with clang a month or so ago.

Is there any way to disable this built-in?
'-fno-builtin' doesn't help.

(Yes, I know that it's bad idea to start identifiers with underscores)

This builtin is also present in GCC 4.7. I suspect that the code brackets it in a version check that tests for a GCC version >= 4.7. Since clang reports the GCC version 4.2, this will fail.

The correct fix is to wrap the check in !__has_builtin(__atomic_compare_exchange), rather than a specific compiler version. A more hacky work-around would be to #undef the GCC version macros before including this header and re#define them as gcc 4.7.


No, in fact it has brackets for (X86 AND GCC):

/* x86/x86_64 gcc */
  * x86/gcc Compare exchange for shared latches. i486+
  * Returns 1 for success, 0 for failure

So what is the solution to this?
I have out of tree backend with:
  setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i32, Expand);

Now i am trying to compile the actual implementation with clang :

int32_t __sync_fetch_and_sub_4 (volatile int32_t *ptr, int32_t value, ...)

I get:
    definition of builtin function '__sync_fetch_and_sub_4'

'-fno-builtin' doesn't help..

How is it possible to compile the builtins implementation with clang?

Well, I go the easy way and just renamed this function, but AFAIU this won’t work in your case.