On 15 Nov 00:10, Jeff Law wrote:
> On 11/14/14 10:26, Ilya Enkovich wrote:
> >Hi,
> >
> >This patch introduces a simple library with several wrappers to be used with 
> >MPX and Pointer Bounds Checker.  Wrappers allow to obtain, copy and just 
> >keep alive bounds whrough widely use library calls.  It significantly 
> >increases checking  quality.
> >
> >Thanks,
> >Ilya
> >--
> >gcc/
> >
> >2014-11-14  Ilya Enkovich  <ilya.enkov...@intel.com>
> >
> >     * gcc.c (MPX_SPEC): Add wrappers library.
> >
> >libmpx/
> >
> >2014-11-14  Ilya Enkovich  <ilya.enkov...@intel.com>
> >
> >     * Makefile.am (SUBDIRS): New.
> >     (MAKEOVERRIDES): New.
> >     * Makefile.in: Regenerate.
> >     * configure.ac: Add mpxintr/Makefile to config
> >     files.
> >     * configure: Regenerate.
> >     * mpxwrap/Makefile.am: New.
> >     * mpxwrap/Makefile.in: New.
> >     * mpxwrap/libtool-version: New.
> >     * mpxwrap/mpx_wrappers.cc: New.
> As Joseph mentioned, symbol versioning.  Anytime a target side
> library is added to GCC, it should be properly versioned.
> 
> Don't forget copyright headers in the new files.  Remember it has to
> be suitable for embeddeding in the target without infecting the
> target with the GPL.  LGPL or GPL + exception clause seem the most
> appropriate to me.
> 
> 
> Jeff
> 

Thank you for review!  Here is a version with license and versioning added.

Thanks,
Ilya
--
gcc/

2014-11-18  Ilya Enkovich  <ilya.enkov...@intel.com>

        * gcc.c (MPX_SPEC): Add wrappers library.

libmpx/

2014-11-18  Ilya Enkovich  <ilya.enkov...@intel.com>

        * Makefile.am (SUBDIRS): New.
        (MAKEOVERRIDES): New.
        * Makefile.in: Regenerate.
        * configure.ac: Add mpxintr/Makefile to config
        files.
        * configure: Regenerate.
        * mpxwrap/Makefile.am: New.
        * mpxwrap/Makefile.in: New.
        * mpxwrap/libtool-version: New.
        * mpxwrap/mpx_wrappers.cc: New.
        * mpxwrap/libmpxwrappers.map: New.


diff --git a/gcc/gcc.c b/gcc/gcc.c
index 8ee7bba..56d7e79 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -811,9 +811,10 @@ proper position among the other output files.  */
 
 #ifndef MPX_SPEC
 #define MPX_SPEC "\
-%{!nostdlib:%{!nodefaultlibs:%{mmpx:\
+%{!nostdlib:%{!nodefaultlibs:%{mmpx:%{fcheck-pointer-bounds:\
     %{static:%nMPX runtime is disabled due to -static used}\
-    %{!static:-lmpx}}}}"
+    %{!static:-lmpx}\
+    %{!fno-chkp-use-wrappers:-lmpxwrappers}}}}}"
 #endif
 
 /* -u* was put back because both BSD and SysV seem to support it.  */
diff --git a/libmpx/Makefile.am b/libmpx/Makefile.am
index c6b479f..553ad30 100644
--- a/libmpx/Makefile.am
+++ b/libmpx/Makefile.am
@@ -1,6 +1,9 @@
 ACLOCAL_AMFLAGS = -I .. -I ../config
 
-SUBDIRS = mpxrt
+SUBDIRS = mpxrt mpxwrap
+
+## May be used by toolexeclibdir.
+gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
@@ -39,3 +42,5 @@ AM_MAKEFLAGS = \
        "PICFLAG=$(PICFLAG)" \
        "RANLIB=$(RANLIB)" \
        "DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES =
