~bkerensa/ubuntu/raring/valgrind/merge-from-deb

« back to all changes in this revision

Viewing changes to exp-omega/o_replace_memops.c

  • Committer: Bazaar Package Importer
  • Author(s): Andrés Roldán
  • Date: 2008-06-13 02:31:40 UTC
  • mto: (1.4.1 upstream) (2.2.1 squeeze)
  • mto: This revision was merged to the branch mainline in revision 24.
  • Revision ID: james.westby@ubuntu.com-20080613023140-iwk33rz9rhvfkr96
Import upstream version 3.3.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
/*------------------------------------------------------------------------*/
 
3
/*--- Replacements for memcpy() et al, which run on the simulated CPU. ---*/
 
4
/*---                                               o_replace_memops.c ---*/
 
5
/*------------------------------------------------------------------------*/
 
6
 
 
7
/*
 
8
   This file is part of Omega, a Valgrind tool for instantly detecting
 
9
   memory leaks.
 
10
 
 
11
   Copyright (C) 2006-2007 Bryan "Brain Murders" Meredith
 
12
 
 
13
   Derived from mac_replace_strmem.c
 
14
   Copyright (C) 2000-2006 Julian Seward 
 
15
      jseward@acm.org
 
16
 
 
17
   This program is free software; you can redistribute it and/or
 
18
   modify it under the terms of the GNU General Public License as
 
19
   published by the Free Software Foundation; either version 2 of the
 
20
   License, or (at your option) any later version.
 
21
 
 
22
   This program is distributed in the hope that it will be useful, but
 
23
   WITHOUT ANY WARRANTY; without even the implied warranty of
 
24
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
25
   General Public License for more details.
 
26
 
 
27
   You should have received a copy of the GNU General Public License
 
28
   along with this program; if not, write to the Free Software
 
29
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 
30
   02111-1307, USA.
 
31
 
 
32
   The GNU General Public License is contained in the file COPYING.
 
33
 
 
34
   The current maintainer is Rich Coe <richard.coe@med.ge.com>.
 
35
*/
 
36
 
 
37
#include <stdio.h>
 
38
#include "pub_tool_basics.h"
 
39
#include "valgrind.h"
 
40
#include "exp-omega.h"
 
41
 
 
42
/* ---------------------------------------------------------------------
 
43
   We have our own versions of these functions so that we can correctly
 
44
   track pointers that are duplicated or overwritten.
 
45
 
 
46
   THEY RUN ON THE SIMD CPU!
 
47
   ------------------------------------------------------------------ */
 
48
 
 
49
int I_WRAP_SONAME_FNNAME_ZU(NONE,main) ( int n, char *a[], char *e[] );
 
50
int I_WRAP_SONAME_FNNAME_ZU(NONE,main) ( int n, char *a[], char *e[] )
 
51
{
 
52
   int    r;
 
53
   OrigFn fn;
 
54
   VALGRIND_GET_ORIG_FN(fn);
 
55
   VALGRIND_DO_ENTER_MAIN;
 
56
   CALL_FN_W_WWW(r, fn, n, a, e);
 
57
   VALGRIND_DO_LEAVE_MAIN;
 
58
   return r;
 
59
}
 
60
 
 
61
 
 
62
void* I_WRAP_SONAME_FNNAME_ZU(NONE,memcpy)( void *dst, const void *src, SizeT len );
 
63
void* I_WRAP_SONAME_FNNAME_ZU(NONE,memcpy)( void *dst, const void *src, SizeT len )
 
64
{
 
65
  register char *d;
 
66
  register char *s;
 
67
                                           
 
68
  if (len == 0)
 
69
    return dst;
 
70
 
 
71
  if ( dst > src ) {
 
72
    d = (char *)dst + len - 1;
 
73
    s = (char *)src + len - 1;
 
74
    while ( len >= 4 ) {
 
75
      *d-- = *s--;
 
76
      *d-- = *s--;
 
77
      *d-- = *s--;
 
78
      *d-- = *s--;
 
79
      len -= 4;
 
80
    }
 
81
    while ( len-- ) {
 
82
      *d-- = *s--;
 
83
    }
 
84
  } else if ( dst < src ) {
 
85
    d = (char *)dst;
 
86
    s = (char *)src;
 
87
    while ( len >= 4 ) {
 
88
      *d++ = *s++;
 
89
      *d++ = *s++;
 
90
      *d++ = *s++;
 
91
      *d++ = *s++;
 
92
      len -= 4;
 
93
    }
 
94
    while ( len-- ) {
 
95
      *d++ = *s++;
 
96
    }
 
97
  }
 
98
  return dst;
 
99
}
 
100
 
 
101
void* I_WRAP_SONAME_FNNAME_ZU(NONE,mempcpy)( void *dst, const void *src, SizeT len );
 
102
void* I_WRAP_SONAME_FNNAME_ZU(NONE,mempcpy)( void *dst, const void *src, SizeT len )
 
103
{
 
104
  register char *d;
 
105
  register char *s;
 
106
                                           
 
107
  if (len == 0)
 
108
    return dst;
 
109
 
 
110
  if ( dst > src ) {
 
111
    d = (char *)dst + len - 1;
 
112
    s = (char *)src + len - 1;
 
113
    while ( len >= 4 ) {
 
114
      *d-- = *s--;
 
115
      *d-- = *s--;
 
116
      *d-- = *s--;
 
117
      *d-- = *s--;
 
118
      len -= 4;
 
119
    }
 
120
    while ( len-- ) {
 
121
      *d-- = *s--;
 
122
    }
 
123
  } else if ( dst < src ) {
 
124
    d = (char *)dst;
 
125
    s = (char *)src;
 
126
    while ( len >= 4 ) {
 
127
      *d++ = *s++;
 
128
      *d++ = *s++;
 
129
      *d++ = *s++;
 
130
      *d++ = *s++;
 
131
      len -= 4;
 
132
    }
 
133
    while ( len-- ) {
 
134
      *d++ = *s++;
 
135
    }
 
136
  }
 
137
  return ((Char*)dst + len);
 
138
}
 
139
 
 
140
void* I_WRAP_SONAME_FNNAME_ZU(NONE,memmove)(void *dstV, const void *srcV, SizeT n);
 
141
void* I_WRAP_SONAME_FNNAME_ZU(NONE,memmove)(void *dstV, const void *srcV, SizeT n)
 
142
{
 
143
  SizeT i;
 
144
  Char* dst = (Char*)dstV;
 
145
  Char* src = (Char*)srcV;
 
146
  if (dst < src) {
 
147
    for (i = 0; i < n; i++)
 
148
      dst[i] = src[i];
 
149
  }
 
150
  else 
 
151
    if (dst > src) {
 
152
      for (i = 0; i < n; i++)
 
153
        dst[n-i-1] = src[n-i-1];
 
154
    }
 
155
  return dst;
 
156
}
 
157
 
 
158
void* I_WRAP_SONAME_FNNAME_ZU(NONE,memset)(void *s, Int c, SizeT n);
 
159
void* I_WRAP_SONAME_FNNAME_ZU(NONE,memset)(void *s, Int c, SizeT n)
 
160
{
 
161
  unsigned char *cp = s;
 
162
  
 
163
  while(n--)
 
164
    *cp++ = c;
 
165
  
 
166
  return s;
 
167
}
 
168
 
 
169
/*--------------------------------------------------------------------*/
 
170
/*--- end                                                          ---*/
 
171
/*--------------------------------------------------------------------*/