Hey guys,

could please someone look at this small patch? It blocks approved MPX
ISA support on i386 target.

Thanks,
Ilya

2013/10/2 Ilya Enkovich <enkovich....@gmail.com>:
> 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