blob: 12b28cb10dfa3625f440942532b9a027cab91407 [file] [log] [blame]
sewardj99a2ceb2007-11-09 12:30:36 +00001
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
sewardj4d474d02008-02-11 11:34:59 +000011 Copyright (C) 2006-2008 Bryan "Brain Murders" Meredith
sewardj99a2ceb2007-11-09 12:30:36 +000012
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.
sewardj5b8ab5b2007-11-30 21:52:27 +000033
34 The current maintainer is Rich Coe <richard.coe@med.ge.com>.
sewardj99a2ceb2007-11-09 12:30:36 +000035*/
36
37#include <stdio.h>
38#include "pub_tool_basics.h"
39#include "valgrind.h"
sewardj2405eb82007-12-05 01:31:42 +000040#include "exp-omega.h"
sewardj99a2ceb2007-11-09 12:30:36 +000041
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
49int I_WRAP_SONAME_FNNAME_ZU(NONE,main) ( int n, char *a[], char *e[] );
50int 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
62void* I_WRAP_SONAME_FNNAME_ZU(NONE,memcpy)( void *dst, const void *src, SizeT len );
63void* 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
101void* I_WRAP_SONAME_FNNAME_ZU(NONE,mempcpy)( void *dst, const void *src, SizeT len );
102void* 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
140void* I_WRAP_SONAME_FNNAME_ZU(NONE,memmove)(void *dstV, const void *srcV, SizeT n);
141void* 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
158void* I_WRAP_SONAME_FNNAME_ZU(NONE,memset)(void *s, Int c, SizeT n);
159void* 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/*--------------------------------------------------------------------*/