Commit Graph

120273 Commits

Author SHA1 Message Date
Richard Henderson
93bf539055 Move libsanitizer configure logic to subdirectory
From-SVN: r193487
2012-11-13 14:19:44 -08:00
Sriraman Tallam
beb42d2022 cgraph.c (insert_new_cgraph_node_version): Use cgraph_get_node instead of cgraph_get_create_node.
2012-11-13  Sriraman Tallam  <tmsriram@google.com>

	* cgraph.c (insert_new_cgraph_node_version): Use cgraph_get_node
	instead of cgraph_get_create_node.
	* config/i386/i386.c (ix86_get_function_versions_dispatcher): Move ifunc
	not supported code to the end.

	* class.c (mark_versions_used): Remove.
	(resolve_address_of_overloaded_function): Call target hook
	for versioned functions. Refactor to call
	get_function_versions_dispatcher.
	* decl.c (duplicate_decls): Add comments.
	* cp/call.c (get_function_version_dispatcher): Expose function.
	(mark_versions_used): Expose function.
	* cp/cp-tree.h (mark_versions_used): New declaration.
	(get_function_version_dispatcher): Ditto.

	* testsuite/g++.dg/mv4.C: Add require ifunc. Change error message.
	* testsuite/g++.dg/mv5.C: Add require ifunc.
	* testsuite/g++.dg/mv6.C: Add require ifunc.

