https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68260
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Dmitry Vyukov from comment #1) > gcc does not instrument atomic operations: > > 00000000004a73d0 <_ZN4spin6unlockEv>: > > void unlock() { flag.clear(std::memory_order_release); } > 4a73d0: 55 push %rbp > 4a73d1: 48 89 e5 mov %rsp,%rbp > 4a73d4: 48 83 ec 10 sub $0x10,%rsp > 4a73d8: 48 8b 45 08 mov 0x8(%rbp),%rax > 4a73dc: 48 89 7d f0 mov %rdi,-0x10(%rbp) > 4a73e0: 48 89 c7 mov %rax,%rdi > 4a73e3: e8 68 4f fd ff callq 47c350 <__tsan_func_entry> > 4a73e8: be 03 00 00 00 mov $0x3,%esi > 4a73ed: 48 8b 45 f0 mov -0x10(%rbp),%rax > 4a73f1: 48 89 45 f8 mov %rax,-0x8(%rbp) > 4a73f5: 48 8b 7d f8 mov -0x8(%rbp),%rdi > 4a73f9: e8 62 02 00 00 callq 4a7660 > <_ZNSt11atomic_flag5clearESt12memory_order> > 4a73fe: e8 fd 4f fd ff callq 47c400 <__tsan_func_exit> > 4a7403: 48 83 c4 10 add $0x10,%rsp > 4a7407: 5d pop %rbp > 4a7408: c3 retq > > > > FWIW this programs works fine with clang. Actually I wonder if _ZNSt11atomic_flag5clearESt12memory_order is instrumented but the one being chose by the linker is not. ODR issues :)