Imported Upstream version 6.10.0.49

Former-commit-id: 1d6753294b2993e1fbf92de9366bb9544db4189b
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2020-01-16 16:38:04 +00:00
parent d94e79959b
commit 468663ddbb
48518 changed files with 2789335 additions and 61176 deletions

View File

@@ -0,0 +1,75 @@
//===-- sanitizer_symbolize.cc ----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Implementation of weak hooks from sanitizer_symbolizer_posix_libcdep.cc.
//
//===----------------------------------------------------------------------===//
#include <stdio.h>
#include <string>
#include "llvm/DebugInfo/Symbolize/DIPrinter.h"
#include "llvm/DebugInfo/Symbolize/Symbolize.h"
static llvm::symbolize::LLVMSymbolizer *getDefaultSymbolizer() {
static llvm::symbolize::LLVMSymbolizer *DefaultSymbolizer =
new llvm::symbolize::LLVMSymbolizer();
return DefaultSymbolizer;
}
namespace __sanitizer {
int internal_snprintf(char *buffer, unsigned long length, const char *format,
...);
} // namespace __sanitizer
extern "C" {
typedef uint64_t u64;
bool __sanitizer_symbolize_code(const char *ModuleName, uint64_t ModuleOffset,
char *Buffer, int MaxLength) {
std::string Result;
{
llvm::raw_string_ostream OS(Result);
llvm::symbolize::DIPrinter Printer(OS);
auto ResOrErr =
getDefaultSymbolizer()->symbolizeInlinedCode(ModuleName, ModuleOffset);
Printer << (ResOrErr ? ResOrErr.get() : llvm::DIInliningInfo());
}
return __sanitizer::internal_snprintf(Buffer, MaxLength, "%s",
Result.c_str()) < MaxLength;
}
bool __sanitizer_symbolize_data(const char *ModuleName, uint64_t ModuleOffset,
char *Buffer, int MaxLength) {
std::string Result;
{
llvm::raw_string_ostream OS(Result);
llvm::symbolize::DIPrinter Printer(OS);
auto ResOrErr =
getDefaultSymbolizer()->symbolizeData(ModuleName, ModuleOffset);
Printer << (ResOrErr ? ResOrErr.get() : llvm::DIGlobal());
}
return __sanitizer::internal_snprintf(Buffer, MaxLength, "%s",
Result.c_str()) < MaxLength;
}
void __sanitizer_symbolize_flush() { getDefaultSymbolizer()->flush(); }
int __sanitizer_symbolize_demangle(const char *Name, char *Buffer,
int MaxLength) {
std::string Result =
llvm::symbolize::LLVMSymbolizer::DemangleName(Name, nullptr);
return __sanitizer::internal_snprintf(Buffer, MaxLength, "%s",
Result.c_str()) < MaxLength
? static_cast<int>(Result.size() + 1)
: 0;
}
} // extern "C"

View File

