2014-04-16 15:00 GMT+04:00 Ilya Enkovich <enkovich....@gmail.com>:
> Hi,
>
> This patch restarts the series for introducing Pointer Bounds Checker 
> instrumentation and supporting Intel Memory Protection Extension (MPX) 
> technology.  Detailed description is on GCC Wiki page: 
> http://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler.
>
> The first patch introduces pointer bounds type and mode.  It was approved 
> earlier for 4.9 and had no significant changes since then.  I'll assume patch 
> is OK if no objections arise.
>
> Patch was bootstrapped and tested for linux-x86_64.
>
> Thanks,
> Ilya
> --
> gcc/
>
> 2014-04-16  Ilya Enkovich  <ilya.enkov...@intel.com>
>
>         * mode-classes.def (MODE_POINTER_BOUNDS): New.
>         * tree.def (POINTER_BOUNDS_TYPE): New.
>         * genmodes.c (complete_mode): Support MODE_POINTER_BOUNDS.
>         (POINTER_BOUNDS_MODE): New.
>         (make_pointer_bounds_mode): New.
>         * machmode.h (POINTER_BOUNDS_MODE_P): New.
>         * stor-layout.c (int_mode_for_mode): Support MODE_POINTER_BOUNDS.
>         (layout_type): Support POINTER_BOUNDS_TYPE.
>         * tree-pretty-print.c (dump_generic_node): Support 
> POINTER_BOUNDS_TYPE.
>         * tree.c (build_int_cst_wide): Support POINTER_BOUNDS_TYPE.
>         (type_contains_placeholder_1): Likewise.
>         * tree.h (POINTER_BOUNDS_TYPE_P): New.
>         * varasm.c (output_constant): Support POINTER_BOUNDS_TYPE.
>         * doc/rtl.texi (MODE_POINTER_BOUNDS): New.
>
>
> diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi
> index 20b7187..3a1014d 100644
> --- a/gcc/doc/rtl.texi
> +++ b/gcc/doc/rtl.texi
> @@ -1382,6 +1382,12 @@ any @code{CC_MODE} modes listed in the 
> @file{@var{machine}-modes.def}.
>  @xref{Jump Patterns},
>  also see @ref{Condition Code}.
>
> +@findex MODE_POINTER_BOUNDS
> +@item MODE_POINTER_BOUNDS
> +Pointer bounds modes.  Used to represent values of pointer bounds type.
> +Operations in these modes may be executed as NOPs depending on hardware
> +features and environment setup.
> +
>  @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 8cc3cde..9d0b413 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_POINTER_BOUNDS:
>      case MODE_FLOAT:
>      case MODE_DECIMAL_FLOAT:
>      case MODE_FRACT:
> @@ -534,6 +535,19 @@ make_special_mode (enum mode_class cl, const char *name,
>    new_mode (cl, name, file, line);
>  }
>
> +#define POINTER_BOUNDS_MODE(N, Y) \
> +  make_pointer_bounds_mode (#N, Y, __FILE__, __LINE__)
> +
> +static void ATTRIBUTE_UNUSED
> +make_pointer_bounds_mode (const char *name,
> +                         unsigned int bytesize,
> +                         const char *file, unsigned int line)
> +{
> +  struct mode_data *m = new_mode (MODE_POINTER_BOUNDS, 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 bc5d901..cbe5042 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 POINTER_BOUNDS_MODE_P(MODE)      \
> +  (GET_MODE_CLASS (MODE) == MODE_POINTER_BOUNDS)
> +
>  /* 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 9c6a8bb..b645484 100644
> --- a/gcc/mode-classes.def
> +++ b/gcc/mode-classes.def
> @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3.  If not see
>    DEF_MODE_CLASS (MODE_CC),            /* condition code in a register */ \
>    DEF_MODE_CLASS (MODE_INT),           /* integer */                      \
>    DEF_MODE_CLASS (MODE_PARTIAL_INT),   /* integer with padding bits */    \
> +  DEF_MODE_CLASS (MODE_POINTER_BOUNDS), /* bounds */                       \
>    DEF_MODE_CLASS (MODE_FRACT),         /* signed fractional number */     \
>    DEF_MODE_CLASS (MODE_UFRACT),                /* unsigned fractional number 
> */   \
>    DEF_MODE_CLASS (MODE_ACCUM),         /* signed accumulator */           \
> diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
> index 084d195..af0ab88 100644
> --- a/gcc/stor-layout.c
> +++ b/gcc/stor-layout.c
> @@ -386,6 +386,7 @@ int_mode_for_mode (enum machine_mode mode)
>      case MODE_VECTOR_ACCUM:
>      case MODE_VECTOR_UFRACT:
>      case MODE_VECTOR_UACCUM:
> +    case MODE_POINTER_BOUNDS:
>        mode = mode_for_size (GET_MODE_BITSIZE (mode), MODE_INT, 0);
>        break;
>
> @@ -2124,6 +2125,11 @@ layout_type (tree type)
>        SET_TYPE_MODE (type, VOIDmode);
>        break;
>
> +    case POINTER_BOUNDS_TYPE:
> +      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 83d5ca6..5fd0f6b 100644
> --- a/gcc/tree-pretty-print.c
> +++ b/gcc/tree-pretty-print.c
> @@ -869,6 +869,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int 
> spc, int flags,
>        break;
>
>      case VOID_TYPE:
> +    case POINTER_BOUNDS_TYPE:
>      case INTEGER_TYPE:
>      case REAL_TYPE:
>      case FIXED_POINT_TYPE:
> diff --git a/gcc/tree.c b/gcc/tree.c
> index efee5e6..6a2ca1c 100644
> --- a/gcc/tree.c
> +++ b/gcc/tree.c
> @@ -1158,7 +1158,8 @@ build_int_cst_wide (tree type, unsigned HOST_WIDE_INT 
> low, HOST_WIDE_INT hi)
>
>      case POINTER_TYPE:
>      case REFERENCE_TYPE:
> -      /* Cache NULL pointer.  */
> +    case POINTER_BOUNDS_TYPE:
> +      /* Cache NULL pointer and zero bounds.  */
>        if (!hi && !low)
>         {
>           limit = 1;
> @@ -3287,6 +3288,7 @@ type_contains_placeholder_1 (const_tree type)
>    switch (TREE_CODE (type))
>      {
>      case VOID_TYPE:
> +    case POINTER_BOUNDS_TYPE:
>      case COMPLEX_TYPE:
>      case ENUMERAL_TYPE:
>      case BOOLEAN_TYPE:
> diff --git a/gcc/tree.def b/gcc/tree.def
> index f8d6444..42eb758 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 (POINTER_BOUNDS_TYPE, "pointer_bounds_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 9fbc5c4..f347b9b 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -548,6 +548,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 pointer bounds type.  */
> +#define POINTER_BOUNDS_TYPE_P(NODE) \
> +  (TREE_CODE (NODE) == POINTER_BOUNDS_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 8e8c5f6..af7fb4a 100644
> --- a/gcc/varasm.c
> +++ b/gcc/varasm.c
> @@ -4700,6 +4700,7 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, 
> unsigned int align)
>      case REFERENCE_TYPE:
>      case OFFSET_TYPE:
>      case FIXED_POINT_TYPE:
> +    case POINTER_BOUNDS_TYPE:
>      case NULLPTR_TYPE:
>        if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
>                                            EXPAND_INITIALIZER),

Will install it in a couple of days.

Ilya

Reply via email to