blob: 0c1a133711c4d3d5bde616d7938b6bdbf8aad5b2 [file] [log] [blame]
// 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")));