@@ -0,0 +1,199 @@
//===-- sanitizer_wrappers.cc -----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Redirect some functions to sanitizer interceptors.
//
//===----------------------------------------------------------------------===//
#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <unistd.h>
#include <tuple>
// Need to match ../sanitizer_common/sanitizer_internal_defs.h
#if defined(ARCH_PPC)
#define OFF_T unsigned long
#else
#define OFF_T unsigned long long
#endif
namespace __sanitizer {
unsigned long internal_open(const char *filename, int flags);
unsigned long internal_open(const char *filename, int flags, unsigned mode);
unsigned long internal_close(int fd);
unsigned long internal_stat(const char *path, void *buf);
unsigned long internal_lstat(const char *path, void *buf);
unsigned long internal_fstat(int fd, void *buf);
size_t internal_strlen(const char *s);
unsigned long internal_mmap(void *addr, unsigned long length, int prot,
int flags, int fd, OFF_T offset);
void *internal_memcpy(void *dest, const void *src, unsigned long n);
// Used to propagate errno.
bool internal_iserror(unsigned long retval, int *rverrno = 0);
} // namespace __sanitizer
namespace {
template <typename T>
struct GetTypes;
template <typename R, typename... Args>
struct GetTypes<R(Args...)> {
using Result = R;
template <size_t i>
struct Arg {
using Type = typename std::tuple_element<i, std::tuple<Args...>>::type;
};
};
#define LLVM_SYMBOLIZER_GET_FUNC(Function) \
((__interceptor_##Function) \
? (__interceptor_##Function) \
: reinterpret_cast<decltype(&Function)>(dlsym(RTLD_NEXT, #Function)))
#define LLVM_SYMBOLIZER_INTERCEPTOR1(Function, ...) \
GetTypes<__VA_ARGS__>::Result __interceptor_##Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type) __attribute__((weak)); \
GetTypes<__VA_ARGS__>::Result Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type arg0) { \
return LLVM_SYMBOLIZER_GET_FUNC(Function)(arg0); \
}
#define LLVM_SYMBOLIZER_INTERCEPTOR2(Function, ...) \
GetTypes<__VA_ARGS__>::Result __interceptor_##Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type, \
GetTypes<__VA_ARGS__>::Arg<1>::Type) __attribute__((weak)); \
GetTypes<__VA_ARGS__>::Result Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type arg0, \
GetTypes<__VA_ARGS__>::Arg<1>::Type arg1) { \
return LLVM_SYMBOLIZER_GET_FUNC(Function)(arg0, arg1); \
}
#define LLVM_SYMBOLIZER_INTERCEPTOR3(Function, ...) \
GetTypes<__VA_ARGS__>::Result __interceptor_##Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type, \
GetTypes<__VA_ARGS__>::Arg<1>::Type, \
GetTypes<__VA_ARGS__>::Arg<2>::Type) __attribute__((weak)); \
GetTypes<__VA_ARGS__>::Result Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type arg0, \
GetTypes<__VA_ARGS__>::Arg<1>::Type arg1, \
GetTypes<__VA_ARGS__>::Arg<2>::Type arg2) { \
return LLVM_SYMBOLIZER_GET_FUNC(Function)(arg0, arg1, arg2); \
}
#define LLVM_SYMBOLIZER_INTERCEPTOR4(Function, ...) \
GetTypes<__VA_ARGS__>::Result __interceptor_##Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type, \
GetTypes<__VA_ARGS__>::Arg<1>::Type, \
GetTypes<__VA_ARGS__>::Arg<2>::Type, \
GetTypes<__VA_ARGS__>::Arg<3>::Type) __attribute__((weak)); \
GetTypes<__VA_ARGS__>::Result Function( \
GetTypes<__VA_ARGS__>::Arg<0>::Type arg0, \
GetTypes<__VA_ARGS__>::Arg<1>::Type arg1, \
GetTypes<__VA_ARGS__>::Arg<2>::Type arg2, \
GetTypes<__VA_ARGS__>::Arg<3>::Type arg3) { \
return LLVM_SYMBOLIZER_GET_FUNC(Function)(arg0, arg1, arg2, arg3); \
}
} // namespace
// C-style interface around internal sanitizer libc functions.
extern "C" {
#define RETURN_OR_SET_ERRNO(T, res) \
int rverrno; \
if (__sanitizer::internal_iserror(res, &rverrno)) { \
errno = rverrno; \
return (T)-1; \
} \
return (T)res;
int open(const char *filename, int flags, ...) {
unsigned long res;
if (flags | O_CREAT) {
va_list va;
va_start(va, flags);
unsigned mode = va_arg(va, unsigned);
va_end(va);
res = __sanitizer::internal_open(filename, flags, mode);
} else {
res = __sanitizer::internal_open(filename, flags);
}
RETURN_OR_SET_ERRNO(int, res);
}
int close(int fd) {
unsigned long res = __sanitizer::internal_close(fd);
RETURN_OR_SET_ERRNO(int, res);
}
#define STAT(func, arg, buf) \
unsigned long res = __sanitizer::internal_##func(arg, buf); \
RETURN_OR_SET_ERRNO(int, res);
int stat(const char *path, struct stat *buf) { STAT(stat, path, buf); }
int lstat(const char *path, struct stat *buf) { STAT(lstat, path, buf); }
int fstat(int fd, struct stat *buf) { STAT(fstat, fd, buf); }
// Redirect versioned stat functions to the __sanitizer::internal() as well.
int __xstat(int version, const char *path, struct stat *buf) {
STAT(stat, path, buf);
}
int __lxstat(int version, const char *path, struct stat *buf) {
STAT(lstat, path, buf);
}
int __fxstat(int version, int fd, struct stat *buf) { STAT(fstat, fd, buf); }
size_t strlen(const char *s) { return __sanitizer::internal_strlen(s); }
void *mmap(void *addr, size_t length, int prot, int flags, int fd,
off_t offset) {
unsigned long res = __sanitizer::internal_mmap(
addr, (unsigned long)length, prot, flags, fd, (unsigned long long)offset);
RETURN_OR_SET_ERRNO(void *, res);
}
LLVM_SYMBOLIZER_INTERCEPTOR3(read, ssize_t(int, void *, size_t))
LLVM_SYMBOLIZER_INTERCEPTOR4(pread, ssize_t(int, void *, size_t, off_t))
LLVM_SYMBOLIZER_INTERCEPTOR4(pread64, ssize_t(int, void *, size_t, off64_t))
LLVM_SYMBOLIZER_INTERCEPTOR2(realpath, char *(const char *, char *))
LLVM_SYMBOLIZER_INTERCEPTOR1(pthread_cond_broadcast, int(pthread_cond_t *))
LLVM_SYMBOLIZER_INTERCEPTOR2(pthread_cond_wait,
int(pthread_cond_t *, pthread_mutex_t *))
LLVM_SYMBOLIZER_INTERCEPTOR1(pthread_mutex_lock, int(pthread_mutex_t *))
LLVM_SYMBOLIZER_INTERCEPTOR1(pthread_mutex_unlock, int(pthread_mutex_t *))
LLVM_SYMBOLIZER_INTERCEPTOR1(pthread_mutex_destroy, int(pthread_mutex_t *))
LLVM_SYMBOLIZER_INTERCEPTOR2(pthread_mutex_init,
int(pthread_mutex_t *,
const pthread_mutexattr_t *))
LLVM_SYMBOLIZER_INTERCEPTOR1(pthread_mutexattr_destroy,
int(pthread_mutexattr_t *))
LLVM_SYMBOLIZER_INTERCEPTOR1(pthread_mutexattr_init, int(pthread_mutexattr_t *))
LLVM_SYMBOLIZER_INTERCEPTOR2(pthread_mutexattr_settype,
int(pthread_mutexattr_t *, int))
LLVM_SYMBOLIZER_INTERCEPTOR1(pthread_getspecific, void *(pthread_key_t))
LLVM_SYMBOLIZER_INTERCEPTOR2(pthread_key_create,
int(pthread_key_t *, void (*)(void *)))
LLVM_SYMBOLIZER_INTERCEPTOR2(pthread_once,
int(pthread_once_t *, void (*)(void)))
LLVM_SYMBOLIZER_INTERCEPTOR2(pthread_setspecific,
int(pthread_key_t, const void *))
LLVM_SYMBOLIZER_INTERCEPTOR3(pthread_sigmask,
int(int, const sigset_t *, sigset_t *))
} // extern "C"

