| // Copyright 2016 The Fuchsia Authors | 
 | // Copyright 2001, Travis Geiselbrecht | 
 | // Copyright 2005, Michael Noisternig | 
 | // Copyright (c) 2008 Travis Geiselbrecht | 
 | // | 
 | // Use of this source code is governed by a MIT-style | 
 | // license that can be found in the LICENSE file or at | 
 | // https://opensource.org/licenses/MIT | 
 |  | 
 | #include <stdint.h> | 
 | #include <string.h> | 
 |  | 
 | __attribute__((no_sanitize_address)) void *__unsanitized_memset(void *s, int c, size_t count) { | 
 |   char *xs = (char *)s; | 
 |   size_t len = (-(size_t)s) & (sizeof(size_t) - 1); | 
 |   size_t cc = c & 0xff; | 
 |  | 
 |   if (count > len) { | 
 |     count -= len; | 
 |     cc |= cc << 8; | 
 |     cc |= cc << 16; | 
 |     if (sizeof(size_t) == 8) | 
 |       cc |= (uint64_t)cc << 32;  // should be optimized out on 32 bit machines | 
 |  | 
 |     // write to non-aligned memory byte-wise | 
 |     for (; len > 0; len--) | 
 |       *xs++ = c; | 
 |  | 
 |     // write to aligned memory dword-wise | 
 |     for (len = count / sizeof(size_t); len > 0; len--) { | 
 |       *((size_t *)xs) = (size_t)cc; | 
 |       xs += sizeof(size_t); | 
 |     } | 
 |  | 
 |     count &= sizeof(size_t) - 1; | 
 |   } | 
 |  | 
 |   // write remaining bytes | 
 |   for (; count > 0; count--) | 
 |     *xs++ = c; | 
 |  | 
 |   return s; | 
 | } | 
 |  | 
 | // Make the function a weak symbol so asan can override it. | 
 | __typeof(__unsanitized_memset) memset __attribute__((weak, alias("__unsanitized_memset"))); |