Add valgrind
authorFlorian Fainelli <florian@openwrt.org>
Thu, 25 Oct 2007 13:59:16 +0000 (13:59 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Thu, 25 Oct 2007 13:59:16 +0000 (13:59 +0000)
SVN-Revision: 9445

utils/valgrind/Makefile [new file with mode: 0644]
utils/valgrind/files/uclibc.supp [new file with mode: 0644]
utils/valgrind/files/valgrind.sh [new file with mode: 0644]
utils/valgrind/patches/001-uclibc_syscall.patch [new file with mode: 0644]

diff --git a/utils/valgrind/Makefile b/utils/valgrind/Makefile
new file mode 100644 (file)
index 0000000..410beaa
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# Copyright (C) 2006 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+# $Id: $
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=valgrind
+PKG_VERSION:=3.2.3
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_URL:=http://valgrind.org/downloads/
+PKG_MD5SUM:=978847992b136c8d8cb5c6559a91df1c
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/valgrind
+  SECTION:=utils
+  CATEGORY:=Utilities
+  DEPENDS:=@TARGET_x86||@TARGET_rdc||@TARGET_ps3||@TARGET_magicbox||@TARGET_amcc||@TARGET_uml
+  TITLE:=debugging and profiling Linux programs
+  URL:=http://www.valgrind.org
+endef
+
+define Package/valgrind/description
+       Valgrind is an award-winning suite of tools for debugging and
+       profiling Linux programs. With the tools that come with Valgrind,
+       you can automatically detect many memory management and threading
+       bugs, avoiding hours of frustrating bug-hunting, making your
+       programs more stable. You can also perform detailed profiling,
+       to speed up and reduce memory use of your programs.
+endef
+
+CONFIGURE_ARGS += \
+       --disable-tls \
+       --enable-only32bit \
+       --without-x \
+       --without-uiout \
+       --disable-valgrindmi \
+       --disable-tui \
+       --disable-valgrindtk \
+        --without-included-gettext
+
+define Build/Compile   
+       $(MAKE) -C $(PKG_BUILD_DIR) \
+               DESTDIR="$(PKG_INSTALL_DIR)" \
+               all install
+endef
+
+define Package/valgrind/install        
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
+       $(INSTALL_BIN) ./files/valgrind.sh $(1)/usr/bin/
+       $(INSTALL_DIR) $(1)/usr/lib/valgrind
+       $(CP) ./files/uclibc.supp $(1)/usr/lib/valgrind/
+       $(CP) $(PKG_INSTALL_DIR)/usr/lib/valgrind/*-linux $(1)/usr/lib/valgrind/
+endef
+
+$(eval $(call BuildPackage,valgrind))
diff --git a/utils/valgrind/files/uclibc.supp b/utils/valgrind/files/uclibc.supp
new file mode 100644 (file)
index 0000000..e153266
--- /dev/null
@@ -0,0 +1,212 @@
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_strdup
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_malloc
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Cond
+   fun:_dl_get_ready_to_run
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_get_ready_to_run
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   fun:_dl_get_ready_to_run
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_get_ready_to_run
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_add_elf_hash_table
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   fun:_dl_add_elf_hash_table
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_add_elf_hash_table
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_check_if_named_library_is_loaded
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_check_if_named_library_is_loaded
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_check_hashed_files
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_check_hashed_files
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_load_elf_shared_library
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   fun:_dl_load_elf_shared_library
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_load_elf_shared_library
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   fun:_dl_load_shared_library
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr1
+   fun:_dl_find_hash
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_find_hash
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_fixup
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   fun:_dl_fixup
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_linux_resolve
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_linux_resolver
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   fun:_dl_parse_lazy_relocation_information
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   obj:/lib/ld-uClibc*
+   fun:_dl_parse_lazy_relocation_information
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_parse_lazy_relocation_information
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   obj:/lib/ld-uClibc*
+   obj:/lib/ld-uClibc*
+   fun:_dl_parse_lazy_relocation_information
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   obj:/lib/ld-uClibc*
+   fun:_dl_parse_lazy_relocation_information
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   obj:/lib/ld-uClibc*
+   fun:_dl_parse_relocation_information
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   fun:_dl_parse_relocation_information
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   fun:_dl_parse_relocation_information
+   obj:/lib/ld-uClibc*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   obj:/lib/ld-uClibc*
+   fun:_dl_parse_relocation_information
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   obj:/lib/ld-uClibc*
+   obj:/lib/ld-uClibc*
+   fun:_dl_parse_relocation_information
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr2
+   obj:/lib/ld-uClibc-0.9.28.so
+   fun:*
+}
+{
+   <insert a suppression name here>
+   Memcheck:Addr4
+   obj:/lib/ld-uClibc-0.9.28.so
+   fun:*
+}
diff --git a/utils/valgrind/files/valgrind.sh b/utils/valgrind/files/valgrind.sh
new file mode 100644 (file)
index 0000000..4b8eb2e
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh -e
+#
+# Valgrind wrapper
+
+# Use special suppression file for uClibc
+export VALGRIND_OPTS="$VALGRIND_OPTS --suppressions=/usr/lib/valgrind/uclibc.supp"
+
+# Use 'exec' to avoid having another shell process hanging around.
+exec $0.bin "$@"
+
diff --git a/utils/valgrind/patches/001-uclibc_syscall.patch b/utils/valgrind/patches/001-uclibc_syscall.patch
new file mode 100644 (file)
index 0000000..afdd53e
--- /dev/null
@@ -0,0 +1,205 @@
+--- valgrind/coregrind/m_syswrap/syswrap-amd64-linux.c.orig    2006-08-02 16:51:51.000000000 -0600
++++ valgrind/coregrind/m_syswrap/syswrap-amd64-linux.c 2006-08-02 16:53:19.000000000 -0600
+@@ -1124,7 +1124,7 @@
+    GENXY(__NR_times,             sys_times),          // 100 
+    PLAXY(__NR_ptrace,            sys_ptrace),         // 101 
+    GENX_(__NR_getuid,            sys_getuid),         // 102 
+-   //   (__NR_syslog,            sys_syslog),         // 103 
++   LINXY(__NR_syslog,            sys_syslog),         // 103 
+    GENX_(__NR_getgid,            sys_getgid),         // 104 
+    GENX_(__NR_setuid,            sys_setuid),         // 105 
+--- valgrind/include/vki-linux.h.orig  2006-08-02 18:22:21.000000000 -0600
++++ valgrind/include/vki-linux.h       2006-08-02 18:38:02.000000000 -0600
+@@ -1556,7 +1556,9 @@
+ #define VKI_BLKROSET   _VKI_IO(0x12,93)       /* set device read-only (0 = read-write) */
+ #define VKI_BLKROGET   _VKI_IO(0x12,94)       /* get read-only status (0 = read_write) */
++#define VKI_BLKRRPART  _VKI_IO(0x12,95) /* re-read partition table */
+ #define VKI_BLKGETSIZE _VKI_IO(0x12,96) /* return device size /512 (long *arg) */
++#define VKI_BLKFLSBUF  _VKI_IO(0x12,97) /* flush buffer cache */
+ #define VKI_BLKRASET   _VKI_IO(0x12,98)       /* set read ahead for block device */
+ #define VKI_BLKRAGET   _VKI_IO(0x12,99)       /* get current read ahead setting */
+ #define VKI_BLKFRASET  _VKI_IO(0x12,100)/* set filesystem (mm/filemap.c) read-ahead */
+@@ -1631,6 +1633,54 @@
+ //#define SG_GET_COMMAND_Q 0x2270   /* Yields 0 (queuing off) or 1 (on) */
+ #define VKI_SG_SET_COMMAND_Q 0x2271   /* Change queuing state with 0 or 1 */
++
++typedef struct vki_scsi_idlun
++{
++    int mux4;
++    int host_unique_id;
++
++} vki_scsi_idlun_t;
++#define VKI_SCSI_IOCTL_GET_IDLUN 0x5382               /* Gets a struct vki_scsi_idlun */
++#define VKI_SCSI_IOCTL_PROBE_HOST 0x5385      /* Gets an arrary describing the SCSI host */
++#define VKI_SCSI_IOCTL_GET_BUS_NUMBER 0x5386  /* Get the bus number for a device */
++
++//----------------------------------------------------------------------
++// From linux-2.6.8.1/include/linux/fd.h
++//----------------------------------------------------------------------
++#define VKI_FDRESET 0x254             /* Takes an int by value */
++#define VKI_FDGETDRVTYP 0x20f /* Returns char floppy_drive_name[16] */
++typedef struct vki_floppy_drive_struct {
++      unsigned long flags;
++      unsigned long spinup_date;
++      unsigned long select_date;
++      unsigned long first_read_date;
++      short probed_format;
++      short track;
++      short maxblock;
++      short maxtrack;
++      int generation;
++      int keep_data;
++      int fd_ref;
++      int fd_device;
++      unsigned long last_checked;
++      char *dmabuf;
++      int bufblocks;
++} vki_floppy_drive_struct_t;
++#define VKI_FDPOLLDRVSTAT 0x213           /* returns a struct floppy_drive_struct */
++typedef struct vki_floppy_struct {
++      unsigned int    size;
++      unsigned int    sect;
++      unsigned int    head;
++      unsigned int    track;
++      unsigned int    stretch;
++      unsigned char   gap;
++      unsigned char   rate;
++      unsigned char   spec1;
++      unsigned char   fmt_gap;
++      const char      * name;
++} vki_floppy_struct_t;
++#define VKI_FDGETPRM 0x204        /* returns a struct floppy_struct */
++
+ //----------------------------------------------------------------------
+ // From linux-2.6.8.1/include/linux/cdrom.h
+ //----------------------------------------------------------------------
+@@ -1640,6 +1690,7 @@
+                                            (struct cdrom_tochdr) */
+ #define VKI_CDROMREADTOCENTRY 0x5306 /* Read TOC entry 
+                                            (struct cdrom_tocentry) */
++#define VKI_CDROMEJECT                0x5309 /* Eject cdrom media */
+ #define VKI_CDROMSUBCHNL      0x530b /* Read subchannel data 
+                                            (struct cdrom_subchnl) */
+ #define VKI_CDROMREADMODE2    0x530c /* Read CDROM mode 2 data (2336 Bytes) 
+--- valgrind/coregrind/m_syswrap/syswrap-generic.c.orig        2006-08-02 18:22:13.000000000 -0600
++++ valgrind/coregrind/m_syswrap/syswrap-generic.c     2006-08-02 18:43:49.000000000 -0600
+@@ -3227,6 +3227,33 @@
+    case VKI_SG_GET_SG_TABLESIZE: /* 0x227f */
+       PRE_MEM_WRITE( "ioctl(SG_GET_SG_TABLESIZE)", ARG3, sizeof(int) );
+       break;
++   case VKI_SCSI_IOCTL_GET_IDLUN:
++      PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_IDLUN)", ARG3, sizeof(vki_scsi_idlun_t) );
++      break;
++   case VKI_SCSI_IOCTL_PROBE_HOST:
++      {
++        int arraylen;
++        char *array = (char*)ARG3;
++        PRE_MEM_READ("ioctl(SCSI_IOCTL_PROBE_HOST)",  ARG3, sizeof(char)*4 );
++        arraylen = array[0] + (array[1]<<8) + (array[2]<<16) + (array[3]<<24);
++        PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_PROBE_HOST)", ARG3, sizeof(char)*arraylen );
++      }
++      break;
++   case VKI_SCSI_IOCTL_GET_BUS_NUMBER:
++      PRE_MEM_WRITE( "ioctl(SCSI_IOCTL_GET_BUS_NUMBER)", ARG3, sizeof(int) );
++      break;
++
++   case VKI_FDRESET:
++      break;
++   case VKI_FDGETDRVTYP:
++      PRE_MEM_WRITE( "ioctl(FDGETDRVTYP)", ARG3, sizeof(char)*16 );
++      break;
++   case VKI_FDPOLLDRVSTAT:
++      PRE_MEM_WRITE( "ioctl(FDPOLLDRVSTAT)", ARG3, sizeof(vki_floppy_drive_struct_t) );
++      break;
++   case VKI_FDGETPRM:
++      PRE_MEM_WRITE( "ioctl(FDGETPRM)", ARG3, sizeof(vki_floppy_struct_t) );
++      break;
+    case VKI_IIOCGETCPS:
+       PRE_MEM_WRITE( "ioctl(IIOCGETCPS)", ARG3,
+@@ -3550,6 +3578,8 @@
+    case VKI_BLKROGET:
+       PRE_MEM_WRITE( "ioctl(BLKROGET)", ARG3, sizeof(int));
+       break;
++   case VKI_BLKRRPART:
++      break;
+    case VKI_BLKGETSIZE:
+       PRE_MEM_WRITE( "ioctl(BLKGETSIZE)", ARG3, sizeof(unsigned long));
+       break;
+@@ -3558,6 +3588,8 @@
+    case VKI_BLKRAGET:
+       PRE_MEM_WRITE( "ioctl(BLKRAGET)", ARG3, sizeof(long));
+       break;
++   case VKI_BLKFLSBUF:
++      break;
+    case VKI_BLKFRASET:
+       break;
+    case VKI_BLKFRAGET:
+@@ -3624,6 +3656,8 @@
+       PRE_MEM_WRITE( "ioctl(CDROMREADTOCENTRY)", ARG3, 
+                    sizeof(struct vki_cdrom_tocentry));
+       break;
++   case VKI_CDROMEJECT:
++      break;
+    case VKI_CDROMMULTISESSION: /* 0x5310 */
+       PRE_MEM_WRITE( "ioctl(CDROMMULTISESSION)", ARG3,
+                    sizeof(struct vki_cdrom_multisession));
+@@ -4042,6 +4076,28 @@
+    case VKI_SG_GET_SG_TABLESIZE:
+       POST_MEM_WRITE(ARG3, sizeof(int));
+       break;      
++   case VKI_SCSI_IOCTL_GET_IDLUN:
++      POST_MEM_WRITE(ARG3, sizeof(vki_scsi_idlun_t));
++      break;
++   case VKI_SCSI_IOCTL_PROBE_HOST:
++      if (RES > 0 && ARG3 )
++        POST_MEM_WRITE(ARG3, sizeof(char)*RES);
++      break;
++   case VKI_SCSI_IOCTL_GET_BUS_NUMBER:
++      POST_MEM_WRITE(ARG3, sizeof(int));
++      break;
++
++   case VKI_FDRESET:
++      break;
++   case VKI_FDGETDRVTYP:
++      POST_MEM_WRITE( ARG3, sizeof(char)*16 );
++      break;
++   case VKI_FDPOLLDRVSTAT:
++      POST_MEM_WRITE( ARG3, sizeof(vki_floppy_drive_struct_t) );
++      break;
++   case VKI_FDGETPRM:
++      POST_MEM_WRITE( ARG3, sizeof(vki_floppy_struct_t) );
++      break;
+    case VKI_IIOCGETCPS:
+       POST_MEM_WRITE( ARG3, VKI_ISDN_MAX_CHANNELS * 2 * sizeof(unsigned long) );
+@@ -4260,6 +4317,8 @@
+    case VKI_BLKROGET:
+       POST_MEM_WRITE(ARG3, sizeof(int));
+       break;
++   case VKI_BLKRRPART:
++      break;
+    case VKI_BLKGETSIZE:
+       POST_MEM_WRITE(ARG3, sizeof(unsigned long));
+       break;
+@@ -4268,6 +4327,8 @@
+    case VKI_BLKRAGET:
+       POST_MEM_WRITE(ARG3, sizeof(long));
+       break;
++   case VKI_BLKFLSBUF:
++      break;
+    case VKI_BLKFRASET:
+       break;
+    case VKI_BLKFRAGET:
+@@ -4309,6 +4370,8 @@
+    case VKI_CDROMREADTOCENTRY:
+       POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_tocentry));
+       break;
++   case VKI_CDROMEJECT:
++      break;
+    case VKI_CDROMMULTISESSION:
+       POST_MEM_WRITE(ARG3, sizeof(struct vki_cdrom_multisession));
+       break;