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