diff --git a/libmpx/configure.ac b/libmpx/configure.ac
index 9a761c4..f3abead 100644
--- a/libmpx/configure.ac
+++ b/libmpx/configure.ac
@@ -110,7 +110,7 @@ fi
 
 AC_CONFIG_FILES([Makefile])
 AC_CONFIG_HEADERS(config.h)
-AC_CONFIG_FILES(AC_FOREACH([DIR], [mpxrt], [DIR/Makefile]),
+AC_CONFIG_FILES(AC_FOREACH([DIR], [mpxrt mpxwrap], [DIR/Makefile ]),
   [cat > vpsed$$ << \_EOF
 s!`test -f '$<' || echo '$(srcdir)/'`!!
 _EOF
diff --git a/libmpx/mpxwrap/Makefile.am b/libmpx/mpxwrap/Makefile.am
new file mode 100644
index 0000000..c254d9b
--- /dev/null
+++ b/libmpx/mpxwrap/Makefile.am
@@ -0,0 +1,54 @@
+ALCLOCAL_AMFLAGS = -I .. -I ../config
+
+# May be used by toolexeclibdir.
+gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
+
+libmpxwrappers_la_CFLAGS = -fcheck-pointer-bounds -mmpx -fno-chkp-check-read \
+                          -fno-chkp-check-write -fno-chkp-use-wrappers
+libmpxwrappers_la_DEPENDENCIES = libmpxwrappers.map
+libmpxwrappers_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libmpxwrappers.map
+
+toolexeclib_LTLIBRARIES = libmpxwrappers.la
+
+libmpxwrappers_la_SOURCES = mpx_wrappers.c
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+       "AR_FLAGS=$(AR_FLAGS)" \
+       "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+       "CFLAGS=$(CFLAGS)" \
+       "CXXFLAGS=$(CXXFLAGS)" \
+       "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+       "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+       "INSTALL=$(INSTALL)" \
+       "INSTALL_DATA=$(INSTALL_DATA)" \
+       "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+       "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+       "JC1FLAGS=$(JC1FLAGS)" \
+       "LDFLAGS=$(LDFLAGS)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+       "MAKE=$(MAKE)" \
+       "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+       "PICFLAG=$(PICFLAG)" \
+       "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+       "SHELL=$(SHELL)" \
+       "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+       "exec_prefix=$(exec_prefix)" \
+       "infodir=$(infodir)" \
+       "libdir=$(libdir)" \
+       "prefix=$(prefix)" \
+       "includedir=$(includedir)" \
+       "AR=$(AR)" \
+       "AS=$(AS)" \
+       "LD=$(LD)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "NM=$(NM)" \
+       "PICFLAG=$(PICFLAG)" \
+       "RANLIB=$(RANLIB)" \
+       "DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES =
+
diff --git a/libmpx/mpxwrap/libmpxwrappers.map 
b/libmpx/mpxwrap/libmpxwrappers.map
new file mode 100644
index 0000000..c2912a7
--- /dev/null
+++ b/libmpx/mpxwrap/libmpxwrappers.map
@@ -0,0 +1,23 @@
+LIBMPXWRAPPERS_1.0
+{
+  global:
+       __mpx_wrapper_malloc;
+       __mpx_wrapper_mmap;
+       __mpx_wrapper_realloc;
+       __mpx_wrapper_calloc;
+       __mpx_wrapper_memset;
+       __mpx_wrapper_bzero;
+       __mpx_wrapper_memmove;
+       __mpx_wrapper_memcpy;
+       __mpx_wrapper_mempcpy;
+       __mpx_wrapper_strncat;
+       __mpx_wrapper_strcat;
+       __mpx_wrapper_stpcpy;
+       __mpx_wrapper_stpncpy;
+       __mpx_wrapper_strcpy;
+       __mpx_wrapper_strncpy;
+       __mpx_wrapper_strlen;
+
+  local:
+       *;
+};
diff --git a/libmpx/mpxwrap/libtool-version b/libmpx/mpxwrap/libtool-version
new file mode 100644
index 0000000..bfe84c8
--- /dev/null
+++ b/libmpx/mpxwrap/libtool-version
@@ -0,0 +1,6 @@
+# This file is used to maintain libtool version info for libmpxintr.  See
+# the libtool manual to understand the meaning of the fields.  This is
+# a separate file so that version updates don't involve re-running
+# automake.
+# CURRENT:REVISION:AGE
+1:0:0
diff --git a/libmpx/mpxwrap/mpx_wrappers.c b/libmpx/mpxwrap/mpx_wrappers.c
new file mode 100644
index 0000000..bcff80f
--- /dev/null
+++ b/libmpx/mpxwrap/mpx_wrappers.c
@@ -0,0 +1,258 @@
+/* MPX Wrappers Library
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   Contributed by Ilya Enkovich (ilya.enkov...@intel.com)
+
+   This file is part of the libmpxwrappers library.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA. 
 */
+
+#include "stdlib.h"
+#include "string.h"
+#include <sys/mman.h>
+
+void *
+__mpx_wrapper_malloc (size_t size)
+{
+  void *p = (void *)malloc (size);
+  if (!p) return __bnd_null_ptr_bounds (p);
+  return __bnd_set_ptr_bounds (p, size);
+}
+
+
+void *
+__mpx_wrapper_mmap (void *addr, size_t length, int prot, int flags,
+                   int fd, off_t offset)
+{
+  void *p = mmap (addr, length, prot, flags, fd, offset);
+  if (!p) return __bnd_null_ptr_bounds (p);
+  return __bnd_set_ptr_bounds (p, length);
+}
+
+void *
+__mpx_wrapper_realloc (void *ptr, size_t n)
+{
+  if (!ptr)
+    return __mpx_wrapper_malloc (n);
+
+  /* We don't kwnow how much data is copied by realloc
+     and therefore may check only lower bounds.  */
+  __bnd_chk_ptr_lbounds (ptr);
+  ptr = realloc (ptr, n);
+
+  if (!ptr)
+    return __bnd_null_ptr_bounds (ptr);
+
+  return __bnd_set_ptr_bounds (ptr, n);
+}
+
+void *
+__mpx_wrapper_calloc (size_t n_elements, size_t element_size)
+{
+  void *p = calloc (n_elements, element_size);
+  if (!p)
+    return __bnd_null_ptr_bounds (p);
+  return __bnd_set_ptr_bounds (p, n_elements * element_size);
+}
+
+void *
+__mpx_wrapper_memset (void *dstpp, int c, size_t len)
+{
+  if (len > 0)
+    {
+      __bnd_chk_ptr_bounds (dstpp, len);
+      memset (dstpp, c, len);
+    }
+  return dstpp;
+}
+
+void
+__mpx_wrapper_bzero (void *dst, size_t len)
+{
+  __mpx_wrapper_memset (dst, 0, len);
+}
+
+void *
+__mpx_wrapper_memmove (void *dst, const void *src, size_t n)
+{
+  const char *s = (const char*)src;
+  char *d = (char*)dst;
+  void *ret = dst;
+  size_t offset_src = ((size_t) s) & (sizeof (void *) - 1);
+  size_t offset_dst = ((size_t) d) & (sizeof (void *) - 1);
+
+  __bnd_chk_ptr_bounds (dst, n);
+  __bnd_chk_ptr_bounds (src, n);
+
+  /* Different alignment means that even if
+     pointers exist in memory, we don't how
+     pointers are aligned and therefore cann't
+     copy bounds anyway.  */
+  if (offset_src != offset_dst)
+    memmove (dst, src, n);
+  else
+    {
+      if (s < d)
+       {
+         d += n;
+         s += n;
+         offset_src = (offset_src + n) & (sizeof (void *) -1);
+         while (n-- && offset_src--)
+           *--d = *--s;
+         n++;
+         if (!n)
+           return ret;
+         void **d1 = (void **)d;
+         void **s1 = (void **)s;
+         /* This loop will also copy bounds.  */
+         while (n >= sizeof (void *))
+           {
+             n -= sizeof (void *);
+             *--d1 = *--s1;
+           }
+         s = (char *)s1;
+         d = (char *)d1;
+         while (n--)
+           *--d = *--s;
+       }
+      else
+       {
+         offset_src = sizeof (void *) - offset_src;
+         while (n-- && offset_src--)
+           *d++ = *s++;
+         n++;
+         if (!n)
+           return ret;
+         void **d1 = (void **)d;
+         void **s1 = (void **)s;
+         /* This loop will also copy bounds.  */
+         while (n >= sizeof (void *))
+           {
+             n -= sizeof (void *);
+             *d1++ = *s1++;
+           }
+         s = (char *)s1;
+         d = (char *)d1;
+         while (n--)
+           *d++ = *s++;
+       }
+    }
+  return ret;
+}
+
+
+void *
+__mpx_wrapper_memcpy (void *dst, const void *src, size_t n)
+{
+  return __mpx_wrapper_memmove (dst, src, n);
+}
+
+void *
+__mpx_wrapper_mempcpy (void *dst, const void *src, size_t n)
+{
+  return (char *)__mpx_wrapper_memcpy (dst, src, n) + n;
+}
+
+char *
+__mpx_wrapper_strncat (char *dst, const char *src, size_t n)
+{
+  size_t dst_size = strlen (dst);
+  size_t src_size = strnlen (src, n);
+
+  __bnd_chk_ptr_bounds (dst, dst_size + src_size + 1);
+  if (src_size < n)
+    __bnd_chk_ptr_bounds (src, src_size + 1);
+  else
+    __bnd_chk_ptr_bounds (src, src_size);
+
+  strncat (dst, src, n);
+
+  return dst;
+}
+
+char *
+__mpx_wrapper_strcat (char *dst, const char *src)
+{
+  size_t dst_size = strlen (dst);
+  size_t src_size = strlen (src);
+
+  __bnd_chk_ptr_bounds (dst, dst_size + src_size + 1);
+  __bnd_chk_ptr_bounds (src, src_size + 1);
+
+  strcat (dst, src);
+
+  return dst;
+}
+
+char *
+__mpx_wrapper_stpcpy (char *dst, const char *src)
+{
+  size_t src_size = strlen (src);
+
+  __bnd_chk_ptr_bounds (dst, src_size + 1);
+  __bnd_chk_ptr_bounds (src, src_size + 1);
+
+  memcpy (dst, src, src_size + 1);
+
+  return dst + src_size;
+}
+
+char *
+__mpx_wrapper_stpncpy (char *dst, const char *src, size_t n)
+{
+  size_t src_size = strnlen (src, n);
+
+  __bnd_chk_ptr_bounds (dst, n);
+  if (src_size < n)
+    __bnd_chk_ptr_bounds (src, src_size + 1);
+  else
+    __bnd_chk_ptr_bounds (src, src_size);
+
+  return dst + src_size;
+}
+
+char *
+__mpx_wrapper_strcpy (char *dst, const char *src)
+{
+  size_t src_size = strlen (src);
+
+  __bnd_chk_ptr_bounds (dst, src_size + 1);
+  __bnd_chk_ptr_bounds (src, src_size + 1);
+
+  memcpy (dst, src, src_size + 1);
+
+  return dst;
+}
+
+char *
+__mpx_wrapper_strncpy (char *dst, const char *src, size_t n)
+{
+  size_t src_size = strnlen (src, n);
+
+  __bnd_chk_ptr_bounds (dst, n);
+  if (src_size < n)
+    __bnd_chk_ptr_bounds (src, src_size + 1);
+  else
+    __bnd_chk_ptr_bounds (src, src_size);
+
+  return dst;
+}
+
+size_t
+__mpx_wrapper_strlen (const char *s)
+{
+  size_t length = strlen (s);
+  __bnd_chk_ptr_bounds (s, length);
+  return length;
+}

Reply via email to