cfgexpand.c (record_or_union_type_has_array_p): New function.
authorHan Shen <shenhan@gcc.gnu.org>
Tue, 7 May 2013 21:33:01 +0000 (21:33 +0000)
committerHan Shen <shenhan@gcc.gnu.org>
Tue, 7 May 2013 21:33:01 +0000 (21:33 +0000)
2013-05-07  Han Shen  <shenhan@google.com>

    gcc/
    * cfgexpand.c (record_or_union_type_has_array_p): New function.
    (expand_used_vars): Add logic handling '-fstack-protector-strong'.
    * common.opt (fstack-protector-strong): New option.
    * doc/cpp.texi (__SSP_STRONG__): New builtin "__SSP_STRONG__".
    * doc/invoke.texi (Optimization Options): Document
    "-fstack-protector-strong".
    * gcc.c (LINK_SSP_SPEC): Add 'fstack-protector-strong'.

    gcc/testsuite/
    * gcc.dg/fstack-protector-strong.c: New.
    * g++.dg/fstack-protector-strong.C: New.

    gcc/c-family/
    * c-cppbuiltin.c (c_cpp_builtins): Added "__SSP_STRONG__=3".

From-SVN: r198699

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-cppbuiltin.c
gcc/cfgexpand.c
gcc/common.opt
gcc/doc/cpp.texi
gcc/doc/invoke.texi
gcc/gcc.c
gcc/testsuite/ChangeLog

index 706381fc5c5d10c658e86b2e531848aa2579a950..2cb6a745fbc00e053c288536799bb63ea3f367ef 100644 (file)
@@ -1,3 +1,13 @@
+2013-05-07  Han Shen  <shenhan@google.com>
+
+       * cfgexpand.c (record_or_union_type_has_array_p): New function.
+       (expand_used_vars): Add logic handling '-fstack-protector-strong'.
+       * common.opt (fstack-protector-strong): New option.
+       * doc/cpp.texi (__SSP_STRONG__): New builtin "__SSP_STRONG__".
+       * doc/invoke.texi (Optimization Options): Document
+       "-fstack-protector-strong".
+       * gcc.c (LINK_SSP_SPEC): Add 'fstack-protector-strong'.
+
 2013-05-06  Steven Bosscher  <steven@gcc.gnu.org>
 
        * config/mips/mips.c (mips_machine_reorg2): Return 0.
index c28efd4219068102f42eb4804889f915ede65e9d..44bad5c3771cacf04f48035be16bb13265b7fbbf 100644 (file)
@@ -1,3 +1,7 @@
+2013-05-07  Han Shen  <shenhan@google.com>
+
+       * c-cppbuiltin.c (c_cpp_builtins): Added "__SSP_STRONG__=3".
+
 2013-04-29  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        * c-common.c (check_user_alignment): Emit error for negative values.
index 3e210d90e0b3d30e810a0be31c0c5b0728d75e0d..0059626f6e34495c15292a74a871504e2ad4673f 100644 (file)
@@ -888,6 +888,8 @@ c_cpp_builtins (cpp_reader *pfile)
   /* Make the choice of the stack protector runtime visible to source code.
      The macro names and values here were chosen for compatibility with an
      earlier implementation, i.e. ProPolice.  */
+  if (flag_stack_protect == 3)
+    cpp_define (pfile, "__SSP_STRONG__=3");
   if (flag_stack_protect == 2)
     cpp_define (pfile, "__SSP_ALL__=2");
   else if (flag_stack_protect == 1)
index a651d8c5868b2a9b762ff1acab3125dc00acafb3..c18727312407f4795e63031056aabe6516c55a78 100644 (file)
@@ -1291,6 +1291,12 @@ clear_tree_used (tree block)
     clear_tree_used (t);
 }
 
