1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_interface.cc -------------------------------------------------===// 27ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 37ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// The LLVM Compiler Infrastructure 47ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 57ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is distributed under the University of Illinois Open Source 67ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// License. See LICENSE.TXT for details. 77ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 87ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===// 97ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 107ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector. 117ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 127ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===// 137ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 147ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#include "tsan_interface.h" 157ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#include "tsan_interface_ann.h" 167ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#include "tsan_rtl.h" 178ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov#include "sanitizer_common/sanitizer_internal_defs.h" 187ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 197ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#define CALLERPC ((uptr)__builtin_return_address(0)) 207ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 217ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyusing namespace __tsan; // NOLINT 227ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 238ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovtypedef u16 uint16_t; 248ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovtypedef u32 uint32_t; 258ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovtypedef u64 uint64_t; 268ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 277ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_init() { 287ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany Initialize(cur_thread()); 297ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 307ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 317ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_read16(void *addr) { 32334553ec45d8982df45a6f5e656e068142ecde3fDmitry Vyukov MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog8); 33334553ec45d8982df45a6f5e656e068142ecde3fDmitry Vyukov MemoryRead(cur_thread(), CALLERPC, (uptr)addr + 8, kSizeLog8); 347ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 357ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 367ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_write16(void *addr) { 37334553ec45d8982df45a6f5e656e068142ecde3fDmitry Vyukov MemoryWrite(cur_thread(), CALLERPC, (uptr)addr, kSizeLog8); 38334553ec45d8982df45a6f5e656e068142ecde3fDmitry Vyukov MemoryWrite(cur_thread(), CALLERPC, (uptr)addr + 8, kSizeLog8); 397ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 407ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 412e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu16 __tsan_unaligned_read2(const uu16 *addr) { 428ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 2, false, false); 432e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov return *addr; 448ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov} 458ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 462e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu32 __tsan_unaligned_read4(const uu32 *addr) { 478ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 4, false, false); 482e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov return *addr; 498ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov} 508ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 512e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu64 __tsan_unaligned_read8(const uu64 *addr) { 528ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 8, false, false); 532e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov return *addr; 548ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov} 558ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 562e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __tsan_unaligned_write2(uu16 *addr, u16 v) { 578ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 2, true, false); 582e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov *addr = v; 598ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov} 608ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 612e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __tsan_unaligned_write4(uu32 *addr, u32 v) { 628ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 4, true, false); 632e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov *addr = v; 648ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov} 658ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 662e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __tsan_unaligned_write8(uu64 *addr, u64 v) { 678ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov UnalignedMemoryAccess(cur_thread(), CALLERPC, (uptr)addr, 8, true, false); 682e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov *addr = v; 698ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov} 708ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 718ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovextern "C" { 723c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE 738ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovuint16_t __sanitizer_unaligned_load16(void *addr) 743c80c6c574850106481f82b9e23d1c728458d4a9Timur Iskhodzhanov ALIAS("__tsan_unaligned_read2"); 753c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE 768ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovuint32_t __sanitizer_unaligned_load32(void *addr) 773c80c6c574850106481f82b9e23d1c728458d4a9Timur Iskhodzhanov ALIAS("__tsan_unaligned_read4"); 783c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE 798ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovuint64_t __sanitizer_unaligned_load64(void *addr) 803c80c6c574850106481f82b9e23d1c728458d4a9Timur Iskhodzhanov ALIAS("__tsan_unaligned_read8"); 813c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE 828ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovvoid __sanitizer_unaligned_store16(void *addr, uint16_t v) 833c80c6c574850106481f82b9e23d1c728458d4a9Timur Iskhodzhanov ALIAS("__tsan_unaligned_write2"); 843c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE 858ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovvoid __sanitizer_unaligned_store32(void *addr, uint32_t v) 863c80c6c574850106481f82b9e23d1c728458d4a9Timur Iskhodzhanov ALIAS("__tsan_unaligned_write4"); 873c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE 888ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukovvoid __sanitizer_unaligned_store64(void *addr, uint64_t v) 893c80c6c574850106481f82b9e23d1c728458d4a9Timur Iskhodzhanov ALIAS("__tsan_unaligned_write8"); 908ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov} 918ecd0e5d9f389d18653892851c6ffb2f235de4b7Dmitry Vyukov 927ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_acquire(void *addr) { 937ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany Acquire(cur_thread(), CALLERPC, (uptr)addr); 947ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 957ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 967ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_release(void *addr) { 977ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany Release(cur_thread(), CALLERPC, (uptr)addr); 987ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 99