Ping

2013/9/17 Ilya Enkovich <enkovich....@gmail.com>:
> Hi,
>
> Here is a patch introducing new type and mode for bounds. It is a part of MPX 
> ISA support patch (http://gcc.gnu.org/ml/gcc-patches/2013-07/msg01094.html).
>
> Bootstrapped and tested on linux-x86_64. Is it OK for trunk?
>
> Thanks,
> Ilya
> --
>
> gcc/
>
> 2013-09-16  Ilya Enkovich  <ilya.enkov...@intel.com>
>
>         * mode-classes.def (MODE_BOUND): New.
>         * tree.def (BOUND_TYPE): New.
>         * genmodes.c (complete_mode): Support MODE_BOUND.
>         (BOUND_MODE): New.
>         (make_bound_mode): New.
>         * machmode.h (BOUND_MODE_P): New.
>         * stor-layout.c (int_mode_for_mode): Support MODE_BOUND.
>         (layout_type): Support BOUND_TYPE.
>         * tree-pretty-print.c (dump_generic_node): Support BOUND_TYPE.
>         * tree.c (build_int_cst_wide): Support BOUND_TYPE.
>         (type_contains_placeholder_1): Likewise.
>         * tree.h (BOUND_TYPE_P): New.
>         * varasm.c (output_constant): Support BOUND_TYPE.
>         * doc/rtl.texi (MODE_BOUND): New.
>
> diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi
> index 1d62223..02b1214 100644
> --- a/gcc/doc/rtl.texi
> +++ b/gcc/doc/rtl.texi
> @@ -1382,6 +1382,10 @@ any @code{CC_MODE} modes listed in the 
> @file{@var{machine}-modes.def}.
>  @xref{Jump Patterns},
>  also see @ref{Condition Code}.
>
> +@findex MODE_BOUND
> +@item MODE_BOUND
> +Bound modes class.  Used to represent values of pointer bounds.
> +
>  @findex MODE_RANDOM
>  @item MODE_RANDOM
>  This is a catchall mode class for modes which don't fit into the above
> diff --git a/gcc/genmodes.c b/gcc/genmodes.c
> index dc38483..89174ec 100644
> --- a/gcc/genmodes.c
> +++ b/gcc/genmodes.c
> @@ -333,6 +333,7 @@ complete_mode (struct mode_data *m)
>        break;
>
>      case MODE_INT:
> +    case MODE_BOUND:
>      case MODE_FLOAT:
>      case MODE_DECIMAL_FLOAT:
>      case MODE_FRACT:
> @@ -533,6 +534,18 @@ make_special_mode (enum mode_class cl, const char *name,
>    new_mode (cl, name, file, line);
>  }
>
> +#define BOUND_MODE(N, Y) make_bound_mode (#N, Y, __FILE__, __LINE__)
> +
> +static void ATTRIBUTE_UNUSED
> +make_bound_mode (const char *name,
> +               unsigned int bytesize,
> +               const char *file, unsigned int line)
> +{
> +  struct mode_data *m = new_mode (MODE_BOUND, name, file, line);
> +  m->bytesize = bytesize;
> +}
> +
> +
>  #define INT_MODE(N, Y) FRACTIONAL_INT_MODE (N, -1U, Y)
>  #define FRACTIONAL_INT_MODE(N, B, Y) \
>    make_int_mode (#N, B, Y, __FILE__, __LINE__)
> diff --git a/gcc/machmode.h b/gcc/machmode.h
> index 981ee92..d4a20b2 100644
> --- a/gcc/machmode.h
> +++ b/gcc/machmode.h
> @@ -174,6 +174,9 @@ extern const unsigned char mode_class[NUM_MACHINE_MODES];
>     || CLASS == MODE_ACCUM                      \
>     || CLASS == MODE_UACCUM)
>
> +#define BOUND_MODE_P(MODE)      \
> +  (GET_MODE_CLASS (MODE) == MODE_BOUND)
> +
>  /* Get the size in bytes and bits of an object of mode MODE.  */
>
>  extern CONST_MODE_SIZE unsigned char mode_size[NUM_MACHINE_MODES];
> diff --git a/gcc/mode-classes.def b/gcc/mode-classes.def
> index 7207ef7..c5ea215 100644
> --- a/gcc/mode-classes.def
> +++ b/gcc/mode-classes.def
> @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3.  If not see
>    DEF_MODE_CLASS (MODE_RANDOM),                /* other */                   
>      \
>    DEF_MODE_CLASS (MODE_CC),            /* condition code in a register */ \
>    DEF_MODE_CLASS (MODE_INT),           /* integer */                      \
> +  DEF_MODE_CLASS (MODE_BOUND),            /* bounds */                     \
>    DEF_MODE_CLASS (MODE_PARTIAL_INT),   /* integer with padding bits */    \
>    DEF_MODE_CLASS (MODE_FRACT),         /* signed fractional number */     \
>    DEF_MODE_CLASS (MODE_UFRACT),                /* unsigned fractional number 
> */   \
> diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
> index 6f6b310..82611c7 100644
> --- a/gcc/stor-layout.c
> +++ b/gcc/stor-layout.c
> @@ -383,6 +383,7 @@ int_mode_for_mode (enum machine_mode mode)
>      case MODE_VECTOR_ACCUM:
>      case MODE_VECTOR_UFRACT:
>      case MODE_VECTOR_UACCUM:
> +    case MODE_BOUND:
>        mode = mode_for_size (GET_MODE_BITSIZE (mode), MODE_INT, 0);
>        break;
>
> @@ -2135,6 +2136,13 @@ layout_type (tree type)
>        SET_TYPE_MODE (type, VOIDmode);
>        break;
>
> +    case BOUND_TYPE:
> +      SET_TYPE_MODE (type,
> +                     mode_for_size (TYPE_PRECISION (type), MODE_BOUND, 0));
> +      TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
> +      TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
> +      break;
> +
>      case OFFSET_TYPE:
>        TYPE_SIZE (type) = bitsize_int (POINTER_SIZE);
>        TYPE_SIZE_UNIT (type) = size_int (POINTER_SIZE / BITS_PER_UNIT);
> diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
> index 69e4006..8b0825c 100644
> --- a/gcc/tree-pretty-print.c
> +++ b/gcc/tree-pretty-print.c
> @@ -697,6 +697,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int 
> spc, int flags,
>        break;
>
>      case VOID_TYPE:
> +    case BOUND_TYPE:
>      case INTEGER_TYPE:
>      case REAL_TYPE:
>      case FIXED_POINT_TYPE:
> diff --git a/gcc/tree.c b/gcc/tree.c
> index b469b97..bbbe16e 100644
> --- a/gcc/tree.c
> +++ b/gcc/tree.c
> @@ -1197,6 +1197,7 @@ build_int_cst_wide (tree type, unsigned HOST_WIDE_INT 
> low, HOST_WIDE_INT hi)
>
>      case INTEGER_TYPE:
>      case OFFSET_TYPE:
> +    case BOUND_TYPE:
>        if (TYPE_UNSIGNED (type))
>         {
>           /* Cache 0..N */
> @@ -3232,6 +3233,7 @@ type_contains_placeholder_1 (const_tree type)
>    switch (TREE_CODE (type))
>      {
>      case VOID_TYPE:
> +    case BOUND_TYPE:
>      case COMPLEX_TYPE:
>      case ENUMERAL_TYPE:
>      case BOOLEAN_TYPE:
> diff --git a/gcc/tree.def b/gcc/tree.def
> index f825aad..b01cdd5 100644
> --- a/gcc/tree.def
> +++ b/gcc/tree.def
> @@ -232,6 +232,11 @@ DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", 
> tcc_type, 0)
>  /* The void type in C */
>  DEFTREECODE (VOID_TYPE, "void_type", tcc_type, 0)
>
> +/* Type to hold bounds for a pointer.
> +   Has TYPE_PRECISION component to specify number of bits used
> +   by this type.  */
> +DEFTREECODE (BOUND_TYPE, "bound_type", tcc_type, 0)
> +
>  /* Type of functions.  Special fields:
>     TREE_TYPE               type of value returned.
>     TYPE_ARG_TYPES      list of types of arguments expected.
> diff --git a/gcc/tree.h b/gcc/tree.h
> index 83edaba..863a204 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -1097,6 +1097,10 @@ extern void omp_clause_range_check_failed (const_tree, 
> const char *, int,
>  /* Nonzero if this type is a complete type.  */
>  #define COMPLETE_TYPE_P(NODE) (TYPE_SIZE (NODE) != NULL_TREE)
>
> +/* Nonzero if this type is a bound type.  */
> +#define BOUND_TYPE_P(NODE) \
> +  (TREE_CODE (NODE) == BOUND_TYPE)
> +
>  /* Nonzero if this type is the (possibly qualified) void type.  */
>  #define VOID_TYPE_P(NODE) (TREE_CODE (NODE) == VOID_TYPE)
>
> diff --git a/gcc/varasm.c b/gcc/varasm.c
> index 0504eeb..2b5305b 100644
> --- a/gcc/varasm.c
> +++ b/gcc/varasm.c
> @@ -4703,6 +4703,7 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, 
> unsigned int align)
>      case REFERENCE_TYPE:
>      case OFFSET_TYPE:
>      case FIXED_POINT_TYPE:
> +    case BOUND_TYPE:
>        if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
>                                            EXPAND_INITIALIZER),
>                               MIN (size, thissize), align, 0))

Reply via email to