+enum {
+  SPCT_FLAG_DEFAULT = 1,
+  SPCT_FLAG_ALL = 2,
+  SPCT_FLAG_STRONG = 3
+};
+
 /* Examine TYPE and determine a bit mask of the following features.  */
 
 #define SPCT_HAS_LARGE_CHAR_ARRAY      1
@@ -1360,7 +1366,8 @@ stack_protect_decl_phase (tree decl)
   if (bits & SPCT_HAS_SMALL_CHAR_ARRAY)
     has_short_buffer = true;
 
-  if (flag_stack_protect == 2)
+  if (flag_stack_protect == SPCT_FLAG_ALL
+      || flag_stack_protect == SPCT_FLAG_STRONG)
     {
       if ((bits & (SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_LARGE_CHAR_ARRAY))
          && !(bits & SPCT_HAS_AGGREGATE))
@@ -1514,6 +1521,27 @@ estimated_stack_frame_size (struct cgraph_node *node)
   return size;
 }
 
+/* Helper routine to check if a record or union contains an array field. */
+
+static int
+record_or_union_type_has_array_p (const_tree tree_type)
+{
+  tree fields = TYPE_FIELDS (tree_type);
+  tree f;
+
+  for (f = fields; f; f = DECL_CHAIN (f))
+    if (TREE_CODE (f) == FIELD_DECL)
+      {
+       tree field_type = TREE_TYPE (f);
+       if (RECORD_OR_UNION_TYPE_P (field_type)
+           && record_or_union_type_has_array_p (field_type))
+         return 1;
+       if (TREE_CODE (field_type) == ARRAY_TYPE)
+         return 1;
+      }
+  return 0;
+}
+
 /* Expand all variables used in the function.  */
 
 static rtx
@@ -1525,6 +1553,7 @@ expand_used_vars (void)
   struct pointer_map_t *ssa_name_decls;
   unsigned i;
   unsigned len;
+  bool gen_stack_protect_signal = false;
 
   /* Compute the phase of the stack frame for this function.  */
   {
@@ -1576,6 +1605,24 @@ expand_used_vars (void)
     }
   pointer_map_destroy (ssa_name_decls);
 
+  if (flag_stack_protect == SPCT_FLAG_STRONG)
+    FOR_EACH_LOCAL_DECL (cfun, i, var)
+      if (!is_global_var (var))
+       {
+         tree var_type = TREE_TYPE (var);
+         /* Examine local referenced variables that have their addresses taken,
+            contain an array, or are arrays.  */
+         if (TREE_CODE (var) == VAR_DECL
+             && (TREE_CODE (var_type) == ARRAY_TYPE
+                 || TREE_ADDRESSABLE (var)
+                 || (RECORD_OR_UNION_TYPE_P (var_type)
+                     && record_or_union_type_has_array_p (var_type))))
+           {
+             gen_stack_protect_signal = true;
+             break;
+           }
+       }
+
   /* At this point all variables on the local_decls with TREE_USED
      set are not associated with any block scope.  Lay them out.  */
 
@@ -1662,12 +1709,26 @@ expand_used_vars (void)
        dump_stack_var_partition ();
     }
 
-  /* There are several conditions under which we should create a
-     stack guard: protect-all, alloca used, protected decls present.  */
-  if (flag_stack_protect == 2
-      || (flag_stack_protect
-         && (cfun->calls_alloca || has_protected_decls)))
-    create_stack_guard ();
+  switch (flag_stack_protect)
+    {
+    case SPCT_FLAG_ALL:
+      create_stack_guard ();
+      break;
+
+    case SPCT_FLAG_STRONG:
+      if (gen_stack_protect_signal
+         || cfun->calls_alloca || has_protected_decls)
+       create_stack_guard ();
+      break;
+
+    case SPCT_FLAG_DEFAULT:
+      if (cfun->calls_alloca || has_protected_decls)
+       create_stack_guard();
+      break;
+
+    default:
+      ;
+    }
 
   /* Assign rtl to each variable based on these partitions.  */
   if (stack_vars_num > 0)
