Commit 3de2a40e by Ilya Enkovich Committed by Ilya Enkovich

re PR c/68337 ([MPX] memcpy() for arrays with function pointers results in huge…

re PR c/68337 ([MPX] memcpy() for arrays with function pointers results in huge resource usage and binaries)

gcc/

	PR c/68337
	* gimple-fold.c: Include ipa-chkp.h.
	(gimple_fold_builtin_memory_op): Don't fold call if we
	are going to instrument it and it may copy pointers.

gcc/testsuite/

	PR c/68337
	* gcc.target/i386/mpx/pr68337-1.c: New test.
	* gcc.target/i386/mpx/pr68337-2.c: New test.

From-SVN: r230796
parent 8632824e
2015-11-24 Ilya Enkovich <enkovich.gnu@gmail.com>
PR c/68337
* gimple-fold.c: Include ipa-chkp.h.
(gimple_fold_builtin_memory_op): Don't fold call if we
are going to instrument it and it may copy pointers.
2015-11-24 Bernd Schmidt <bschmidt@redhat.com>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
......@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see
#include "gomp-constants.h"
#include "optabs-query.h"
#include "omp-low.h"
#include "ipa-chkp.h"
/* Return true when DECL can be referenced from current unit.
......@@ -664,6 +665,18 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
unsigned int src_align, dest_align;
tree off0;
/* Inlining of memcpy/memmove may cause bounds lost (if we copy
pointers as wide integer) and also may result in huge function
size because of inlined bounds copy. Thus don't inline for
functions we want to instrument. */
if (flag_check_pointer_bounds
&& chkp_instrumentable_p (cfun->decl)
/* Even if data may contain pointers we can inline if copy
less than a pointer size. */
&& (!tree_fits_uhwi_p (len)
|| compare_tree_int (len, POINTER_SIZE_UNITS) >= 0))
return false;
/* Build accesses at offset zero with a ref-all character type. */
off0 = build_int_cst (build_pointer_type_for_mode (char_type_node,
ptr_mode, true), 0);
......
2015-11-24 Ilya Enkovich <enkovich.gnu@gmail.com>
PR c/68337
* gcc.target/i386/mpx/pr68337-1.c: New test.
* gcc.target/i386/mpx/pr68337-2.c: New test.
2015-11-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR rtl-optimization/68194
......
/* { dg-do run } */
/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
#include "mpx-check.h"
#define N 2
extern void abort ();
static int
mpx_test (int argc, const char **argv)
{
char ** src = (char **)malloc (sizeof (char *) * N);
char ** dst = (char **)malloc (sizeof (char *) * N);
int i;
for (i = 0; i < N; i++)
src[i] = __bnd_set_ptr_bounds (argv[0] + i, i + 1);
__builtin_memcpy(dst, src, sizeof (char *) * N);
for (i = 0; i < N; i++)
{
char *p = dst[i];
if (p != argv[0] + i
|| __bnd_get_ptr_lbound (p) != p
|| __bnd_get_ptr_ubound (p) != p + i)
abort ();
}
return 0;
}
/* { dg-do compile } */
/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
/* { dg-final { scan-assembler-not "memcpy" } } */
void
test (void *dst, void *src)
{
__builtin_memcpy (dst, src, sizeof (char *) / 2);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment