[meta-freescale] [PATCH 18/20] valgrind: add bbappend for multilib support and override memcpy/memset

Zhenhua Luo zhenhua.luo at freescale.com
Fri Aug 28 03:36:57 PDT 2015


* Add bbappend for qoriq(except e500v2) to create a symbolic link as the
  user expects to see a /usr/bin/valgrind on 64-bit MACHINE's, ensure that
  the link created, points to the *64-bit* valgrind. Assume that the presence
  of the patterns: "\-64b" in ${MACHINE} and "64" in ${TARGET_ARCH}, indicate
  the 64-bit flavour and that their absence indicates 32-bit flavour respectively.
  Now, when both 32-bit and 64-bit flavours are available to choose from; it
  does happen that even though ${MACHINE} is chosen to indicate the choice of
  the 32-bit case, the 64-bit tools are built too. So, ensure that on 32-bit,
  the link points to the 32-bit valgrind, and of-course, that on 64-bit, the
  link points to the 64-bit valgrind.
* Override the 32-bit implementations of memcpy(), memset() from glibc.
  On 64-bit platforms, for 32-bit mode, the Freescale optimized implementations
  of the glibc functions memcpy(), memset() use POWER ISA Category:64-bit
  instructions. By design, these are not implementatble in Valgrind in 32-bit
  mode. Therefore, we override the library versions with plain classic POWER
  32-bit alternate versions (emitted at -O0 by GCC).
  Add COMPATIBLE_MACHINE

Signed-off-by: Ting Liu <b28495 at freescale.com>
Signed-off-by: Zhenhua Luo <zhenhua.luo at freescale.com>
---
 .../override-32-bit-glibc-memcpy-memset.patch      | 159 +++++++++++++++++++++
 recipes-devtools/valgrind/valgrind_3.10.1.bbappend |  19 +++
 2 files changed, 178 insertions(+)
 create mode 100644 recipes-devtools/valgrind/valgrind/override-32-bit-glibc-memcpy-memset.patch
 create mode 100644 recipes-devtools/valgrind/valgrind_3.10.1.bbappend