View File

@@ -0,0 +1,39 @@
#!/bin/bash
function usage() {
echo "Usage: $0 INPUT... OUTPUT"
exit 1
}
if [ "$#" -le 1 ]; then
usage
fi
AR=$(readlink -f $AR)
LINK=$(readlink -f $LINK)
INPUTS=
OUTPUT=
for ARG in $@; do
INPUTS="$INPUTS $OUTPUT"
OUTPUT=$(readlink -f $ARG)
done
echo Inputs: $INPUTS
echo Output: $OUTPUT
SCRATCH_DIR=$(mktemp -d)
ln -s $INPUTS $SCRATCH_DIR/
pushd $SCRATCH_DIR
for INPUT in *; do
for OBJ in $($AR t $INPUT); do
$AR x $INPUT $OBJ
mv -f $OBJ $(basename $INPUT).$OBJ
done
done
$LINK *.o -o $OUTPUT
rm -rf $SCRATCH_DIR

View File

@@ -0,0 +1,185 @@
#!/bin/bash -eu
#
# Run as: CLANG=bin/clang ZLIB_SRC=src/zlib \
# build_symbolizer.sh runtime_build/lib/clang/4.0.0/lib/linux/
# zlib can be downloaded from from http://www.zlib.net.
#
# Script compiles self-contained object file with symbolization code and injects
# it into the given set of runtime libraries. Script updates only libraries
# which has unresolved __sanitizer_symbolize_* symbols and matches architecture.
# Object file is be compiled from LLVM sources with dependencies like libc++ and
# zlib. Then it internalizes symbols in the file, so that it can be linked
# into arbitrary programs, avoiding conflicts with the program own symbols and
# avoiding dependencies on any program symbols. The only acceptable dependencies
# are libc and __sanitizer::internal_* from sanitizer runtime.
#
# Symbols exported by the object file will be used by Sanitizer runtime
# libraries to symbolize code/data in-process.
#
# The script will modify the output directory which is given as the first
# argument to the script.
#
# FIXME: We should really be using a simpler approach to building this object
# file, and it should be available as a regular cmake rule. Conceptually, we
# want to be doing "ld -r" followed by "objcopy -G" to create a relocatable
# object file with only our entry points exposed. However, this does not work at
# present, see PR30750.
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SRC_DIR=$(readlink -f $SCRIPT_DIR/..)
TARGE_DIR=$(readlink -f $1)
LLVM_SRC="${LLVM_SRC:-$SCRIPT_DIR/../../../../../..}"
LLVM_SRC=$(readlink -f $LLVM_SRC)
if [[ ! -d "${LLVM_SRC}/projects/libcxxabi" ||
! -d "${LLVM_SRC}/projects/libcxx" ]]; then
echo "Missing or incomplete LLVM_SRC"
exit 1
fi
if [[ "$ZLIB_SRC" == "" ||
! -x "${ZLIB_SRC}/configure" ||
! -f "${ZLIB_SRC}/zlib.h" ]]; then
echo "Missing or incomplete ZLIB_SRC"
exit 1
fi
ZLIB_SRC=$(readlink -f $ZLIB_SRC)
J="${J:-50}"
CLANG="${CLANG:-`which clang`}"
CLANG_DIR=$(readlink -f $(dirname "$CLANG"))
BUILD_DIR=$(readlink -f ./symbolizer)
mkdir -p $BUILD_DIR
cd $BUILD_DIR
CC=$CLANG_DIR/clang
CXX=$CLANG_DIR/clang++
TBLGEN=$CLANG_DIR/llvm-tblgen
OPT=$CLANG_DIR/opt
export AR=$CLANG_DIR/llvm-ar
export LINK=$CLANG_DIR/llvm-link
for F in $CC $CXX $TBLGEN $LINK $OPT $AR; do
if [[ ! -x "$F" ]]; then
echo "Missing $F"
exit 1
fi
done
ZLIB_BUILD=${BUILD_DIR}/zlib
LIBCXX_BUILD=${BUILD_DIR}/libcxx
LLVM_BUILD=${BUILD_DIR}/llvm
SYMBOLIZER_BUILD=${BUILD_DIR}/symbolizer
FLAGS=${FLAGS:-}
FLAGS="$FLAGS -fPIC -flto -Os -g0 -DNDEBUG"
# Build zlib.
mkdir -p ${ZLIB_BUILD}
cd ${ZLIB_BUILD}
cp -r ${ZLIB_SRC}/* .
CC=$CC CFLAGS="$FLAGS" RANLIB=/bin/true ./configure --static
make -j${J} libz.a
# Build and install libcxxabi and libcxx.
if [[ ! -d ${LIBCXX_BUILD} ]]; then
mkdir -p ${LIBCXX_BUILD}
cd ${LIBCXX_BUILD}
LIBCXX_FLAGS="${FLAGS} -Wno-macro-redefined -I${LLVM_SRC}/projects/libcxxabi/include"
cmake -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_C_FLAGS_RELEASE="${LIBCXX_FLAGS}" \
-DCMAKE_CXX_FLAGS_RELEASE="${LIBCXX_FLAGS}" \
-DLIBCXXABI_ENABLE_ASSERTIONS=OFF \
-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF \
-DLIBCXXABI_ENABLE_SHARED=OFF \
-DLIBCXXABI_ENABLE_THREADS=OFF \
-DLIBCXX_ENABLE_ASSERTIONS=OFF \
-DLIBCXX_ENABLE_EXCEPTIONS=OFF \
-DLIBCXX_ENABLE_RTTI=OFF \
-DLIBCXX_ENABLE_SHARED=OFF \
-DLIBCXX_ENABLE_THREADS=OFF \
$LLVM_SRC
fi
cd ${LIBCXX_BUILD}
ninja cxx cxxabi
FLAGS="${FLAGS} -fno-rtti -fno-exceptions"
LLVM_FLAGS="${FLAGS} -nostdinc++ -I${ZLIB_BUILD} -I${LIBCXX_BUILD}/include/c++/v1"
# Build LLVM.
if [[ ! -d ${LLVM_BUILD} ]]; then
mkdir -p ${LLVM_BUILD}
cd ${LLVM_BUILD}
cmake -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_C_FLAGS_RELEASE="${LLVM_FLAGS}" \
-DCMAKE_CXX_FLAGS_RELEASE="${LLVM_FLAGS}" \
-DLLVM_TABLEGEN=$TBLGEN \
-DLLVM_ENABLE_ZLIB=ON \
-DLLVM_ENABLE_TERMINFO=OFF \
-DLLVM_ENABLE_THREADS=OFF \
$LLVM_SRC
fi
cd ${LLVM_BUILD}
ninja LLVMSymbolize LLVMObject LLVMBinaryFormat LLVMDebugInfoDWARF LLVMSupport LLVMDebugInfoPDB LLVMMC
cd ${BUILD_DIR}
rm -rf ${SYMBOLIZER_BUILD}
mkdir ${SYMBOLIZER_BUILD}
cd ${SYMBOLIZER_BUILD}
echo "Compiling..."
SYMBOLIZER_FLAGS="$LLVM_FLAGS -I${LLVM_SRC}/include -I${LLVM_BUILD}/include -std=c++11"
$CXX $SYMBOLIZER_FLAGS ${SRC_DIR}/sanitizer_symbolize.cc ${SRC_DIR}/sanitizer_wrappers.cc -c
$AR rc symbolizer.a sanitizer_symbolize.o sanitizer_wrappers.o
SYMBOLIZER_API_LIST=__sanitizer_symbolize_code,__sanitizer_symbolize_data,__sanitizer_symbolize_flush,__sanitizer_symbolize_demangle
# Merge all the object files together and copy the resulting library back.
$SCRIPT_DIR/ar_to_bc.sh $LIBCXX_BUILD/lib/libc++.a \
$LIBCXX_BUILD/lib/libc++abi.a \
$LLVM_BUILD/lib/libLLVMSymbolize.a \
$LLVM_BUILD/lib/libLLVMObject.a \
$LLVM_BUILD/lib/libLLVMBinaryFormat.a \
$LLVM_BUILD/lib/libLLVMDebugInfoDWARF.a \
$LLVM_BUILD/lib/libLLVMSupport.a \
$LLVM_BUILD/lib/libLLVMDebugInfoPDB.a \
$LLVM_BUILD/lib/libLLVMMC.a \
$ZLIB_BUILD/libz.a \
symbolizer.a \
all.bc
echo "Optimizing..."
$OPT -internalize -internalize-public-api-list=${SYMBOLIZER_API_LIST} all.bc -o opt.bc
$CC $FLAGS -fno-lto -c opt.bc -o symbolizer.o
echo "Checking undefined symbols..."
nm -f posix -g symbolizer.o | cut -f 1,2 -d \ | LC_COLLATE=C sort -u > undefined.new
(diff -u $SCRIPT_DIR/global_symbols.txt undefined.new | grep -E "^\+[^+]") && \
(echo "Failed: unexpected symbols"; exit 1)
arch() {
objdump -f $1 | grep -m1 -Po "(?<=file format ).*$"
}
SYMBOLIZER_FORMAT=$(arch symbolizer.o)
echo "Injecting $SYMBOLIZER_FORMAT symbolizer..."
for A in $TARGE_DIR/libclang_rt.*san*.a; do
A_FORMAT=$(arch $A)
if [[ "$A_FORMAT" != "$SYMBOLIZER_FORMAT" ]] ; then
continue
fi
(nm -u $A 2>/dev/null | grep -E "__sanitizer_symbolize_code" >/dev/null) || continue
echo "$A"
$AR rcs $A symbolizer.o
done
echo "Success!"

View File

@@ -0,0 +1,139 @@
_GLOBAL_OFFSET_TABLE_ U
_ZN11__sanitizer13internal_mmapEPvmiiiy U
_ZN11__sanitizer13internal_openEPKcij U
_ZN11__sanitizer13internal_statEPKcPv U
_ZN11__sanitizer14internal_closeEi U
_ZN11__sanitizer14internal_fstatEiPv U
_ZN11__sanitizer14internal_lstatEPKcPv U
_ZN11__sanitizer15internal_strlenEPKc U
_ZN11__sanitizer16internal_iserrorEmPi U
_ZN11__sanitizer17internal_snprintfEPcmPKcz U
__ctype_b_loc U
__ctype_get_mb_cur_max U
__cxa_atexit U
__divdi3 U
__dso_handle U
__errno_location U
__interceptor_pread w
__interceptor_read w
__interceptor_realpath w
__moddi3 U
__sanitizer_symbolize_code T
__sanitizer_symbolize_data T
__sanitizer_symbolize_demangle T
__sanitizer_symbolize_flush T
__strdup U
__udivdi3 U
__umoddi3 U
_exit U
abort U
access U
calloc U
catclose U
catgets U
catopen U
ceil U
clock_gettime U
cfgetospeed U
dl_iterate_phdr U
dlsym U
dup U
dup2 U
environ U
execv U
exit U
fclose U
fflush U
fileno U
fopen U
fork U
fprintf U
fputc U
free U
freelocale U
fwrite U
getc U
getcwd U
getenv U
getpagesize U
getpid U
gettimeofday U
ioctl U
isalpha U
isatty U
isprint U
isupper U
isxdigit U
log10 U
lseek U
lseek64 U
malloc U
mbrlen U
mbrtowc U
mbsnrtowcs U
mbsrtowcs U
mbtowc U
memchr U
memcmp U
memcpy U
memmove U
memset U
mkdir U
munmap U
newlocale U
perror U
posix_spawn U
posix_spawn_file_actions_adddup2 U
posix_spawn_file_actions_addopen U
posix_spawn_file_actions_destroy U
posix_spawn_file_actions_init U
qsort U
rand U
readlink U
realloc U
remove U
setvbuf U
sigfillset U
sigprocmask U
snprintf U
sprintf U
srand U
sscanf U
stderr U
stdin U
stdout U
strcat U
strchr U
strcmp U
strcpy U
strdup U
strerror U
strerror_r U
strftime_l U
strncmp U
strncpy U
strrchr U
strsep U
strtod_l U
strtof_l U
strtol U
strtold_l U
strtoll_l U
strtoull_l U
tcgetattr U
uname U
ungetc U
unlink U
uselocale U
vasprintf U
vfprintf U
vsnprintf U
vsscanf U
waitpid U
wcrtomb U
wcslen U
wcsnrtombs U
wmemcpy U
wmemmove U
wmemset U
write U