15de29a4bSNico Weber //===-- tsan_bench.cpp ----------------------------------------------------===//
25de29a4bSNico Weber //
35de29a4bSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45de29a4bSNico Weber // See https://llvm.org/LICENSE.txt for license information.
55de29a4bSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65de29a4bSNico Weber //
75de29a4bSNico Weber //===----------------------------------------------------------------------===//
85de29a4bSNico Weber //
95de29a4bSNico Weber // This file is a part of ThreadSanitizer (TSan), a race detector.
105de29a4bSNico Weber //
115de29a4bSNico Weber //===----------------------------------------------------------------------===//
125de29a4bSNico Weber #include "tsan_test_util.h"
135de29a4bSNico Weber #include "tsan_interface.h"
145de29a4bSNico Weber #include "tsan_defs.h"
155de29a4bSNico Weber #include "gtest/gtest.h"
165de29a4bSNico Weber #include <stdint.h>
175de29a4bSNico Weber 
185de29a4bSNico Weber const int kSize = 128;
195de29a4bSNico Weber const int kRepeat = 2*1024*1024;
205de29a4bSNico Weber 
noinstr(void * p)215de29a4bSNico Weber void noinstr(void *p) {}
225de29a4bSNico Weber 
235de29a4bSNico Weber template<typename T, void(*__tsan_mop)(void *p)>
Benchmark()245de29a4bSNico Weber static void Benchmark() {
255de29a4bSNico Weber   volatile T data[kSize];
265de29a4bSNico Weber   for (int i = 0; i < kRepeat; i++) {
275de29a4bSNico Weber     for (int j = 0; j < kSize; j++) {
285de29a4bSNico Weber       __tsan_mop((void*)&data[j]);
295de29a4bSNico Weber       data[j]++;
305de29a4bSNico Weber     }
315de29a4bSNico Weber   }
325de29a4bSNico Weber }
335de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop1)345de29a4bSNico Weber TEST(DISABLED_BENCH, Mop1) {
355de29a4bSNico Weber   Benchmark<uint8_t, noinstr>();
365de29a4bSNico Weber }
375de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop1Read)385de29a4bSNico Weber TEST(DISABLED_BENCH, Mop1Read) {
395de29a4bSNico Weber   Benchmark<uint8_t, __tsan_read1>();
405de29a4bSNico Weber }
415de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop1Write)425de29a4bSNico Weber TEST(DISABLED_BENCH, Mop1Write) {
435de29a4bSNico Weber   Benchmark<uint8_t, __tsan_write1>();
445de29a4bSNico Weber }
455de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop2)465de29a4bSNico Weber TEST(DISABLED_BENCH, Mop2) {
475de29a4bSNico Weber   Benchmark<uint16_t, noinstr>();
485de29a4bSNico Weber }
495de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop2Read)505de29a4bSNico Weber TEST(DISABLED_BENCH, Mop2Read) {
515de29a4bSNico Weber   Benchmark<uint16_t, __tsan_read2>();
525de29a4bSNico Weber }
535de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop2Write)545de29a4bSNico Weber TEST(DISABLED_BENCH, Mop2Write) {
555de29a4bSNico Weber   Benchmark<uint16_t, __tsan_write2>();
565de29a4bSNico Weber }
575de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop4)585de29a4bSNico Weber TEST(DISABLED_BENCH, Mop4) {
595de29a4bSNico Weber   Benchmark<uint32_t, noinstr>();
605de29a4bSNico Weber }
615de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop4Read)625de29a4bSNico Weber TEST(DISABLED_BENCH, Mop4Read) {
635de29a4bSNico Weber   Benchmark<uint32_t, __tsan_read4>();
645de29a4bSNico Weber }
655de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop4Write)665de29a4bSNico Weber TEST(DISABLED_BENCH, Mop4Write) {
675de29a4bSNico Weber   Benchmark<uint32_t, __tsan_write4>();
685de29a4bSNico Weber }
695de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop8)705de29a4bSNico Weber TEST(DISABLED_BENCH, Mop8) {
715de29a4bSNico Weber   Benchmark<uint8_t, noinstr>();
725de29a4bSNico Weber }
735de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop8Read)745de29a4bSNico Weber TEST(DISABLED_BENCH, Mop8Read) {
755de29a4bSNico Weber   Benchmark<uint64_t, __tsan_read8>();
765de29a4bSNico Weber }
775de29a4bSNico Weber 
TEST(DISABLED_BENCH,Mop8Write)785de29a4bSNico Weber TEST(DISABLED_BENCH, Mop8Write) {
795de29a4bSNico Weber   Benchmark<uint64_t, __tsan_write8>();
805de29a4bSNico Weber }
815de29a4bSNico Weber 
TEST(DISABLED_BENCH,FuncCall)825de29a4bSNico Weber TEST(DISABLED_BENCH, FuncCall) {
835de29a4bSNico Weber   for (int i = 0; i < kRepeat; i++) {
845de29a4bSNico Weber     for (int j = 0; j < kSize; j++)
855de29a4bSNico Weber       __tsan_func_entry((void*)(uintptr_t)j);
865de29a4bSNico Weber     for (int j = 0; j < kSize; j++)
875de29a4bSNico Weber       __tsan_func_exit();
885de29a4bSNico Weber   }
895de29a4bSNico Weber }
905de29a4bSNico Weber 
TEST(DISABLED_BENCH,MutexLocal)915de29a4bSNico Weber TEST(DISABLED_BENCH, MutexLocal) {
92*cfed8d0fSDmitry Vyukov   UserMutex m;
935de29a4bSNico Weber   ScopedThread().Create(m);
945de29a4bSNico Weber   for (int i = 0; i < 50; i++) {
955de29a4bSNico Weber     ScopedThread t;
965de29a4bSNico Weber     t.Lock(m);
975de29a4bSNico Weber     t.Unlock(m);
985de29a4bSNico Weber   }
995de29a4bSNico Weber   for (int i = 0; i < 16*1024*1024; i++) {
1005de29a4bSNico Weber     m.Lock();
1015de29a4bSNico Weber     m.Unlock();
1025de29a4bSNico Weber   }
1035de29a4bSNico Weber   ScopedThread().Destroy(m);
1045de29a4bSNico Weber }
105