aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTsvetkova Alexandra <aleksandra.tsvetkova@intel.com>2015-12-11 14:38:53 +0000
committerIlya Enkovich <ienkovich@gcc.gnu.org>2015-12-11 14:38:53 +0000
commit653b8b8d89fa0243b7e769a22f172b3264da58f4 (patch)
tree62169eeb0eed7ce16ceda7ca3df1cf922428c590 /gcc
parenta9000e1e2f60df8bd20bbbb58a64bb2addf7e648 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/mpx/memmove-1.c117
-rw-r--r--gcc/testsuite/gcc.target/i386/mpx/memmove-2.c40
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;
+}