diff options
author | Tsvetkova Alexandra <aleksandra.tsvetkova@intel.com> | 2015-12-11 14:38:53 +0000 |
---|---|---|
committer | Ilya Enkovich <ienkovich@gcc.gnu.org> | 2015-12-11 14:38:53 +0000 |
commit | 653b8b8d89fa0243b7e769a22f172b3264da58f4 (patch) | |
tree | 62169eeb0eed7ce16ceda7ca3df1cf922428c590 /gcc | |
parent | a9000e1e2f60df8bd20bbbb58a64bb2addf7e648 (diff) | |
download | gcc-653b8b8d89fa0243b7e769a22f172b3264da58f4.zip gcc-653b8b8d89fa0243b7e769a22f172b3264da58f4.tar.gz gcc-653b8b8d89fa0243b7e769a22f172b3264da58f4.tar.bz2 |
Makefile.am (libmpx_la_LDFLAGS): Add -version-info option.
libmpx/
2015-12-11 Tsvetkova Alexandra <aleksandra.tsvetkova@intel.com>
* mpxrt/Makefile.am (libmpx_la_LDFLAGS): Add -version-info
option.
* libmpxwrap/Makefile.am (libmpx_la_LDFLAGS): Likewise and
fix include path.
* libmpx/Makefile.in: Regenerate.
* mpxrt/Makefile.in: Regenerate.
* libmpxwrap/Makefile.in: Regenerate.
* mpxrt/libtool-version: New version.
* libmpxwrap/libtool-version: Likewise.
* mpxrt/libmpx.map: Add new version and a new symbol.
* mpxrt/mpxrt.h: New file.
* mpxrt/mpxrt.c (NUM_L1_BITS): Moved to mpxrt.h.
(REG_IP_IDX): Moved to mpxrt.h.
(REX_PREFIX): Moved to mpxrt.h.
(XSAVE_OFFSET_IN_FPMEM): Moved to mpxrt.h.
(MPX_L1_SIZE): Moved to mpxrt.h.
* libmpxwrap/mpx_wrappers.c (mpx_pointer): New type.
(mpx_bt_entry): New type.
(alloc_bt): New function.
(get_bt): New function.
(copy_if_possible): New function.
(copy_if_possible_from_end): New function.
(move_bounds): New function.
(__mpx_wrapper_memmove): Use move_bounds to copy bounds.
gcc/testsuite/
2015-12-11 Tsvetkova Alexandra <aleksandra.tsvetkova@intel.com>
* gcc.target/i386/mpx/memmove-1.c: New test.
* gcc.target/i386/mpx/memmove-2.c: New test.
From-SVN: r231565
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/mpx/memmove-1.c | 117 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/mpx/memmove-2.c | 40 |
3 files changed, 162 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 747b913..541228a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-11 Tsvetkova Alexandra <aleksandra.tsvetkova@intel.com> + + * gcc.target/i386/mpx/memmove-1.c: New test. + * gcc.target/i386/mpx/memmove-2.c: New test. + 2015-12-11 Nathan Sidwell <nathan@acm.org> * gcc.target/nvptx/ary-init.c: Repair dg_final syntax. diff --git a/gcc/testsuite/gcc.target/i386/mpx/memmove-1.c b/gcc/testsuite/gcc.target/i386/mpx/memmove-1.c new file mode 100644 index 0000000..0efd030 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/mpx/memmove-1.c @@ -0,0 +1,117 @@ +/* { dg-do run } */ +/* { dg-options "-fcheck-pointer-bounds -mmpx" } */ + + +#include <stdint.h> +#include <string.h> +#include "mpx-check.h" + +#ifdef __i386__ +/* i386 directory size is 4MB. */ +#define MPX_NUM_L2_BITS 10 +#define MPX_NUM_IGN_BITS 2 +#else /* __i386__ */ +/* x86_64 directory size is 2GB. */ +#define MPX_NUM_L2_BITS 17 +#define MPX_NUM_IGN_BITS 3 +#endif /* !__i386__ */ + + +/* bt_num_of_elems is the number of elements in bounds table. */ +unsigned long bt_num_of_elems = (1UL << MPX_NUM_L2_BITS); +/* Function to test MPX wrapper of memmove function. + src_bigger_dst determines which address is bigger, can be 0 or 1. + src_bt_index and dst_bt index are bt_indexes + from the beginning of the page. + bd_index_end is the bd index of the last element of src if we define + bd index of the first element as 0. + src_bt index_end is bt index of the last element of src. + pointers inside determines if array being copied includes pointers + src_align and dst_align are alignments of src and dst. + Arrays may contain unaligned pointers. */ +int +test (int src_bigger_dst, int src_bt_index, int dst_bt_index, + int bd_index_end, int src_bt_index_end, int pointers_inside, + int src_align, int dst_align) +{ + const int n = + src_bt_index_end - src_bt_index + bd_index_end * bt_num_of_elems; + if (n < 0) + { + return 0; + } + const int num_of_pointers = (bd_index_end + 2) * bt_num_of_elems; + void **arr = 0; + posix_memalign ((void **) (&arr), + 1UL << (MPX_NUM_L2_BITS + MPX_NUM_IGN_BITS), + num_of_pointers * sizeof (void *)); + void **src = arr, **dst = arr; + if ((src_bigger_dst) && (src_bt_index < dst_bt_index)) + src_bt_index += bt_num_of_elems; + if (!(src_bigger_dst) && (src_bt_index > dst_bt_index)) + dst_bt_index += bt_num_of_elems; + src += src_bt_index; + dst += dst_bt_index; + char *realign = (char *) src; + realign += src_align; + src = (void **) realign; + realign = (char *) dst; + realign += src_align; + dst = (void **) realign; + if (pointers_inside) + { + for (int i = 0; i < n; i++) + src[i] = __bnd_set_ptr_bounds (arr + i, i * sizeof (void *) + 1); + } + memmove (dst, src, n * sizeof (void *)); + if (pointers_inside) + { + for (int i = 0; i < n; i++) + { + if (dst[i] != arr + i) + abort (); + if (__bnd_get_ptr_lbound (dst[i]) != arr + i) + abort (); + if (__bnd_get_ptr_ubound (dst[i]) != arr + 2 * i) + abort (); + } + } + free (arr); + return 0; +} + +/* Call testall to test common cases of memmove for MPX. */ +void +testall () +{ + int align[3]; + align[0] = 0; + align[1] = 1; + align[2] = 7; + for (int pointers_inside = 0; pointers_inside < 2; pointers_inside++) + for (int src_bigger_dst = 0; src_bigger_dst < 2; src_bigger_dst++) + for (int src_align = 0; src_align < 3; src_align ++) + for (int dst_align = 0; dst_align < 3; dst_align ++) + for (int pages = 0; pages < 4; pages++) + { + test (src_bigger_dst, 1, 2, pages, 1, pointers_inside, + align[src_align], align[dst_align]); + test (src_bigger_dst, 1, 2, pages, 2, pointers_inside, + align[src_align], align[dst_align]); + test (src_bigger_dst, 2, 1, pages, 12, pointers_inside, + align[src_align], align[dst_align]); + test (src_bigger_dst, 2, 1, pages, 1, pointers_inside, + align[src_align], align[dst_align]); + test (src_bigger_dst, 2, 3, pages, 12, pointers_inside, + align[src_align], align[dst_align]); + test (src_bigger_dst, 1, bt_num_of_elems - 2, pages, 2, + pointers_inside, align[src_align], align[dst_align]); + } +}; + +int +mpx_test (int argc, const char **argv) +{ + testall (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/i386/mpx/memmove-2.c b/gcc/testsuite/gcc.target/i386/mpx/memmove-2.c new file mode 100644 index 0000000..e1d78fa --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/mpx/memmove-2.c @@ -0,0 +1,40 @@ +/* { dg-do run } */ +/* { dg-options "-fcheck-pointer-bounds -mmpx" } */ + + +#include <stdint.h> +#include <string.h> +#include "mpx-check.h" + +#ifdef __i386__ +/* i386 directory size is 4MB. */ +#define MPX_NUM_L2_BITS 10 +#define MPX_NUM_IGN_BITS 2 +#else /* __i386__ */ +/* x86_64 directory size is 2GB. */ +#define MPX_NUM_L2_BITS 17 +#define MPX_NUM_IGN_BITS 3 +#endif /* !__i386__ */ + + +/* bt_num_of_elems is the number of elements in bounds table. */ +unsigned long bt_num_of_elems = (1UL << MPX_NUM_L2_BITS); + +/* Function to test MPX wrapper of memmove function. + Check case with no BT allocated for data. */ + +int +mpx_test (int argc, const char **argv) +{ + void **arr = 0; + posix_memalign ((void **) (&arr), + 1UL << (MPX_NUM_L2_BITS + MPX_NUM_IGN_BITS), + 2 * bt_num_of_elems * sizeof (void *)); + void **src = arr, **dst = arr, **ptr = arr; + src += 10; + dst += 1; + ptr += bt_num_of_elems + 100; + ptr[0] = __bnd_set_ptr_bounds (arr + 1, sizeof (void *) + 1); + memmove (dst, src, 5 * sizeof (void *)); + return 0; +} |