1f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
2f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--------------------------------------------------------------------*/
3f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--- Basic definitions for all of Helgrind.                       ---*/
4f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*---                                                  hg_basics.h ---*/
5f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--------------------------------------------------------------------*/
6f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
7f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*
8f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   This file is part of Helgrind, a Valgrind tool for detecting errors
9f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   in threaded programs.
10f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
11b3a1e4bffbdbbf38304f216af405009868f43628sewardj   Copyright (C) 2007-2015 OpenWorks Ltd
12f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      info@open-works.co.uk
13f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
14f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   This program is free software; you can redistribute it and/or
15f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   modify it under the terms of the GNU General Public License as
16f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   published by the Free Software Foundation; either version 2 of the
17f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   License, or (at your option) any later version.
18f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
19f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   This program is distributed in the hope that it will be useful, but
20f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
21f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   General Public License for more details.
23f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
24f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   You should have received a copy of the GNU General Public License
25f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   along with this program; if not, write to the Free Software
26f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   02111-1307, USA.
28f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
29f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   The GNU General Public License is contained in the file COPYING.
30f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj*/
31f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
32f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#ifndef __HG_BASICS_H
33f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define __HG_BASICS_H
34f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
35f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
36f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*----------------------------------------------------------------*/
37f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--- Very basic stuff                                         ---*/
38f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*----------------------------------------------------------------*/
39f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
40f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define HG_(str) VGAPPEND(vgHelgrind_,str)
41f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
4219f91bbaedb4caef8a60ce94b0f507193cc0bc10florianvoid*  HG_(zalloc) ( const HChar* cc, SizeT n );
4319f91bbaedb4caef8a60ce94b0f507193cc0bc10florianvoid   HG_(free)   ( void* p );
4419f91bbaedb4caef8a60ce94b0f507193cc0bc10florianHChar* HG_(strdup) ( const HChar* cc, const HChar* s );
45f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
46f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjstatic inline Bool HG_(is_sane_ThreadId) ( ThreadId coretid ) {
47f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   return coretid >= 0 && coretid < VG_N_THREADS;
48f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj}
49f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
50f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
51f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*----------------------------------------------------------------*/
52f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--- Command line options                                     ---*/
53f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*----------------------------------------------------------------*/
54f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
55f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/* Flags for controlling for which events sanity checking is done */
56f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define SCE_THREADS  (1<<0)  // Sanity check at thread create/join
57f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define SCE_LOCKS    (1<<1)  // Sanity check at lock events
58f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define SCE_BIGRANGE (1<<2)  // Sanity check at big mem range events
59f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define SCE_ACCESS   (1<<3)  // Sanity check at mem accesses
60f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define SCE_LAOG     (1<<4)  // Sanity check at significant LAOG events
61f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
62f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#define SCE_BIGRANGE_T 256  // big mem range minimum size
63f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
64f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
65f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/* Enable/disable lock order checking.  Sometimes it produces a lot of
66f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   errors, possibly genuine, which nevertheless can be very
67f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   annoying. */
68f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Bool HG_(clo_track_lockorders);
69f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
70f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/* When comparing race errors for equality, should the race address be
71f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   taken into account?  For users, no, but for verification purposes
72f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   (regtesting) this is sometimes important. */
73f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Bool HG_(clo_cmp_race_err_addrs);
74f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
7523f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj/* Controls how much history to collect, in order to show conflicting
7623f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj   accesses.  There are three levels:
7723f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj
7823f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj   0: "none": don't collect any history.  Fastest, but means we can
7923f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      only show one of the two stacks in a race.
8023f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj
81f386139a0c24629ecf3dbaa8825a02f499d177e1sewardj   1: "approx": collect one stack trace per (notional) segment, that
8223f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      is, collect a stack trace for a thread every time its vector
83ad4e979f408239dabbaae955d8ffcb84a51a5c85florian      clock changes.  This facilitates showing the bounds of the
8423f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      conflicting segment(s), with relatively small overhead.
8523f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj
8623f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj   2: "full": collect a stack trace every time the constraints for a
8723f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      location change.  This facilitates showing both stack traces in
8823f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      a race, although can be very expensive in time and space
8923f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      (depends on the rate that threads "drag" locations across
9023f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      vector-clock-change boundaries ("dragovers").  This involves
9123f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      collecting and storing large numbers of call stacks just in case
9223f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      we might need to show them later, and so is expensive (although
9323f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj      very useful). */
9423f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardjextern UWord HG_(clo_history_level);
9523f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj
9623f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj/* When doing "full" history collection, this determines the size of
9723f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj   the conflicting-access cache, measured in terms of maximum possible
9823f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj   number of elements in the previous-access map.  Must be between 10k
9923f1200ba3aa3d8dbb484626ba1bdb7cfcf3b3a9sewardj   amd 10 million.  Default is 1 million. */
100849b0ed71673805c5bdc3e44b1743a3d2c1b513dsewardjextern UWord HG_(clo_conflict_cache_size);
101f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
102f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/* Sanity check level.  This is an or-ing of
103f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   SCE_{THREADS,LOCKS,BIGRANGE,ACCESS,LAOG}. */
1045e5cb009574352880f1bc530e1a73ddaae5003fcflorianextern UWord HG_(clo_sanity_flags);
105f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
106622fe49b55cb60d6132bb100236f591de1515146sewardj/* Treat heap frees as if the memory was written immediately prior to
107622fe49b55cb60d6132bb100236f591de1515146sewardj   the free.  This shakes out races in which memory is referenced by
108622fe49b55cb60d6132bb100236f591de1515146sewardj   one thread, and freed by another, and there's no observable
109622fe49b55cb60d6132bb100236f591de1515146sewardj   synchronisation event to guarantee that the reference happens
110622fe49b55cb60d6132bb100236f591de1515146sewardj   before the free. */
111622fe49b55cb60d6132bb100236f591de1515146sewardjextern Bool HG_(clo_free_is_write);
112f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
113ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj/* Controls the application of VTS pruning.  There are three levels:
114ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj
115ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj   0: "never": VTS pruning is never done
116ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj
117ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj   1: "auto": (the default): VTS pruning is sometimes done after VTS
118ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj      GCs, just frequently enough to keep space use under control, as
119ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj      determined by heuristics in libhb_core.c.
120ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj
121ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj   2: "always": VTS pruning is done after every VTS GC.  This is
122ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj      mostly a big time waster, but minimises space use. */
123ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardjextern UWord HG_(clo_vts_pruning);
124ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj
125ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj/* When False, race checking ignores memory references which are to
126ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj   the stack, which speeds things up a bit.  Default: True. */
127ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardjextern Bool HG_(clo_check_stack_refs);
128ffce8159a95134f0a2bc1cea3c3e6e265f096d9fsewardj
129f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj#endif /* ! __HG_BASICS_H */
130f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
131f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--------------------------------------------------------------------*/
132f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--- end                                              hg_basics.h ---*/
133f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj/*--------------------------------------------------------------------*/
134