1b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov//===-- tsan_go.cc --------------------------------------------------------===// 2b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// 3b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// The LLVM Compiler Infrastructure 4b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// 5b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// This file is distributed under the University of Illinois Open Source 6b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// License. See LICENSE.TXT for details. 7b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// 8b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov//===----------------------------------------------------------------------===// 9b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// 10b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// ThreadSanitizer runtime for Go language. 11b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov// 12b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov//===----------------------------------------------------------------------===// 13b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 14b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov#include "tsan_rtl.h" 15b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov#include "tsan_symbolize.h" 16b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov#include "sanitizer_common/sanitizer_common.h" 17b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov#include <stdlib.h> 18b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 19b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukovnamespace __tsan { 20b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 21b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukovvoid InitializeInterceptors() { 22b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 23b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 24b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukovvoid InitializeDynamicAnnotations() { 25b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 26b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 27b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukovbool IsExpectedReport(uptr addr, uptr size) { 28b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov return false; 29b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 30b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *internal_start_thread(void(*func)(void*), void *arg) { 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid internal_join_thread(void *th) { 36b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 37b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 385a1f23310cc4a1debae8741653defe620518e612Dmitry VyukovReportLocation *SymbolizeData(uptr addr) { 39b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov return 0; 40b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 41b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 42c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry VyukovReportStack *NewReportStackEntry(uptr addr) { 43c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry Vyukov ReportStack *ent = (ReportStack*)internal_alloc(MBlockReportStack, 44c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry Vyukov sizeof(ReportStack)); 45c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry Vyukov internal_memset(ent, 0, sizeof(*ent)); 46c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry Vyukov ent->pc = addr; 47c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry Vyukov return ent; 48c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry Vyukov} 49c510a2f264a22ff60333fc48e5fa12d41cefba3cDmitry Vyukov 50b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukovvoid *internal_alloc(MBlockType typ, uptr sz) { 51b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov return InternalAlloc(sz); 52b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 53b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 54b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukovvoid internal_free(void *p) { 55b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov InternalFree(p); 56b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 57b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct SymbolizeContext { 592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr pc; 602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *func; 612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *file; 622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr line; 632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr off; 642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uptr res; 652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 676b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov// Callback into Go. 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void (*symbolize_cb)(SymbolizeContext *ctx); 69b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 706b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry VyukovReportStack *SymbolizeCode(uptr addr) { 716b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov ReportStack *s = (ReportStack*)internal_alloc(MBlockReportStack, 726b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov sizeof(ReportStack)); 736b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov internal_memset(s, 0, sizeof(*s)); 746b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov s->pc = addr; 752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SymbolizeContext ctx; 762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines internal_memset(&ctx, 0, sizeof(ctx)); 772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ctx.pc = addr; 782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines symbolize_cb(&ctx); 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (ctx.res) { 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s->offset = ctx.off; 812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s->func = internal_strdup(ctx.func ? ctx.func : "??"); 822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s->file = internal_strdup(ctx.file ? ctx.file : "-"); 832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s->line = ctx.line; 846b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov s->col = 0; 856b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov } 866b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov return s; 876b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 886b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 896b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukovextern "C" { 90b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 916faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovstatic ThreadState *main_thr; 922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic bool inited; 936faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov 946faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovstatic ThreadState *AllocGoroutine() { 957d15f5dc87f980d7931fbc036a0b38e2eee16718Dmitry Vyukov ThreadState *thr = (ThreadState*)internal_alloc(MBlockThreadContex, 96cb3a6b82ae406613f8870519d2acda1ee1c8f2b5Dmitry Vyukov sizeof(ThreadState)); 977d15f5dc87f980d7931fbc036a0b38e2eee16718Dmitry Vyukov internal_memset(thr, 0, sizeof(*thr)); 986faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov return thr; 99cb3a6b82ae406613f8870519d2acda1ee1c8f2b5Dmitry Vyukov} 100cb3a6b82ae406613f8870519d2acda1ee1c8f2b5Dmitry Vyukov 1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_init(ThreadState **thrp, void (*cb)(SymbolizeContext *cb)) { 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines symbolize_cb = cb; 1036faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov ThreadState *thr = AllocGoroutine(); 1046faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov main_thr = *thrp = thr; 105b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov Initialize(thr); 1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines inited = true; 107b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 108b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 109b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukovvoid __tsan_fini() { 110b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov // FIXME: Not necessary thread 0. 1116faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov ThreadState *thr = main_thr; 112b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov int res = Finalize(thr); 1131bf56b76cf08ab19800cf5a30849277bf1e084d4Dmitry Vyukov exit(res); 114b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 115b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 116a05fcc1e3e045097f2f1a20798cbe038bbb1d6a9Dmitry Vyukovvoid __tsan_map_shadow(uptr addr, uptr size) { 117a05fcc1e3e045097f2f1a20798cbe038bbb1d6a9Dmitry Vyukov MapShadow(addr, size); 118a05fcc1e3e045097f2f1a20798cbe038bbb1d6a9Dmitry Vyukov} 119a05fcc1e3e045097f2f1a20798cbe038bbb1d6a9Dmitry Vyukov 1206faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_read(ThreadState *thr, void *addr, void *pc) { 121334553ec45d8982df45a6f5e656e068142ecde3fDmitry Vyukov MemoryRead(thr, (uptr)pc, (uptr)addr, kSizeLog1); 1226b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1236b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_read_pc(ThreadState *thr, void *addr, uptr callpc, uptr pc) { 1252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (callpc != 0) 1262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FuncEntry(thr, callpc); 1272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MemoryRead(thr, (uptr)pc, (uptr)addr, kSizeLog1); 1282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (callpc != 0) 1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FuncExit(thr); 1302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1326faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_write(ThreadState *thr, void *addr, void *pc) { 133334553ec45d8982df45a6f5e656e068142ecde3fDmitry Vyukov MemoryWrite(thr, (uptr)pc, (uptr)addr, kSizeLog1); 1346b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1356b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_write_pc(ThreadState *thr, void *addr, uptr callpc, uptr pc) { 1372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (callpc != 0) 1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FuncEntry(thr, callpc); 1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MemoryWrite(thr, (uptr)pc, (uptr)addr, kSizeLog1); 1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (callpc != 0) 1412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FuncExit(thr); 1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_read_range(ThreadState *thr, void *addr, uptr size, uptr pc) { 14548cd12d0398914db195c1a25852b153f3345090dDmitry Vyukov MemoryAccessRange(thr, (uptr)pc, (uptr)addr, size, false); 1461a9cd8ddea1985ab4941a8bd2f6e20822d1e9c1dDmitry Vyukov} 1471a9cd8ddea1985ab4941a8bd2f6e20822d1e9c1dDmitry Vyukov 1482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_write_range(ThreadState *thr, void *addr, uptr size, uptr pc) { 14948cd12d0398914db195c1a25852b153f3345090dDmitry Vyukov MemoryAccessRange(thr, (uptr)pc, (uptr)addr, size, true); 1501a9cd8ddea1985ab4941a8bd2f6e20822d1e9c1dDmitry Vyukov} 1511a9cd8ddea1985ab4941a8bd2f6e20822d1e9c1dDmitry Vyukov 1526faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_func_enter(ThreadState *thr, void *pc) { 1536b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov FuncEntry(thr, (uptr)pc); 1546b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1556b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1566faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_func_exit(ThreadState *thr) { 1576b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov FuncExit(thr); 1586b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1596b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_malloc(void *p, uptr sz) { 1612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!inited) 1621bf56b76cf08ab19800cf5a30849277bf1e084d4Dmitry Vyukov return; 1632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MemoryResetRange(0, 0, (uptr)p, sz); 1646b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1656b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1666faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_go_start(ThreadState *parent, ThreadState **pthr, void *pc) { 1676faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov ThreadState *thr = AllocGoroutine(); 1686faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov *pthr = thr; 1696faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov int goid = ThreadCreate(parent, (uptr)pc, 0, true); 1706faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukov ThreadStart(thr, goid, 0); 1716b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1726b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1736faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_go_end(ThreadState *thr) { 1746b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov ThreadFinish(thr); 1757d15f5dc87f980d7931fbc036a0b38e2eee16718Dmitry Vyukov internal_free(thr); 1766b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1776b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1786faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_acquire(ThreadState *thr, void *addr) { 1796b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov Acquire(thr, 0, (uptr)addr); 1806b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1816b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1826faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_release(ThreadState *thr, void *addr) { 1839d150bdb433ddd092073dabd87ba15aa176603a1Dmitry Vyukov ReleaseStore(thr, 0, (uptr)addr); 1846b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov} 1856b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov 1866faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_release_merge(ThreadState *thr, void *addr) { 1876b2804f4a5d8891728c030e1ac93f719eaad3171Dmitry Vyukov Release(thr, 0, (uptr)addr); 188b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} 189b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov 1906faa20f2441cd845d98cb390ae2bacca908537eeDmitry Vyukovvoid __tsan_finalizer_goroutine(ThreadState *thr) { 191538f1ba8cb57cfa02d25f8f922feb00975e0a286Dmitry Vyukov AcquireGlobal(thr, 0); 1928f1104cbf1af615242e14c66d1b3dd9e8437b152Dmitry Vyukov} 1938f1104cbf1af615242e14c66d1b3dd9e8437b152Dmitry Vyukov 1945d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid __tsan_mutex_before_lock(ThreadState *thr, uptr addr, uptr write) { 1952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1975d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid __tsan_mutex_after_lock(ThreadState *thr, uptr addr, uptr write) { 1982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (write) 1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MutexLock(thr, 0, addr); 2002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines else 2012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MutexReadLock(thr, 0, addr); 2022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2045d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid __tsan_mutex_before_unlock(ThreadState *thr, uptr addr, uptr write) { 2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (write) 2062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MutexUnlock(thr, 0, addr); 2072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines else 2082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MutexReadUnlock(thr, 0, addr); 2092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 211b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} // extern "C" 212b78caa645f70eff2f037f1f8bb43ca9129dbd8d9Dmitry Vyukov} // namespace __tsan 2133086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenko 2143086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenkonamespace __sanitizer { 2153086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenko 2163086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenkovoid SymbolizerPrepareForSandboxing() { 2173086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenko // Nothing to do here for Go. 2183086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenko} 2193086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenko 2203086d7bd6456e43b6695c8356db364ade826dce3Alexander Potapenko} // namespace __sanitizer 221