[PATCH] Fix up __builtin_alloca_with_align (0, ...) folding (PR sanitizer/91707)

Jakub Jelinek jakub@redhat.com
Tue Sep 24 10:46:00 GMT 2019


Hi!

build_array_type_nelts is only meaningful for non-zero number of elements,
for 0 it creates weirdo arrays like char D.2358[0:18446744073709551615].
The following patch uses in that case types like the C FE emits for
zero-length array instead (i.e. char D.2358[0:] with forced 0 size).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-09-24  Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/91707
	* tree-ssa-ccp.c (fold_builtin_alloca_with_align): For n_elem 0
	use a type like C zero length array instead of array from 0
	to SIZE_MAX.

--- gcc/tree-ssa-ccp.c.jj	2019-09-20 12:25:26.809718354 +0200
+++ gcc/tree-ssa-ccp.c	2019-09-23 19:38:03.530722874 +0200
@@ -2223,7 +2223,18 @@ fold_builtin_alloca_with_align (gimple *
   /* Declare array.  */
   elem_type = build_nonstandard_integer_type (BITS_PER_UNIT, 1);
   n_elem = size * 8 / BITS_PER_UNIT;
-  array_type = build_array_type_nelts (elem_type, n_elem);
+  if (n_elem == 0)
+    {
+      /* For alloca (0), use array type similar to C zero-length arrays.  */
+      tree range_type = build_range_type (sizetype, size_zero_node, NULL_TREE);
+      array_type = build_array_type (elem_type, range_type);
+      array_type = build_distinct_type_copy (TYPE_MAIN_VARIANT (array_type));
+      TYPE_SIZE (array_type) = bitsize_zero_node;
+      TYPE_SIZE_UNIT (array_type) = size_zero_node;
+      SET_TYPE_STRUCTURAL_EQUALITY (array_type);
+    }
+  else
+    array_type = build_array_type_nelts (elem_type, n_elem);
   var = create_tmp_var (array_type);
   SET_DECL_ALIGN (var, TREE_INT_CST_LOW (gimple_call_arg (stmt, 1)));
   if (uid != 0)

	Jakub



More information about the Gcc-patches mailing list