1. 13 Nov, 2012 19 commits
  2. 12 Nov, 2012 21 commits
    • future (atomic_future): Remove declaration of non-standard name. · 0ad9f930
      	* include/std/future (atomic_future): Remove declaration of
      	non-standard name.
      
      From-SVN: r193457
      Jonathan Wakely committed
    • common.opt (fvar-tracking-uninit): Document. · 1267ca30
      	* 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
      Eric Botcazou committed
    • sched-vis.c (print_pattern): Handle NULL patterns. · aea9bbeb
      	* sched-vis.c (print_pattern): Handle NULL patterns.
      
      From-SVN: r193455
      Steven Bosscher committed
    • configure.ac: Check for getexecname. · 33521509
      	* 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
      Ian Lance Taylor committed
    • re PR rtl-optimization/51447 (global register variable definition incorrectly removed as dead code) · 211d71a7
      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
      Steven Bosscher committed
    • Use CSINC instead of CSEL to return 1 (AArch64) · 06b1198f
      From-SVN: r193452
      Ian Bolton committed
    • gcc_update: Add libquadmath generated files. · 36a41ef1
      2012-11-12  Tobias Burnus  <burnus@net-b.de>
      
              * gcc_update: Add libquadmath generated files.
      
      From-SVN: r193448
      Tobias Burnus committed
    • Add libsanitizer generated files · 6671a4e4
      	* gcc_update: Add libsanitizer generated files.
      
      From-SVN: r193447
      H.J. Lu committed
    • Remove ChangeLog.asan · 132a1a23
      	* ChangeLog.asan: Remove this, as it got accidentally in from the
      	merging of the asan branch into trunk.
      
      From-SVN: r193444
      Dodji Seketeli committed
    • invoke.texi: Move -faddress-sanitizer from Optimization Options to Debugging Options. · 0fc1ec3e
      2012-11-12  Tobias Burnus  <burnus@net-b.de>
      
              * doc/invoke.texi: Move -faddress-sanitizer from Optimization
              Options to Debugging Options.
      
      From-SVN: r193443
      Tobias Burnus committed
    • * asan.c: Formatting cleanups. · 497a1c66
      From-SVN: r193442
      Jakub Jelinek committed
    • Import the asan runtime library into GCC tree · f35db108
      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
      Wei Mi committed
    • Instrument built-in memory access function calls · 25ae5027
      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
      Dodji Seketeli committed
    • Factorize condition insertion code out of build_check_stmt · 01452015
      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
      Dodji Seketeli committed
    • Make build_check_stmt accept an SSA_NAME for its base · dc29bf1e
      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
      Dodji Seketeli committed
    • Implement protection of global variables · 8240018b
      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
      Jakub Jelinek committed
    • Implement protection of stack variables · f3ddd692
      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
      Jakub Jelinek committed