sanitizer_libc.cc revision 88207ab15125e2f1e9b3d541b735b2b8aba9b6d9
19e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com//===-- sanitizer_libc.cc -------------------------------------------------===//
29e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com//
39e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com//                     The LLVM Compiler Infrastructure
49e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com//
59e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// This file is distributed under the University of Illinois Open Source
69e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// License. See LICENSE.TXT for details.
7235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com//
8235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com//===----------------------------------------------------------------------===//
9235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com//
108dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com// This file is shared between AddressSanitizer and ThreadSanitizer
116d0032a8ec680221c2a704cac2391f2a2d77546fcaryclark@google.com// run-time libraries. See sanitizer_libc.h for details.
128dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com//===----------------------------------------------------------------------===//
1373ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com#include "sanitizer_common.h"
149d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.com#include "sanitizer_libc.h"
159d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.com
169d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.comnamespace __sanitizer {
179d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.com
181304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.comvoid MiniLibcStub() {
1927accef223a27fba437f5e825d99edbae20a045bcaryclark@google.com}
20d68bc309bbc3f0f4c3107cf4fa60ce1ff4847b75caryclark@google.com
21d68bc309bbc3f0f4c3107cf4fa60ce1ff4847b75caryclark@google.comvoid *internal_memchr(const void *s, int c, uptr n) {
2273ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com  const char* t = (char*)s;
23c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com  for (uptr i = 0; i < n; ++i, ++t)
241304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com    if (*t == c)
259f60291c5375457f8adf228dbe6e8ff1186b13e1caryclark@google.com      return (void*)t;
269f60291c5375457f8adf228dbe6e8ff1186b13e1caryclark@google.com  return 0;
2773ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com}
2805c4bad470722bc4e5e6ae3d79aa8bcf9e732f06caryclark@google.com
2905c4bad470722bc4e5e6ae3d79aa8bcf9e732f06caryclark@google.comint internal_memcmp(const void* s1, const void* s2, uptr n) {
307ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com  const char* t1 = (char*)s1;
317ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com  const char* t2 = (char*)s2;
321304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com  for (uptr i = 0; i < n; ++i, ++t1, ++t2)
3373ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    if (*t1 != *t2)
341304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com      return *t1 < *t2 ? -1 : 1;
351304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com  return 0;
368dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com}
371304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com
389d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.comvoid *internal_memcpy(void *dest, const void *src, uptr n) {
39c83c70e911a38aea03db4af8dd9841d0d77bd129caryclark@google.com  char *d = (char*)dest;
4045a8fc6a8b00451f807783f2a6ec640e9bcc7256caryclark@google.com  char *s = (char*)src;
418dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  for (uptr i = 0; i < n; ++i)
4245a8fc6a8b00451f807783f2a6ec640e9bcc7256caryclark@google.com    d[i] = s[i];
43235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com  return dest;
447ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com}
45beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com
46235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.comvoid *internal_memset(void* s, int c, uptr n) {
47  // The next line prevents Clang from making a call to memset() instead of the
48  // loop below.
49  // FIXME: building the runtime with -ffreestanding is a better idea. However
50  // there currently are linktime problems due to PR12396.
51  char volatile *t = (char*)s;
52  for (uptr i = 0; i < n; ++i, ++t) {
53    *t = c;
54  }
55  return s;
56}
57
58char* internal_strdup(const char *s) {
59  uptr len = internal_strlen(s);
60  char *s2 = (char*)InternalAlloc(len + 1);
61  internal_memcpy(s2, s, len);
62  s2[len] = 0;
63  return s2;
64}
65
66int internal_strcmp(const char *s1, const char *s2) {
67  while (true) {
68    unsigned c1 = *s1;
69    unsigned c2 = *s2;
70    if (c1 != c2) return (c1 < c2) ? -1 : 1;
71    if (c1 == 0) break;
72    s1++;
73    s2++;
74  }
75  return 0;
76}
77
78char* internal_strchr(const char *s, int c) {
79  while (true) {
80    if (*s == (char)c)
81      return (char*)s;
82    if (*s == 0)
83      return 0;
84    s++;
85  }
86}
87
88char *internal_strrchr(const char *s, int c) {
89  const char *res = 0;
90  for (uptr i = 0; s[i]; i++) {
91    if (s[i] == c) res = s + i;
92  }
93  return (char*)res;
94}
95
96uptr internal_strlen(const char *s) {
97  uptr i = 0;
98  while (s[i]) i++;
99  return i;
100}
101
102char *internal_strncpy(char *dst, const char *src, uptr n) {
103  uptr i;
104  for (i = 0; i < n && src[i]; i++)
105    dst[i] = src[i];
106  for (; i < n; i++)
107    dst[i] = '\0';
108  return dst;
109}
110
111}  // namespace __sanitizer
112