Commit 32b4b7f5 by Dmitry Vyukov Committed by Wei Mi

builtins.def (DEF_SANITIZER_BUILTIN): Define tsan builtins.

2012-11-22  Dmitry Vyukov  <dvyukov@google.com>
	    Wei Mi  <wmi@google.com>

	* builtins.def (DEF_SANITIZER_BUILTIN): Define tsan builtins. 
	* sanitizer.def: Ditto. 
	* Makefile.in (tsan.o): Add tsan.o target. 
	(BUILTINS_DEF): Add sanitizer.def.
	* passes.c (init_optimization_passes): Add tsan passes.
	* tree-pass.h (register_pass_info): Ditto.
	* toplev.c (compile_file): Ditto. 
	* doc/invoke.texi: Document tsan related options.
	* gcc.c (LINK_COMMAND_SPEC): Add LIBTSAN_SPEC in link command if
	-fsanitize=thread.
	* tsan.c: New file about tsan.
	* tsan.h: Ditto.
	* common.opt: Add -fsanitize=thread.


Co-Authored-By: Wei Mi <wmi@google.com>

From-SVN: r193736
parent bdb6985c
2012-11-22 Dmitry Vyukov <dvyukov@google.com>
Wei Mi <wmi@google.com>
* builtins.def (DEF_SANITIZER_BUILTIN): Define tsan builtins.
* sanitizer.def: Ditto.
* Makefile.in (tsan.o): Add tsan.o target.
(BUILTINS_DEF): Add sanitizer.def.
* passes.c (init_optimization_passes): Add tsan passes.
* tree-pass.h (register_pass_info): Ditto.
* toplev.c (compile_file): Ditto.
* doc/invoke.texi: Document tsan related options.
* gcc.c (LINK_COMMAND_SPEC): Add LIBTSAN_SPEC in link command if
-fsanitize=thread.
* tsan.c: New file about tsan.
* tsan.h: Ditto.
* common.opt: Add -fsanitize=thread.
2012-11-22 Uros Bizjak <ubizjak@gmail.com> 2012-11-22 Uros Bizjak <ubizjak@gmail.com>
* doc/md.texi (RTL Templates Transformation): Use @pxref for * doc/md.texi (RTL Templates Transformation): Use @pxref for
...@@ -863,7 +863,7 @@ RTL_ERROR_H = rtl-error.h $(RTL_H) $(DIAGNOSTIC_CORE_H) ...@@ -863,7 +863,7 @@ RTL_ERROR_H = rtl-error.h $(RTL_H) $(DIAGNOSTIC_CORE_H)
READ_MD_H = $(OBSTACK_H) $(HASHTAB_H) read-md.h READ_MD_H = $(OBSTACK_H) $(HASHTAB_H) read-md.h
PARAMS_H = params.h params.def PARAMS_H = params.h params.def
BUILTINS_DEF = builtins.def sync-builtins.def omp-builtins.def \ BUILTINS_DEF = builtins.def sync-builtins.def omp-builtins.def \
gtm-builtins.def gtm-builtins.def sanitizer.def
INTERNAL_FN_DEF = internal-fn.def INTERNAL_FN_DEF = internal-fn.def
INTERNAL_FN_H = internal-fn.h $(INTERNAL_FN_DEF) INTERNAL_FN_H = internal-fn.h $(INTERNAL_FN_DEF)
TREE_H = coretypes.h tree.h all-tree.def tree.def c-family/c-common.def \ TREE_H = coretypes.h tree.h all-tree.def tree.def c-family/c-common.def \
...@@ -1365,6 +1365,7 @@ OBJS = \ ...@@ -1365,6 +1365,7 @@ OBJS = \
trans-mem.o \ trans-mem.o \
tree-affine.o \ tree-affine.o \
asan.o \ asan.o \
tsan.o \
tree-call-cdce.o \ tree-call-cdce.o \
tree-cfg.o \ tree-cfg.o \
tree-cfgcleanup.o \ tree-cfgcleanup.o \
...@@ -2228,6 +2229,12 @@ asan.o : asan.c asan.h $(CONFIG_H) $(SYSTEM_H) $(GIMPLE_H) \ ...@@ -2228,6 +2229,12 @@ asan.o : asan.c asan.h $(CONFIG_H) $(SYSTEM_H) $(GIMPLE_H) \
output.h coretypes.h $(GIMPLE_PRETTY_PRINT_H) \ output.h coretypes.h $(GIMPLE_PRETTY_PRINT_H) \
tree-iterator.h $(TREE_FLOW_H) $(TREE_PASS_H) \ tree-iterator.h $(TREE_FLOW_H) $(TREE_PASS_H) \
$(TARGET_H) $(EXPR_H) $(OPTABS_H) $(TM_P_H) $(TARGET_H) $(EXPR_H) $(OPTABS_H) $(TM_P_H)
tsan.o : $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(TREE_INLINE_H) \
$(GIMPLE_H) $(DIAGNOSTIC_H) langhooks.h \
$(TM_H) coretypes.h $(TREE_DUMP_H) $(TREE_PASS_H) $(CGRAPH_H) $(GGC_H) \
$(BASIC_BLOCK_H) $(FLAGS_H) $(FUNCTION_H) \
$(TM_P_H) $(TREE_FLOW_H) $(DIAGNOSTIC_CORE_H) $(GIMPLE_H) tree-iterator.h \
intl.h cfghooks.h output.h options.h c-family/c-common.h tsan.h
tree-ssa-tail-merge.o: tree-ssa-tail-merge.c \ tree-ssa-tail-merge.o: tree-ssa-tail-merge.c \
$(SYSTEM_H) $(CONFIG_H) coretypes.h $(TM_H) $(BITMAP_H) \ $(SYSTEM_H) $(CONFIG_H) coretypes.h $(TM_H) $(BITMAP_H) \
$(FLAGS_H) $(TM_P_H) $(BASIC_BLOCK_H) \ $(FLAGS_H) $(TM_P_H) $(BASIC_BLOCK_H) \
...@@ -2689,7 +2696,8 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ ...@@ -2689,7 +2696,8 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
$(CGRAPH_H) $(COVERAGE_H) alloc-pool.h $(GGC_H) \ $(CGRAPH_H) $(COVERAGE_H) alloc-pool.h $(GGC_H) \
$(OPTS_H) params.def tree-mudflap.h $(TREE_PASS_H) $(GIMPLE_H) \ $(OPTS_H) params.def tree-mudflap.h $(TREE_PASS_H) $(GIMPLE_H) \
tree-ssa-alias.h $(PLUGIN_H) realmpfr.h tree-diagnostic.h \ tree-ssa-alias.h $(PLUGIN_H) realmpfr.h tree-diagnostic.h \
$(TREE_PRETTY_PRINT_H) opts-diagnostic.h $(COMMON_TARGET_H) $(TREE_PRETTY_PRINT_H) opts-diagnostic.h $(COMMON_TARGET_H) \
tsan.h
hwint.o : hwint.c $(CONFIG_H) $(SYSTEM_H) $(DIAGNOSTIC_CORE_H) hwint.o : hwint.c $(CONFIG_H) $(SYSTEM_H) $(DIAGNOSTIC_CORE_H)
...@@ -3740,6 +3748,7 @@ GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \ ...@@ -3740,6 +3748,7 @@ GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \
$(srcdir)/target-globals.h \ $(srcdir)/target-globals.h \
$(srcdir)/ipa-inline.h \ $(srcdir)/ipa-inline.h \
$(srcdir)/asan.c \ $(srcdir)/asan.c \
$(srcdir)/tsan.c \
@all_gtfiles@ @all_gtfiles@
# Compute the list of GT header files from the corresponding C sources, # Compute the list of GT header files from the corresponding C sources,
......
...@@ -149,6 +149,15 @@ along with GCC; see the file COPYING3. If not see ...@@ -149,6 +149,15 @@ along with GCC; see the file COPYING3. If not see
DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE, \ DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
true, true, true, ATTRS, false, flag_tm) true, true, true, ATTRS, false, flag_tm)
/* Builtin used by the implementation of libsanitizer. These
functions are mapped to the actual implementation of the
libtsan library. */
#undef DEF_SANITIZER_BUILTIN
#define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
true, true, true, ATTRS, true, \
flag_tsan)
/* Define an attribute list for math functions that are normally /* Define an attribute list for math functions that are normally
"impure" because some of them may write into global memory for "impure" because some of them may write into global memory for
`errno'. If !flag_errno_math they are instead "const". */ `errno'. If !flag_errno_math they are instead "const". */
...@@ -825,3 +834,7 @@ DEF_GCC_BUILTIN (BUILT_IN_LINE, "LINE", BT_FN_INT, ATTR_NOTHROW_LEAF_LIST) ...@@ -825,3 +834,7 @@ DEF_GCC_BUILTIN (BUILT_IN_LINE, "LINE", BT_FN_INT, ATTR_NOTHROW_LEAF_LIST)
/* GTM builtins. */ /* GTM builtins. */
#include "gtm-builtins.def" #include "gtm-builtins.def"
/* Sanitizer builtins. */
#include "sanitizer.def"
...@@ -844,6 +844,10 @@ fsanitize=address ...@@ -844,6 +844,10 @@ fsanitize=address
Common Report Var(flag_asan) Common Report Var(flag_asan)
Enable AddressSanitizer, a memory error detector Enable AddressSanitizer, a memory error detector
fsanitize=thread
Common Report Var(flag_tsan)
Enable ThreadSanitizer, a data race detector
fasynchronous-unwind-tables fasynchronous-unwind-tables
Common Report Var(flag_asynchronous_unwind_tables) Optimization Common Report Var(flag_asynchronous_unwind_tables) Optimization
Generate unwind tables that are exact at each instruction boundary Generate unwind tables that are exact at each instruction boundary
...@@ -2519,6 +2523,9 @@ Driver ...@@ -2519,6 +2523,9 @@ Driver
static-libasan static-libasan
Driver Driver
static-libtsan
Driver
symbolic symbolic
Driver Driver
......
...@@ -453,7 +453,8 @@ Objective-C and Objective-C++ Dialects}. ...@@ -453,7 +453,8 @@ Objective-C and Objective-C++ Dialects}.
@xref{Link Options,,Options for Linking}. @xref{Link Options,,Options for Linking}.
@gccoptlist{@var{object-file-name} -l@var{library} @gol @gccoptlist{@var{object-file-name} -l@var{library} @gol
-nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic @gol -nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic @gol
-s -static -static-libgcc -static-libasan -static-libstdc++ @gol -s -static -static-libgcc -static-libstdc++ @gol
-static-libasan -static-libtsan @gol
-shared -shared-libgcc -symbolic @gol -shared -shared-libgcc -symbolic @gol
-T @var{script} -Wl,@var{option} -Xlinker @var{option} @gol -T @var{script} -Wl,@var{option} -Xlinker @var{option} @gol
-u @var{symbol}} -u @var{symbol}}
...@@ -6862,6 +6863,12 @@ Memory access instructions will be instrumented to detect ...@@ -6862,6 +6863,12 @@ Memory access instructions will be instrumented to detect
out-of-bounds and use-after-free bugs. So far only heap bugs will be detected. out-of-bounds and use-after-free bugs. So far only heap bugs will be detected.
See @uref{http://code.google.com/p/address-sanitizer/} for more details. See @uref{http://code.google.com/p/address-sanitizer/} for more details.
@item -fsanitize=thread
Enable ThreadSanitizer, a fast data race detector.
Memory access instructions will be instrumented to detect
data race bugs.
See @uref{http://code.google.com/p/data-race-test/wiki/ThreadSanitizer} for more details.
@item -fmudflap -fmudflapth -fmudflapir @item -fmudflap -fmudflapth -fmudflapir
@opindex fmudflap @opindex fmudflap
@opindex fmudflapth @opindex fmudflapth
...@@ -9947,6 +9954,15 @@ option is not used, then this links against the shared version of ...@@ -9947,6 +9954,15 @@ option is not used, then this links against the shared version of
driver to link @file{libasan} statically, without necessarily linking driver to link @file{libasan} statically, without necessarily linking
other libraries statically. other libraries statically.
@item -static-libtsan
When the @option{-fsanitize=thread} option is used to link a program,
the GCC driver automatically links against @option{libtsan}. If
@file{libtsan} is available as a shared library, and the @option{-static}
option is not used, then this links against the shared version of
@file{libtsan}. The @option{-static-libtsan} option directs the GCC
driver to link @file{libtsan} statically, without necessarily linking
other libraries statically.
@item -static-libstdc++ @item -static-libstdc++
When the @command{g++} program is used to link a C++ program, it When the @command{g++} program is used to link a C++ program, it
normally automatically links against @option{libstdc++}. If normally automatically links against @option{libstdc++}. If
......
...@@ -560,6 +560,15 @@ proper position among the other output files. */ ...@@ -560,6 +560,15 @@ proper position among the other output files. */
#endif #endif
#endif #endif
#ifndef LIBTSAN_SPEC
#ifdef HAVE_LD_STATIC_DYNAMIC
#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
"} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}"
#else
#define LIBTSAN_SPEC "-ltsan"
#endif
#endif
/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
included. */ included. */
#ifndef LIBGCC_SPEC #ifndef LIBGCC_SPEC
...@@ -704,6 +713,7 @@ proper position among the other output files. */ ...@@ -704,6 +713,7 @@ proper position among the other output files. */
%(mflib) " STACK_SPLIT_SPEC "\ %(mflib) " STACK_SPLIT_SPEC "\
%{fprofile-arcs|fprofile-generate*|coverage:-lgcov}\ %{fprofile-arcs|fprofile-generate*|coverage:-lgcov}\
%{fsanitize=address:" LIBASAN_SPEC "%{static:%ecannot specify -static with -fsanitize=address}}\ %{fsanitize=address:" LIBASAN_SPEC "%{static:%ecannot specify -static with -fsanitize=address}}\
%{fsanitize=thread:" LIBTSAN_SPEC "}\
%{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\ %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
%{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}" %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}"
#endif #endif
......
...@@ -1450,6 +1450,7 @@ init_optimization_passes (void) ...@@ -1450,6 +1450,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_pre); NEXT_PASS (pass_pre);
NEXT_PASS (pass_sink_code); NEXT_PASS (pass_sink_code);
NEXT_PASS (pass_asan); NEXT_PASS (pass_asan);
NEXT_PASS (pass_tsan);
NEXT_PASS (pass_tree_loop); NEXT_PASS (pass_tree_loop);
{ {
struct opt_pass **p = &pass_tree_loop.pass.sub; struct opt_pass **p = &pass_tree_loop.pass.sub;
...@@ -1556,6 +1557,7 @@ init_optimization_passes (void) ...@@ -1556,6 +1557,7 @@ init_optimization_passes (void)
} }
NEXT_PASS (pass_lower_complex_O0); NEXT_PASS (pass_lower_complex_O0);
NEXT_PASS (pass_asan_O0); NEXT_PASS (pass_asan_O0);
NEXT_PASS (pass_tsan_O0);
NEXT_PASS (pass_cleanup_eh); NEXT_PASS (pass_cleanup_eh);
NEXT_PASS (pass_lower_resx); NEXT_PASS (pass_lower_resx);
NEXT_PASS (pass_nrv); NEXT_PASS (pass_nrv);
......
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_INIT, "__tsan_init",
BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_FUNC_ENTRY, "__tsan_func_entry",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_FUNC_EXIT, "__tsan_func_exit",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_VPTR_UPDATE, "__tsan_vptr_update",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ_1, "__tsan_read1",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ_2, "__tsan_read2",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ_4, "__tsan_read4",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ_8, "__tsan_read8",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ_16, "__tsan_read16",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE_1, "__tsan_write1",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE_2, "__tsan_write2",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE_4, "__tsan_write4",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE_8, "__tsan_write8",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE_16, "__tsan_write16",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
...@@ -73,6 +73,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -73,6 +73,7 @@ along with GCC; see the file COPYING3. If not see
#include "alloc-pool.h" #include "alloc-pool.h"
#include "tree-mudflap.h" #include "tree-mudflap.h"
#include "asan.h" #include "asan.h"
#include "tsan.h"
#include "gimple.h" #include "gimple.h"
#include "tree-ssa-alias.h" #include "tree-ssa-alias.h"
#include "plugin.h" #include "plugin.h"
...@@ -575,6 +576,9 @@ compile_file (void) ...@@ -575,6 +576,9 @@ compile_file (void)
if (flag_asan) if (flag_asan)
asan_finish_file (); asan_finish_file ();
if (flag_tsan)
tsan_finish_file ();
output_shared_constant_pool (); output_shared_constant_pool ();
output_object_blocks (); output_object_blocks ();
finish_tm_clone_pairs (); finish_tm_clone_pairs ();
......
...@@ -261,6 +261,8 @@ extern struct gimple_opt_pass pass_mudflap_1; ...@@ -261,6 +261,8 @@ extern struct gimple_opt_pass pass_mudflap_1;
extern struct gimple_opt_pass pass_mudflap_2; extern struct gimple_opt_pass pass_mudflap_2;
extern struct gimple_opt_pass pass_asan; extern struct gimple_opt_pass pass_asan;
extern struct gimple_opt_pass pass_asan_O0; extern struct gimple_opt_pass pass_asan_O0;
extern struct gimple_opt_pass pass_tsan;
extern struct gimple_opt_pass pass_tsan_O0;
extern struct gimple_opt_pass pass_lower_cf; extern struct gimple_opt_pass pass_lower_cf;
extern struct gimple_opt_pass pass_refactor_eh; extern struct gimple_opt_pass pass_refactor_eh;
extern struct gimple_opt_pass pass_lower_eh; extern struct gimple_opt_pass pass_lower_eh;
......
This diff is collapsed. Click to expand it.
/* ThreadSanitizer, a data race detector.
Copyright (C) 2011, 2012 Free Software Foundation, Inc.
Contributed by Dmitry Vyukov <dvyukov@google.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/>. */
#ifndef TREE_TSAN
#define TREE_TSAN
extern void tsan_finish_file (void);
#endif /* TREE_TSAN */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment