svn commit: r327138 - in projects/clang600-import/contrib/compiler-rt: include/sanitizer lib/builtins/aarch64 lib/hwasan lib/msan lib/profile lib/sanitizer_common lib/tsan/rtl lib/ubsan
Dimitry Andric
dim at FreeBSD.org
Sun Dec 24 01:15:16 UTC 2017
Author: dim
Date: Sun Dec 24 01:15:12 2017
New Revision: 327138
URL: https://svnweb.freebsd.org/changeset/base/327138
Log:
Merge compiler-rt trunk r321414 to contrib/compiler-rt.
Added:
projects/clang600-import/contrib/compiler-rt/lib/builtins/aarch64/
- copied from r327137, vendor/compiler-rt/dist/lib/builtins/aarch64/
projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sancov_begin.S
- copied unchanged from r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_begin.S
projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sancov_end.S
- copied unchanged from r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_end.S
projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_mips.h
- copied unchanged from r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_atomic_clang_mips.h
Modified:
projects/clang600-import/contrib/compiler-rt/include/sanitizer/allocator_interface.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/asan_interface.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/esan_interface.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/hwasan_interface.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/lsan_interface.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/msan_interface.h
projects/clang600-import/contrib/compiler-rt/include/sanitizer/scudo_interface.h
projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan.cc
projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_interface_internal.h
projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_linux.cc
projects/clang600-import/contrib/compiler-rt/lib/msan/msan_new_delete.cc
projects/clang600-import/contrib/compiler-rt/lib/profile/InstrProfilingUtil.c
projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_other.h
projects/clang600-import/contrib/compiler-rt/lib/tsan/rtl/tsan_new_delete.cc
projects/clang600-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc
Directory Properties:
projects/clang600-import/contrib/compiler-rt/ (props changed)
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/allocator_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/allocator_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/allocator_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -32,7 +32,7 @@ extern "C" {
size_t __sanitizer_get_allocated_size(const volatile void *p);
/* Number of bytes, allocated and not yet freed by the application. */
- size_t __sanitizer_get_current_allocated_bytes();
+ size_t __sanitizer_get_current_allocated_bytes(void);
/* Number of bytes, mmaped by the allocator to fulfill allocation requests.
Generally, for request of X bytes, allocator can reserve and add to free
@@ -40,17 +40,17 @@ extern "C" {
All these chunks count toward the heap size. Currently, allocator never
releases memory to OS (instead, it just puts freed chunks to free
lists). */
- size_t __sanitizer_get_heap_size();
+ size_t __sanitizer_get_heap_size(void);
/* Number of bytes, mmaped by the allocator, which can be used to fulfill
allocation requests. When a user program frees memory chunk, it can first
fall into quarantine and will count toward __sanitizer_get_free_bytes()
later. */
- size_t __sanitizer_get_free_bytes();
+ size_t __sanitizer_get_free_bytes(void);
/* Number of bytes in unmapped pages, that are released to OS. Currently,
always returns 0. */
- size_t __sanitizer_get_unmapped_bytes();
+ size_t __sanitizer_get_unmapped_bytes(void);
/* Malloc hooks that may be optionally provided by user.
__sanitizer_malloc_hook(ptr, size) is called immediately after
@@ -81,7 +81,7 @@ extern "C" {
resources in attempt to reduce process RSS.
Currently available with ASan only.
*/
- void __sanitizer_purge_allocator();
+ void __sanitizer_purge_allocator(void);
#ifdef __cplusplus
} // extern "C"
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/asan_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/asan_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/asan_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -64,19 +64,19 @@ extern "C" {
// Useful for calling from a debugger to get information about an ASan error.
// Returns 1 if an error has been (or is being) reported, otherwise returns 0.
- int __asan_report_present();
+ int __asan_report_present(void);
// Useful for calling from a debugger to get information about an ASan error.
// If an error has been (or is being) reported, the following functions return
// the pc, bp, sp, address, access type (0 = read, 1 = write), access size and
// bug description (e.g. "heap-use-after-free"). Otherwise they return 0.
- void *__asan_get_report_pc();
- void *__asan_get_report_bp();
- void *__asan_get_report_sp();
- void *__asan_get_report_address();
- int __asan_get_report_access_type();
- size_t __asan_get_report_access_size();
- const char *__asan_get_report_description();
+ void *__asan_get_report_pc(void);
+ void *__asan_get_report_bp(void);
+ void *__asan_get_report_sp(void);
+ void *__asan_get_report_address(void);
+ int __asan_get_report_access_type(void);
+ size_t __asan_get_report_access_size(void);
+ const char *__asan_get_report_description(void);
// Useful for calling from the debugger to get information about a pointer.
// Returns the category of the given pointer as a constant string.
@@ -118,21 +118,21 @@ extern "C" {
// User may provide function that would be called right when ASan detects
// an error. This can be used to notice cases when ASan detects an error, but
// the program crashes before ASan report is printed.
- void __asan_on_error();
+ void __asan_on_error(void);
// Prints accumulated stats to stderr. Used for debugging.
- void __asan_print_accumulated_stats();
+ void __asan_print_accumulated_stats(void);
// This function may be optionally provided by user and should return
// a string containing ASan runtime options. See asan_flags.h for details.
- const char* __asan_default_options();
+ const char* __asan_default_options(void);
// The following 2 functions facilitate garbage collection in presence of
// asan's fake stack.
// Returns an opaque handler to be used later in __asan_addr_is_in_fake_stack.
// Returns NULL if the current thread does not have a fake stack.
- void *__asan_get_current_fake_stack();
+ void *__asan_get_current_fake_stack(void);
// If fake_stack is non-NULL and addr belongs to a fake frame in
// fake_stack, returns the address on real stack that corresponds to
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/common_interface_defs.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -115,7 +115,7 @@ extern "C" {
const void *beg, const void *mid, const void *end);
// Print the stack trace leading to this call. Useful for debugging user code.
- void __sanitizer_print_stack_trace();
+ void __sanitizer_print_stack_trace(void);
// Symbolizes the supplied 'pc' using the format string 'fmt'.
// Outputs at most 'out_buf_size' bytes into 'out_buf'.
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/coverage_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -20,10 +20,10 @@ extern "C" {
#endif
// Record and dump coverage info.
- void __sanitizer_cov_dump();
+ void __sanitizer_cov_dump(void);
// Clear collected coverage info.
- void __sanitizer_cov_reset();
+ void __sanitizer_cov_reset(void);
// Dump collected coverage info. Sorts pcs by module into individual .sancov
// files.
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/esan_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/esan_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/esan_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -37,11 +37,11 @@ extern "C" {
// This function can be called mid-run (or at the end of a run for
// a server process that doesn't shut down normally) to request that
// data for that point in the run be reported from the tool.
-void COMPILER_RT_WEAK __esan_report();
+void COMPILER_RT_WEAK __esan_report(void);
// This function returns the number of samples that the esan tool has collected
// to this point. This is useful for testing.
-unsigned int COMPILER_RT_WEAK __esan_get_sample_count();
+unsigned int COMPILER_RT_WEAK __esan_get_sample_count(void);
#ifdef __cplusplus
} // extern "C"
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/hwasan_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/hwasan_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/hwasan_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -21,10 +21,10 @@ extern "C" {
#endif
// This function may be optionally provided by user and should return
// a string containing HWASan runtime options. See asan_flags.h for details.
- const char* __hwasan_default_options();
+ const char* __hwasan_default_options(void);
- void __hwasan_enable_allocator_tagging();
- void __hwasan_disable_allocator_tagging();
+ void __hwasan_enable_allocator_tagging(void);
+ void __hwasan_disable_allocator_tagging(void);
#ifdef __cplusplus
} // extern "C"
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/lsan_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/lsan_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/lsan_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -21,8 +21,8 @@ extern "C" {
#endif
// Allocations made between calls to __lsan_disable() and __lsan_enable() will
// be treated as non-leaks. Disable/enable pairs may be nested.
- void __lsan_disable();
- void __lsan_enable();
+ void __lsan_disable(void);
+ void __lsan_enable(void);
// The heap object into which p points will be treated as a non-leak.
void __lsan_ignore_object(const void *p);
@@ -49,7 +49,7 @@ extern "C" {
// the time of first invocation of this function.
// By calling this function early during process shutdown, you can instruct
// LSan to ignore shutdown-only leaks which happen later on.
- void __lsan_do_leak_check();
+ void __lsan_do_leak_check(void);
// Check for leaks now. Returns zero if no leaks have been found or if leak
// detection is disabled, non-zero otherwise.
@@ -58,7 +58,7 @@ extern "C" {
// terminate the process. It does not affect the behavior of
// __lsan_do_leak_check() or the end-of-process leak check, and is not
// affected by them.
- int __lsan_do_recoverable_leak_check();
+ int __lsan_do_recoverable_leak_check(void);
// The user may optionally provide this function to disallow leak checking
// for the program it is linked into (if the return value is non-zero). This
@@ -66,15 +66,15 @@ extern "C" {
// that is unsupported.
// To avoid dead stripping, you may need to define this function with
// __attribute__((used))
- int __lsan_is_turned_off();
+ int __lsan_is_turned_off(void);
// This function may be optionally provided by user and should return
// a string containing LSan runtime options. See lsan_flags.inc for details.
- const char *__lsan_default_options();
+ const char *__lsan_default_options(void);
// This function may be optionally provided by the user and should return
// a string containing LSan suppressions.
- const char *__lsan_default_suppressions();
+ const char *__lsan_default_suppressions(void);
#ifdef __cplusplus
} // extern "C"
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/msan_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/msan_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/msan_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -31,10 +31,10 @@ extern "C" {
int __msan_origin_is_descendant_or_same(uint32_t this_id, uint32_t prev_id);
/* Returns non-zero if tracking origins. */
- int __msan_get_track_origins();
+ int __msan_get_track_origins(void);
/* Returns the origin id of the latest UMR in the calling thread. */
- uint32_t __msan_get_umr_origin();
+ uint32_t __msan_get_umr_origin(void);
/* Make memory region fully initialized (without changing its contents). */
void __msan_unpoison(const volatile void *a, size_t size);
@@ -82,7 +82,7 @@ extern "C" {
void __msan_dump_shadow(const volatile void *x, size_t size);
/* Returns true if running under a dynamic tool (DynamoRio-based). */
- int __msan_has_dynamic_component();
+ int __msan_has_dynamic_component(void);
/* Tell MSan about newly allocated memory (ex.: custom allocator).
Memory will be marked uninitialized, with origin at the call site. */
@@ -93,7 +93,7 @@ extern "C" {
/* This function may be optionally provided by user and should return
a string containing Msan runtime options. See msan_flags.h for details. */
- const char* __msan_default_options();
+ const char* __msan_default_options(void);
/* Deprecated. Call __sanitizer_set_death_callback instead. */
void __msan_set_death_callback(void (*callback)(void));
Modified: projects/clang600-import/contrib/compiler-rt/include/sanitizer/scudo_interface.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/include/sanitizer/scudo_interface.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/include/sanitizer/scudo_interface.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -20,7 +20,7 @@ extern "C" {
#endif
// This function may be optionally provided by a user and should return
// a string containing Scudo runtime options. See scudo_flags.h for details.
- const char* __scudo_default_options();
+ const char* __scudo_default_options(void);
// This function allows to set the RSS limit at runtime. This can be either
// the hard limit (HardLimit=1) or the soft limit (HardLimit=0). The limit
Modified: projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan.cc
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan.cc Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan.cc Sun Dec 24 01:15:12 2017 (r327138)
@@ -252,40 +252,112 @@ static void SigIll() {
// __builtin_unreachable();
}
-template<bool IsStore, unsigned LogSize>
-__attribute__((always_inline, nodebug))
-static void CheckAddress(uptr p) {
+enum class ErrorAction { Abort, Recover };
+enum class AccessType { Load, Store };
+
+template <ErrorAction EA, AccessType AT, unsigned LogSize>
+__attribute__((always_inline, nodebug)) static void CheckAddress(uptr p) {
tag_t ptr_tag = GetTagFromPointer(p);
uptr ptr_raw = p & ~kAddressTagMask;
tag_t mem_tag = *(tag_t *)MEM_TO_SHADOW(ptr_raw);
- if (UNLIKELY(ptr_tag != mem_tag)) SigIll<0x100 + 0x10 * IsStore + LogSize>();
+ if (UNLIKELY(ptr_tag != mem_tag)) {
+ SigIll<0x100 + 0x20 * (EA == ErrorAction::Recover) +
+ 0x10 * (AT == AccessType::Store) + LogSize>();
+ if (EA == ErrorAction::Abort) __builtin_unreachable();
+ }
}
-template<bool IsStore>
-__attribute__((always_inline, nodebug))
-static void CheckAddressSized(uptr p, uptr sz) {
+template <ErrorAction EA, AccessType AT>
+__attribute__((always_inline, nodebug)) static void CheckAddressSized(uptr p,
+ uptr sz) {
CHECK_NE(0, sz);
tag_t ptr_tag = GetTagFromPointer(p);
uptr ptr_raw = p & ~kAddressTagMask;
tag_t *shadow_first = (tag_t *)MEM_TO_SHADOW(ptr_raw);
tag_t *shadow_last = (tag_t *)MEM_TO_SHADOW(ptr_raw + sz - 1);
for (tag_t *t = shadow_first; t <= shadow_last; ++t)
- if (UNLIKELY(ptr_tag != *t)) SigIll<0x100 + 0x10 * IsStore + 0xf>();
+ if (UNLIKELY(ptr_tag != *t)) {
+ SigIll<0x100 + 0x20 * (EA == ErrorAction::Recover) +
+ 0x10 * (AT == AccessType::Store) + 0xf>();
+ if (EA == ErrorAction::Abort) __builtin_unreachable();
+ }
}
-void __hwasan_load(uptr p, uptr sz) { CheckAddressSized<false>(p, sz); }
-void __hwasan_load1(uptr p) { CheckAddress<false, 0>(p); }
-void __hwasan_load2(uptr p) { CheckAddress<false, 1>(p); }
-void __hwasan_load4(uptr p) { CheckAddress<false, 2>(p); }
-void __hwasan_load8(uptr p) { CheckAddress<false, 3>(p); }
-void __hwasan_load16(uptr p) { CheckAddress<false, 4>(p); }
+void __hwasan_load(uptr p, uptr sz) {
+ CheckAddressSized<ErrorAction::Abort, AccessType::Load>(p, sz);
+}
+void __hwasan_load1(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Load, 0>(p);
+}
+void __hwasan_load2(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Load, 1>(p);
+}
+void __hwasan_load4(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Load, 2>(p);
+}
+void __hwasan_load8(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Load, 3>(p);
+}
+void __hwasan_load16(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Load, 4>(p);
+}
-void __hwasan_store(uptr p, uptr sz) { CheckAddressSized<true>(p, sz); }
-void __hwasan_store1(uptr p) { CheckAddress<true, 0>(p); }
-void __hwasan_store2(uptr p) { CheckAddress<true, 1>(p); }
-void __hwasan_store4(uptr p) { CheckAddress<true, 2>(p); }
-void __hwasan_store8(uptr p) { CheckAddress<true, 3>(p); }
-void __hwasan_store16(uptr p) { CheckAddress<true, 4>(p); }
+void __hwasan_load_noabort(uptr p, uptr sz) {
+ CheckAddressSized<ErrorAction::Recover, AccessType::Load>(p, sz);
+}
+void __hwasan_load1_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Load, 0>(p);
+}
+void __hwasan_load2_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Load, 1>(p);
+}
+void __hwasan_load4_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Load, 2>(p);
+}
+void __hwasan_load8_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Load, 3>(p);
+}
+void __hwasan_load16_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Load, 4>(p);
+}
+
+void __hwasan_store(uptr p, uptr sz) {
+ CheckAddressSized<ErrorAction::Abort, AccessType::Store>(p, sz);
+}
+void __hwasan_store1(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Store, 0>(p);
+}
+void __hwasan_store2(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Store, 1>(p);
+}
+void __hwasan_store4(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Store, 2>(p);
+}
+void __hwasan_store8(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Store, 3>(p);
+}
+void __hwasan_store16(uptr p) {
+ CheckAddress<ErrorAction::Abort, AccessType::Store, 4>(p);
+}
+
+void __hwasan_store_noabort(uptr p, uptr sz) {
+ CheckAddressSized<ErrorAction::Recover, AccessType::Store>(p, sz);
+}
+void __hwasan_store1_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Store, 0>(p);
+}
+void __hwasan_store2_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Store, 1>(p);
+}
+void __hwasan_store4_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Store, 2>(p);
+}
+void __hwasan_store8_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Store, 3>(p);
+}
+void __hwasan_store16_noabort(uptr p) {
+ CheckAddress<ErrorAction::Recover, AccessType::Store, 4>(p);
+}
#if !SANITIZER_SUPPORTS_WEAK_HOOKS
extern "C" {
Modified: projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_interface_internal.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_interface_internal.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_interface_internal.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -45,6 +45,19 @@ SANITIZER_INTERFACE_ATTRIBUTE
void __hwasan_load16(uptr);
SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_load_noabort(uptr, uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_load1_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_load2_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_load4_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_load8_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_load16_noabort(uptr);
+
+SANITIZER_INTERFACE_ATTRIBUTE
void __hwasan_store(uptr, uptr);
SANITIZER_INTERFACE_ATTRIBUTE
void __hwasan_store1(uptr);
@@ -56,6 +69,19 @@ SANITIZER_INTERFACE_ATTRIBUTE
void __hwasan_store8(uptr);
SANITIZER_INTERFACE_ATTRIBUTE
void __hwasan_store16(uptr);
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_store_noabort(uptr, uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_store1_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_store2_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_store4_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_store8_noabort(uptr);
+SANITIZER_INTERFACE_ATTRIBUTE
+void __hwasan_store16_noabort(uptr);
// Returns the offset of the first tag mismatch or -1 if the whole range is
// good.
Modified: projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_linux.cc
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_linux.cc Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/hwasan/hwasan_linux.cc Sun Dec 24 01:15:12 2017 (r327138)
@@ -174,12 +174,14 @@ struct AccessInfo {
uptr size;
bool is_store;
bool is_load;
+ bool recover;
};
#if defined(__aarch64__)
static AccessInfo GetAccessInfo(siginfo_t *info, ucontext_t *uc) {
// Access type is encoded in HLT immediate as 0x1XY,
- // where X is 1 for store, 0 for load.
+ // where X&1 is 1 for store, 0 for load,
+ // and X&2 is 1 if the error is recoverable.
// Valid values of Y are 0 to 4, which are interpreted as log2(access_size),
// and 0xF, which means that access size is stored in X1 register.
// Access address is always in X0 register.
@@ -189,7 +191,8 @@ static AccessInfo GetAccessInfo(siginfo_t *info, ucont
if ((code & 0xff00) != 0x100)
return AccessInfo{0, 0, false, false}; // Not ours.
bool is_store = code & 0x10;
- unsigned size_log = code & 0xff;
+ bool recover = code & 0x20;
+ unsigned size_log = code & 0xf;
if (size_log > 4 && size_log != 0xf)
return AccessInfo{0, 0, false, false}; // Not ours.
@@ -200,6 +203,7 @@ static AccessInfo GetAccessInfo(siginfo_t *info, ucont
ai.size = uc->uc_mcontext.regs[1];
else
ai.size = 1U << size_log;
+ ai.recover = recover;
return ai;
}
#else
@@ -223,7 +227,7 @@ static bool HwasanOnSIGILL(int signo, siginfo_t *info,
ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store);
++hwasan_report_count;
- if (flags()->halt_on_error)
+ if (flags()->halt_on_error || !ai.recover)
Die();
uc->uc_mcontext.pc += 4;
Modified: projects/clang600-import/contrib/compiler-rt/lib/msan/msan_new_delete.cc
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/msan/msan_new_delete.cc Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/msan/msan_new_delete.cc Sun Dec 24 01:15:12 2017 (r327138)
@@ -22,9 +22,10 @@
using namespace __msan; // NOLINT
-// Fake std::nothrow_t to avoid including <new>.
+// Fake std::nothrow_t and std::align_val_t to avoid including <new>.
namespace std {
struct nothrow_t {};
+ enum class align_val_t: size_t {};
} // namespace std
@@ -34,6 +35,11 @@ namespace std {
void *res = msan_malloc(size, &stack);\
if (!nothrow && UNLIKELY(!res)) DieOnFailure::OnOOM();\
return res
+#define OPERATOR_NEW_BODY_ALIGN(nothrow) \
+ GET_MALLOC_STACK_TRACE;\
+ void *res = msan_memalign((uptr)align, size, &stack);\
+ if (!nothrow && UNLIKELY(!res)) DieOnFailure::OnOOM();\
+ return res;
INTERCEPTOR_ATTRIBUTE
void *operator new(size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); }
@@ -47,6 +53,18 @@ INTERCEPTOR_ATTRIBUTE
void *operator new[](size_t size, std::nothrow_t const&) {
OPERATOR_NEW_BODY(true /*nothrow*/);
}
+INTERCEPTOR_ATTRIBUTE
+void *operator new(size_t size, std::align_val_t align)
+{ OPERATOR_NEW_BODY_ALIGN(false /*nothrow*/); }
+INTERCEPTOR_ATTRIBUTE
+void *operator new[](size_t size, std::align_val_t align)
+{ OPERATOR_NEW_BODY_ALIGN(false /*nothrow*/); }
+INTERCEPTOR_ATTRIBUTE
+void *operator new(size_t size, std::align_val_t align, std::nothrow_t const&)
+{ OPERATOR_NEW_BODY_ALIGN(true /*nothrow*/); }
+INTERCEPTOR_ATTRIBUTE
+void *operator new[](size_t size, std::align_val_t align, std::nothrow_t const&)
+{ OPERATOR_NEW_BODY_ALIGN(true /*nothrow*/); }
#define OPERATOR_DELETE_BODY \
GET_MALLOC_STACK_TRACE; \
@@ -62,5 +80,29 @@ INTERCEPTOR_ATTRIBUTE
void operator delete[](void *ptr, std::nothrow_t const&) {
OPERATOR_DELETE_BODY;
}
+INTERCEPTOR_ATTRIBUTE
+void operator delete(void *ptr, size_t size) NOEXCEPT { OPERATOR_DELETE_BODY; }
+INTERCEPTOR_ATTRIBUTE
+void operator delete[](void *ptr, size_t size) NOEXCEPT
+{ OPERATOR_DELETE_BODY; }
+INTERCEPTOR_ATTRIBUTE
+void operator delete(void *ptr, std::align_val_t align) NOEXCEPT
+{ OPERATOR_DELETE_BODY; }
+INTERCEPTOR_ATTRIBUTE
+void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT
+{ OPERATOR_DELETE_BODY; }
+INTERCEPTOR_ATTRIBUTE
+void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&)
+{ OPERATOR_DELETE_BODY; }
+INTERCEPTOR_ATTRIBUTE
+void operator delete[](void *ptr, std::align_val_t align, std::nothrow_t const&)
+{ OPERATOR_DELETE_BODY; }
+INTERCEPTOR_ATTRIBUTE
+void operator delete(void *ptr, size_t size, std::align_val_t align) NOEXCEPT
+{ OPERATOR_DELETE_BODY; }
+INTERCEPTOR_ATTRIBUTE
+void operator delete[](void *ptr, size_t size, std::align_val_t align) NOEXCEPT
+{ OPERATOR_DELETE_BODY; }
+
#endif // MSAN_REPLACE_OPERATORS_NEW_AND_DELETE
Modified: projects/clang600-import/contrib/compiler-rt/lib/profile/InstrProfilingUtil.c
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/profile/InstrProfilingUtil.c Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/profile/InstrProfilingUtil.c Sun Dec 24 01:15:12 2017 (r327138)
@@ -9,6 +9,7 @@
#ifdef _WIN32
#include <direct.h>
+#include <process.h>
#include <windows.h>
#include "WindowsMMap.h"
#else
Copied: projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sancov_begin.S (from r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_begin.S)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sancov_begin.S Sun Dec 24 01:15:12 2017 (r327138, copy of r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_begin.S)
@@ -0,0 +1,5 @@
+ .type __start___sancov_guards, at object
+ .globl __start___sancov_guards
+ .section __sancov_guards,"aw", at progbits
+ .p2align 2
+__start___sancov_guards:
Copied: projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sancov_end.S (from r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_end.S)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sancov_end.S Sun Dec 24 01:15:12 2017 (r327138, copy of r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sancov_end.S)
@@ -0,0 +1,5 @@
+ .type __stop___sancov_guards, at object
+ .globl __stop___sancov_guards
+ .section __sancov_guards,"aw", at progbits
+ .p2align 2
+__stop___sancov_guards:
Modified: projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -78,17 +78,7 @@ INLINE bool atomic_compare_exchange_strong(volatile T
typedef typename T::Type Type;
Type cmpv = *cmp;
Type prev;
-#if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
- if (sizeof(*a) == 8) {
- Type volatile *val_ptr = const_cast<Type volatile *>(&a->val_dont_use);
- prev = __mips_sync_val_compare_and_swap<u64>(
- reinterpret_cast<u64 volatile *>(val_ptr), (u64)cmpv, (u64)xchg);
- } else {
- prev = __sync_val_compare_and_swap(&a->val_dont_use, cmpv, xchg);
- }
-#else
prev = __sync_val_compare_and_swap(&a->val_dont_use, cmpv, xchg);
-#endif
if (prev == cmpv) return true;
*cmp = prev;
return false;
@@ -103,6 +93,13 @@ INLINE bool atomic_compare_exchange_weak(volatile T *a
}
} // namespace __sanitizer
+
+// This include provides explicit template instantiations for atomic_uint64_t
+// on MIPS32, which does not directly support 8 byte atomics. It has to
+// proceed the template definitions above.
+#if defined(_MIPS_SIM) && defined(_ABIO32)
+ #include "sanitizer_atomic_clang_mips.h"
+#endif
#undef ATOMIC_ORDER
Copied: projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_mips.h (from r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_atomic_clang_mips.h)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_mips.h Sun Dec 24 01:15:12 2017 (r327138, copy of r327137, vendor/compiler-rt/dist/lib/sanitizer_common/sanitizer_atomic_clang_mips.h)
@@ -0,0 +1,118 @@
+//===-- sanitizer_atomic_clang_mips.h ---------------------------*- 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 ThreadSanitizer/AddressSanitizer runtime.
+// Not intended for direct inclusion. Include sanitizer_atomic.h.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SANITIZER_ATOMIC_CLANG_MIPS_H
+#define SANITIZER_ATOMIC_CLANG_MIPS_H
+
+namespace __sanitizer {
+
+// MIPS32 does not support atomics > 4 bytes. To address this lack of
+// functionality, the sanitizer library provides helper methods which use an
+// internal spin lock mechanism to emulate atomic oprations when the size is
+// 8 bytes.
+static void __spin_lock(volatile int *lock) {
+ while (__sync_lock_test_and_set(lock, 1))
+ while (*lock) {
+ }
+}
+
+static void __spin_unlock(volatile int *lock) { __sync_lock_release(lock); }
+
+// Make sure the lock is on its own cache line to prevent false sharing.
+// Put it inside a struct that is aligned and padded to the typical MIPS
+// cacheline which is 32 bytes.
+static struct {
+ int lock;
+ char pad[32 - sizeof(int)];
+} __attribute__((aligned(32))) lock = {0, {0}};
+
+template <>
+INLINE atomic_uint64_t::Type atomic_fetch_add(volatile atomic_uint64_t *ptr,
+ atomic_uint64_t::Type val,
+ memory_order mo) {
+ DCHECK(mo &
+ (memory_order_relaxed | memory_order_releasae | memory_order_seq_cst));
+ DCHECK(!((uptr)ptr % sizeof(*ptr)));
+
+ atomic_uint64_t::Type ret;
+
+ __spin_lock(&lock.lock);
+ ret = *(const_cast<atomic_uint64_t::Type volatile *>(&ptr->val_dont_use));
+ ptr->val_dont_use = ret + val;
+ __spin_unlock(&lock.lock);
+
+ return ret;
+}
+
+template <>
+INLINE atomic_uint64_t::Type atomic_fetch_sub(volatile atomic_uint64_t *ptr,
+ atomic_uint64_t::Type val,
+ memory_order mo) {
+ return atomic_fetch_add(ptr, -val, mo);
+}
+
+template <>
+INLINE bool atomic_compare_exchange_strong(volatile atomic_uint64_t *ptr,
+ atomic_uint64_t::Type *cmp,
+ atomic_uint64_t::Type xchg,
+ memory_order mo) {
+ DCHECK(mo &
+ (memory_order_relaxed | memory_order_releasae | memory_order_seq_cst));
+ DCHECK(!((uptr)ptr % sizeof(*ptr)));
+
+ typedef atomic_uint64_t::Type Type;
+ Type cmpv = *cmp;
+ Type prev;
+ bool ret = false;
+
+ __spin_lock(&lock.lock);
+ prev = *(const_cast<Type volatile *>(&ptr->val_dont_use));
+ if (prev == cmpv) {
+ ret = true;
+ ptr->val_dont_use = xchg;
+ }
+ __spin_unlock(&lock.lock);
+
+ return ret;
+}
+
+template <>
+INLINE atomic_uint64_t::Type atomic_load(const volatile atomic_uint64_t *ptr,
+ memory_order mo) {
+ DCHECK(mo &
+ (memory_order_relaxed | memory_order_releasae | memory_order_seq_cst));
+ DCHECK(!((uptr)ptr % sizeof(*ptr)));
+
+ atomic_uint64_t::Type zero = 0;
+ volatile atomic_uint64_t *Newptr =
+ const_cast<volatile atomic_uint64_t *>(ptr);
+ return atomic_fetch_add(Newptr, zero, mo);
+}
+
+template <>
+INLINE void atomic_store(volatile atomic_uint64_t *ptr, atomic_uint64_t::Type v,
+ memory_order mo) {
+ DCHECK(mo &
+ (memory_order_relaxed | memory_order_releasae | memory_order_seq_cst));
+ DCHECK(!((uptr)ptr % sizeof(*ptr)));
+
+ __spin_lock(&lock.lock);
+ ptr->val_dont_use = v;
+ __spin_unlock(&lock.lock);
+}
+
+} // namespace __sanitizer
+
+#endif // SANITIZER_ATOMIC_CLANG_MIPS_H
+
Modified: projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_other.h
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_other.h Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_other.h Sun Dec 24 01:15:12 2017 (r327138)
@@ -17,56 +17,7 @@
namespace __sanitizer {
-// MIPS32 does not support atomic > 4 bytes. To address this lack of
-// functionality, the sanitizer library provides helper methods which use an
-// internal spin lock mechanism to emulate atomic oprations when the size is
-// 8 bytes.
-#if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
-static void __spin_lock(volatile int *lock) {
- while (__sync_lock_test_and_set(lock, 1))
- while (*lock) {
- }
-}
-static void __spin_unlock(volatile int *lock) { __sync_lock_release(lock); }
-
-
-// Make sure the lock is on its own cache line to prevent false sharing.
-// Put it inside a struct that is aligned and padded to the typical MIPS
-// cacheline which is 32 bytes.
-static struct {
- int lock;
- char pad[32 - sizeof(int)];
-} __attribute__((aligned(32))) lock = {0};
-
-template <class T>
-T __mips_sync_fetch_and_add(volatile T *ptr, T val) {
- T ret;
-
- __spin_lock(&lock.lock);
-
- ret = *ptr;
- *ptr = ret + val;
-
- __spin_unlock(&lock.lock);
-
- return ret;
-}
-
-template <class T>
-T __mips_sync_val_compare_and_swap(volatile T *ptr, T oldval, T newval) {
- T ret;
- __spin_lock(&lock.lock);
-
- ret = *ptr;
- if (ret == oldval) *ptr = newval;
-
- __spin_unlock(&lock.lock);
-
- return ret;
-}
-#endif
-
INLINE void proc_yield(int cnt) {
__asm__ __volatile__("" ::: "memory");
}
@@ -103,15 +54,8 @@ INLINE typename T::Type atomic_load(
// 64-bit load on 32-bit platform.
// Gross, but simple and reliable.
// Assume that it is not in read-only memory.
-#if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
- typename T::Type volatile *val_ptr =
- const_cast<typename T::Type volatile *>(&a->val_dont_use);
- v = __mips_sync_fetch_and_add<u64>(
- reinterpret_cast<u64 volatile *>(val_ptr), 0);
-#else
v = __sync_fetch_and_add(
const_cast<typename T::Type volatile *>(&a->val_dont_use), 0);
-#endif
}
return v;
}
@@ -141,14 +85,7 @@ INLINE void atomic_store(volatile T *a, typename T::Ty
typename T::Type cmp = a->val_dont_use;
typename T::Type cur;
for (;;) {
-#if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
- typename T::Type volatile *val_ptr =
- const_cast<typename T::Type volatile *>(&a->val_dont_use);
- cur = __mips_sync_val_compare_and_swap<u64>(
- reinterpret_cast<u64 volatile *>(val_ptr), (u64)cmp, (u64)v);
-#else
cur = __sync_val_compare_and_swap(&a->val_dont_use, cmp, v);
-#endif
if (cmp == v)
break;
cmp = cur;
Modified: projects/clang600-import/contrib/compiler-rt/lib/tsan/rtl/tsan_new_delete.cc
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/tsan/rtl/tsan_new_delete.cc Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/tsan/rtl/tsan_new_delete.cc Sun Dec 24 01:15:12 2017 (r327138)
@@ -20,6 +20,7 @@ using namespace __tsan; // NOLINT
namespace std {
struct nothrow_t {};
+enum class align_val_t: __sanitizer::uptr {};
} // namespace std
DECLARE_REAL(void *, malloc, uptr size)
@@ -38,6 +39,18 @@ DECLARE_REAL(void, free, void *ptr)
invoke_malloc_hook(p, size); \
return p;
+#define OPERATOR_NEW_BODY_ALIGN(mangled_name, nothrow) \
+ if (cur_thread()->in_symbolizer) \
+ return InternalAlloc(size, nullptr, (uptr)align); \
+ void *p = 0; \
+ { \
+ SCOPED_INTERCEPTOR_RAW(mangled_name, size); \
+ p = user_memalign(thr, pc, (uptr)align, size); \
+ if (!nothrow && UNLIKELY(!p)) DieOnFailure::OnOOM(); \
+ } \
+ invoke_malloc_hook(p, size); \
+ return p;
+
SANITIZER_INTERFACE_ATTRIBUTE
void *operator new(__sanitizer::uptr size);
void *operator new(__sanitizer::uptr size) {
@@ -62,6 +75,36 @@ void *operator new[](__sanitizer::uptr size, std::noth
OPERATOR_NEW_BODY(_ZnamRKSt9nothrow_t, true /*nothrow*/);
}
+SANITIZER_INTERFACE_ATTRIBUTE
+void *operator new(__sanitizer::uptr size, std::align_val_t align);
+void *operator new(__sanitizer::uptr size, std::align_val_t align) {
+ OPERATOR_NEW_BODY_ALIGN(_ZnwmSt11align_val_t, false /*nothrow*/);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void *operator new[](__sanitizer::uptr size, std::align_val_t align);
+void *operator new[](__sanitizer::uptr size, std::align_val_t align) {
+ OPERATOR_NEW_BODY_ALIGN(_ZnamSt11align_val_t, false /*nothrow*/);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void *operator new(__sanitizer::uptr size, std::align_val_t align,
+ std::nothrow_t const&);
+void *operator new(__sanitizer::uptr size, std::align_val_t align,
+ std::nothrow_t const&) {
+ OPERATOR_NEW_BODY_ALIGN(_ZnwmSt11align_val_tRKSt9nothrow_t,
+ true /*nothrow*/);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void *operator new[](__sanitizer::uptr size, std::align_val_t align,
+ std::nothrow_t const&);
+void *operator new[](__sanitizer::uptr size, std::align_val_t align,
+ std::nothrow_t const&) {
+ OPERATOR_NEW_BODY_ALIGN(_ZnamSt11align_val_tRKSt9nothrow_t,
+ true /*nothrow*/);
+}
+
#define OPERATOR_DELETE_BODY(mangled_name) \
if (ptr == 0) return; \
if (cur_thread()->in_symbolizer) \
@@ -92,4 +135,58 @@ SANITIZER_INTERFACE_ATTRIBUTE
void operator delete[](void *ptr, std::nothrow_t const&);
void operator delete[](void *ptr, std::nothrow_t const&) {
OPERATOR_DELETE_BODY(_ZdaPvRKSt9nothrow_t);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete(void *ptr, __sanitizer::uptr size) NOEXCEPT;
+void operator delete(void *ptr, __sanitizer::uptr size) NOEXCEPT {
+ OPERATOR_DELETE_BODY(_ZdlPvm);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete[](void *ptr, __sanitizer::uptr size) NOEXCEPT;
+void operator delete[](void *ptr, __sanitizer::uptr size) NOEXCEPT {
+ OPERATOR_DELETE_BODY(_ZdaPvm);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete(void *ptr, std::align_val_t align) NOEXCEPT;
+void operator delete(void *ptr, std::align_val_t align) NOEXCEPT {
+ OPERATOR_DELETE_BODY(_ZdlPvSt11align_val_t);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT;
+void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT {
+ OPERATOR_DELETE_BODY(_ZdaPvSt11align_val_t);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&);
+void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&) {
+ OPERATOR_DELETE_BODY(_ZdlPvSt11align_val_tRKSt9nothrow_t);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete[](void *ptr, std::align_val_t align,
+ std::nothrow_t const&);
+void operator delete[](void *ptr, std::align_val_t align,
+ std::nothrow_t const&) {
+ OPERATOR_DELETE_BODY(_ZdaPvSt11align_val_tRKSt9nothrow_t);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete(void *ptr, __sanitizer::uptr size,
+ std::align_val_t align) NOEXCEPT;
+void operator delete(void *ptr, __sanitizer::uptr size,
+ std::align_val_t align) NOEXCEPT {
+ OPERATOR_DELETE_BODY(_ZdlPvmSt11align_val_t);
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void operator delete[](void *ptr, __sanitizer::uptr size,
+ std::align_val_t align) NOEXCEPT;
+void operator delete[](void *ptr, __sanitizer::uptr size,
+ std::align_val_t align) NOEXCEPT {
+ OPERATOR_DELETE_BODY(_ZdaPvmSt11align_val_t);
}
Modified: projects/clang600-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc
==============================================================================
--- projects/clang600-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc Sun Dec 24 01:12:46 2017 (r327137)
+++ projects/clang600-import/contrib/compiler-rt/lib/ubsan/ubsan_handlers.cc Sun Dec 24 01:15:12 2017 (r327138)
@@ -297,7 +297,7 @@ void __ubsan::__ubsan_handle_out_of_bounds_abort(OutOf
static void handleBuiltinUnreachableImpl(UnreachableData *Data,
ReportOptions Opts) {
ScopedReport R(Opts, Data->Loc, ErrorType::UnreachableCall);
- Diag(Data->Loc, DL_Error, "execution reached a __builtin_unreachable() call");
+ Diag(Data->Loc, DL_Error, "execution reached an unreachable program point");
}
void __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) {
More information about the svn-src-projects
mailing list