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))