diff --git a/recipes-devtools/valgrind/valgrind/override-32-bit-glibc-memcpy-memset.patch b/recipes-devtools/valgrind/valgrind/override-32-bit-glibc-memcpy-memset.patch
new file mode 100644
index 0000000..56da7d2
--- /dev/null
+++ b/recipes-devtools/valgrind/valgrind/override-32-bit-glibc-memcpy-memset.patch
@@ -0,0 +1,159 @@
+Upstream-Status: Pending
+
+ Override the 32-bit implementations of memcpy(), memset() from glibc.
+
+ On 64-bit platforms, for 32-bit mode, the Freescale optimized implementations
+ of the glibc functions memcpy(), memset() use POWER ISA Category:64-bit
+ instructions. By design, these are not implementatble in Valgrind in 32-bit
+ mode. Therefore, we override the library versions with plain classic POWER
+ 32-bit alternate versions (emitted at -O0 by GCC).
+
+ Note that this does not affect in any way, the user's ability to debug their
+ code with Valgrind.
+
+Signed-off-by: Anmol Paralkar <Anmol at freescale.com>
+
+Index: coregrind/pub_core_trampoline.h
+===================================================================
+--- a/coregrind/pub_core_trampoline.h	(revision 14779)
++++ b/coregrind/pub_core_trampoline.h	(working copy)
+@@ -79,6 +79,8 @@
+ extern UInt  VG_(ppc32_linux_REDIR_FOR_strlen)( void* );
+ extern UInt  VG_(ppc32_linux_REDIR_FOR_strcmp)( void*, void* );
+ extern void* VG_(ppc32_linux_REDIR_FOR_strchr)( void*, Int );
++extern void *VG_(ppc32_linux_fsl_REDIR_FOR_memcpy)(void *dest, const void *src, Int n);
++extern void *VG_(ppc32_linux_fsl_REDIR_FOR_memset)(void *s, Int c, Int n);
+ #endif
+ 
+ #if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
+Index: coregrind/m_trampoline.S
+===================================================================
+--- a/coregrind/m_trampoline.S	(revision 14779)
++++ b/coregrind/m_trampoline.S	(working copy)
+@@ -307,6 +307,105 @@
+ .global VG_(trampoline_stuff_start)
+ VG_(trampoline_stuff_start):
+ 
++/* To obtain the assembly below, do: gcc -S -m32 on:
++#define VG_(x) x
++
++void *VG_(ppc32_linux_fsl_REDIR_FOR_memcpy)(char *dst, const char *src, int n)
++{
++  const char *p;
++  char *q = dst;
++  p = src;
++  while ((p - src) < n)
++    *q++ = *p++;
++  return dst;
++}
++*/
++.align 2
++.globl VG_(ppc32_linux_fsl_REDIR_FOR_memcpy)
++.type   VG_(ppc32_linux_fsl_REDIR_FOR_memcpy), @function
++VG_(ppc32_linux_fsl_REDIR_FOR_memcpy):
++        stwu 1,-48(1)
++        stw 31,44(1)
++        mr 31,1
++        stw 3,24(31)
++        stw 4,28(31)
++        stw 5,32(31)
++        lwz 9,24(31)
++        stw 9,12(31)
++        lwz 9,28(31)
++        stw 9,8(31)
++        b .L2
++.L3:   
++        lwz 9,12(31)
++        addi 10,9,1
++        stw 10,12(31)
++        lwz 10,8(31)
++        addi 8,10,1
++        stw 8,8(31)
++        lbz 10,0(10)
++        rlwinm 10,10,0,0xff
++        stb 10,0(9)
++.L2:   
++        lwz 10,8(31)
++        lwz 9,28(31)
++        subf 10,9,10
++        lwz 9,32(31)
++        cmpw 7,10,9
++        blt 7,.L3
++        lwz 9,24(31)
++        mr 3,9
++        addi 11,31,48
++        lwz 31,-4(11)
++        mr 1,11
++        blr
++.size   VG_(ppc32_linux_fsl_REDIR_FOR_memcpy),.-VG_(ppc32_linux_fsl_REDIR_FOR_memcpy)
++
++/* To obtain the assembly below, do: gcc -S -m32 on:
++#define VG_(x) x
++void *VG_(ppc32_linux_fsl_REDIR_FOR_memset)(char *s, int c, int n)
++{
++  char *p;
++  p = s;
++  while ((p - s) < n)
++    *p++ = c;
++  return s;
++}
++ */
++.align 2
++.globl VG_(ppc32_linux_fsl_REDIR_FOR_memset)
++.type   VG_(ppc32_linux_fsl_REDIR_FOR_memset), @function
++VG_(ppc32_linux_fsl_REDIR_FOR_memset):
++        stwu 1,-48(1)
++        stw 31,44(1)
++        mr 31,1
++        stw 3,24(31)
++        stw 4,28(31)
++        stw 5,32(31)
++        lwz 9,24(31)
++        stw 9,8(31)
++        b .L6
++.L7:
++        lwz 9,8(31)
++        addi 10,9,1
++        stw 10,8(31)
++        lwz 10,28(31)
++        rlwinm 10,10,0,0xff
++        stb 10,0(9)
++.L6:   
++        lwz 10,8(31)
++        lwz 9,24(31)
++        subf 10,9,10
++        lwz 9,32(31)
++        cmpw 7,10,9
++        blt 7,.L7
++        lwz 9,24(31)
++        mr 3,9
++        addi 11,31,48
++        lwz 31,-4(11)
++        mr 1,11
++        blr
++.size   VG_(ppc32_linux_fsl_REDIR_FOR_memset),.-VG_(ppc32_linux_fsl_REDIR_FOR_memset)
++
+ .global VG_(ppc32_linux_SUBST_FOR_sigreturn)
+ VG_(ppc32_linux_SUBST_FOR_sigreturn):
+ 	li 0,__NR_sigreturn
+Index: coregrind/m_redir.c
+===================================================================
+--- a/coregrind/m_redir.c	(revision 14779)
++++ b/coregrind/m_redir.c	(working copy)
+@@ -1284,6 +1284,16 @@
+    }
+ 
+ #  elif defined(VGP_ppc32_linux)
++   add_hardwired_spec(
++      "ld.so.1", "memcpy",
++      (Addr)VG_(fnptr_to_fnentry)( &VG_(ppc32_linux_fsl_REDIR_FOR_memcpy) ),
++         complain_about_stripped_glibc_ldso
++   );
++   add_hardwired_spec(
++      "ld.so.1", "memset",
++      (Addr)VG_(fnptr_to_fnentry)( &VG_(ppc32_linux_fsl_REDIR_FOR_memset) ),
++         complain_about_stripped_glibc_ldso
++   );
+    /* If we're using memcheck, use these intercepts right from
+       the start, otherwise ld.so makes a lot of noise. */
+    if (0==VG_(strcmp)("Memcheck", VG_(details).name)) {
diff --git a/recipes-devtools/valgrind/valgrind_3.10.1.bbappend b/recipes-devtools/valgrind/valgrind_3.10.1.bbappend
new file mode 100644
index 0000000..5fefffc
--- /dev/null
+++ b/recipes-devtools/valgrind/valgrind_3.10.1.bbappend
@@ -0,0 +1,19 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+
+SRC_URI_append_qoriq-ppc = " \
+    file://override-32-bit-glibc-memcpy-memset.patch \
+"
+
+do_install_append_qoriq-ppc() {
+    # Create a symbolic link as the user expects to see a /usr/bin/valgrind
+    # On 64-bit MACHINE's, ensure that the link created, points to the *64-bit*
+    # valgrind. Assume that the presence of the patterns: "\-64b" in ${MACHINE}
+    # and "64" in ${TARGET_ARCH}, indicate the 64-bit flavour and that their
+    # absence indicates 32-bit flavour respectively. Now, when both 32-bit and
+    # 64-bit flavours are available to choose from; it does happen that even
+    # though ${MACHINE} is chosen to indicate the choice of the 32-bit case, the
+    # 64-bit tools are built too. So, ensure that on 32-bit, the link points
+    # to the 32-bit valgrind, and of-course, that on 64-bit, the link points
+    # to the 64-bit valgrind.
+    ln -sf ${TARGET_ARCH}-valgrind valgrind
+}
-- 
2.4.3



More information about the meta-freescale mailing list