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