13cab2bb3Spatrick //===-- dd_interceptors.cpp -----------------------------------------------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick
9d89ec533Spatrick #include <pthread.h>
10d89ec533Spatrick
113cab2bb3Spatrick #include "dd_rtl.h"
123cab2bb3Spatrick #include "interception/interception.h"
13d89ec533Spatrick #include "sanitizer_common/sanitizer_allocator_internal.h"
143cab2bb3Spatrick #include "sanitizer_common/sanitizer_procmaps.h"
153cab2bb3Spatrick
163cab2bb3Spatrick using namespace __dsan;
173cab2bb3Spatrick
183cab2bb3Spatrick __attribute__((tls_model("initial-exec")))
193cab2bb3Spatrick static __thread Thread *thr;
203cab2bb3Spatrick __attribute__((tls_model("initial-exec")))
213cab2bb3Spatrick static __thread volatile int initing;
223cab2bb3Spatrick static bool inited;
233cab2bb3Spatrick static uptr g_data_start;
243cab2bb3Spatrick static uptr g_data_end;
253cab2bb3Spatrick
InitThread()263cab2bb3Spatrick static bool InitThread() {
273cab2bb3Spatrick if (initing)
283cab2bb3Spatrick return false;
293cab2bb3Spatrick if (thr != 0)
303cab2bb3Spatrick return true;
313cab2bb3Spatrick initing = true;
323cab2bb3Spatrick if (!inited) {
333cab2bb3Spatrick inited = true;
343cab2bb3Spatrick Initialize();
353cab2bb3Spatrick }
363cab2bb3Spatrick thr = (Thread*)InternalAlloc(sizeof(*thr));
373cab2bb3Spatrick internal_memset(thr, 0, sizeof(*thr));
383cab2bb3Spatrick ThreadInit(thr);
393cab2bb3Spatrick initing = false;
403cab2bb3Spatrick return true;
413cab2bb3Spatrick }
423cab2bb3Spatrick
INTERCEPTOR(int,pthread_mutex_destroy,pthread_mutex_t * m)433cab2bb3Spatrick INTERCEPTOR(int, pthread_mutex_destroy, pthread_mutex_t *m) {
443cab2bb3Spatrick InitThread();
453cab2bb3Spatrick MutexDestroy(thr, (uptr)m);
463cab2bb3Spatrick return REAL(pthread_mutex_destroy)(m);
473cab2bb3Spatrick }
483cab2bb3Spatrick
INTERCEPTOR(int,pthread_mutex_lock,pthread_mutex_t * m)493cab2bb3Spatrick INTERCEPTOR(int, pthread_mutex_lock, pthread_mutex_t *m) {
503cab2bb3Spatrick InitThread();
513cab2bb3Spatrick MutexBeforeLock(thr, (uptr)m, true);
523cab2bb3Spatrick int res = REAL(pthread_mutex_lock)(m);
533cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, false);
543cab2bb3Spatrick return res;
553cab2bb3Spatrick }
563cab2bb3Spatrick
INTERCEPTOR(int,pthread_mutex_trylock,pthread_mutex_t * m)573cab2bb3Spatrick INTERCEPTOR(int, pthread_mutex_trylock, pthread_mutex_t *m) {
583cab2bb3Spatrick InitThread();
593cab2bb3Spatrick int res = REAL(pthread_mutex_trylock)(m);
603cab2bb3Spatrick if (res == 0)
613cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, true);
623cab2bb3Spatrick return res;
633cab2bb3Spatrick }
643cab2bb3Spatrick
INTERCEPTOR(int,pthread_mutex_unlock,pthread_mutex_t * m)653cab2bb3Spatrick INTERCEPTOR(int, pthread_mutex_unlock, pthread_mutex_t *m) {
663cab2bb3Spatrick InitThread();
673cab2bb3Spatrick MutexBeforeUnlock(thr, (uptr)m, true);
683cab2bb3Spatrick return REAL(pthread_mutex_unlock)(m);
693cab2bb3Spatrick }
703cab2bb3Spatrick
INTERCEPTOR(int,pthread_spin_destroy,pthread_spinlock_t * m)713cab2bb3Spatrick INTERCEPTOR(int, pthread_spin_destroy, pthread_spinlock_t *m) {
723cab2bb3Spatrick InitThread();
733cab2bb3Spatrick int res = REAL(pthread_spin_destroy)(m);
743cab2bb3Spatrick MutexDestroy(thr, (uptr)m);
753cab2bb3Spatrick return res;
763cab2bb3Spatrick }
773cab2bb3Spatrick
INTERCEPTOR(int,pthread_spin_lock,pthread_spinlock_t * m)783cab2bb3Spatrick INTERCEPTOR(int, pthread_spin_lock, pthread_spinlock_t *m) {
793cab2bb3Spatrick InitThread();
803cab2bb3Spatrick MutexBeforeLock(thr, (uptr)m, true);
813cab2bb3Spatrick int res = REAL(pthread_spin_lock)(m);
823cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, false);
833cab2bb3Spatrick return res;
843cab2bb3Spatrick }
853cab2bb3Spatrick
INTERCEPTOR(int,pthread_spin_trylock,pthread_spinlock_t * m)863cab2bb3Spatrick INTERCEPTOR(int, pthread_spin_trylock, pthread_spinlock_t *m) {
873cab2bb3Spatrick InitThread();
883cab2bb3Spatrick int res = REAL(pthread_spin_trylock)(m);
893cab2bb3Spatrick if (res == 0)
903cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, true);
913cab2bb3Spatrick return res;
923cab2bb3Spatrick }
933cab2bb3Spatrick
INTERCEPTOR(int,pthread_spin_unlock,pthread_spinlock_t * m)943cab2bb3Spatrick INTERCEPTOR(int, pthread_spin_unlock, pthread_spinlock_t *m) {
953cab2bb3Spatrick InitThread();
963cab2bb3Spatrick MutexBeforeUnlock(thr, (uptr)m, true);
973cab2bb3Spatrick return REAL(pthread_spin_unlock)(m);
983cab2bb3Spatrick }
993cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_destroy,pthread_rwlock_t * m)1003cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_destroy, pthread_rwlock_t *m) {
1013cab2bb3Spatrick InitThread();
1023cab2bb3Spatrick MutexDestroy(thr, (uptr)m);
1033cab2bb3Spatrick return REAL(pthread_rwlock_destroy)(m);
1043cab2bb3Spatrick }
1053cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_rdlock,pthread_rwlock_t * m)1063cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_rdlock, pthread_rwlock_t *m) {
1073cab2bb3Spatrick InitThread();
1083cab2bb3Spatrick MutexBeforeLock(thr, (uptr)m, false);
1093cab2bb3Spatrick int res = REAL(pthread_rwlock_rdlock)(m);
1103cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, false, false);
1113cab2bb3Spatrick return res;
1123cab2bb3Spatrick }
1133cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_tryrdlock,pthread_rwlock_t * m)1143cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_tryrdlock, pthread_rwlock_t *m) {
1153cab2bb3Spatrick InitThread();
1163cab2bb3Spatrick int res = REAL(pthread_rwlock_tryrdlock)(m);
1173cab2bb3Spatrick if (res == 0)
1183cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, false, true);
1193cab2bb3Spatrick return res;
1203cab2bb3Spatrick }
1213cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_timedrdlock,pthread_rwlock_t * m,const timespec * abstime)1223cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_timedrdlock, pthread_rwlock_t *m,
1233cab2bb3Spatrick const timespec *abstime) {
1243cab2bb3Spatrick InitThread();
1253cab2bb3Spatrick int res = REAL(pthread_rwlock_timedrdlock)(m, abstime);
1263cab2bb3Spatrick if (res == 0)
1273cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, false, true);
1283cab2bb3Spatrick return res;
1293cab2bb3Spatrick }
1303cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_wrlock,pthread_rwlock_t * m)1313cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_wrlock, pthread_rwlock_t *m) {
1323cab2bb3Spatrick InitThread();
1333cab2bb3Spatrick MutexBeforeLock(thr, (uptr)m, true);
1343cab2bb3Spatrick int res = REAL(pthread_rwlock_wrlock)(m);
1353cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, false);
1363cab2bb3Spatrick return res;
1373cab2bb3Spatrick }
1383cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_trywrlock,pthread_rwlock_t * m)1393cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_trywrlock, pthread_rwlock_t *m) {
1403cab2bb3Spatrick InitThread();
1413cab2bb3Spatrick int res = REAL(pthread_rwlock_trywrlock)(m);
1423cab2bb3Spatrick if (res == 0)
1433cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, true);
1443cab2bb3Spatrick return res;
1453cab2bb3Spatrick }
1463cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_timedwrlock,pthread_rwlock_t * m,const timespec * abstime)1473cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_timedwrlock, pthread_rwlock_t *m,
1483cab2bb3Spatrick const timespec *abstime) {
1493cab2bb3Spatrick InitThread();
1503cab2bb3Spatrick int res = REAL(pthread_rwlock_timedwrlock)(m, abstime);
1513cab2bb3Spatrick if (res == 0)
1523cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, true);
1533cab2bb3Spatrick return res;
1543cab2bb3Spatrick }
1553cab2bb3Spatrick
INTERCEPTOR(int,pthread_rwlock_unlock,pthread_rwlock_t * m)1563cab2bb3Spatrick INTERCEPTOR(int, pthread_rwlock_unlock, pthread_rwlock_t *m) {
1573cab2bb3Spatrick InitThread();
1583cab2bb3Spatrick MutexBeforeUnlock(thr, (uptr)m, true); // note: not necessary write unlock
1593cab2bb3Spatrick return REAL(pthread_rwlock_unlock)(m);
1603cab2bb3Spatrick }
1613cab2bb3Spatrick
init_cond(pthread_cond_t * c,bool force=false)1623cab2bb3Spatrick static pthread_cond_t *init_cond(pthread_cond_t *c, bool force = false) {
1633cab2bb3Spatrick atomic_uintptr_t *p = (atomic_uintptr_t*)c;
1643cab2bb3Spatrick uptr cond = atomic_load(p, memory_order_acquire);
1653cab2bb3Spatrick if (!force && cond != 0)
1663cab2bb3Spatrick return (pthread_cond_t*)cond;
167d89ec533Spatrick void *newcond = InternalAlloc(sizeof(pthread_cond_t));
1683cab2bb3Spatrick internal_memset(newcond, 0, sizeof(pthread_cond_t));
1693cab2bb3Spatrick if (atomic_compare_exchange_strong(p, &cond, (uptr)newcond,
1703cab2bb3Spatrick memory_order_acq_rel))
1713cab2bb3Spatrick return (pthread_cond_t*)newcond;
172d89ec533Spatrick InternalFree(newcond);
1733cab2bb3Spatrick return (pthread_cond_t*)cond;
1743cab2bb3Spatrick }
1753cab2bb3Spatrick
INTERCEPTOR(int,pthread_cond_init,pthread_cond_t * c,const pthread_condattr_t * a)1763cab2bb3Spatrick INTERCEPTOR(int, pthread_cond_init, pthread_cond_t *c,
1773cab2bb3Spatrick const pthread_condattr_t *a) {
1783cab2bb3Spatrick InitThread();
1793cab2bb3Spatrick pthread_cond_t *cond = init_cond(c, true);
1803cab2bb3Spatrick return REAL(pthread_cond_init)(cond, a);
1813cab2bb3Spatrick }
1823cab2bb3Spatrick
INTERCEPTOR(int,pthread_cond_wait,pthread_cond_t * c,pthread_mutex_t * m)1833cab2bb3Spatrick INTERCEPTOR(int, pthread_cond_wait, pthread_cond_t *c, pthread_mutex_t *m) {
1843cab2bb3Spatrick InitThread();
1853cab2bb3Spatrick pthread_cond_t *cond = init_cond(c);
1863cab2bb3Spatrick MutexBeforeUnlock(thr, (uptr)m, true);
1873cab2bb3Spatrick MutexBeforeLock(thr, (uptr)m, true);
1883cab2bb3Spatrick int res = REAL(pthread_cond_wait)(cond, m);
1893cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, false);
1903cab2bb3Spatrick return res;
1913cab2bb3Spatrick }
1923cab2bb3Spatrick
INTERCEPTOR(int,pthread_cond_timedwait,pthread_cond_t * c,pthread_mutex_t * m,const timespec * abstime)1933cab2bb3Spatrick INTERCEPTOR(int, pthread_cond_timedwait, pthread_cond_t *c, pthread_mutex_t *m,
1943cab2bb3Spatrick const timespec *abstime) {
1953cab2bb3Spatrick InitThread();
1963cab2bb3Spatrick pthread_cond_t *cond = init_cond(c);
1973cab2bb3Spatrick MutexBeforeUnlock(thr, (uptr)m, true);
1983cab2bb3Spatrick MutexBeforeLock(thr, (uptr)m, true);
1993cab2bb3Spatrick int res = REAL(pthread_cond_timedwait)(cond, m, abstime);
2003cab2bb3Spatrick MutexAfterLock(thr, (uptr)m, true, false);
2013cab2bb3Spatrick return res;
2023cab2bb3Spatrick }
2033cab2bb3Spatrick
INTERCEPTOR(int,pthread_cond_signal,pthread_cond_t * c)2043cab2bb3Spatrick INTERCEPTOR(int, pthread_cond_signal, pthread_cond_t *c) {
2053cab2bb3Spatrick InitThread();
2063cab2bb3Spatrick pthread_cond_t *cond = init_cond(c);
2073cab2bb3Spatrick return REAL(pthread_cond_signal)(cond);
2083cab2bb3Spatrick }
2093cab2bb3Spatrick
INTERCEPTOR(int,pthread_cond_broadcast,pthread_cond_t * c)2103cab2bb3Spatrick INTERCEPTOR(int, pthread_cond_broadcast, pthread_cond_t *c) {
2113cab2bb3Spatrick InitThread();
2123cab2bb3Spatrick pthread_cond_t *cond = init_cond(c);
2133cab2bb3Spatrick return REAL(pthread_cond_broadcast)(cond);
2143cab2bb3Spatrick }
2153cab2bb3Spatrick
INTERCEPTOR(int,pthread_cond_destroy,pthread_cond_t * c)2163cab2bb3Spatrick INTERCEPTOR(int, pthread_cond_destroy, pthread_cond_t *c) {
2173cab2bb3Spatrick InitThread();
2183cab2bb3Spatrick pthread_cond_t *cond = init_cond(c);
2193cab2bb3Spatrick int res = REAL(pthread_cond_destroy)(cond);
220d89ec533Spatrick InternalFree(cond);
2213cab2bb3Spatrick atomic_store((atomic_uintptr_t*)c, 0, memory_order_relaxed);
2223cab2bb3Spatrick return res;
2233cab2bb3Spatrick }
2243cab2bb3Spatrick
2253cab2bb3Spatrick // for symbolizer
INTERCEPTOR(char *,realpath,const char * path,char * resolved_path)2263cab2bb3Spatrick INTERCEPTOR(char*, realpath, const char *path, char *resolved_path) {
2273cab2bb3Spatrick InitThread();
2283cab2bb3Spatrick return REAL(realpath)(path, resolved_path);
2293cab2bb3Spatrick }
2303cab2bb3Spatrick
INTERCEPTOR(SSIZE_T,read,int fd,void * ptr,SIZE_T count)2313cab2bb3Spatrick INTERCEPTOR(SSIZE_T, read, int fd, void *ptr, SIZE_T count) {
2323cab2bb3Spatrick InitThread();
2333cab2bb3Spatrick return REAL(read)(fd, ptr, count);
2343cab2bb3Spatrick }
2353cab2bb3Spatrick
INTERCEPTOR(SSIZE_T,pread,int fd,void * ptr,SIZE_T count,OFF_T offset)2363cab2bb3Spatrick INTERCEPTOR(SSIZE_T, pread, int fd, void *ptr, SIZE_T count, OFF_T offset) {
2373cab2bb3Spatrick InitThread();
2383cab2bb3Spatrick return REAL(pread)(fd, ptr, count, offset);
2393cab2bb3Spatrick }
2403cab2bb3Spatrick
2413cab2bb3Spatrick extern "C" {
__dsan_before_mutex_lock(uptr m,int writelock)2423cab2bb3Spatrick void __dsan_before_mutex_lock(uptr m, int writelock) {
2433cab2bb3Spatrick if (!InitThread())
2443cab2bb3Spatrick return;
2453cab2bb3Spatrick MutexBeforeLock(thr, m, writelock);
2463cab2bb3Spatrick }
2473cab2bb3Spatrick
__dsan_after_mutex_lock(uptr m,int writelock,int trylock)2483cab2bb3Spatrick void __dsan_after_mutex_lock(uptr m, int writelock, int trylock) {
2493cab2bb3Spatrick if (!InitThread())
2503cab2bb3Spatrick return;
2513cab2bb3Spatrick MutexAfterLock(thr, m, writelock, trylock);
2523cab2bb3Spatrick }
2533cab2bb3Spatrick
__dsan_before_mutex_unlock(uptr m,int writelock)2543cab2bb3Spatrick void __dsan_before_mutex_unlock(uptr m, int writelock) {
2553cab2bb3Spatrick if (!InitThread())
2563cab2bb3Spatrick return;
2573cab2bb3Spatrick MutexBeforeUnlock(thr, m, writelock);
2583cab2bb3Spatrick }
2593cab2bb3Spatrick
__dsan_mutex_destroy(uptr m)2603cab2bb3Spatrick void __dsan_mutex_destroy(uptr m) {
2613cab2bb3Spatrick if (!InitThread())
2623cab2bb3Spatrick return;
2633cab2bb3Spatrick // if (m >= g_data_start && m < g_data_end)
2643cab2bb3Spatrick // return;
2653cab2bb3Spatrick MutexDestroy(thr, m);
2663cab2bb3Spatrick }
2673cab2bb3Spatrick } // extern "C"
2683cab2bb3Spatrick
2693cab2bb3Spatrick namespace __dsan {
2703cab2bb3Spatrick
InitDataSeg()2713cab2bb3Spatrick static void InitDataSeg() {
2723cab2bb3Spatrick MemoryMappingLayout proc_maps(true);
2733cab2bb3Spatrick char name[128];
2743cab2bb3Spatrick MemoryMappedSegment segment(name, ARRAY_SIZE(name));
2753cab2bb3Spatrick bool prev_is_data = false;
2763cab2bb3Spatrick while (proc_maps.Next(&segment)) {
2773cab2bb3Spatrick bool is_data = segment.offset != 0 && segment.filename[0] != 0;
2783cab2bb3Spatrick // BSS may get merged with [heap] in /proc/self/maps. This is not very
2793cab2bb3Spatrick // reliable.
2803cab2bb3Spatrick bool is_bss = segment.offset == 0 &&
2813cab2bb3Spatrick (segment.filename[0] == 0 ||
2823cab2bb3Spatrick internal_strcmp(segment.filename, "[heap]") == 0) &&
2833cab2bb3Spatrick prev_is_data;
2843cab2bb3Spatrick if (g_data_start == 0 && is_data) g_data_start = segment.start;
2853cab2bb3Spatrick if (is_bss) g_data_end = segment.end;
2863cab2bb3Spatrick prev_is_data = is_data;
2873cab2bb3Spatrick }
288*810390e3Srobert VPrintf(1, "guessed data_start=0x%zx data_end=0x%zx\n", g_data_start,
289*810390e3Srobert g_data_end);
2903cab2bb3Spatrick CHECK_LT(g_data_start, g_data_end);
2913cab2bb3Spatrick CHECK_GE((uptr)&g_data_start, g_data_start);
2923cab2bb3Spatrick CHECK_LT((uptr)&g_data_start, g_data_end);
2933cab2bb3Spatrick }
2943cab2bb3Spatrick
InitializeInterceptors()2953cab2bb3Spatrick void InitializeInterceptors() {
2963cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_mutex_destroy);
2973cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_mutex_lock);
2983cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_mutex_trylock);
2993cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_mutex_unlock);
3003cab2bb3Spatrick
3013cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_spin_destroy);
3023cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_spin_lock);
3033cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_spin_trylock);
3043cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_spin_unlock);
3053cab2bb3Spatrick
3063cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_destroy);
3073cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_rdlock);
3083cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_tryrdlock);
3093cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_timedrdlock);
3103cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_wrlock);
3113cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_trywrlock);
3123cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_timedwrlock);
3133cab2bb3Spatrick INTERCEPT_FUNCTION(pthread_rwlock_unlock);
3143cab2bb3Spatrick
3153cab2bb3Spatrick INTERCEPT_FUNCTION_VER(pthread_cond_init, "GLIBC_2.3.2");
3163cab2bb3Spatrick INTERCEPT_FUNCTION_VER(pthread_cond_signal, "GLIBC_2.3.2");
3173cab2bb3Spatrick INTERCEPT_FUNCTION_VER(pthread_cond_broadcast, "GLIBC_2.3.2");
3183cab2bb3Spatrick INTERCEPT_FUNCTION_VER(pthread_cond_wait, "GLIBC_2.3.2");
3193cab2bb3Spatrick INTERCEPT_FUNCTION_VER(pthread_cond_timedwait, "GLIBC_2.3.2");
3203cab2bb3Spatrick INTERCEPT_FUNCTION_VER(pthread_cond_destroy, "GLIBC_2.3.2");
3213cab2bb3Spatrick
3223cab2bb3Spatrick // for symbolizer
3233cab2bb3Spatrick INTERCEPT_FUNCTION(realpath);
3243cab2bb3Spatrick INTERCEPT_FUNCTION(read);
3253cab2bb3Spatrick INTERCEPT_FUNCTION(pread);
3263cab2bb3Spatrick
3273cab2bb3Spatrick InitDataSeg();
3283cab2bb3Spatrick }
3293cab2bb3Spatrick
3303cab2bb3Spatrick } // namespace __dsan
331