On Tue, May 6, 2014 at 2:10 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> 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.

Please avoid putting in this patch series piece-mail and instead wait until
all parts are approved.

Thanks,
Richard.

> Ilya

Reply via email to