From 7ac77d6b2911c24bcdbc4ac767e4001f06d84921 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 5 Jun 2012 09:49:25 +0000 Subject: [PATCH] [Sanitizer] add sanitizer_posix.cc. Move more various functions into sanitizer_libc: sscanf, munmap, memchr llvm-svn: 157994 --- compiler-rt/lib/asan/asan_interceptors.cc | 8 ----- compiler-rt/lib/asan/asan_interceptors.h | 1 - compiler-rt/lib/asan/asan_internal.h | 1 - compiler-rt/lib/asan/asan_linux.cc | 10 +++--- compiler-rt/lib/asan/asan_mac.cc | 2 +- compiler-rt/lib/asan/asan_printf.cc | 13 ------- .../lib/sanitizer_common/sanitizer_libc.cc | 8 +++++ .../lib/sanitizer_common/sanitizer_libc.h | 7 ++++ .../lib/sanitizer_common/sanitizer_linux.cc | 4 +++ .../lib/sanitizer_common/sanitizer_mac.cc | 4 +++ .../lib/sanitizer_common/sanitizer_posix.cc | 34 +++++++++++++++++++ .../lib/sanitizer_common/sanitizer_win.cc | 10 ++++++ 12 files changed, 73 insertions(+), 29 deletions(-) create mode 100644 compiler-rt/lib/sanitizer_common/sanitizer_posix.cc diff --git a/compiler-rt/lib/asan/asan_interceptors.cc b/compiler-rt/lib/asan/asan_interceptors.cc index a22ddcf65a71..63ae5799e25b 100644 --- a/compiler-rt/lib/asan/asan_interceptors.cc +++ b/compiler-rt/lib/asan/asan_interceptors.cc @@ -249,14 +249,6 @@ char* internal_strchr(const char *s, int c) { } } -void* internal_memchr(const void* s, int c, uptr n) { - const char* t = (char*)s; - for (uptr i = 0; i < n; ++i, ++t) - if (*t == c) - return (void*)t; - return 0; -} - int internal_memcmp(const void* s1, const void* s2, uptr n) { const char* t1 = (char*)s1; const char* t2 = (char*)s2; diff --git a/compiler-rt/lib/asan/asan_interceptors.h b/compiler-rt/lib/asan/asan_interceptors.h index 235013a01c71..975187f53e44 100644 --- a/compiler-rt/lib/asan/asan_interceptors.h +++ b/compiler-rt/lib/asan/asan_interceptors.h @@ -35,7 +35,6 @@ s64 internal_atoll(const char *nptr); uptr internal_strlen(const char *s); uptr internal_strnlen(const char *s, uptr maxlen); char* internal_strchr(const char *s, int c); -void* internal_memchr(const void* s, int c, uptr n); void* internal_memset(void *s, int c, uptr n); int internal_memcmp(const void* s1, const void* s2, uptr n); char *internal_strstr(const char *haystack, const char *needle); diff --git a/compiler-rt/lib/asan/asan_internal.h b/compiler-rt/lib/asan/asan_internal.h index cd01f2c23f6d..2df8729e016d 100644 --- a/compiler-rt/lib/asan/asan_internal.h +++ b/compiler-rt/lib/asan/asan_internal.h @@ -194,7 +194,6 @@ uptr ReadFileToBuffer(const char *file_name, char **buff, void RawWrite(const char *buffer); int SNPrintf(char *buffer, uptr length, const char *format, ...); void Printf(const char *format, ...); -int SScanf(const char *str, const char *format, ...); void Report(const char *format, ...); // Don't use std::min and std::max, to minimize dependency on libstdc++. diff --git a/compiler-rt/lib/asan/asan_linux.cc b/compiler-rt/lib/asan/asan_linux.cc index 908138c5883b..ee356edd6987 100644 --- a/compiler-rt/lib/asan/asan_linux.cc +++ b/compiler-rt/lib/asan/asan_linux.cc @@ -103,7 +103,7 @@ void *AsanMprotect(uptr fixed_addr, uptr size) { void AsanUnmapOrDie(void *addr, uptr size) { if (!addr || !size) return; - int res = syscall(__NR_munmap, addr, size); + int res = internal_munmap(addr, size); if (res != 0) { Report("Failed to unmap\n"); AsanDie(); @@ -171,10 +171,10 @@ bool AsanProcMaps::Next(uptr *start, uptr *end, char *next_line = (char*)internal_memchr(current_, '\n', last - current_); if (next_line == 0) next_line = last; - if (SScanf(current_, - "%lx-%lx %4s %lx %x:%x %ld %n", - start, end, flags, offset, &major, &minor, - &inode, &consumed) != 7) + if (internal_sscanf(current_, + "%lx-%lx %4s %lx %x:%x %ld %n", + start, end, flags, offset, &major, &minor, + &inode, &consumed) != 7) return false; current_ += consumed; // Skip spaces. diff --git a/compiler-rt/lib/asan/asan_mac.cc b/compiler-rt/lib/asan/asan_mac.cc index b688771ab0f0..636ed73c124d 100644 --- a/compiler-rt/lib/asan/asan_mac.cc +++ b/compiler-rt/lib/asan/asan_mac.cc @@ -127,7 +127,7 @@ void *AsanMprotect(uptr fixed_addr, uptr size) { void AsanUnmapOrDie(void *addr, uptr size) { if (!addr || !size) return; - int res = munmap(addr, size); + int res = internal_munmap(addr, size); if (res != 0) { Report("Failed to unmap\n"); AsanDie(); diff --git a/compiler-rt/lib/asan/asan_printf.cc b/compiler-rt/lib/asan/asan_printf.cc index 19ed5bf7dc9a..af48bba91bf7 100644 --- a/compiler-rt/lib/asan/asan_printf.cc +++ b/compiler-rt/lib/asan/asan_printf.cc @@ -193,17 +193,4 @@ void Report(const char *format, ...) { RawWrite(buffer); } -int SScanf(const char *str, const char *format, ...) { -#ifndef _WIN32 - va_list args; - va_start(args, format); - int res = vsscanf(str, format, args); - va_end(args); - return res; -#else - UNIMPLEMENTED(); - return -1; -#endif -} - } // namespace __asan diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_libc.cc b/compiler-rt/lib/sanitizer_common/sanitizer_libc.cc index 29bcd4973384..e213b528b145 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_libc.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_libc.cc @@ -18,6 +18,14 @@ namespace __sanitizer { void MiniLibcStub() { } +void *internal_memchr(const void *s, int c, uptr n) { + const char* t = (char*)s; + for (uptr i = 0; i < n; ++i, ++t) + if (*t == c) + return (void*)t; + return 0; +} + int internal_strcmp(const char *s1, const char *s2) { while (true) { unsigned c1 = *s1; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_libc.h b/compiler-rt/lib/sanitizer_common/sanitizer_libc.h index 8ccaf7b0678b..9391e96118b9 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_libc.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_libc.h @@ -26,18 +26,25 @@ namespace __sanitizer { void MiniLibcStub(); // internal_X() is a custom implementation of X() for use in RTL. + +// String functions +void *internal_memchr(const void *s, int c, uptr n); int internal_strcmp(const char *s1, const char *s2); char *internal_strncpy(char *dst, const char *src, uptr n); +// Memory void *internal_mmap(void *addr, uptr length, int prot, int flags, int fd, u64 offset); +int internal_munmap(void *addr, uptr length); +// I/O typedef int fd_t; const fd_t kInvalidFd = -1; int internal_close(fd_t fd); fd_t internal_open(const char *filename, bool write); uptr internal_read(fd_t fd, void *buf, uptr count); uptr internal_write(fd_t fd, const void *buf, uptr count); +int internal_sscanf(const char *str, const char *format, ...); } // namespace __sanitizer diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index 99e44813df9a..153c0ca5099f 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -34,6 +34,10 @@ void *internal_mmap(void *addr, uptr length, int prot, int flags, #endif } +int internal_munmap(void *addr, uptr length) { + return syscall(__NR_munmap, addr, length); +} + int internal_close(fd_t fd) { return syscall(__NR_close, fd); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc index 4b9c631c9653..e7b846fb057b 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc @@ -30,6 +30,10 @@ void *internal_mmap(void *addr, size_t length, int prot, int flags, return mmap(addr, length, prot, flags, fd, offset); } +int internal_munmap(void *addr, uptr length) { + return munmap(addr, length); +} + int internal_close(fd_t fd) { return close(fd); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc new file mode 100644 index 000000000000..ac3d1ec8d63e --- /dev/null +++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc @@ -0,0 +1,34 @@ +//===-- sanitizer_posix.cc ------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is shared between AddressSanitizer and ThreadSanitizer +// run-time libraries and implements POSIX-specific functions from +// sanitizer_libc.h. +//===----------------------------------------------------------------------===// +#if defined(__linux__) || defined(__APPLE__) + +#include "sanitizer_defs.h" +#include "sanitizer_libc.h" + +#include +#include + +namespace __sanitizer { + +int internal_sscanf(const char *str, const char *format, ...) { + va_list args; + va_start(args, format); + int res = vsscanf(str, format, args); + va_end(args); + return res; +} + +} // namespace __sanitizer + +#endif // __linux__ || __APPLE_ diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_win.cc b/compiler-rt/lib/sanitizer_common/sanitizer_win.cc index 6bf551ce7bf0..98414dded45f 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_win.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_win.cc @@ -29,6 +29,11 @@ void *internal_mmap(void *addr, uptr length, int prot, int flags, return 0; } +int internal_munmap(void *addr, uptr length) { + UNIMPLEMENTED_WIN(); + return 0; +} + int internal_close(fd_t fd) { UNIMPLEMENTED_WIN(); return 0; @@ -58,6 +63,11 @@ uptr internal_write(fd_t fd, const void *buf, uptr count) { return ret; } +int internal_sscanf(const char *str, const char *format, ...) { + UNIMPLEMENTED_WIN(); + return -1; +} + } // namespace __sanitizer #endif // _WIN32