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