From-SVN: r193486
2012-11-13 21:56:30 +00:00
Ian Lance Taylor
73c3ed27fc re PR other/55312 (libbacktrace doesn't honor --disable-werror)
PR other/55312
	* configure.ac: Only add -Werror if building a target library.

From-SVN: r193485
2012-11-13 21:25:39 +00:00
Martin Jambor
3e452a2871 re PR tree-optimization/55253 (Revision 193298 miscompiles sqlite with -Os)
2012-11-13  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/55253
	* ipa-cp.c (merge_aggregate_lattices): Propagate aggs_contain_variable
	flag.

	* testsuite/gcc.dg/torture/pr55253.c: New test.
	* testsuite/gcc.dg/torture/pr55305.c: Likewise.

From-SVN: r193484
2012-11-13 19:56:24 +01:00
H.J. Lu
d10e419beb Workaround PR middle-end/55142
gcc/

2012-11-13  Eric Botcazou  <ebotcazou@adacore.com>
	    H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/55142
	* config/i386/i386.c (legitimize_pic_address): Properly handle
	REG + CONST.
	(ix86_print_operand_address): Set code to 'k' when forcing
	addr32 prefix.  For x32, zero-extend negative displacement if
	it < -16*1024*1024.

gcc/testsuite/

2012-11-13  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/55142
	* gcc.target/i386/pr55142-1.c: New file.
	* gcc.target/i386/pr55142-2.c: Likewise.

From-SVN: r193483
2012-11-13 10:35:32 -08:00
Uros Bizjak
141a9e06ad mode-switching.c (create_pre_exit): Use NONDEBUG_INSN_P.
* mode-switching.c (create_pre_exit): Use NONDEBUG_INSN_P.

From-SVN: r193482
2012-11-13 18:22:04 +01:00
Uros Bizjak
397b971c95 * ChangeLog: Fix my last entry.
From-SVN: r193481
2012-11-13 18:08:13 +01:00
Uros Bizjak
ffbbfaba10 re PR target/41993 ([sh] ICE in create_pre_exit, at mode-switching.c:399)
PR target/41993
	* mode-switching.c (create_pre_exit): Set return_copy to last_insn
	when copy_start is a function return regno instead of pseudo.
	Skip debug instructions in instruction scan loop.

From-SVN: r193480
2012-11-13 17:59:37 +01:00
Dodji Seketeli
be22520dc2 PR c++/54466 - ICE with alias template which type-id is const qualified
Consider this short example:

    template<typename T>
      struct X { };

    template<typename T>
      using Y = const X<T>;

    using Z = Y<int>;

G++ crashes in lookup_class_template_1 while trying to build the alias
template instantiation Y<int>.

I think this is indirectly due to the fact that that
lookup_class_template_1 can now yield a const qualified type like
'const X<T>'.

As a consequence, the code in lookup_template_class_1 that was trying
to access the TYPE_STUB_DECL field of the result of
lookup_template_class_1 should now be adjusted to access the
TYPE_STUB_DECL of the main variant of the resulting type instead (and
that is TYPE_MAIN_DECL); because qualified types (constructed with
build_qualified_type) have their TYPE_STUB_DECL set to NULL.

Fixed thus and tested on x86_64-unknown-linux-gnu against trunk.

gcc/cp

	PR c++/54466
	* pt.c (lookup_template_class_1): TYPE_STUB_DECL should be
	accessed on the main variant of the type.

gcc/testsuite/

	* g++.dg/cpp0x/alias-decl-26.C: New test file.

In the example of this patch, g++ crashes when trying to build the
alias template Y<int

From-SVN: r193479
2012-11-13 17:07:39 +01:00
Dodji Seketeli
d6531d8364 Enable libsanitizer just on x86 linux for now
This patch builds libsanitizer only on x86_64 and i?86 linux targets
for now.  I guess The build can be enabled on other targets when they
are ready.

ChangeLog:

	* configure.ac: Enable libsanitizer just on x86 linux for now.
	* configure: Re-generate.

From-SVN: r193478
2012-11-13 16:12:12 +01:00
David Edelsohn
e7fae5500c configure.ac: Disable libsanitizer on AIX.
* configure.ac: Disable libsanitizer on AIX. Merge libquadmath
        sections.
        * configure: Regenerate.

From-SVN: r193477
2012-11-13 09:19:14 -05:00
Andrew Stubbs
3f2dc80614 arm.c (arm_emit_coreregs_64bit_shift): Fix comment.
2012-11-13  Andrew Stubbs  <ams@codesourcery.com>
            Ulrich Weigand  <ulrich.weigand@linaro.org>

	* config/arm/arm.c (arm_emit_coreregs_64bit_shift): Fix comment.
	* config/arm/arm.md (opt, opt_enabled): New attributes.
	(enabled): Use opt_enabled.
	(ashldi3, ashrdi3, lshrdi3): Add TARGET_NEON case.
	(ashldi3): Allow general operands for TARGET_NEON case.
	* config/arm/iterators.md (rshifts): New code iterator.
	(shift, shifttype): New code attributes.
	* config/arm/neon.md (UNSPEC_LOAD_COUNT): New unspec type.
	(neon_load_count, ashldi3_neon_noclobber, ashldi3_neon,
	signed_shift_di3_neon, unsigned_shift_di3_neon,
	ashrdi3_neon_imm_noclobber, lshrdi3_neon_imm_noclobber,
	<shift>di3_neon): New patterns.

Co-Authored-By: Ulrich Weigand <ulrich.weigand@linaro.org>

From-SVN: r193476
2012-11-13 13:31:50 +00:00
H.J. Lu
2b12109c4a Enable x32 check on more i386 tests
* gcc.target/i386/avx256-unaligned-load-2.c: Requre !ia32
	instead of lp64.
	* gcc.target/i386/avx256-unaligned-store-2.c: Likewise.
	* gcc.target/i386/pr49715-2.c: Likewise.
	* gcc.target/i386/retarg.c: Likewise.  Scan both %rdi and %edi.

From-SVN: r193475
2012-11-13 04:31:12 -08:00
Jakub Jelinek
daa2dcb534 * Makefile.in (asan.o): Depend on $(TM_P_H).
From-SVN: r193472
2012-11-13 08:38:25 +01:00
Jakub Jelinek
784fb9b322 re PR tree-optimization/55281 (ICE in build_int_cst_wide, at tree.c:1217 (with Ofast, ok with O3))
PR tree-optimization/55281
	* tree-vect-generic.c (expand_vector_condition): Accept any
	is_gimple_val rather than just SSA_NAME if not COMPARISON_CLASS_P.
	* fold-const.c (fold_ternary_loc): Fold VEC_COND_EXPR if arg0 is
	either integer_all_onesp or integer_zerop.
	* tree-vect-stmts.c (vectorizable_condition): Build the condition
	using corresponding vector integer type instead of vectype.

	* gcc.dg/vect/fast-math-pr55281.c: New test.
	* g++.dg/opt/pr55281.C: New test.

From-SVN: r193471
2012-11-13 08:25:36 +01:00
Jakub Jelinek
5d68b7e60b re PR rtl-optimization/54127 (ICE in maybe_record_trace_start with asm goto, --target=powerpc-unknown-linux-gnu)
PR rtl-optimization/54127
	* cfgrtl.c (force_nonfallthru_and_redirect): When redirecting
	asm goto labels from BB_HEAD (e->dest) to target bb, decrement
	LABEL_NUSES of BB_HEAD (e->dest) and increment LABEL_NUSES of
	BB_HEAD (target) appropriately and adjust JUMP_LABEL and/or
	REG_LABEL_TARGET and REG_LABEL_OPERAND.

	* gcc.dg/torture/pr54127.c: New test.

From-SVN: r193470
2012-11-13 08:23:51 +01:00
Jakub Jelinek
42b04d70a1 asan.c (instrument_builtin_call): Fix up dest assignment.
* asan.c (instrument_builtin_call) <case BUILT_IN_BCOPY>: Fix up
	dest assignment.

From-SVN: r193469
2012-11-13 08:21:15 +01:00
David S. Miller
d2860e7236 Get sparc building again after ASAN merge.
libsanitizer/

	* asan/asan_linux.cc (GetPcSpBp): Add sparc support.

From-SVN: r193468
2012-11-12 22:53:23 -08:00
Hans-Peter Nilsson
097f98d44d re PR target/55257 (g++.dg/debug/dwarf2/non-virtual-thunk.C scan-assembler thunk.C:30)
PR target/55257
	* config/cris/cris.c (cris_asm_output_mi_thunk): Call
	final_start_function and final_end_function.

From-SVN: r193467
2012-11-13 06:15:53 +00:00
David Edelsohn
7f71fad918 * asan.c: Include tm_p.h
From-SVN: r193466
2012-11-12 22:14:28 -05:00
Hans-Peter Nilsson
3c31b9b46a configure.ac: Add section for configdirs for libsanitizer.
* configure.ac: Add section for configdirs for libsanitizer.
	Disable for cris-*-* and mmix-*-*.
	* configure: Regenerate.

From-SVN: r193465
2012-11-13 01:36:17 +00:00
John David Anglin
ab11fb42c3 re PR target/55195 (shorten_branches generates incorrect forward branch distances)
PR target/55195
	* config/pa/pa.md (type): Add sibcall and sh_func_adrs insn types.
	(in_branch_delay): Don't allow sibcall or sh_func_adrs insns.
	(in_nullified_branch_delay): Likewise.
	(in_call_delay): Likewise.
	Define delay for sibcall insns.  Adjust Z3 and Z4 insn reservations for
	new types.  Add opaque cond to mark all calls, sibcalls, dyncalls and
	the $$sh_func_adrs call as variable.  Update type of sibcalls and
	$$sh_func_adrs call.
	* config/pa/pa.c (pa_adjust_insn_length): Revise to return updated
	length instead of adjustment.  Handle negative and undefined call
	adjustments for insn_default_length.  Remove adjustment for millicode
	insn with unfilled delay slot.
	(pa_output_millicode_call): Update for revised millicode length.
	* config/pa/pa.h (ADJUST_INSN_LENGTH): Revise to set LENGTH.

From-SVN: r193464
2012-11-13 00:36:54 +00:00
GCC Administrator
769b084b1a Daily bump.
From-SVN: r193463
2012-11-13 00:18:29 +00:00
Eric Botcazou
c38cdd3f22 * tree-ssa-ccp.c (dump_lattice_value) <CONSTANT>: Fix duplication.
From-SVN: r193459
2012-11-12 23:32:56 +00:00
Jonathan Wakely
0ad9f93083 future (atomic_future): Remove declaration of non-standard name.
* include/std/future (atomic_future): Remove declaration of
	non-standard name.

From-SVN: r193457
2012-11-12 23:00:41 +00:00
Eric Botcazou
1267ca30d1 common.opt (fvar-tracking-uninit): Document.
* common.opt (fvar-tracking-uninit): Document.
	* toplev.c (process_options): Fix handling of flag_var_tracking_uninit.
	* config/darwin.c (darwin_override_options): Likewise.

From-SVN: r193456
2012-11-12 22:59:37 +00:00
Steven Bosscher
aea9bbebd1 sched-vis.c (print_pattern): Handle NULL patterns.
* sched-vis.c (print_pattern): Handle NULL patterns.

From-SVN: r193455
2012-11-12 22:13:20 +00:00
Ian Lance Taylor
33521509a8 configure.ac: Check for getexecname.
* configure.ac: Check for getexecname.
	* fileline.c: #include <errno.h>.  Define getexecname if not
	available.
	(fileline_initialize): Try to find the executable in a few
	different ways.
	* print.c (error_callback): Only print the filename if it came
	from the backtrace state.
	* configure, config.h.in: Rebuild.

Co-Authored-By: Gerald Pfeifer <gerald@pfeifer.com>
Co-Authored-By: Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>

From-SVN: r193454
2012-11-12 21:24:19 +00:00
Steven Bosscher
211d71a745 re PR rtl-optimization/51447 (global register variable definition incorrectly removed as dead code)
gcc/
	PR rtl-optimization/51447
	* df-scan.c (df_get_entry_block_def_set): Add global regs to the set.
	* df-problems.c (df_lr_local_compute): Make global regs always live.
	* dce.c (deletable_insn_p): Make insns setting a global reg
	inherently necessary.

testsuite/
	PR rtl-optimization/51447
	* gcc.c-torture/execute/pr51447.c: New test.

From-SVN: r193453
2012-11-12 20:21:59 +00:00
Ian Bolton
06b1198f75 Use CSINC instead of CSEL to return 1 (AArch64)
From-SVN: r193452
2012-11-12 19:39:46 +00:00
Ian Bolton
f5313c63ba Optimise comparison where intermediate result not used (AArch64)
From-SVN: r193450
2012-11-12 19:35:24 +00:00
Ian Lance Taylor
86f2731e63 syscall: Force first letter of error message to lower case.
From-SVN: r193449
2012-11-12 19:34:52 +00:00
Tobias Burnus
36a41ef191 gcc_update: Add libquadmath generated files.
2012-11-12  Tobias Burnus  <burnus@net-b.de>

        * gcc_update: Add libquadmath generated files.

From-SVN: r193448
2012-11-12 20:26:53 +01:00
H.J. Lu
6671a4e47c Add libsanitizer generated files
* gcc_update: Add libsanitizer generated files.

From-SVN: r193447
2012-11-12 10:56:36 -08:00
Jason Merrill
7a3a9e6821 * include/std/complex (real, imag): Add ABI tag in C++11 mode.
From-SVN: r193445
2012-11-12 12:51:26 -05:00
Dodji Seketeli
132a1a23e6 Remove ChangeLog.asan
* ChangeLog.asan: Remove this, as it got accidentally in from the
	merging of the asan branch into trunk.

From-SVN: r193444
2012-11-12 17:46:03 +01:00
Tobias Burnus
0fc1ec3eb9 invoke.texi: Move -faddress-sanitizer from Optimization Options to Debugging Options.
2012-11-12  Tobias Burnus  <burnus@net-b.de>

        * doc/invoke.texi: Move -faddress-sanitizer from Optimization
        Options to Debugging Options.

From-SVN: r193443
2012-11-12 17:44:03 +01:00
Jakub Jelinek
497a1c6692 * asan.c: Formatting cleanups.
From-SVN: r193442
2012-11-12 17:18:59 +01:00
Wei Mi
f35db108b9 Import the asan runtime library into GCC tree
This patch imports the runtime library in the GCC tree, ensures that
-lasan is passed to the linker when -faddress-sanitizer is used and
sets up the build system accordingly.

ChangeLog:

	* configure.ac: Add libsanitizer to target_libraries.
	* Makefile.def: Ditto.
	* configure: Regenerate.
	* Makefile.in: Regenerate.
	* libsanitizer: New directory for asan runtime.  Contains an empty
	tsan directory.

gcc/ChangeLog:

	* gcc.c (LINK_COMMAND_SPEC): Add -laddress-sanitizer to link
	command if -faddress-sanitizer is on.

libsanitizer:

	Initial checkin: migrate asan runtime from llvm.

From-SVN: r193441
2012-11-12 16:53:47 +01:00
Dodji Seketeli
25ae50273a Instrument built-in memory access function calls
This patch instruments many memory access patterns through builtins.

Basically, for a call like:

     __builtin_memset (from, 0, n_bytes);

the patch would only instrument the accesses at the beginning and at
the end of the memory region [from, from + n_bytes].  This is the
strategy used by the llvm implementation of asan.

This instrumentation is done for all the memory access builtin
functions that expose a well specified memory region -- one that
explicitly states the number of bytes accessed in the region.

A special treatment is used for __builtin_strlen.  The patch
instruments the access to the first byte of its argument, as well as
the access to the byte (of the argument) at the offset returned by
strlen.

For the __sync_* and __atomic* calls the patch instruments the access
to the bytes pointed to by the argument.

While doing this, I have added a new parameter to build_check_stmt to
decide whether to insert the instrumentation code before or after the
statement iterator.  This allows us to do away with the
gsi_{next,prev} dance we were doing in the callers of this function.

Tested by running cc1 -fasan on variations of simple programs like:

    int
    foo ()
    {
      char foo[10] = {0};

      foo[0] = 't';
      foo[1] = 'e';
      foo[2] = 's';
      foo[3] = 't';
      int l = __builtin_strlen (foo);
      int n = sizeof (foo);
      __builtin_memset (&foo[4], 0, n - 4);
      __sync_fetch_and_add (&foo[11], 1);

      return l;
    }

and by starring at the gimple output which for this function is:

    ;; Function foo (foo, funcdef_no=0, decl_uid=1714, cgraph_uid=0)

    foo ()
    {
      int n;
      int l;
      char foo[10];
      int D.1725;
      char * D.1724;
      int D.1723;
      long unsigned int D.1722;
      int D.1721;
      long unsigned int D.1720;
      long unsigned int _1;
      int _4;
      long unsigned int _5;
      int _6;
      char * _7;
      int _8;
      char * _9;
      unsigned long _10;
      unsigned long _11;
      unsigned long _12;
      signed char * _13;
      signed char _14;
      _Bool _15;
      unsigned long _16;
      signed char _17;
      _Bool _18;
      _Bool _19;
      char * _20;
      unsigned long _21;
      unsigned long _22;
      unsigned long _23;
      signed char * _24;
      signed char _25;
      _Bool _26;
      unsigned long _27;
      signed char _28;
      _Bool _29;
      _Bool _30;
      char * _31;
      unsigned long _32;
      unsigned long _33;
      unsigned long _34;
      signed char * _35;
      signed char _36;
      _Bool _37;
      unsigned long _38;
      signed char _39;
      _Bool _40;
      _Bool _41;
      char * _42;
      unsigned long _43;
      unsigned long _44;
      unsigned long _45;
      signed char * _46;
      signed char _47;
      _Bool _48;
      unsigned long _49;
      signed char _50;
      _Bool _51;
      _Bool _52;
      char * _53;
      unsigned long _54;
      unsigned long _55;
      unsigned long _56;
      signed char * _57;
      signed char _58;
      _Bool _59;
      unsigned long _60;
      signed char _61;
      _Bool _62;
      _Bool _63;
      char[10] * _64;
      unsigned long _65;
      unsigned long _66;
      unsigned long _67;
      signed char * _68;
      signed char _69;
      _Bool _70;
      unsigned long _71;
      signed char _72;
      _Bool _73;
      _Bool _74;
      unsigned long _75;
      unsigned long _76;
      unsigned long _77;
      signed char * _78;
      signed char _79;
      _Bool _80;
      unsigned long _81;
      signed char _82;
      _Bool _83;
      _Bool _84;
      long unsigned int _85;
      long unsigned int _86;
      char * _87;
      char * _88;
      unsigned long _89;
      unsigned long _90;
      unsigned long _91;
      signed char * _92;
      signed char _93;
      _Bool _94;
      unsigned long _95;
      signed char _96;
      _Bool _97;
      _Bool _98;
      char * _99;
      unsigned long _100;
      unsigned long _101;
      unsigned long _102;
      signed char * _103;
      signed char _104;
      _Bool _105;
      unsigned long _106;
      signed char _107;
      _Bool _108;
      _Bool _109;

      <bb 2>:
      foo = {};
      _9 = &foo[0];
      _10 = (unsigned long) _9;
      _11 = _10 >> 3;
      _12 = _11 + 17592186044416;
      _13 = (signed char *) _12;
      _14 = *_13;
      _15 = _14 != 0;
      _16 = _10 & 7;
      _17 = (signed char) _16;
      _18 = _17 >= _14;
      _19 = _15 & _18;
      if (_19 != 0)
	goto <bb 5>;
      else
	goto <bb 4>;

      <bb 5>:
      __asan_report_store1 (_10);

      <bb 4>:
      foo[0] = 116;
      _20 = &foo[1];
      _21 = (unsigned long) _20;
      _22 = _21 >> 3;
      _23 = _22 + 17592186044416;
      _24 = (signed char *) _23;
      _25 = *_24;
      _26 = _25 != 0;
      _27 = _21 & 7;
      _28 = (signed char) _27;
      _29 = _28 >= _25;
      _30 = _26 & _29;
      if (_30 != 0)
	goto <bb 7>;
      else
	goto <bb 6>;

      <bb 7>:
      __asan_report_store1 (_21);

      <bb 6>:
      foo[1] = 101;
      _31 = &foo[2];
      _32 = (unsigned long) _31;
      _33 = _32 >> 3;
      _34 = _33 + 17592186044416;
      _35 = (signed char *) _34;
      _36 = *_35;
      _37 = _36 != 0;
      _38 = _32 & 7;
      _39 = (signed char) _38;
      _40 = _39 >= _36;
      _41 = _37 & _40;
      if (_41 != 0)
	goto <bb 9>;
      else
	goto <bb 8>;

      <bb 9>:
      __asan_report_store1 (_32);

      <bb 8>:
      foo[2] = 115;
      _42 = &foo[3];
      _43 = (unsigned long) _42;
      _44 = _43 >> 3;
      _45 = _44 + 17592186044416;
      _46 = (signed char *) _45;
      _47 = *_46;
      _48 = _47 != 0;
      _49 = _43 & 7;
      _50 = (signed char) _49;
      _51 = _50 >= _47;
      _52 = _48 & _51;
      if (_52 != 0)
	goto <bb 11>;
      else
	goto <bb 10>;

      <bb 11>:
      __asan_report_store1 (_43);

      <bb 10>:
      foo[3] = 116;
      _53 = (char *) &foo;
      _54 = (unsigned long) _53;
      _55 = _54 >> 3;
      _56 = _55 + 17592186044416;
      _57 = (signed char *) _56;
      _58 = *_57;
      _59 = _58 != 0;
      _60 = _54 & 7;
      _61 = (signed char) _60;
      _62 = _61 >= _58;
      _63 = _59 & _62;
      if (_63 != 0)
	goto <bb 13>;
      else
	goto <bb 12>;

      <bb 13>:
      __asan_report_load1 (_54);

      <bb 12>:
      _1 = __builtin_strlen (&foo);
      _64 = _53 + _1;
      _65 = (unsigned long) _64;
      _66 = _65 >> 3;
      _67 = _66 + 17592186044416;
      _68 = (signed char *) _67;
      _69 = *_68;
      _70 = _69 != 0;
      _71 = _65 & 7;
      _72 = (signed char) _71;
      _73 = _72 >= _69;
      _74 = _70 & _73;
      if (_74 != 0)
	goto <bb 15>;
      else
	goto <bb 14>;

      <bb 15>:
      __asan_report_load1 (_65);

      <bb 14>:
      l_2 = (int) _1;
      n_3 = 10;
      _4 = n_3 + -4;
      _5 = (long unsigned int) _4;
      _6 = l_2 + 1;
      _7 = &foo[_6];
      if (_5 != 0)
	goto <bb 17>;
      else
	goto <bb 16>;

      <bb 17>:
      _75 = (unsigned long) _7;
      _76 = _75 >> 3;
      _77 = _76 + 17592186044416;
      _78 = (signed char *) _77;
      _79 = *_78;
      _80 = _79 != 0;
      _81 = _75 & 7;
      _82 = (signed char) _81;
      _83 = _82 >= _79;
      _84 = _80 & _83;
      _85 = _5;
      _86 = _85 - 1;
      _87 = _7;
      _88 = _87 + _86;
      _89 = (unsigned long) _88;
      _90 = _89 >> 3;
      _91 = _90 + 17592186044416;
      _92 = (signed char *) _91;
      _93 = *_92;
      _94 = _93 != 0;
      _95 = _89 & 7;
      _96 = (signed char) _95;
      _97 = _96 >= _93;
      _98 = _94 & _97;
      if (_98 != 0)
	goto <bb 21>;
      else
	goto <bb 20>;

      <bb 21>:
      __asan_report_store1 (_89);

      <bb 20>:
      if (_84 != 0)
	goto <bb 19>;
      else
	goto <bb 18>;

      <bb 19>:
      __asan_report_store1 (_75);

      <bb 18>:

      <bb 16>:
      __builtin_memset (_7, 0, _5);
      _99 = &foo[11];
      _100 = (unsigned long) _99;
      _101 = _100 >> 3;
      _102 = _101 + 17592186044416;
      _103 = (signed char *) _102;
      _104 = *_103;
      _105 = _104 != 0;
      _106 = _100 & 7;
      _107 = (signed char) _106;
      _108 = _107 >= _104;
      _109 = _105 & _108;
      if (_109 != 0)
	goto <bb 23>;
      else
	goto <bb 22>;

      <bb 23>:
      __asan_report_store1 (_100);

      <bb 22>:
      __sync_fetch_and_add_1 (&foo[11], 1);
      _8 = l_2;
      foo ={v} {CLOBBER};

    <L1>:
      return _8;

    }

    ;; Function _GLOBAL__sub_I_00099_0_foo (_GLOBAL__sub_I_00099_0_foo, funcdef_no=1, decl_uid=1752, cgraph_uid=4)

    _GLOBAL__sub_I_00099_0_foo ()
    {
      <bb 2>:
      __asan_init ();
      return;

    }

gcc/
	* gimple.h (is_gimple_builtin_call): Declare ...
	* gimple.c (is_gimple_builtin_call): ... New public function.
	* asan.c (insert_if_then_before_iter, instrument_mem_region_access,
	instrument_strlen_call, maybe_instrument_builtin_call,
	instrument_call): New static functions.
	(create_cond_insert_point): Renamed
	create_cond_insert_point_before_iter into this.  Add a new
	parameter to decide whether to insert the condition before or
	after the statement iterator.
	(build_check_stmt): Adjust for the new create_cond_insert_point.
	Add a new parameter to decide whether to add the instrumentation
	code before or after the statement iterator.
	(instrument_assignment): Factorize from ...
	(transform_statements): ... here.  Use maybe_instrument_call to
	instrument builtin function calls as well.
	(instrument_derefs): Adjust for the new parameter of
	build_check_stmt.  Fix detection of bit-field access.

From-SVN: r193440
2012-11-12 16:53:25 +01:00
Dodji Seketeli
01452015d7 Factorize condition insertion code out of build_check_stmt
This patch splits a new create_cond_insert_point_before_iter function
out of build_check_stmt, to be used by a later patch.

Tested by running cc1 -fasan on the test program below with and
without the patch and by inspecting the gimple output to see that
there is no change.

void
foo ()
{
  char foo[1] = {0};

  foo[0] = 1;
}

gcc/

	* asan.c (create_cond_insert_point_before_iter): Factorize out of ...
	(build_check_stmt): ... here.

From-SVN: r193439
2012-11-12 16:53:12 +01:00
Dodji Seketeli
dc29bf1eef Make build_check_stmt accept an SSA_NAME for its base
This patch makes build_check_stmt accept its memory access parameter
to be an SSA name.  This is useful for a subsequent patch that will
re-use.

Tested by running cc1 -fasan on the program below with and without the
patch and inspecting the gimple output to see that there is no change.

void
foo ()
{
  char foo[1] = {0};

  foo[0] = 1;
}

gcc/
	* asan.c (build_check_stmt): Accept the memory access to be
	represented by an SSA_NAME.

From-SVN: r193438
2012-11-12 16:52:56 +01:00
Jakub Jelinek
8240018b0c Implement protection of global variables
This patch implements the protection of global variables.  See the
comments appended to the beginning of the asan.c file.

	* varasm.c: Include asan.h.
	(assemble_noswitch_variable): Grow size by asan_red_zone_size
	if decl is asan protected.
	(place_block_symbol): Likewise.
	(assemble_variable): If decl is asan protected, increase
	DECL_ALIGN if needed, and for decls emitted using
	assemble_variable_contents append padding zeros after it.
	* Makefile.in (varasm.o): Depend on asan.h.
	* asan.c: Include output.h.
	(asan_pp, asan_pp_initialized, asan_ctor_statements): New variables.
	(asan_pp_initialize, asan_pp_string): New functions.
	(asan_emit_stack_protection): Use asan_pp{,_initialized}
	instead of local pp{,_initialized} vars, use asan_pp_initialize
	and asan_pp_string helpers.
	(asan_needs_local_alias, asan_protect_global,
	asan_global_struct, asan_add_global): New functions.
	(asan_finish_file): Protect global vars that can be protected. Use
	asan_ctor_statements instead of ctor_statements
	* asan.h (asan_protect_global): New prototype.
	(asan_red_zone_size): New inline function.

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

From-SVN: r193437
2012-11-12 16:52:42 +01:00
Jakub Jelinek
f3ddd6929a Implement protection of stack variables
This patch implements the protection of stack variables.

It lays out stack variables as well as the different red zones,
emits some prologue code to populate the shadow memory as to poison
(mark as non-accessible) the regions of the red zones and mark the
regions of stack variables as accessible, and emit some epilogue code
to un-poison (mark as accessible) the regions of red zones right
before the function exits.

	* Makefile.in (asan.o): Depend on $(EXPR_H) $(OPTABS_H).
	(cfgexpand.o): Depend on asan.h.
	* asan.c: Include expr.h and optabs.h.
	(asan_shadow_set): New variable.
	(asan_shadow_cst, asan_emit_stack_protection): New functions.
	(asan_init_shadow_ptr_types): Initialize also asan_shadow_set.
	* cfgexpand.c: Include asan.h.  Define HOST_WIDE_INT heap vector.
	(partition_stack_vars): If i is large alignment and j small
	alignment or vice versa, break out of the loop instead of continue,
	and put the test earlier.  If flag_asan, break out of the loop
	if for small alignment size is different.
	(struct stack_vars_data): New type.
	(expand_stack_vars): Add DATA argument.  Change PRED type to
	function taking size_t argument instead of tree.  Adjust pred
	calls.  Fill DATA in and add needed padding in between variables
	if -faddress-sanitizer.
	(defer_stack_allocation): Defer everything for flag_asan.
	(stack_protect_decl_phase_1, stack_protect_decl_phase_2): Take
	size_t index into stack_vars array instead of the decl directly.
	(asan_decl_phase_3): New function.
	(expand_used_vars): Return var destruction sequence.  Adjust
	expand_stack_vars calls, add another one for flag_asan.  Call
	asan_emit_stack_protection if expand_stack_vars added anything
	to the vectors.
	(expand_gimple_basic_block): Add disable_tail_calls argument.
	(gimple_expand_cfg): Pass true to it if expand_used_vars returned
	non-NULL.  Emit the sequence returned by expand_used_vars after
	return_label.
	* asan.h (asan_emit_stack_protection): New prototype.
	(asan_shadow_set): New decl.
	(ASAN_RED_ZONE_SIZE, ASAN_STACK_MAGIC_LEFT, ASAN_STACK_MAGIC_MIDDLE,
	ASAN_STACK_MAGIC_RIGHT, ASAN_STACK_FRAME_MAGIC): Define.
	(asan_protect_stack_decl): New inline.
	* toplev.c (process_options): Also disable -faddress-sanitizer on
	!FRAME_GROWS_DOWNWARDS targets.

From-SVN: r193436
2012-11-12 16:52:26 +01:00
Jakub Jelinek
dfb9e332a5 Allow asan at -O0
This patch defines a new asan pass gate that is activated at -O0, in
addition to the pass that was initially activated at -O3 level The
patch also does some comment cleanups here and there.

	* asan.c (build_check_stmt): Rename join_bb variable to else_bb.
	(gate_asan_O0): New function.
	(pass_asan_O0): New variable.
	* passes.c (init_optimization_passes): Add pass_asan_O0.
	* tree-pass.h (pass_asan_O0): New declaration.

From-SVN: r193435
2012-11-12 16:52:09 +01:00
Jakub Jelinek
f6d9848430 Emit GIMPLE directly instead of gimplifying GENERIC.
This patch cleanups the instrumentation code generation by emitting
GIMPLE directly, as opposed to emitting GENERIC tree and then
gimplifying them.  It also does some cleanups here and there

	* Makefile.in (GTFILES): Add $(srcdir)/asan.c.
	(asan.o): Update the dependencies of asan.o.
	* asan.c (tm.h, tree.h, tm_p.h, basic-block.h, flags.h
	function.h, tree-inline.h, tree-dump.h, diagnostic.h, demangle.h,
	langhooks.h, ggc.h, cgraph.h, gimple.h): Remove these unused but
	included headers.
	(shadow_ptr_types): New variable.
	(report_error_func): Change is_store argument to bool, don't append
	newline to function name.
	(PROB_VERY_UNLIKELY, PROB_ALWAYS): Define.
	(build_check_stmt): Change is_store argument to bool.  Emit GIMPLE
	directly instead of creating trees and gimplifying them.  Mark
	the error reporting function as very unlikely.
	(instrument_derefs): Change is_store argument to bool.  Use
	int_size_in_bytes to compute size_in_bytes, simplify size check.
	Use build_fold_addr_expr instead of build_addr.
	(transform_statements): Adjust instrument_derefs caller.
	Use gimple_assign_single_p as stmt test.  Don't look at MEM refs
	in rhs2.
	(asan_init_shadow_ptr_types): New function.
	(asan_instrument): Don't push/pop gimplify context.
	Call asan_init_shadow_ptr_types if not yet initialized.
	* asan.h (ASAN_SHADOW_SHIFT): Adjust comment.

Co-Authored-By: Dodji Seketeli <dodji@redhat.com>
Co-Authored-By: Xinliang David Li <davidxl@google.com>

From-SVN: r193434
2012-11-12 16:51:53 +01:00
Jakub Jelinek
dfe06d3e7f Initial asan cleanups
This patch defines a new asan_shadow_offset target macro, instead of
having a mere macro in the asan.c file.  It becomes thus cleaner to
define the target macro for targets that supports asan, namely x86 for
now.  The ASAN_SHADOW_SHIFT (which, along with the asan_shadow_offset
constant, is used to compute the address of the shadow memory byte for
a given memory address) is defined in asan.h.

gcc/ChangeLog

	* toplev.c (process_options): Warn and turn off
	-faddress-sanitizer if not supported by target.
	* asan.c: Include target.h.
	(asan_scale, asan_offset_log_32, asan_offset_log_64,
	asan_offset_log): Removed.
	(build_check_stmt): Use ASAN_SHADOW_SHIFT and
	targetm.asan_shadow_offset ().
	(asan_instrument): Don't initialize asan_offset_log.
	* asan.h (ASAN_SHADOW_SHIFT): Define.
	* target.def (TARGET_ASAN_SHADOW_OFFSET): New hook.
	* doc/tm.texi.in (TARGET_ASAN_SHADOW_OFFSET): Add it.
	* doc/tm.texi: Regenerated.
	* Makefile.in (asan.o): Depend on $(TARGET_H).
	* config/i386/i386.c (ix86_asan_shadow_offset): New function.
	(TARGET_ASAN_SHADOW_OFFSET): Define.

From-SVN: r193433
2012-11-12 16:51:34 +01:00
Wei Mi
37d6f666ca Initial import of asan from the Google branch
This patch imports the initial state of asan as it was in the
Google branch.

It provides basic infrastructure for asan to instrument memory
accesses on the heap, at -O3.  Note that it supports neither stack nor
global variable protection.

The rest of the patches of the set is intended to further improve this
base.

gcc/ChangeLog

	* Makefile.in: Add asan.c and its dependencies.
	* common.opt: Add -faddress-sanitizer option.
	* invoke.texi: Document the new flag.
	* passes.c: Add the asan pass.
	* toplev.c (compile_file): Call asan_finish_file.
	* asan.c: New file.
	* asan.h: New file.
	* tree-pass.h: Declare pass_asan.

Co-Authored-By: Diego Novillo <dnovillo@google.com>
Co-Authored-By: Dodji Seketeli <dodji@redhat.com>

From-SVN: r193432
2012-11-12 16:51:13 +01:00
Tobias Burnus
abfc73778e re PR fortran/55272 (ICE on passing coarray argument between files)
2012-11-12  Tobias Burnus  <burnus@net-b.de>

        PR fortran/55272
        * module.c (mio_array_spec): Correctly handle coarray
        scalars.

2012-11-12  Tobias Burnus  <burnus@net-b.de>

        PR fortran/55272
        * gfortran.dg/coarray_29_1.f90: New.
        * gfortran.dg/coarray_29_2.f90: New.

From-SVN: r193429
2012-11-12 12:03:42 +01:00
Tobias Burnus
3b4adfb357 diagnostic.c (diagnostic_append_note): Also call va_end when inhibit_notes_p is true.
2012-11-12  Tobias Burnus  <burnus@net-b.de>

        * diagnostic.c (diagnostic_append_note): Also call va_end when
        inhibit_notes_p is true.

From-SVN: r193428
2012-11-12 12:00:58 +01:00