This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, i386, Pointer Bounds Checker 17/x] Pointer bounds constants support
- From: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 2 Jun 2014 14:25:02 +0400
- Subject: [PATCH, i386, Pointer Bounds Checker 17/x] Pointer bounds constants support
- Authentication-results: sourceware.org; auth=none
Hi,
This patch adds support for pointer bounds constants to be used as DECL_INITIAL for constant bounds (like zero bounds).
Bootstrapped and tested on linux-x86_64.
Thanks,
Ilya
--
gcc/
2014-05-30 Ilya Enkovich <ilya.enkovich@intel.com>
* emit-rtl.c (immed_double_const): Support MODE_POINTER_BOUNDS.
(init_emit_once): Build pointer bounds zero constants.
* explow.c (trunc_int_for_mode): Likewise.
* varpool.c (ctor_for_folding): Do not fold constant
bounds vars.
* varasm.c (output_constant_pool_2): Support MODE_POINTER_BOUNDS.
* config/i386/i386.c (ix86_legitimate_constant_p): Mark
bounds constant as not valid.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 6a99b6b..888f5ad 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -12443,8 +12443,12 @@ darwin_local_data_pic (rtx disp)
satisfies CONSTANT_P. */
static bool
-ix86_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
+ix86_legitimate_constant_p (enum machine_mode mode, rtx x)
{
+ /* Pointer bounds constants are not valid. */
+ if (POINTER_BOUNDS_MODE_P (mode))
+ return false;
+
switch (GET_CODE (x))
{
case CONST:
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 4736f8d..f9484d5 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -505,7 +505,8 @@ immed_double_const (HOST_WIDE_INT i0, HOST_WIDE_INT i1, enum machine_mode mode)
|| GET_MODE_CLASS (mode) == MODE_PARTIAL_INT
/* We can get a 0 for an error mark. */
|| GET_MODE_CLASS (mode) == MODE_VECTOR_INT
- || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT);
+ || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
+ || GET_MODE_CLASS (mode) == MODE_POINTER_BOUNDS);
if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
return gen_int_mode (i0, mode);
@@ -5875,6 +5876,11 @@ init_emit_once (void)
if (STORE_FLAG_VALUE == 1)
const_tiny_rtx[1][(int) BImode] = const1_rtx;
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_POINTER_BOUNDS);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ const_tiny_rtx[0][mode] = immed_double_const (0, 0, mode);
+
pc_rtx = gen_rtx_fmt_ (PC, VOIDmode);
ret_rtx = gen_rtx_fmt_ (RETURN, VOIDmode);
simple_return_rtx = gen_rtx_fmt_ (SIMPLE_RETURN, VOIDmode);
diff --git a/gcc/explow.c b/gcc/explow.c
index 48e91a6..9661abb 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -53,7 +53,8 @@ trunc_int_for_mode (HOST_WIDE_INT c, enum machine_mode mode)
int width = GET_MODE_PRECISION (mode);
/* You want to truncate to a _what_? */
- gcc_assert (SCALAR_INT_MODE_P (mode));
+ gcc_assert (SCALAR_INT_MODE_P (mode)
+ || POINTER_BOUNDS_MODE_P (mode));
/* Canonicalize BImode to 0 and STORE_FLAG_VALUE. */
if (mode == BImode)
diff --git a/gcc/varasm.c b/gcc/varasm.c
index af7fb4a..fcae2fa 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -3799,6 +3799,7 @@ output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
case MODE_UFRACT:
case MODE_ACCUM:
case MODE_UACCUM:
+ case MODE_POINTER_BOUNDS:
assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
break;
diff --git a/gcc/varpool.c b/gcc/varpool.c
index 0eeb2b6..321165d 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -257,6 +257,12 @@ ctor_for_folding (tree decl)
&& TREE_CODE (decl) != CONST_DECL)
return error_mark_node;
+ /* Static constant bounds are created to be
+ used instead of constants and therefore
+ do not let folding it. */
+ if (POINTER_BOUNDS_P (decl))
+ return error_mark_node;
+
if (TREE_CODE (decl) == CONST_DECL
|| DECL_IN_CONSTANT_POOL (decl))
return DECL_INITIAL (decl);