index 350bf973f760e6786e2686c84044010fd9c3144a..4c7933e587cc7a85887425795a14e65988c9f61a 100644 (file)
@@ -1942,6 +1942,10 @@ fstack-protector-all
 Common Report RejectNegative Var(flag_stack_protect, 2)
 Use a stack protection method for every function
 
+fstack-protector-strong
+Common Report RejectNegative Var(flag_stack_protect, 3)
+Use a smart stack protection method for certain functions
+
 fstack-usage
 Common RejectNegative Var(flag_stack_usage)
 Output stack usage information on a per-function basis
index 4e7b05cd159f6bde8b20ae695d28ee73b83c4039..c605b3bcf5034339dd2dd7b21e7d6b6a0a1cc67d 100644 (file)
@@ -2349,6 +2349,10 @@ use.
 This macro is defined, with value 2, when @option{-fstack-protector-all} is
 in use.
 
+@item __SSP_STRONG__
+This macro is defined, with value 3, when @option{-fstack-protector-strong} is
+in use.
+
 @item __SANITIZE_ADDRESS__
 This macro is defined, with value 1, when @option{-fsanitize=address} is
 in use.
index 49ed64fc6d4ed41b4abdd77dfc0668392a393a7e..f02c226e5a9d97f6d8bf22612b0ddbe557bc114e 100644 (file)
@@ -407,8 +407,8 @@ Objective-C and Objective-C++ Dialects}.
 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops @gol
 -fshrink-wrap -fsignaling-nans -fsingle-precision-constant @gol
 -fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector @gol
--fstack-protector-all -fstrict-aliasing -fstrict-overflow @gol
--fthread-jumps -ftracer -ftree-bit-ccp @gol
+-fstack-protector-all -fstack-protector-strong -fstrict-aliasing @gol
+-fstrict-overflow -fthread-jumps -ftracer -ftree-bit-ccp @gol
 -ftree-builtin-call-dce -ftree-ccp -ftree-ch @gol
 -ftree-coalesce-inline-vars -ftree-coalesce-vars -ftree-copy-prop @gol
 -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse @gol
@@ -8957,6 +8957,12 @@ If a guard check fails, an error message is printed and the program exits.
 @opindex fstack-protector-all
 Like @option{-fstack-protector} except that all functions are protected.
 
+@item -fstack-protector-strong
+@opindex fstack-protector-strong
+Like @option{-fstack-protector} but includes additional functions to
+be protected --- those that have local array definitions, or have
+references to local frame addresses.
+
 @item -fsection-anchors
 @opindex fsection-anchors
 Try to reduce the number of symbolic address calculations by using
index 27072f007743429a6b8f121408af5d00b182d18e..7aaf07dbe2cf0ef83cae6fb9934e8be8b1df3ed4 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -655,7 +655,7 @@ proper position among the other output files.  */
 #ifdef TARGET_LIBC_PROVIDES_SSP
 #define LINK_SSP_SPEC "%{fstack-protector:}"
 #else
-#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
+#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-strong|fstack-protector-all:-lssp_nonshared -lssp}"
 #endif
 #endif
 
index 4b5a3570e02cc33a040f85a6e82c8dc1b24ba926..2180495b38f1c5f11a7940fbb07cfd9efa98866e 100644 (file)
@@ -1,3 +1,9 @@
+2013-04-16  Han Shen  <shenhan@google.com>
+
+       Test cases for '-fstack-protector-strong'.
+       * gcc.dg/fstack-protector-strong.c: New.
+       * g++.dg/fstack-protector-strong.C: New.
+
 2013-05-07  Ian Bolton  <ian.bolton@arm.com>
 
        * gcc.target/aarch64/ands_1.c: New test. 
 
        * gcc.target/aarch64/negs.c: New.
 
+>>>>>>> trunk
 2013-04-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/56895