1bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov/* Copyright (c) 2008-2010, Google Inc.
2bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * All rights reserved.
3bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov *
4bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * Redistribution and use in source and binary forms, with or without
5bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * modification, are permitted provided that the following conditions are
6bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * met:
7bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov *
8bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov *     * Redistributions of source code must retain the above copyright
9bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * notice, this list of conditions and the following disclaimer.
10bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov *     * Neither the name of Google Inc. nor the names of its
11bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * contributors may be used to endorse or promote products derived from
12bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * this software without specific prior written permission.
13bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov *
14bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov */
26bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov
27bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// This file is part of ThreadSanitizer, a dynamic data race detector.
28bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Author: Konstantin Serebryany.
29bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Implement some of the libc functions to link with valgrind.
30bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Do not include any linux header here to avoid conflicts.
31bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov//
32bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanovextern "C" {
33bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#include "pub_tool_basics.h"
34bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#include "pub_tool_libcbase.h"
35bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov}
36bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov
37bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// can't use VG_(memmove) since it is buggy.
38bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanovextern "C" void * memmove(void *a, const void *b, unsigned long size) {
39bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov  char *A = (char*)a;
40bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov  const char *B = (const char*)b;
41bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov  if (A < B) {
42bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov    for (unsigned long i = 0; i < size; i++) {
43bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov      A[i] = B[i];
44bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov    }
45bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov  } else if(A > B) {
46bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov    for (unsigned long i = 0; i < size; i++) {
47bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov      A[size - i - 1] = B[size - i - 1];
48bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov    }
49bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov  }
50bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov  return a;
51bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov}
52bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov
53bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanovextern "C" int memcmp(const void *a, const void *b, unsigned long c) {
54bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov  return VG_(memcmp)(a,b,c);
55bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov}
56bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#ifndef VGO_darwin
57bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanovextern "C" void* __memcpy_chk(void *dest, const void *src, unsigned long n) {
58bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov   return VG_(memcpy)(dest,src,n);
59bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov}
60bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#endif
61