2019-11-18 08:23:31 +08:00
|
|
|
/*
|
|
|
|
* lock-unrelated.c -- Archer testcase
|
|
|
|
*/
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
//
|
|
|
|
// See tools/archer/LICENSE.txt for details.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
// RUN: %libarcher-compile-and-run-race | FileCheck %s
|
[OpenMP][Tool] Add Archer option to disable data race analysis for sequential part
This introduces the new `ARCHER_OPTIONS` flag `ignore_serial=0|1` to disable
analysis and logging of memory accesses in the sequential part of the OpenMP
application.
In the sequential part of an OpenMP program no data race is possible, unless
there is non-OpenMP concurrency (such as pthreads, MPI, ...). For the latter
reason, this is not active by default.
Besides reducing the runtime overhead for the sequential part of the program,
this reduces the memory overhead for sequential initialization. In combination
with `flush_shadow=1` this can allow analysis of applications, which run close
to the limit of available memory, but only access smaller parts of shared
memory during each OpenMP parallel region.
A problem for this approach is that Archer only gets active, when the OpenMP
runtime gets initialized, which might be after serial initialization of the
application. In such case, it helps to call for example `omp_get_max_threads()`
at the beginning of main.
Differential Revision: https://reviews.llvm.org/D90473
2020-11-02 23:34:46 +08:00
|
|
|
// RUN: %libarcher-compile-and-run-race-noserial | FileCheck %s
|
2019-11-23 00:10:48 +08:00
|
|
|
// REQUIRES: tsan
|
2019-11-18 08:23:31 +08:00
|
|
|
#include <omp.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
int var = 0;
|
|
|
|
|
|
|
|
omp_lock_t lock;
|
|
|
|
omp_init_lock(&lock);
|
|
|
|
|
2021-07-29 23:54:01 +08:00
|
|
|
#pragma omp parallel num_threads(8) shared(var)
|
2019-11-18 08:23:31 +08:00
|
|
|
{
|
|
|
|
omp_set_lock(&lock);
|
|
|
|
// Dummy locking.
|
|
|
|
omp_unset_lock(&lock);
|
|
|
|
|
|
|
|
var++;
|
|
|
|
}
|
|
|
|
|
|
|
|
omp_destroy_lock(&lock);
|
|
|
|
|
|
|
|
int error = (var != 2);
|
|
|
|
fprintf(stderr, "DONE\n");
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: WARNING: ThreadSanitizer: data race
|
|
|
|
// CHECK-NEXT: {{(Write|Read)}} of size 4
|
|
|
|
// CHECK-NEXT: #0 {{.*}}lock-unrelated.c:31
|
|
|
|
// CHECK: Previous write of size 4
|
|
|
|
// CHECK-NEXT: #0 {{.*}}lock-unrelated.c:31
|
|
|
|
// CHECK: DONE
|
|
|
|
// CHECK: ThreadSanitizer: reported 1 warnings
|