svn commit: r311697 - in projects/clang400-import/contrib/compiler-rt: include/sanitizer include/xray lib/asan lib/builtins lib/builtins/arm lib/cfi lib/dfsan lib/esan lib/interception lib/lsan lib...
Dimitry Andric
dim at FreeBSD.org
Sun Jan 8 19:47:19 UTC 2017
Author: dim
Date: Sun Jan 8 19:47:17 2017
New Revision: 311697
URL: https://svnweb.freebsd.org/changeset/base/311697
Log:
Merge compiler-rt r291274.
Added:
projects/clang400-import/contrib/compiler-rt/include/xray/
- copied from r311696, vendor/compiler-rt/dist/include/xray/
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_descriptions.cc
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/asan/asan_descriptions.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_descriptions.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/asan/asan_descriptions.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_errors.cc
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/asan/asan_errors.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_errors.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/asan/asan_errors.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_globals_win.cc
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/asan/asan_globals_win.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_globals_win.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/asan/asan_globals_win.h
projects/clang400-import/contrib/compiler-rt/lib/builtins/floattitf.c
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/builtins/floattitf.c
projects/clang400-import/contrib/compiler-rt/lib/builtins/floatuntitf.c
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/builtins/floatuntitf.c
projects/clang400-import/contrib/compiler-rt/lib/builtins/mingw_fixfloat.c
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/builtins/mingw_fixfloat.c
projects/clang400-import/contrib/compiler-rt/lib/esan/esan_hashtable.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/esan/esan_hashtable.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sancov_flags.cc
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_flags.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sancov_flags.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_flags.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sancov_flags.inc
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_flags.inc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_bytemap.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_bytemap.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_combined.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_local_cache.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_local_cache.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_primary32.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_primary64.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_secondary.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_secondary.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_size_class_map.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_size_class_map.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_stats.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_allocator_stats.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cc
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_dbghelp.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_dbghelp.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux_mips64.S
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_linux_mips64.S
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/symbolizer/
- copied from r311696, vendor/compiler-rt/dist/lib/sanitizer_common/symbolizer/
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_allocator_secondary.h
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/scudo/scudo_allocator_secondary.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_mips64.S
- copied unchanged from r311696, vendor/compiler-rt/dist/lib/tsan/rtl/tsan_rtl_mips64.S
projects/clang400-import/contrib/compiler-rt/lib/xray/
- copied from r311696, vendor/compiler-rt/dist/lib/xray/
Modified:
projects/clang400-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h
projects/clang400-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation_flags.inc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_debugging.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_fake_stack.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_fake_stack.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_flags.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_flags.inc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_globals.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_interceptors.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_interface_internal.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_internal.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_mac.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_malloc_linux.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_malloc_win.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_mapping.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_memory_profile.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_new_delete.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_poisoning.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_poisoning.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_posix.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_report.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_report.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_rtl.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_scariness_score.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_thread.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_thread.h
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_win.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_win_dll_thunk.cc
projects/clang400-import/contrib/compiler-rt/lib/asan/asan_win_dynamic_runtime_thunk.cc
projects/clang400-import/contrib/compiler-rt/lib/builtins/arm/aeabi_idivmod.S
projects/clang400-import/contrib/compiler-rt/lib/builtins/arm/aeabi_ldivmod.S
projects/clang400-import/contrib/compiler-rt/lib/builtins/arm/aeabi_uidivmod.S
projects/clang400-import/contrib/compiler-rt/lib/builtins/arm/aeabi_uldivmod.S
projects/clang400-import/contrib/compiler-rt/lib/builtins/arm/comparesf2.S
projects/clang400-import/contrib/compiler-rt/lib/builtins/arm/divsi3.S
projects/clang400-import/contrib/compiler-rt/lib/builtins/arm/udivsi3.S
projects/clang400-import/contrib/compiler-rt/lib/builtins/assembly.h
projects/clang400-import/contrib/compiler-rt/lib/builtins/atomic.c
projects/clang400-import/contrib/compiler-rt/lib/builtins/clear_cache.c
projects/clang400-import/contrib/compiler-rt/lib/builtins/int_lib.h
projects/clang400-import/contrib/compiler-rt/lib/cfi/cfi.cc
projects/clang400-import/contrib/compiler-rt/lib/dfsan/dfsan.cc
projects/clang400-import/contrib/compiler-rt/lib/dfsan/dfsan.h
projects/clang400-import/contrib/compiler-rt/lib/dfsan/dfsan_interceptors.cc
projects/clang400-import/contrib/compiler-rt/lib/dfsan/dfsan_platform.h
projects/clang400-import/contrib/compiler-rt/lib/dfsan/done_abilist.txt
projects/clang400-import/contrib/compiler-rt/lib/esan/cache_frag.cpp
projects/clang400-import/contrib/compiler-rt/lib/esan/esan.cpp
projects/clang400-import/contrib/compiler-rt/lib/esan/esan.h
projects/clang400-import/contrib/compiler-rt/lib/esan/esan_flags.cpp
projects/clang400-import/contrib/compiler-rt/lib/esan/esan_interceptors.cpp
projects/clang400-import/contrib/compiler-rt/lib/esan/esan_interface_internal.h
projects/clang400-import/contrib/compiler-rt/lib/esan/esan_linux.cpp
projects/clang400-import/contrib/compiler-rt/lib/esan/esan_shadow.h
projects/clang400-import/contrib/compiler-rt/lib/interception/interception.h
projects/clang400-import/contrib/compiler-rt/lib/interception/interception_win.cc
projects/clang400-import/contrib/compiler-rt/lib/lsan/lsan_allocator.cc
projects/clang400-import/contrib/compiler-rt/lib/lsan/lsan_common.cc
projects/clang400-import/contrib/compiler-rt/lib/lsan/lsan_common_linux.cc
projects/clang400-import/contrib/compiler-rt/lib/lsan/lsan_thread.cc
projects/clang400-import/contrib/compiler-rt/lib/msan/msan.h
projects/clang400-import/contrib/compiler-rt/lib/msan/msan_allocator.cc
projects/clang400-import/contrib/compiler-rt/lib/msan/msan_interceptors.cc
projects/clang400-import/contrib/compiler-rt/lib/msan/msan_interface_internal.h
projects/clang400-import/contrib/compiler-rt/lib/msan/msan_linux.cc
projects/clang400-import/contrib/compiler-rt/lib/profile/GCDAProfiling.c
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfData.inc
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfiling.c
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfiling.h
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfilingFile.c
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfilingInternal.h
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfilingPort.h
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfilingRuntime.cc
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfilingUtil.c
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfilingUtil.h
projects/clang400-import/contrib/compiler-rt/lib/profile/InstrProfilingValue.c
projects/clang400-import/contrib/compiler-rt/lib/profile/WindowsMMap.c
projects/clang400-import/contrib/compiler-rt/lib/safestack/safestack.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_addrhashmap.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_interface.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_internal.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_nolibc.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_flags.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_interface_internal.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_libc.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_libignore.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_mac.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_malloc_mac.inc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_linux.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_printf.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_procmaps.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_freebsd.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_linux.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_mac.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_quarantine.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_stackdepot.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.h
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_win.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_thread_registry.cc
projects/clang400-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_win.cc
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_allocator.cpp
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_allocator.h
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_flags.cpp
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_flags.h
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_interceptors.cpp
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_new_delete.cpp
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_termination.cpp
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_utils.cpp
projects/clang400-import/contrib/compiler-rt/lib/scudo/scudo_utils.h
projects/clang400-import/contrib/compiler-rt/lib/stats/stats_client.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/go/tsan_go.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_clock.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_debugging.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_defs.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_flags.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_flags.inc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors_mac.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interface.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interface_inl.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interface_java.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_libdispatch_mac.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_mman.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_mutexset.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_platform.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_platform_mac.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_platform_posix.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_platform_windows.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_aarch64.S
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_proc.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_sync.cc
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_sync.h
projects/clang400-import/contrib/compiler-rt/lib/tsan/rtl/tsan_trace.h
projects/clang400-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc
projects/clang400-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.h
projects/clang400-import/contrib/compiler-rt/lib/ubsan/ubsan_init.cc
projects/clang400-import/contrib/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cc
Directory Properties:
projects/clang400-import/contrib/compiler-rt/ (props changed)
Modified: projects/clang400-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h
==============================================================================
--- projects/clang400-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h Sun Jan 8 19:39:03 2017 (r311696)
+++ projects/clang400-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h Sun Jan 8 19:47:17 2017 (r311697)
@@ -117,6 +117,16 @@ extern "C" {
// Print the stack trace leading to this call. Useful for debugging user code.
void __sanitizer_print_stack_trace();
+ // Symbolizes the supplied 'pc' using the format string 'fmt'.
+ // Outputs at most 'out_buf_size' bytes into 'out_buf'.
+ // The format syntax is described in
+ // lib/sanitizer_common/sanitizer_stacktrace_printer.h.
+ void __sanitizer_symbolize_pc(void *pc, const char *fmt, char *out_buf,
+ size_t out_buf_size);
+ // Same as __sanitizer_symbolize_pc, but for data section (i.e. globals).
+ void __sanitizer_symbolize_global(void *data_ptr, const char *fmt,
+ char *out_buf, size_t out_buf_size);
+
// Sets the callback to be called right before death on error.
// Passing 0 will unset the callback.
void __sanitizer_set_death_callback(void (*callback)(void));
@@ -169,7 +179,16 @@ extern "C" {
// use-after-return detection.
void __sanitizer_start_switch_fiber(void **fake_stack_save,
const void *bottom, size_t size);
- void __sanitizer_finish_switch_fiber(void *fake_stack_save);
+ void __sanitizer_finish_switch_fiber(void *fake_stack_save,
+ const void **bottom_old,
+ size_t *size_old);
+
+ // Get full module name and calculate pc offset within it.
+ // Returns 1 if pc belongs to some module, 0 if module was not found.
+ int __sanitizer_get_module_and_offset_for_pc(void *pc, char *module_path,
+ size_t module_path_len,
+ void **pc_offset);
+
#ifdef __cplusplus
} // extern "C"
#endif
Modified: projects/clang400-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h
==============================================================================
--- projects/clang400-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h Sun Jan 8 19:39:03 2017 (r311696)
+++ projects/clang400-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h Sun Jan 8 19:47:17 2017 (r311697)
@@ -23,6 +23,11 @@ extern "C" {
void __sanitizer_cov_init();
// Record and dump coverage info.
void __sanitizer_cov_dump();
+
+ // Dump collected coverage info. Sorts pcs by module into individual
+ // .sancov files.
+ void __sanitizer_dump_coverage(const uintptr_t *pcs, uintptr_t len);
+
// Open <name>.sancov.packed in the coverage directory and return the file
// descriptor. Returns -1 on failure, or if coverage dumping is disabled.
// This is intended for use by sandboxing code.
@@ -41,13 +46,6 @@ extern "C" {
// Some of the entries in *data will be zero.
uintptr_t __sanitizer_get_coverage_guards(uintptr_t **data);
- // Set *data to the growing buffer with covered PCs and return the size
- // of the buffer. The entries are never zero.
- // When only unique pcs are collected, the size is equal to
- // __sanitizer_get_total_unique_coverage.
- // WARNING: EXPERIMENTAL API.
- uintptr_t __sanitizer_get_coverage_pc_buffer(uintptr_t **data);
-
// The coverage instrumentation may optionally provide imprecise counters.
// Rather than exposing the counter values to the user we instead map
// the counters to a bitset.
@@ -65,6 +63,7 @@ extern "C" {
// __sanitizer_get_number_of_counters bytes long and 8-aligned.
uintptr_t
__sanitizer_update_counter_bitset_and_clear_counters(uint8_t *bitset);
+
#ifdef __cplusplus
} // extern "C"
#endif
Modified: projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation.cc
==============================================================================
--- projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation.cc Sun Jan 8 19:39:03 2017 (r311696)
+++ projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation.cc Sun Jan 8 19:47:17 2017 (r311697)
@@ -79,11 +79,13 @@ static struct AsanDeactivatedFlags {
Report(
"quarantine_size_mb %d, max_redzone %d, poison_heap %d, "
"malloc_context_size %d, alloc_dealloc_mismatch %d, "
- "allocator_may_return_null %d, coverage %d, coverage_dir %s\n",
+ "allocator_may_return_null %d, coverage %d, coverage_dir %s, "
+ "allocator_release_to_os_interval_ms %d\n",
allocator_options.quarantine_size_mb, allocator_options.max_redzone,
poison_heap, malloc_context_size,
allocator_options.alloc_dealloc_mismatch,
- allocator_options.may_return_null, coverage, coverage_dir);
+ allocator_options.may_return_null, coverage, coverage_dir,
+ allocator_options.release_to_os_interval_ms);
}
} asan_deactivated_flags;
Modified: projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation_flags.inc
==============================================================================
--- projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation_flags.inc Sun Jan 8 19:39:03 2017 (r311696)
+++ projects/clang400-import/contrib/compiler-rt/lib/asan/asan_activation_flags.inc Sun Jan 8 19:47:17 2017 (r311697)
@@ -33,3 +33,4 @@ COMMON_ACTIVATION_FLAG(bool, coverage)
COMMON_ACTIVATION_FLAG(const char *, coverage_dir)
COMMON_ACTIVATION_FLAG(int, verbosity)
COMMON_ACTIVATION_FLAG(bool, help)
+COMMON_ACTIVATION_FLAG(s32, allocator_release_to_os_interval_ms)
Modified: projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.cc
==============================================================================
--- projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.cc Sun Jan 8 19:39:03 2017 (r311696)
+++ projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.cc Sun Jan 8 19:47:17 2017 (r311697)
@@ -207,25 +207,27 @@ QuarantineCache *GetQuarantineCache(Asan
void AllocatorOptions::SetFrom(const Flags *f, const CommonFlags *cf) {
quarantine_size_mb = f->quarantine_size_mb;
+ thread_local_quarantine_size_kb = f->thread_local_quarantine_size_kb;
min_redzone = f->redzone;
max_redzone = f->max_redzone;
may_return_null = cf->allocator_may_return_null;
alloc_dealloc_mismatch = f->alloc_dealloc_mismatch;
+ release_to_os_interval_ms = cf->allocator_release_to_os_interval_ms;
}
void AllocatorOptions::CopyTo(Flags *f, CommonFlags *cf) {
f->quarantine_size_mb = quarantine_size_mb;
+ f->thread_local_quarantine_size_kb = thread_local_quarantine_size_kb;
f->redzone = min_redzone;
f->max_redzone = max_redzone;
cf->allocator_may_return_null = may_return_null;
f->alloc_dealloc_mismatch = alloc_dealloc_mismatch;
+ cf->allocator_release_to_os_interval_ms = release_to_os_interval_ms;
}
struct Allocator {
static const uptr kMaxAllowedMallocSize =
FIRST_32_SECOND_64(3UL << 30, 1ULL << 40);
- static const uptr kMaxThreadLocalQuarantine =
- FIRST_32_SECOND_64(1 << 18, 1 << 20);
AsanAllocator allocator;
AsanQuarantine quarantine;
@@ -254,7 +256,7 @@ struct Allocator {
void SharedInitCode(const AllocatorOptions &options) {
CheckOptions(options);
quarantine.Init((uptr)options.quarantine_size_mb << 20,
- kMaxThreadLocalQuarantine);
+ (uptr)options.thread_local_quarantine_size_kb << 10);
atomic_store(&alloc_dealloc_mismatch, options.alloc_dealloc_mismatch,
memory_order_release);
atomic_store(&min_redzone, options.min_redzone, memory_order_release);
@@ -262,22 +264,59 @@ struct Allocator {
}
void Initialize(const AllocatorOptions &options) {
- allocator.Init(options.may_return_null);
+ allocator.Init(options.may_return_null, options.release_to_os_interval_ms);
SharedInitCode(options);
}
+ void RePoisonChunk(uptr chunk) {
+ // This could a user-facing chunk (with redzones), or some internal
+ // housekeeping chunk, like TransferBatch. Start by assuming the former.
+ AsanChunk *ac = GetAsanChunk((void *)chunk);
+ uptr allocated_size = allocator.GetActuallyAllocatedSize((void *)ac);
+ uptr beg = ac->Beg();
+ uptr end = ac->Beg() + ac->UsedSize(true);
+ uptr chunk_end = chunk + allocated_size;
+ if (chunk < beg && beg < end && end <= chunk_end) {
+ // Looks like a valid AsanChunk. Or maybe not. Be conservative and only
+ // poison the redzones.
+ PoisonShadow(chunk, beg - chunk, kAsanHeapLeftRedzoneMagic);
+ uptr end_aligned_down = RoundDownTo(end, SHADOW_GRANULARITY);
+ FastPoisonShadowPartialRightRedzone(
+ end_aligned_down, end - end_aligned_down,
+ chunk_end - end_aligned_down, kAsanHeapLeftRedzoneMagic);
+ } else {
+ // This can not be an AsanChunk. Poison everything. It may be reused as
+ // AsanChunk later.
+ PoisonShadow(chunk, allocated_size, kAsanHeapLeftRedzoneMagic);
+ }
+ }
+
void ReInitialize(const AllocatorOptions &options) {
allocator.SetMayReturnNull(options.may_return_null);
+ allocator.SetReleaseToOSIntervalMs(options.release_to_os_interval_ms);
SharedInitCode(options);
+
+ // Poison all existing allocation's redzones.
+ if (CanPoisonMemory()) {
+ allocator.ForceLock();
+ allocator.ForEachChunk(
+ [](uptr chunk, void *alloc) {
+ ((Allocator *)alloc)->RePoisonChunk(chunk);
+ },
+ this);
+ allocator.ForceUnlock();
+ }
}
void GetOptions(AllocatorOptions *options) const {
options->quarantine_size_mb = quarantine.GetSize() >> 20;
+ options->thread_local_quarantine_size_kb = quarantine.GetCacheSize() >> 10;
options->min_redzone = atomic_load(&min_redzone, memory_order_acquire);
options->max_redzone = atomic_load(&max_redzone, memory_order_acquire);
options->may_return_null = allocator.MayReturnNull();
options->alloc_dealloc_mismatch =
atomic_load(&alloc_dealloc_mismatch, memory_order_acquire);
+ options->release_to_os_interval_ms = allocator.ReleaseToOSIntervalMs();
}
// -------------------- Helper methods. -------------------------
@@ -356,7 +395,7 @@ struct Allocator {
if (size > kMaxAllowedMallocSize || needed_size > kMaxAllowedMallocSize) {
Report("WARNING: AddressSanitizer failed to allocate 0x%zx bytes\n",
(void*)size);
- return allocator.ReturnNullOrDie();
+ return allocator.ReturnNullOrDieOnBadRequest();
}
AsanThread *t = GetCurrentThread();
@@ -373,8 +412,7 @@ struct Allocator {
allocator.Allocate(cache, needed_size, 8, false, check_rss_limit);
}
- if (!allocated)
- return allocator.ReturnNullOrDie();
+ if (!allocated) return allocator.ReturnNullOrDieOnOOM();
if (*(u8 *)MEM_TO_SHADOW((uptr)allocated) == 0 && CanPoisonMemory()) {
// Heap poisoning is enabled, but the allocator provides an unpoisoned
@@ -530,7 +568,7 @@ struct Allocator {
if (delete_size && flags()->new_delete_type_mismatch &&
delete_size != m->UsedSize()) {
- ReportNewDeleteSizeMismatch(p, m->UsedSize(), delete_size, stack);
+ ReportNewDeleteSizeMismatch(p, delete_size, stack);
}
QuarantineChunk(m, ptr, stack, alloc_type);
@@ -563,7 +601,7 @@ struct Allocator {
void *Calloc(uptr nmemb, uptr size, BufferedStackTrace *stack) {
if (CallocShouldReturnNullDueToOverflow(size, nmemb))
- return allocator.ReturnNullOrDie();
+ return allocator.ReturnNullOrDieOnBadRequest();
void *ptr = Allocate(nmemb * size, 8, stack, FROM_MALLOC, false);
// If the memory comes from the secondary allocator no need to clear it
// as it comes directly from mmap.
@@ -643,6 +681,7 @@ struct Allocator {
void PrintStats() {
allocator.PrintStats();
+ quarantine.PrintStats();
}
void ForceLock() {
@@ -662,17 +701,23 @@ static AsanAllocator &get_allocator() {
return instance.allocator;
}
-bool AsanChunkView::IsValid() {
+bool AsanChunkView::IsValid() const {
return chunk_ && chunk_->chunk_state != CHUNK_AVAILABLE;
}
-bool AsanChunkView::IsAllocated() {
+bool AsanChunkView::IsAllocated() const {
return chunk_ && chunk_->chunk_state == CHUNK_ALLOCATED;
}
-uptr AsanChunkView::Beg() { return chunk_->Beg(); }
-uptr AsanChunkView::End() { return Beg() + UsedSize(); }
-uptr AsanChunkView::UsedSize() { return chunk_->UsedSize(); }
-uptr AsanChunkView::AllocTid() { return chunk_->alloc_tid; }
-uptr AsanChunkView::FreeTid() { return chunk_->free_tid; }
+bool AsanChunkView::IsQuarantined() const {
+ return chunk_ && chunk_->chunk_state == CHUNK_QUARANTINE;
+}
+uptr AsanChunkView::Beg() const { return chunk_->Beg(); }
+uptr AsanChunkView::End() const { return Beg() + UsedSize(); }
+uptr AsanChunkView::UsedSize() const { return chunk_->UsedSize(); }
+uptr AsanChunkView::AllocTid() const { return chunk_->alloc_tid; }
+uptr AsanChunkView::FreeTid() const { return chunk_->free_tid; }
+AllocType AsanChunkView::GetAllocType() const {
+ return (AllocType)chunk_->alloc_type;
+}
static StackTrace GetStackTraceFromId(u32 id) {
CHECK(id);
@@ -681,14 +726,14 @@ static StackTrace GetStackTraceFromId(u3
return res;
}
-u32 AsanChunkView::GetAllocStackId() { return chunk_->alloc_context_id; }
-u32 AsanChunkView::GetFreeStackId() { return chunk_->free_context_id; }
+u32 AsanChunkView::GetAllocStackId() const { return chunk_->alloc_context_id; }
+u32 AsanChunkView::GetFreeStackId() const { return chunk_->free_context_id; }
-StackTrace AsanChunkView::GetAllocStack() {
+StackTrace AsanChunkView::GetAllocStack() const {
return GetStackTraceFromId(GetAllocStackId());
}
-StackTrace AsanChunkView::GetFreeStack() {
+StackTrace AsanChunkView::GetFreeStack() const {
return GetStackTraceFromId(GetFreeStackId());
}
@@ -707,6 +752,9 @@ void GetAllocatorOptions(AllocatorOption
AsanChunkView FindHeapChunkByAddress(uptr addr) {
return instance.FindHeapChunkByAddress(addr);
}
+AsanChunkView FindHeapChunkByAllocBeg(uptr addr) {
+ return AsanChunkView(instance.GetAsanChunk(reinterpret_cast<void*>(addr)));
+}
void AsanThreadLocalMallocStorage::CommitBack() {
instance.CommitBack(this);
Modified: projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.h
==============================================================================
--- projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.h Sun Jan 8 19:39:03 2017 (r311696)
+++ projects/clang400-import/contrib/compiler-rt/lib/asan/asan_allocator.h Sun Jan 8 19:47:17 2017 (r311697)
@@ -33,10 +33,12 @@ struct AsanChunk;
struct AllocatorOptions {
u32 quarantine_size_mb;
+ u32 thread_local_quarantine_size_kb;
u16 min_redzone;
u16 max_redzone;
u8 may_return_null;
u8 alloc_dealloc_mismatch;
+ s32 release_to_os_interval_ms;
void SetFrom(const Flags *f, const CommonFlags *cf);
void CopyTo(Flags *f, CommonFlags *cf);
@@ -49,27 +51,29 @@ void GetAllocatorOptions(AllocatorOption
class AsanChunkView {
public:
explicit AsanChunkView(AsanChunk *chunk) : chunk_(chunk) {}
- bool IsValid(); // Checks if AsanChunkView points to a valid allocated
- // or quarantined chunk.
- bool IsAllocated(); // Checks if the memory is currently allocated.
- uptr Beg(); // First byte of user memory.
- uptr End(); // Last byte of user memory.
- uptr UsedSize(); // Size requested by the user.
- uptr AllocTid();
- uptr FreeTid();
+ bool IsValid() const; // Checks if AsanChunkView points to a valid
+ // allocated or quarantined chunk.
+ bool IsAllocated() const; // Checks if the memory is currently allocated.
+ bool IsQuarantined() const; // Checks if the memory is currently quarantined.
+ uptr Beg() const; // First byte of user memory.
+ uptr End() const; // Last byte of user memory.
+ uptr UsedSize() const; // Size requested by the user.
+ uptr AllocTid() const;
+ uptr FreeTid() const;
bool Eq(const AsanChunkView &c) const { return chunk_ == c.chunk_; }
- u32 GetAllocStackId();
- u32 GetFreeStackId();
- StackTrace GetAllocStack();
- StackTrace GetFreeStack();
- bool AddrIsInside(uptr addr, uptr access_size, sptr *offset) {
+ u32 GetAllocStackId() const;
+ u32 GetFreeStackId() const;
+ StackTrace GetAllocStack() const;
+ StackTrace GetFreeStack() const;
+ AllocType GetAllocType() const;
+ bool AddrIsInside(uptr addr, uptr access_size, sptr *offset) const {
if (addr >= Beg() && (addr + access_size) <= End()) {
*offset = addr - Beg();
return true;
}
return false;
}
- bool AddrIsAtLeft(uptr addr, uptr access_size, sptr *offset) {
+ bool AddrIsAtLeft(uptr addr, uptr access_size, sptr *offset) const {
(void)access_size;
if (addr < Beg()) {
*offset = Beg() - addr;
@@ -77,7 +81,7 @@ class AsanChunkView {
}
return false;
}
- bool AddrIsAtRight(uptr addr, uptr access_size, sptr *offset) {
+ bool AddrIsAtRight(uptr addr, uptr access_size, sptr *offset) const {
if (addr + access_size > End()) {
*offset = addr - End();
return true;
@@ -90,6 +94,7 @@ class AsanChunkView {
};
AsanChunkView FindHeapChunkByAddress(uptr address);
+AsanChunkView FindHeapChunkByAllocBeg(uptr address);
// List of AsanChunks with total size.
class AsanChunkFifoList: public IntrusiveList<AsanChunk> {
@@ -117,18 +122,36 @@ struct AsanMapUnmapCallback {
# if defined(__powerpc64__)
const uptr kAllocatorSpace = 0xa0000000000ULL;
const uptr kAllocatorSize = 0x20000000000ULL; // 2T.
+typedef DefaultSizeClassMap SizeClassMap;
+# elif defined(__aarch64__) && SANITIZER_ANDROID
+const uptr kAllocatorSpace = 0x3000000000ULL;
+const uptr kAllocatorSize = 0x2000000000ULL; // 128G.
+typedef VeryCompactSizeClassMap SizeClassMap;
# elif defined(__aarch64__)
-// AArch64/SANITIZIER_CAN_USER_ALLOCATOR64 is only for 42-bit VMA
+// AArch64/SANITIZER_CAN_USER_ALLOCATOR64 is only for 42-bit VMA
// so no need to different values for different VMA.
const uptr kAllocatorSpace = 0x10000000000ULL;
const uptr kAllocatorSize = 0x10000000000ULL; // 3T.
+typedef DefaultSizeClassMap SizeClassMap;
+# elif SANITIZER_WINDOWS
+const uptr kAllocatorSpace = ~(uptr)0;
+const uptr kAllocatorSize = 0x8000000000ULL; // 500G
+typedef DefaultSizeClassMap SizeClassMap;
# else
const uptr kAllocatorSpace = 0x600000000000ULL;
const uptr kAllocatorSize = 0x40000000000ULL; // 4T.
-# endif
typedef DefaultSizeClassMap SizeClassMap;
-typedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, 0 /*metadata*/,
- SizeClassMap, AsanMapUnmapCallback> PrimaryAllocator;
+# endif
+struct AP64 { // Allocator64 parameters. Deliberately using a short name.
+ static const uptr kSpaceBeg = kAllocatorSpace;
+ static const uptr kSpaceSize = kAllocatorSize;
+ static const uptr kMetadataSize = 0;
+ typedef __asan::SizeClassMap SizeClassMap;
+ typedef AsanMapUnmapCallback MapUnmapCallback;
+ static const uptr kFlags = 0;
+};
+
+typedef SizeClassAllocator64<AP64> PrimaryAllocator;
#else // Fallback to SizeClassAllocator32.
static const uptr kRegionSizeLog = 20;
static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog;
Modified: projects/clang400-import/contrib/compiler-rt/lib/asan/asan_debugging.cc
==============================================================================
--- projects/clang400-import/contrib/compiler-rt/lib/asan/asan_debugging.cc Sun Jan 8 19:39:03 2017 (r311696)
+++ projects/clang400-import/contrib/compiler-rt/lib/asan/asan_debugging.cc Sun Jan 8 19:47:17 2017 (r311697)
@@ -14,74 +14,39 @@
//===----------------------------------------------------------------------===//
#include "asan_allocator.h"
+#include "asan_descriptions.h"
#include "asan_flags.h"
#include "asan_internal.h"
#include "asan_mapping.h"
#include "asan_report.h"
#include "asan_thread.h"
-namespace __asan {
-
-void GetInfoForStackVar(uptr addr, AddressDescription *descr, AsanThread *t) {
- descr->name[0] = 0;
- descr->region_address = 0;
- descr->region_size = 0;
- descr->region_kind = "stack";
+namespace {
+using namespace __asan;
- AsanThread::StackFrameAccess access;
- if (!t->GetStackFrameAccessByAddr(addr, &access))
- return;
+static void FindInfoForStackVar(uptr addr, const char *frame_descr, uptr offset,
+ char *name, uptr name_size,
+ uptr ®ion_address, uptr ®ion_size) {
InternalMmapVector<StackVarDescr> vars(16);
- if (!ParseFrameDescription(access.frame_descr, &vars)) {
+ if (!ParseFrameDescription(frame_descr, &vars)) {
return;
}
for (uptr i = 0; i < vars.size(); i++) {
- if (access.offset <= vars[i].beg + vars[i].size) {
- internal_strncat(descr->name, vars[i].name_pos,
- Min(descr->name_size, vars[i].name_len));
- descr->region_address = addr - (access.offset - vars[i].beg);
- descr->region_size = vars[i].size;
+ if (offset <= vars[i].beg + vars[i].size) {
+ // We use name_len + 1 because strlcpy will guarantee a \0 at the end, so
+ // if we're limiting the copy due to name_len, we add 1 to ensure we copy
+ // the whole name and then terminate with '\0'.
+ internal_strlcpy(name, vars[i].name_pos,
+ Min(name_size, vars[i].name_len + 1));
+ region_address = addr - (offset - vars[i].beg);
+ region_size = vars[i].size;
return;
}
}
}
-void GetInfoForHeapAddress(uptr addr, AddressDescription *descr) {
- AsanChunkView chunk = FindHeapChunkByAddress(addr);
-
- descr->name[0] = 0;
- descr->region_address = 0;
- descr->region_size = 0;
-
- if (!chunk.IsValid()) {
- descr->region_kind = "heap-invalid";
- return;
- }
-
- descr->region_address = chunk.Beg();
- descr->region_size = chunk.UsedSize();
- descr->region_kind = "heap";
-}
-
-void AsanLocateAddress(uptr addr, AddressDescription *descr) {
- if (DescribeAddressIfShadow(addr, descr, /* print */ false)) {
- return;
- }
- if (GetInfoForAddressIfGlobal(addr, descr)) {
- return;
- }
- asanThreadRegistry().Lock();
- AsanThread *thread = FindThreadByStackAddress(addr);
- asanThreadRegistry().Unlock();
- if (thread) {
- GetInfoForStackVar(addr, descr, thread);
- return;
- }
- GetInfoForHeapAddress(addr, descr);
-}
-
-static uptr AsanGetStack(uptr addr, uptr *trace, u32 size, u32 *thread_id,
+uptr AsanGetStack(uptr addr, uptr *trace, u32 size, u32 *thread_id,
bool alloc_stack) {
AsanChunkView chunk = FindHeapChunkByAddress(addr);
if (!chunk.IsValid()) return 0;
@@ -108,18 +73,58 @@ static uptr AsanGetStack(uptr addr, uptr
return 0;
}
-} // namespace __asan
-
-using namespace __asan;
+} // namespace
SANITIZER_INTERFACE_ATTRIBUTE
const char *__asan_locate_address(uptr addr, char *name, uptr name_size,
- uptr *region_address, uptr *region_size) {
- AddressDescription descr = { name, name_size, 0, 0, nullptr };
- AsanLocateAddress(addr, &descr);
- if (region_address) *region_address = descr.region_address;
- if (region_size) *region_size = descr.region_size;
- return descr.region_kind;
+ uptr *region_address_ptr,
+ uptr *region_size_ptr) {
+ AddressDescription descr(addr);
+ uptr region_address = 0;
+ uptr region_size = 0;
+ const char *region_kind = nullptr;
+ if (name && name_size > 0) name[0] = 0;
+
+ if (auto shadow = descr.AsShadow()) {
+ // region_{address,size} are already 0
+ switch (shadow->kind) {
+ case kShadowKindLow:
+ region_kind = "low shadow";
+ break;
+ case kShadowKindGap:
+ region_kind = "shadow gap";
+ break;
+ case kShadowKindHigh:
+ region_kind = "high shadow";
+ break;
+ }
+ } else if (auto heap = descr.AsHeap()) {
+ region_kind = "heap";
+ region_address = heap->chunk_access.chunk_begin;
+ region_size = heap->chunk_access.chunk_size;
+ } else if (auto stack = descr.AsStack()) {
+ region_kind = "stack";
+ if (!stack->frame_descr) {
+ // region_{address,size} are already 0
+ } else {
+ FindInfoForStackVar(addr, stack->frame_descr, stack->offset, name,
+ name_size, region_address, region_size);
+ }
+ } else if (auto global = descr.AsGlobal()) {
+ region_kind = "global";
+ auto &g = global->globals[0];
+ internal_strlcpy(name, g.name, name_size);
+ region_address = g.beg;
+ region_size = g.size;
+ } else {
+ // region_{address,size} are already 0
+ region_kind = "heap-invalid";
+ }
+
+ CHECK(region_kind);
+ if (region_address_ptr) *region_address_ptr = region_address;
+ if (region_size_ptr) *region_size_ptr = region_size;
+ return region_kind;
}
SANITIZER_INTERFACE_ATTRIBUTE
Copied: projects/clang400-import/contrib/compiler-rt/lib/asan/asan_descriptions.cc (from r311696, vendor/compiler-rt/dist/lib/asan/asan_descriptions.cc)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/clang400-import/contrib/compiler-rt/lib/asan/asan_descriptions.cc Sun Jan 8 19:47:17 2017 (r311697, copy of r311696, vendor/compiler-rt/dist/lib/asan/asan_descriptions.cc)
@@ -0,0 +1,486 @@
+//===-- asan_descriptions.cc ------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+// ASan functions for getting information about an address and/or printing it.
+//===----------------------------------------------------------------------===//
+
+#include "asan_descriptions.h"
+#include "asan_mapping.h"
+#include "asan_report.h"
+#include "asan_stack.h"
+#include "sanitizer_common/sanitizer_stackdepot.h"
+
+namespace __asan {
+
+// Return " (thread_name) " or an empty string if the name is empty.
+const char *ThreadNameWithParenthesis(AsanThreadContext *t, char buff[],
+ uptr buff_len) {
+ const char *name = t->name;
+ if (name[0] == '\0') return "";
+ buff[0] = 0;
+ internal_strncat(buff, " (", 3);
+ internal_strncat(buff, name, buff_len - 4);
+ internal_strncat(buff, ")", 2);
+ return buff;
+}
+
+const char *ThreadNameWithParenthesis(u32 tid, char buff[], uptr buff_len) {
+ if (tid == kInvalidTid) return "";
+ asanThreadRegistry().CheckLocked();
+ AsanThreadContext *t = GetThreadContextByTidLocked(tid);
+ return ThreadNameWithParenthesis(t, buff, buff_len);
+}
+
+void DescribeThread(AsanThreadContext *context) {
+ CHECK(context);
+ asanThreadRegistry().CheckLocked();
+ // No need to announce the main thread.
+ if (context->tid == 0 || context->announced) {
+ return;
+ }
+ context->announced = true;
+ char tname[128];
+ InternalScopedString str(1024);
+ str.append("Thread T%d%s", context->tid,
+ ThreadNameWithParenthesis(context->tid, tname, sizeof(tname)));
+ if (context->parent_tid == kInvalidTid) {
+ str.append(" created by unknown thread\n");
+ Printf("%s", str.data());
+ return;
+ }
+ str.append(
+ " created by T%d%s here:\n", context->parent_tid,
+ ThreadNameWithParenthesis(context->parent_tid, tname, sizeof(tname)));
+ Printf("%s", str.data());
+ StackDepotGet(context->stack_id).Print();
+ // Recursively described parent thread if needed.
+ if (flags()->print_full_thread_history) {
+ AsanThreadContext *parent_context =
+ GetThreadContextByTidLocked(context->parent_tid);
+ DescribeThread(parent_context);
+ }
+}
+
+// Shadow descriptions
+static bool GetShadowKind(uptr addr, ShadowKind *shadow_kind) {
+ CHECK(!AddrIsInMem(addr));
+ if (AddrIsInShadowGap(addr)) {
+ *shadow_kind = kShadowKindGap;
+ } else if (AddrIsInHighShadow(addr)) {
+ *shadow_kind = kShadowKindHigh;
+ } else if (AddrIsInLowShadow(addr)) {
+ *shadow_kind = kShadowKindLow;
+ } else {
+ CHECK(0 && "Address is not in memory and not in shadow?");
+ return false;
+ }
+ return true;
+}
+
+bool DescribeAddressIfShadow(uptr addr) {
+ ShadowAddressDescription descr;
+ if (!GetShadowAddressInformation(addr, &descr)) return false;
+ descr.Print();
+ return true;
+}
+
+bool GetShadowAddressInformation(uptr addr, ShadowAddressDescription *descr) {
+ if (AddrIsInMem(addr)) return false;
+ ShadowKind shadow_kind;
+ if (!GetShadowKind(addr, &shadow_kind)) return false;
+ if (shadow_kind != kShadowKindGap) descr->shadow_byte = *(u8 *)addr;
+ descr->addr = addr;
+ descr->kind = shadow_kind;
+ return true;
+}
+
+// Heap descriptions
+static void GetAccessToHeapChunkInformation(ChunkAccess *descr,
+ AsanChunkView chunk, uptr addr,
+ uptr access_size) {
+ descr->bad_addr = addr;
+ if (chunk.AddrIsAtLeft(addr, access_size, &descr->offset)) {
+ descr->access_type = kAccessTypeLeft;
+ } else if (chunk.AddrIsAtRight(addr, access_size, &descr->offset)) {
+ descr->access_type = kAccessTypeRight;
+ if (descr->offset < 0) {
+ descr->bad_addr -= descr->offset;
+ descr->offset = 0;
+ }
+ } else if (chunk.AddrIsInside(addr, access_size, &descr->offset)) {
+ descr->access_type = kAccessTypeInside;
+ } else {
+ descr->access_type = kAccessTypeUnknown;
+ }
+ descr->chunk_begin = chunk.Beg();
+ descr->chunk_size = chunk.UsedSize();
+ descr->alloc_type = chunk.GetAllocType();
+}
+
+static void PrintHeapChunkAccess(uptr addr, const ChunkAccess &descr) {
+ Decorator d;
+ InternalScopedString str(4096);
+ str.append("%s", d.Location());
+ switch (descr.access_type) {
+ case kAccessTypeLeft:
+ str.append("%p is located %zd bytes to the left of",
+ (void *)descr.bad_addr, descr.offset);
+ break;
+ case kAccessTypeRight:
+ str.append("%p is located %zd bytes to the right of",
+ (void *)descr.bad_addr, descr.offset);
+ break;
+ case kAccessTypeInside:
+ str.append("%p is located %zd bytes inside of", (void *)descr.bad_addr,
+ descr.offset);
+ break;
+ case kAccessTypeUnknown:
+ str.append(
+ "%p is located somewhere around (this is AddressSanitizer bug!)",
+ (void *)descr.bad_addr);
+ }
+ str.append(" %zu-byte region [%p,%p)\n", descr.chunk_size,
+ (void *)descr.chunk_begin,
+ (void *)(descr.chunk_begin + descr.chunk_size));
+ str.append("%s", d.EndLocation());
+ Printf("%s", str.data());
+}
+
+bool GetHeapAddressInformation(uptr addr, uptr access_size,
+ HeapAddressDescription *descr) {
+ AsanChunkView chunk = FindHeapChunkByAddress(addr);
+ if (!chunk.IsValid()) {
+ return false;
+ }
+ descr->addr = addr;
+ GetAccessToHeapChunkInformation(&descr->chunk_access, chunk, addr,
+ access_size);
+ CHECK_NE(chunk.AllocTid(), kInvalidTid);
+ descr->alloc_tid = chunk.AllocTid();
+ descr->alloc_stack_id = chunk.GetAllocStackId();
+ descr->free_tid = chunk.FreeTid();
+ if (descr->free_tid != kInvalidTid)
+ descr->free_stack_id = chunk.GetFreeStackId();
+ return true;
+}
+
+static StackTrace GetStackTraceFromId(u32 id) {
+ CHECK(id);
+ StackTrace res = StackDepotGet(id);
+ CHECK(res.trace);
+ return res;
+}
+
+bool DescribeAddressIfHeap(uptr addr, uptr access_size) {
+ HeapAddressDescription descr;
+ if (!GetHeapAddressInformation(addr, access_size, &descr)) {
+ Printf(
+ "AddressSanitizer can not describe address in more detail "
+ "(wild memory access suspected).\n");
+ return false;
+ }
+ descr.Print();
+ return true;
+}
+
+// Stack descriptions
+bool GetStackAddressInformation(uptr addr, uptr access_size,
+ StackAddressDescription *descr) {
+ AsanThread *t = FindThreadByStackAddress(addr);
+ if (!t) return false;
+
+ descr->addr = addr;
+ descr->tid = t->tid();
+ // Try to fetch precise stack frame for this access.
+ AsanThread::StackFrameAccess access;
+ if (!t->GetStackFrameAccessByAddr(addr, &access)) {
+ descr->frame_descr = nullptr;
+ return true;
+ }
+
+ descr->offset = access.offset;
+ descr->access_size = access_size;
+ descr->frame_pc = access.frame_pc;
+ descr->frame_descr = access.frame_descr;
+
+#if SANITIZER_PPC64V1
+ // On PowerPC64 ELFv1, the address of a function actually points to a
+ // three-doubleword data structure with the first field containing
+ // the address of the function's code.
+ descr->frame_pc = *reinterpret_cast<uptr *>(descr->frame_pc);
+#endif
+ descr->frame_pc += 16;
+
+ return true;
+}
+
+static void PrintAccessAndVarIntersection(const StackVarDescr &var, uptr addr,
+ uptr access_size, uptr prev_var_end,
+ uptr next_var_beg) {
+ uptr var_end = var.beg + var.size;
+ uptr addr_end = addr + access_size;
+ const char *pos_descr = nullptr;
+ // If the variable [var.beg, var_end) is the nearest variable to the
+ // current memory access, indicate it in the log.
+ if (addr >= var.beg) {
+ if (addr_end <= var_end)
+ pos_descr = "is inside"; // May happen if this is a use-after-return.
+ else if (addr < var_end)
+ pos_descr = "partially overflows";
+ else if (addr_end <= next_var_beg &&
+ next_var_beg - addr_end >= addr - var_end)
+ pos_descr = "overflows";
+ } else {
+ if (addr_end > var.beg)
+ pos_descr = "partially underflows";
+ else if (addr >= prev_var_end && addr - prev_var_end >= var.beg - addr_end)
+ pos_descr = "underflows";
+ }
+ InternalScopedString str(1024);
+ str.append(" [%zd, %zd)", var.beg, var_end);
+ // Render variable name.
+ str.append(" '");
+ for (uptr i = 0; i < var.name_len; ++i) {
+ str.append("%c", var.name_pos[i]);
+ }
+ str.append("'");
+ if (pos_descr) {
+ Decorator d;
+ // FIXME: we may want to also print the size of the access here,
+ // but in case of accesses generated by memset it may be confusing.
+ str.append("%s <== Memory access at offset %zd %s this variable%s\n",
+ d.Location(), addr, pos_descr, d.EndLocation());
+ } else {
+ str.append("\n");
+ }
+ Printf("%s", str.data());
+}
+
+bool DescribeAddressIfStack(uptr addr, uptr access_size) {
+ StackAddressDescription descr;
+ if (!GetStackAddressInformation(addr, access_size, &descr)) return false;
+ descr.Print();
+ return true;
+}
+
+// Global descriptions
+static void DescribeAddressRelativeToGlobal(uptr addr, uptr access_size,
+ const __asan_global &g) {
+ InternalScopedString str(4096);
+ Decorator d;
+ str.append("%s", d.Location());
+ if (addr < g.beg) {
+ str.append("%p is located %zd bytes to the left", (void *)addr,
+ g.beg - addr);
+ } else if (addr + access_size > g.beg + g.size) {
+ if (addr < g.beg + g.size) addr = g.beg + g.size;
+ str.append("%p is located %zd bytes to the right", (void *)addr,
+ addr - (g.beg + g.size));
+ } else {
+ // Can it happen?
+ str.append("%p is located %zd bytes inside", (void *)addr, addr - g.beg);
+ }
+ str.append(" of global variable '%s' defined in '",
+ MaybeDemangleGlobalName(g.name));
+ PrintGlobalLocation(&str, g);
+ str.append("' (0x%zx) of size %zu\n", g.beg, g.size);
+ str.append("%s", d.EndLocation());
+ PrintGlobalNameIfASCII(&str, g);
+ Printf("%s", str.data());
+}
+
+bool GetGlobalAddressInformation(uptr addr, uptr access_size,
+ GlobalAddressDescription *descr) {
+ descr->addr = addr;
+ int globals_num = GetGlobalsForAddress(addr, descr->globals, descr->reg_sites,
+ ARRAY_SIZE(descr->globals));
+ descr->size = globals_num;
+ descr->access_size = access_size;
+ return globals_num != 0;
+}
+
+bool DescribeAddressIfGlobal(uptr addr, uptr access_size,
+ const char *bug_type) {
+ GlobalAddressDescription descr;
+ if (!GetGlobalAddressInformation(addr, access_size, &descr)) return false;
+
+ descr.Print(bug_type);
+ return true;
+}
+
+void ShadowAddressDescription::Print() const {
+ Printf("Address %p is located in the %s area.\n", addr, ShadowNames[kind]);
+}
+
+void GlobalAddressDescription::Print(const char *bug_type) const {
+ for (int i = 0; i < size; i++) {
+ DescribeAddressRelativeToGlobal(addr, access_size, globals[i]);
+ if (bug_type &&
+ 0 == internal_strcmp(bug_type, "initialization-order-fiasco") &&
+ reg_sites[i]) {
+ Printf(" registered at:\n");
+ StackDepotGet(reg_sites[i]).Print();
+ }
+ }
+}
+
+void StackAddressDescription::Print() const {
+ Decorator d;
+ char tname[128];
+ Printf("%s", d.Location());
+ Printf("Address %p is located in stack of thread T%d%s", addr, tid,
+ ThreadNameWithParenthesis(tid, tname, sizeof(tname)));
+
+ if (!frame_descr) {
+ Printf("%s\n", d.EndLocation());
+ return;
+ }
+ Printf(" at offset %zu in frame%s\n", offset, d.EndLocation());
+
+ // Now we print the frame where the alloca has happened.
+ // We print this frame as a stack trace with one element.
+ // The symbolizer may print more than one frame if inlining was involved.
+ // The frame numbers may be different than those in the stack trace printed
+ // previously. That's unfortunate, but I have no better solution,
+ // especially given that the alloca may be from entirely different place
+ // (e.g. use-after-scope, or different thread's stack).
+ Printf("%s", d.EndLocation());
+ StackTrace alloca_stack(&frame_pc, 1);
+ alloca_stack.Print();
+
+ InternalMmapVector<StackVarDescr> vars(16);
+ if (!ParseFrameDescription(frame_descr, &vars)) {
+ Printf(
+ "AddressSanitizer can't parse the stack frame "
+ "descriptor: |%s|\n",
+ frame_descr);
+ // 'addr' is a stack address, so return true even if we can't parse frame
+ return;
+ }
+ uptr n_objects = vars.size();
+ // Report the number of stack objects.
+ Printf(" This frame has %zu object(s):\n", n_objects);
+
+ // Report all objects in this frame.
+ for (uptr i = 0; i < n_objects; i++) {
+ uptr prev_var_end = i ? vars[i - 1].beg + vars[i - 1].size : 0;
+ uptr next_var_beg = i + 1 < n_objects ? vars[i + 1].beg : ~(0UL);
+ PrintAccessAndVarIntersection(vars[i], offset, access_size, prev_var_end,
+ next_var_beg);
+ }
+ Printf(
+ "HINT: this may be a false positive if your program uses "
+ "some custom stack unwind mechanism or swapcontext\n");
+ if (SANITIZER_WINDOWS)
+ Printf(" (longjmp, SEH and C++ exceptions *are* supported)\n");
+ else
+ Printf(" (longjmp and C++ exceptions *are* supported)\n");
+
+ DescribeThread(GetThreadContextByTidLocked(tid));
+}
+
+void HeapAddressDescription::Print() const {
+ PrintHeapChunkAccess(addr, chunk_access);
+
+ asanThreadRegistry().CheckLocked();
+ AsanThreadContext *alloc_thread = GetThreadContextByTidLocked(alloc_tid);
+ StackTrace alloc_stack = GetStackTraceFromId(alloc_stack_id);
+
+ char tname[128];
+ Decorator d;
+ AsanThreadContext *free_thread = nullptr;
+ if (free_tid != kInvalidTid) {
+ free_thread = GetThreadContextByTidLocked(free_tid);
+ Printf("%sfreed by thread T%d%s here:%s\n", d.Allocation(),
+ free_thread->tid,
+ ThreadNameWithParenthesis(free_thread, tname, sizeof(tname)),
+ d.EndAllocation());
+ StackTrace free_stack = GetStackTraceFromId(free_stack_id);
+ free_stack.Print();
+ Printf("%spreviously allocated by thread T%d%s here:%s\n", d.Allocation(),
+ alloc_thread->tid,
+ ThreadNameWithParenthesis(alloc_thread, tname, sizeof(tname)),
+ d.EndAllocation());
+ } else {
+ Printf("%sallocated by thread T%d%s here:%s\n", d.Allocation(),
+ alloc_thread->tid,
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list