Merge in trunk.
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Nov 2013 02:15:30 +0000 (02:15 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Nov 2013 02:15:30 +0000 (02:15 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/wide-int@204436 138bc75d-0d04-0410-961f-82ee72b054a4

33 files changed:
1  2 
gcc/Makefile.in
gcc/asan.c
gcc/c-family/c-cppbuiltin.c
gcc/c-family/c-pragma.c
gcc/c/c-parser.c
gcc/config/aarch64/aarch64.c
gcc/config/arm/arm.c
gcc/config/i386/i386.c
gcc/config/rs6000/rs6000.c
gcc/config/sh/sh.md
gcc/cp/decl.c
gcc/cp/parser.c
gcc/doc/md.texi
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/expr.c
gcc/final.c
gcc/fortran/trans-expr.c
gcc/fortran/trans-io.c
gcc/gengtype-parse.c
gcc/gimple.c
gcc/gimplify.c
gcc/ipa-prop.c
gcc/loop-iv.c
gcc/omp-low.c
gcc/optabs.c
gcc/rtlanal.c
gcc/target.def
gcc/tree-dfa.c
gcc/tree-ssa-alias.c
gcc/tree-ssa.c
gcc/tree-vrp.c
gcc/tree.c

diff --cc gcc/Makefile.in
Simple merge
diff --cc gcc/asan.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc gcc/cp/decl.c
Simple merge
diff --cc gcc/cp/parser.c
Simple merge
diff --cc gcc/doc/md.texi
Simple merge
diff --cc gcc/doc/tm.texi
Simple merge
Simple merge
diff --cc gcc/expr.c
Simple merge
diff --cc gcc/final.c
@@@ -78,7 -78,7 +78,8 @@@ along with GCC; see the file COPYING3
  #include "cfgloop.h"
  #include "params.h"
  #include "tree-pretty-print.h" /* for dump_function_header */
+ #include "asan.h"
 +#include "wide-int-print.h"
  
  #ifdef XCOFF_DEBUGGING_INFO
  #include "xcoffout.h"         /* Needed for external data
Simple merge
Simple merge
Simple merge
diff --cc gcc/gimple.c
Simple merge
diff --cc gcc/gimplify.c
Simple merge
diff --cc gcc/ipa-prop.c
Simple merge
diff --cc gcc/loop-iv.c
Simple merge
diff --cc gcc/omp-low.c
Simple merge
diff --cc gcc/optabs.c
Simple merge
diff --cc gcc/rtlanal.c
Simple merge
diff --cc gcc/target.def
Simple merge
diff --cc gcc/tree-dfa.c
@@@ -386,10 -386,9 +386,9 @@@ get_ref_base_and_extent (tree exp, HOST
    HOST_WIDE_INT bitsize = -1;
    HOST_WIDE_INT maxsize = -1;
    tree size_tree = NULL_TREE;
 -  double_int bit_offset = double_int_zero;
 +  offset_int bit_offset = 0;
    HOST_WIDE_INT hbit_offset;
    bool seen_variable_array_ref = false;
-   tree base_type;
  
    /* First get the final access size from just the outermost expression.  */
    if (TREE_CODE (exp) == COMPONENT_REF)
        case VIEW_CONVERT_EXPR:
          break;
  
 -            bit_offset = double_int_zero;
+       case TARGET_MEM_REF:
+         /* Via the variable index or index2 we can reach the
+            whole object.  Still hand back the decl here.  */
+         if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
+             && (TMR_INDEX (exp) || TMR_INDEX2 (exp)))
+           {
+             exp = TREE_OPERAND (TMR_BASE (exp), 0);
++            bit_offset = 0;
+             maxsize = -1;
+             goto done;
+           }
+         /* Fallthru.  */
        case MEM_REF:
 -                || !host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
+         /* We need to deal with variable arrays ending structures such as
+            struct { int length; int a[1]; } x;           x.a[d]
+            struct { struct { int a; int b; } a[1]; } x;  x.a[d].a
+            struct { struct { int a[1]; } a[1]; } x;      x.a[0][d], x.a[d][0]
+            struct { int len; union { int a[1]; struct X x; } u; } x; x.u.a[d]
+            where we do not know maxsize for variable index accesses to
+            the array.  The simplest way to conservatively deal with this
+            is to punt in the case that offset + maxsize reaches the
+            base type boundary.  This needs to include possible trailing
+            padding that is there for alignment purposes.  */
+         if (seen_variable_array_ref
+             && maxsize != -1
+             && (!bit_offset.fits_shwi ()
 -                    == (signed) TREE_INT_CST_LOW
++                || !tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (exp)))
+                 || (bit_offset.to_shwi () + maxsize
++                    == (signed) tree_to_uhwi
+                           (TYPE_SIZE (TREE_TYPE (exp))))))
+           maxsize = -1;
          /* Hand back the decl for MEM[&decl, off].  */
          if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
            {
  
        exp = TREE_OPERAND (exp, 0);
      }
-  done:
  
 -        || !host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
+   /* We need to deal with variable arrays ending structures.  */
+   if (seen_variable_array_ref
+       && maxsize != -1
+       && (!bit_offset.fits_shwi ()
 -            == (signed) TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (exp))))))
++        || !tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (exp)))
+         || (bit_offset.to_shwi () + maxsize
 -  if (!bit_offset.fits_shwi ())
++            == (signed) tree_to_uhwi (TYPE_SIZE (TREE_TYPE (exp))))))
+     maxsize = -1;
+  done:
 +  if (!wi::fits_shwi_p (bit_offset))
      {
        *poffset = 0;
        *psize = bitsize;
Simple merge
diff --cc gcc/tree-ssa.c
Simple merge
diff --cc gcc/tree-vrp.c
Simple merge
diff --cc gcc/tree.c
Simple merge