GCC Middle and Back End API Reference
tsan.c File Reference
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tree.h"
#include "intl.h"
#include "tm.h"
#include "basic-block.h"
#include "gimple.h"
#include "function.h"
#include "gimple-ssa.h"
#include "cgraph.h"
#include "tree-cfg.h"
#include "tree-ssanames.h"
#include "tree-pass.h"
#include "tree-iterator.h"
#include "langhooks.h"
#include "output.h"
#include "options.h"
#include "target.h"
#include "diagnostic.h"
#include "tree-ssa-propagate.h"
#include "tsan.h"
#include "asan.h"
Include dependency graph for tsan.c:

Data Structures

struct  tsan_map_atomic

Macros

#define TRANSFORM(fcode, tsan_fcode, action, code)   { BUILT_IN_##fcode, BUILT_IN_##tsan_fcode, action, code }
#define CHECK_LAST(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, check_last, ERROR_MARK)
#define ADD_SEQ_CST(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, add_seq_cst, ERROR_MARK)
#define ADD_ACQUIRE(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, add_acquire, ERROR_MARK)
#define WEAK_CAS(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, weak_cas, ERROR_MARK)
#define STRONG_CAS(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, strong_cas, ERROR_MARK)
#define BOOL_CAS(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, bool_cas, ERROR_MARK)
#define VAL_CAS(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, val_cas, ERROR_MARK)
#define LOCK_RELEASE(fcode, tsan_fcode)   TRANSFORM (fcode, tsan_fcode, lock_release, ERROR_MARK)
#define FETCH_OP(fcode, tsan_fcode, code)   TRANSFORM (fcode, tsan_fcode, fetch_op, code)
#define FETCH_OPS(fcode, tsan_fcode, code)   TRANSFORM (fcode, tsan_fcode, fetch_op_seq_cst, code)

Enumerations

enum  tsan_atomic_action {
  check_last, add_seq_cst, add_acquire, weak_cas,
  strong_cas, bool_cas, val_cas, lock_release,
  fetch_op, fetch_op_seq_cst
}

Functions

static tree get_memory_access_decl ()
static tree is_vptr_store ()
static bool instrument_expr ()
static void instrument_builtin_call ()
static bool instrument_gimple ()
static bool instrument_memory_accesses ()
static void instrument_func_entry ()
static void instrument_func_exit ()
static unsigned tsan_pass ()
static bool tsan_gate ()
void tsan_finish_file ()
gimple_opt_passmake_pass_tsan ()
static bool tsan_gate_O0 ()
gimple_opt_passmake_pass_tsan_O0 ()

Variables

static struct tsan_map_atomic tsan_atomic_table []

Macro Definition Documentation

#define ADD_ACQUIRE (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, add_acquire, ERROR_MARK)
#define ADD_SEQ_CST (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, add_seq_cst, ERROR_MARK)
#define BOOL_CAS (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, bool_cas, ERROR_MARK)
#define CHECK_LAST (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, check_last, ERROR_MARK)
#define FETCH_OP (   fcode,
  tsan_fcode,
  code 
)    TRANSFORM (fcode, tsan_fcode, fetch_op, code)
#define FETCH_OPS (   fcode,
  tsan_fcode,
  code 
)    TRANSFORM (fcode, tsan_fcode, fetch_op_seq_cst, code)
#define LOCK_RELEASE (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, lock_release, ERROR_MARK)
#define STRONG_CAS (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, strong_cas, ERROR_MARK)
#define TRANSFORM (   fcode,
  tsan_fcode,
  action,
  code 
)    { BUILT_IN_##fcode, BUILT_IN_##tsan_fcode, action, code }
#define VAL_CAS (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, val_cas, ERROR_MARK)
#define WEAK_CAS (   fcode,
  tsan_fcode 
)    TRANSFORM (fcode, tsan_fcode, weak_cas, ERROR_MARK)

Enumeration Type Documentation

Actions for sync/atomic builtin transformations.

Enumerator:
check_last 
add_seq_cst 
add_acquire 
weak_cas 
strong_cas 
bool_cas 
val_cas 
lock_release 
fetch_op 
fetch_op_seq_cst 

Function Documentation

static tree get_memory_access_decl ( )
static

GCC instrumentation plugin for ThreadSanitizer. Copyright (C) 2011-2013 Free Software Foundation, Inc. Contributed by Dmitry Vyukov dvyuk.nosp@m.ov@g.nosp@m.oogle.nosp@m..com

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see http://www.gnu.org/licenses/. Number of instrumented memory accesses in the current function. Builds the following decl void __tsan_read/writeX (void *addr);

static bool instrument_expr ( )
static

Instruments EXPR if needed. If any instrumentation is inserted, return true.

 For now just avoid instrumenting bit field acceses.
 TODO: handle bit-fields as if touching the whole field.   
 No need to instrument accesses to decls that don't escape,
 they can't escape to other threads then.   
 Instrumentation for assignment of a function result
 must be inserted after the call.  Instrumentation for
 reads of function arguments must be inserted before the call.
 That's because the call can contain synchronization.   
     If the call can throw, it must be the last stmt in
     a basic block, so the instrumented stmts need to be
     inserted in successor bbs.   

Referenced by instrument_gimple().

static void instrument_func_entry ( )
static

Instruments function entry.

static void instrument_func_exit ( )
static

Instruments function exits.

Find all function exits.

static bool instrument_gimple ( )
static

Instruments the gimple pointed to by GSI. Return true if func entry/exit should be instrumented.

References gimple_assign_lhs(), gimple_assign_load_p(), gimple_assign_rhs1(), gimple_store_p(), and instrument_expr().

static bool instrument_memory_accesses ( )
static

Instruments all interesting memory accesses in the current function. Return true if func entry/exit should be instrumented.

References builtin_decl_implicit(), cfun, ENTRY_BLOCK_PTR, g, gimple_build_call(), gimple_call_set_lhs(), gimple_set_location(), gsi_after_labels(), gsi_insert_before(), GSI_SAME_STMT, integer_zero_node, make_ssa_name(), NULL, ptr_type_node, and single_succ().

static tree is_vptr_store ( )
static

Check as to whether EXPR refers to a store to vptr.

References DECL_VIRTUAL_P, gimple_assign_rhs1(), TREE_CODE, and TREE_OPERAND.

gimple_opt_pass* make_pass_tsan ( )
gimple_opt_pass* make_pass_tsan_O0 ( )
void tsan_finish_file ( void  )

Inserts __tsan_init () into the list of CTORs.

Referenced by emit_debug_global_declarations().

static bool tsan_gate ( )
static

The pass's gate.

References GIMPLE_PASS, and OPTGROUP_NONE.

static bool tsan_gate_O0 ( )
static

Variable Documentation

struct tsan_map_atomic tsan_atomic_table[]
static

Referenced by instrument_builtin_call().