[compiler-rt] r354989 - hwasan: Rename source files from cc to cpp
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 27 07:44:03 PST 2019
Author: nico
Date: Wed Feb 27 07:44:03 2019
New Revision: 354989
URL: http://llvm.org/viewvc/llvm-project?rev=354989&view=rev
Log:
hwasan: Rename source files from cc to cpp
As discussed elsewhere: LLVM uses cpp as its C++ source extension; the
sanitizers should too. This updates files in hwasan.
Patch generated by
for f in lib/hwasan/*.cc ; do svn mv $f ${f%.cc}.cpp; done
followed by
for f in lib/hwasan/*.cpp ; do sed -i '' -e '1s/\.cc -/.cpp /' $f; done
CMakeLists.txt updated manually.
Differential Revision: https://reviews.llvm.org/D58620
Added:
compiler-rt/trunk/lib/hwasan/hwasan.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan.cc
compiler-rt/trunk/lib/hwasan/hwasan_allocator.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc
compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc
compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc
compiler-rt/trunk/lib/hwasan/hwasan_linux.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_linux.cc
compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc
compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc
compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc
compiler-rt/trunk/lib/hwasan/hwasan_report.cpp
- copied, changed from r354988, compiler-rt/trunk/lib/hwasan/hwasan_report.cc
compiler-rt/trunk/lib/hwasan/hwasan_thread.cpp
- copied unchanged from r354988, compiler-rt/trunk/lib/hwasan/hwasan_thread.cc
compiler-rt/trunk/lib/hwasan/hwasan_thread_list.cpp
- copied unchanged from r354988, compiler-rt/trunk/lib/hwasan/hwasan_thread_list.cc
Removed:
compiler-rt/trunk/lib/hwasan/hwasan.cc
compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc
compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc
compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc
compiler-rt/trunk/lib/hwasan/hwasan_linux.cc
compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc
compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc
compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc
compiler-rt/trunk/lib/hwasan/hwasan_report.cc
compiler-rt/trunk/lib/hwasan/hwasan_thread.cc
compiler-rt/trunk/lib/hwasan/hwasan_thread_list.cc
Modified:
compiler-rt/trunk/lib/hwasan/CMakeLists.txt
Modified: compiler-rt/trunk/lib/hwasan/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/CMakeLists.txt?rev=354989&r1=354988&r2=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/hwasan/CMakeLists.txt Wed Feb 27 07:44:03 2019
@@ -2,20 +2,21 @@ include_directories(..)
# Runtime library sources and build flags.
set(HWASAN_RTL_SOURCES
- hwasan.cc
- hwasan_allocator.cc
- hwasan_dynamic_shadow.cc
- hwasan_interceptors.cc
- hwasan_linux.cc
- hwasan_memintrinsics.cc
- hwasan_poisoning.cc
- hwasan_report.cc
- hwasan_thread.cc
- hwasan_thread_list.cc
+ hwasan.cpp
+ hwasan_allocator.cpp
+ hwasan_dynamic_shadow.cpp
+ hwasan_interceptors.cpp
+ hwasan_linux.cpp
+ hwasan_memintrinsics.cpp
+ hwasan_poisoning.cpp
+ hwasan_report.cpp
+ hwasan_thread.cpp
+ hwasan_thread_list.cpp
)
set(HWASAN_RTL_CXX_SOURCES
- hwasan_new_delete.cc)
+ hwasan_new_delete.cpp
+ )
set(HWASAN_RTL_HEADERS
hwasan.h
Removed: compiler-rt/trunk/lib/hwasan/hwasan.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan.cc (removed)
@@ -1,507 +0,0 @@
-//===-- hwasan.cc ---------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of HWAddressSanitizer.
-//
-// HWAddressSanitizer runtime.
-//===----------------------------------------------------------------------===//
-
-#include "hwasan.h"
-#include "hwasan_checks.h"
-#include "hwasan_dynamic_shadow.h"
-#include "hwasan_poisoning.h"
-#include "hwasan_report.h"
-#include "hwasan_thread.h"
-#include "hwasan_thread_list.h"
-#include "sanitizer_common/sanitizer_atomic.h"
-#include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_flag_parser.h"
-#include "sanitizer_common/sanitizer_flags.h"
-#include "sanitizer_common/sanitizer_libc.h"
-#include "sanitizer_common/sanitizer_procmaps.h"
-#include "sanitizer_common/sanitizer_stackdepot.h"
-#include "sanitizer_common/sanitizer_stacktrace.h"
-#include "sanitizer_common/sanitizer_symbolizer.h"
-#include "ubsan/ubsan_flags.h"
-#include "ubsan/ubsan_init.h"
-
-// ACHTUNG! No system header includes in this file.
-
-using namespace __sanitizer;
-
-namespace __hwasan {
-
-void EnterSymbolizer() {
- Thread *t = GetCurrentThread();
- CHECK(t);
- t->EnterSymbolizer();
-}
-void ExitSymbolizer() {
- Thread *t = GetCurrentThread();
- CHECK(t);
- t->LeaveSymbolizer();
-}
-bool IsInSymbolizer() {
- Thread *t = GetCurrentThread();
- return t && t->InSymbolizer();
-}
-
-static Flags hwasan_flags;
-
-Flags *flags() {
- return &hwasan_flags;
-}
-
-int hwasan_inited = 0;
-int hwasan_instrumentation_inited = 0;
-bool hwasan_init_is_running;
-
-int hwasan_report_count = 0;
-
-void Flags::SetDefaults() {
-#define HWASAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
-#include "hwasan_flags.inc"
-#undef HWASAN_FLAG
-}
-
-static void RegisterHwasanFlags(FlagParser *parser, Flags *f) {
-#define HWASAN_FLAG(Type, Name, DefaultValue, Description) \
- RegisterFlag(parser, #Name, Description, &f->Name);
-#include "hwasan_flags.inc"
-#undef HWASAN_FLAG
-}
-
-static void InitializeFlags() {
- SetCommonFlagsDefaults();
- {
- CommonFlags cf;
- cf.CopyFrom(*common_flags());
- cf.external_symbolizer_path = GetEnv("HWASAN_SYMBOLIZER_PATH");
- cf.malloc_context_size = 20;
- cf.handle_ioctl = true;
- // FIXME: test and enable.
- cf.check_printf = false;
- cf.intercept_tls_get_addr = true;
- cf.exitcode = 99;
- // 8 shadow pages ~512kB, small enough to cover common stack sizes.
- cf.clear_shadow_mmap_threshold = 4096 * (SANITIZER_ANDROID ? 2 : 8);
- // Sigtrap is used in error reporting.
- cf.handle_sigtrap = kHandleSignalExclusive;
-
-#if SANITIZER_ANDROID
- // Let platform handle other signals. It is better at reporting them then we
- // are.
- cf.handle_segv = kHandleSignalNo;
- cf.handle_sigbus = kHandleSignalNo;
- cf.handle_abort = kHandleSignalNo;
- cf.handle_sigill = kHandleSignalNo;
- cf.handle_sigfpe = kHandleSignalNo;
-#endif
- OverrideCommonFlags(cf);
- }
-
- Flags *f = flags();
- f->SetDefaults();
-
- FlagParser parser;
- RegisterHwasanFlags(&parser, f);
- RegisterCommonFlags(&parser);
-
-#if HWASAN_CONTAINS_UBSAN
- __ubsan::Flags *uf = __ubsan::flags();
- uf->SetDefaults();
-
- FlagParser ubsan_parser;
- __ubsan::RegisterUbsanFlags(&ubsan_parser, uf);
- RegisterCommonFlags(&ubsan_parser);
-#endif
-
- // Override from user-specified string.
- if (__hwasan_default_options)
- parser.ParseString(__hwasan_default_options());
-#if HWASAN_CONTAINS_UBSAN
- const char *ubsan_default_options = __ubsan::MaybeCallUbsanDefaultOptions();
- ubsan_parser.ParseString(ubsan_default_options);
-#endif
-
- const char *hwasan_options = GetEnv("HWASAN_OPTIONS");
- parser.ParseString(hwasan_options);
-#if HWASAN_CONTAINS_UBSAN
- ubsan_parser.ParseString(GetEnv("UBSAN_OPTIONS"));
-#endif
- VPrintf(1, "HWASAN_OPTIONS: %s\n",
- hwasan_options ? hwasan_options : "<empty>");
-
- InitializeCommonFlags();
-
- if (Verbosity()) ReportUnrecognizedFlags();
-
- if (common_flags()->help) parser.PrintFlagDescriptions();
-}
-
-void GetStackTrace(BufferedStackTrace *stack, uptr max_s, uptr pc, uptr bp,
- void *context, bool request_fast_unwind) {
- Thread *t = GetCurrentThread();
- if (!t) {
- // the thread is still being created.
- stack->size = 0;
- return;
- }
- if (!StackTrace::WillUseFastUnwind(request_fast_unwind)) {
- // Block reports from our interceptors during _Unwind_Backtrace.
- SymbolizerScope sym_scope;
- return stack->Unwind(max_s, pc, bp, context, 0, 0, request_fast_unwind);
- }
- stack->Unwind(max_s, pc, bp, context, t->stack_top(), t->stack_bottom(),
- request_fast_unwind);
-}
-
-static void HWAsanCheckFailed(const char *file, int line, const char *cond,
- u64 v1, u64 v2) {
- Report("HWAddressSanitizer CHECK failed: %s:%d \"%s\" (0x%zx, 0x%zx)\n", file,
- line, cond, (uptr)v1, (uptr)v2);
- PRINT_CURRENT_STACK_CHECK();
- Die();
-}
-
-static constexpr uptr kMemoryUsageBufferSize = 4096;
-
-static void HwasanFormatMemoryUsage(InternalScopedString &s) {
- HwasanThreadList &thread_list = hwasanThreadList();
- auto thread_stats = thread_list.GetThreadStats();
- auto *sds = StackDepotGetStats();
- AllocatorStatCounters asc;
- GetAllocatorStats(asc);
- s.append(
- "HWASAN pid: %d rss: %zd threads: %zd stacks: %zd"
- " thr_aux: %zd stack_depot: %zd uniq_stacks: %zd"
- " heap: %zd",
- internal_getpid(), GetRSS(), thread_stats.n_live_threads,
- thread_stats.total_stack_size,
- thread_stats.n_live_threads * thread_list.MemoryUsedPerThread(),
- sds->allocated, sds->n_uniq_ids, asc[AllocatorStatMapped]);
-}
-
-#if SANITIZER_ANDROID
-static char *memory_usage_buffer = nullptr;
-
-static void InitMemoryUsage() {
- memory_usage_buffer =
- (char *)MmapOrDie(kMemoryUsageBufferSize, "memory usage string");
- CHECK(memory_usage_buffer);
- memory_usage_buffer[0] = '\0';
- DecorateMapping((uptr)memory_usage_buffer, kMemoryUsageBufferSize,
- memory_usage_buffer);
-}
-
-void UpdateMemoryUsage() {
- if (!flags()->export_memory_stats)
- return;
- if (!memory_usage_buffer)
- InitMemoryUsage();
- InternalScopedString s(kMemoryUsageBufferSize);
- HwasanFormatMemoryUsage(s);
- internal_strncpy(memory_usage_buffer, s.data(), kMemoryUsageBufferSize - 1);
- memory_usage_buffer[kMemoryUsageBufferSize - 1] = '\0';
-}
-#else
-void UpdateMemoryUsage() {}
-#endif
-
-struct FrameDescription {
- uptr PC;
- const char *Descr;
-};
-
-struct FrameDescriptionArray {
- FrameDescription *beg, *end;
-};
-
-static InternalMmapVectorNoCtor<FrameDescriptionArray> AllFrames;
-
-void InitFrameDescriptors(uptr b, uptr e) {
- FrameDescription *beg = reinterpret_cast<FrameDescription *>(b);
- FrameDescription *end = reinterpret_cast<FrameDescription *>(e);
- if (beg == end)
- return;
- AllFrames.push_back({beg, end});
- if (Verbosity())
- for (FrameDescription *frame_descr = beg; frame_descr < end; frame_descr++)
- Printf("Frame: %p %s\n", frame_descr->PC, frame_descr->Descr);
-}
-
-const char *GetStackFrameDescr(uptr pc) {
- for (uptr i = 0, n = AllFrames.size(); i < n; i++)
- for (auto p = AllFrames[i].beg; p < AllFrames[i].end; p++)
- if (p->PC == pc)
- return p->Descr;
- return nullptr;
-}
-
-// Prepare to run instrumented code on the main thread.
-void InitInstrumentation() {
- if (hwasan_instrumentation_inited) return;
-
- if (!InitShadow()) {
- Printf("FATAL: HWAddressSanitizer cannot mmap the shadow memory.\n");
- DumpProcessMap();
- Die();
- }
-
- InitThreads();
- hwasanThreadList().CreateCurrentThread();
-
- hwasan_instrumentation_inited = 1;
-}
-
-} // namespace __hwasan
-
-// Interface.
-
-using namespace __hwasan;
-
-uptr __hwasan_shadow_memory_dynamic_address; // Global interface symbol.
-
-void __hwasan_init_frames(uptr beg, uptr end) {
- InitFrameDescriptors(beg, end);
-}
-
-void __hwasan_init_static() {
- InitShadowGOT();
- InitInstrumentation();
-}
-
-void __hwasan_init() {
- CHECK(!hwasan_init_is_running);
- if (hwasan_inited) return;
- hwasan_init_is_running = 1;
- SanitizerToolName = "HWAddressSanitizer";
-
- InitTlsSize();
-
- CacheBinaryName();
- InitializeFlags();
-
- // Install tool-specific callbacks in sanitizer_common.
- SetCheckFailedCallback(HWAsanCheckFailed);
-
- __sanitizer_set_report_path(common_flags()->log_path);
-
- AndroidTestTlsSlot();
-
- DisableCoreDumperIfNecessary();
-
- InitInstrumentation();
-
- // Needs to be called here because flags()->random_tags might not have been
- // initialized when InitInstrumentation() was called.
- GetCurrentThread()->InitRandomState();
-
- MadviseShadow();
-
- SetPrintfAndReportCallback(AppendToErrorMessageBuffer);
- // This may call libc -> needs initialized shadow.
- AndroidLogInit();
-
- InitializeInterceptors();
- InstallDeadlySignalHandlers(HwasanOnDeadlySignal);
- InstallAtExitHandler(); // Needs __cxa_atexit interceptor.
-
- Symbolizer::GetOrInit()->AddHooks(EnterSymbolizer, ExitSymbolizer);
-
- InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
-
- HwasanTSDInit();
- HwasanTSDThreadInit();
-
- HwasanAllocatorInit();
-
-#if HWASAN_CONTAINS_UBSAN
- __ubsan::InitAsPlugin();
-#endif
-
- VPrintf(1, "HWAddressSanitizer init done\n");
-
- hwasan_init_is_running = 0;
- hwasan_inited = 1;
-}
-
-void __hwasan_print_shadow(const void *p, uptr sz) {
- uptr ptr_raw = UntagAddr(reinterpret_cast<uptr>(p));
- uptr shadow_first = MemToShadow(ptr_raw);
- uptr shadow_last = MemToShadow(ptr_raw + sz - 1);
- Printf("HWASan shadow map for %zx .. %zx (pointer tag %x)\n", ptr_raw,
- ptr_raw + sz, GetTagFromPointer((uptr)p));
- for (uptr s = shadow_first; s <= shadow_last; ++s)
- Printf(" %zx: %x\n", ShadowToMem(s), *(tag_t *)s);
-}
-
-sptr __hwasan_test_shadow(const void *p, uptr sz) {
- if (sz == 0)
- return -1;
- tag_t ptr_tag = GetTagFromPointer((uptr)p);
- uptr ptr_raw = UntagAddr(reinterpret_cast<uptr>(p));
- uptr shadow_first = MemToShadow(ptr_raw);
- uptr shadow_last = MemToShadow(ptr_raw + sz - 1);
- for (uptr s = shadow_first; s <= shadow_last; ++s)
- if (*(tag_t *)s != ptr_tag) {
- sptr offset = ShadowToMem(s) - ptr_raw;
- return offset < 0 ? 0 : offset;
- }
- return -1;
-}
-
-u16 __sanitizer_unaligned_load16(const uu16 *p) {
- return *p;
-}
-u32 __sanitizer_unaligned_load32(const uu32 *p) {
- return *p;
-}
-u64 __sanitizer_unaligned_load64(const uu64 *p) {
- return *p;
-}
-void __sanitizer_unaligned_store16(uu16 *p, u16 x) {
- *p = x;
-}
-void __sanitizer_unaligned_store32(uu32 *p, u32 x) {
- *p = x;
-}
-void __sanitizer_unaligned_store64(uu64 *p, u64 x) {
- *p = x;
-}
-
-void __hwasan_loadN(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_loadN_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_storeN(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_storeN_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);
-}
-
-void __hwasan_tag_memory(uptr p, u8 tag, uptr sz) {
- TagMemoryAligned(p, sz, tag);
-}
-
-uptr __hwasan_tag_pointer(uptr p, u8 tag) {
- return AddTagToPointer(p, tag);
-}
-
-void __hwasan_handle_longjmp(const void *sp_dst) {
- uptr dst = (uptr)sp_dst;
- // HWASan does not support tagged SP.
- CHECK(GetTagFromPointer(dst) == 0);
-
- uptr sp = (uptr)__builtin_frame_address(0);
- static const uptr kMaxExpectedCleanupSize = 64 << 20; // 64M
- if (dst < sp || dst - sp > kMaxExpectedCleanupSize) {
- Report(
- "WARNING: HWASan is ignoring requested __hwasan_handle_longjmp: "
- "stack top: %p; target %p; distance: %p (%zd)\n"
- "False positive error reports may follow\n",
- (void *)sp, (void *)dst, dst - sp);
- return;
- }
- TagMemory(sp, dst - sp, 0);
-}
-
-void __hwasan_print_memory_usage() {
- InternalScopedString s(kMemoryUsageBufferSize);
- HwasanFormatMemoryUsage(s);
- Printf("%s\n", s.data());
-}
-
-static const u8 kFallbackTag = 0xBB;
-
-u8 __hwasan_generate_tag() {
- Thread *t = GetCurrentThread();
- if (!t) return kFallbackTag;
- return t->GenerateRandomTag();
-}
-
-#if !SANITIZER_SUPPORTS_WEAK_HOOKS
-extern "C" {
-SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
-const char* __hwasan_default_options() { return ""; }
-} // extern "C"
-#endif
-
-extern "C" {
-SANITIZER_INTERFACE_ATTRIBUTE
-void __sanitizer_print_stack_trace() {
- GET_FATAL_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME());
- stack.Print();
-}
-} // extern "C"
Copied: compiler-rt/trunk/lib/hwasan/hwasan.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan.cc ---------------------------------------------------------===//
+//===-- hwasan.cpp --------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc (removed)
@@ -1,450 +0,0 @@
-//===-- hwasan_allocator.cc ------------------------- ---------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of HWAddressSanitizer.
-//
-// HWAddressSanitizer allocator.
-//===----------------------------------------------------------------------===//
-
-#include "sanitizer_common/sanitizer_atomic.h"
-#include "sanitizer_common/sanitizer_errno.h"
-#include "sanitizer_common/sanitizer_stackdepot.h"
-#include "hwasan.h"
-#include "hwasan_allocator.h"
-#include "hwasan_mapping.h"
-#include "hwasan_malloc_bisect.h"
-#include "hwasan_thread.h"
-#include "hwasan_report.h"
-
-#if HWASAN_WITH_INTERCEPTORS
-DEFINE_REAL(void *, realloc, void *ptr, uptr size)
-DEFINE_REAL(void, free, void *ptr)
-#endif
-
-namespace __hwasan {
-
-static Allocator allocator;
-static AllocatorCache fallback_allocator_cache;
-static SpinMutex fallback_mutex;
-static atomic_uint8_t hwasan_allocator_tagging_enabled;
-
-static const tag_t kFallbackAllocTag = 0xBB;
-static const tag_t kFallbackFreeTag = 0xBC;
-
-enum RightAlignMode {
- kRightAlignNever,
- kRightAlignSometimes,
- kRightAlignAlways
-};
-
-// These two variables are initialized from flags()->malloc_align_right
-// in HwasanAllocatorInit and are never changed afterwards.
-static RightAlignMode right_align_mode = kRightAlignNever;
-static bool right_align_8 = false;
-
-// Initialized in HwasanAllocatorInit, an never changed.
-static ALIGNED(16) u8 tail_magic[kShadowAlignment];
-
-bool HwasanChunkView::IsAllocated() const {
- return metadata_ && metadata_->alloc_context_id && metadata_->requested_size;
-}
-
-// Aligns the 'addr' right to the granule boundary.
-static uptr AlignRight(uptr addr, uptr requested_size) {
- uptr tail_size = requested_size % kShadowAlignment;
- if (!tail_size) return addr;
- if (right_align_8)
- return tail_size > 8 ? addr : addr + 8;
- return addr + kShadowAlignment - tail_size;
-}
-
-uptr HwasanChunkView::Beg() const {
- if (metadata_ && metadata_->right_aligned)
- return AlignRight(block_, metadata_->requested_size);
- return block_;
-}
-uptr HwasanChunkView::End() const {
- return Beg() + UsedSize();
-}
-uptr HwasanChunkView::UsedSize() const {
- return metadata_->requested_size;
-}
-u32 HwasanChunkView::GetAllocStackId() const {
- return metadata_->alloc_context_id;
-}
-
-uptr HwasanChunkView::ActualSize() const {
- return allocator.GetActuallyAllocatedSize(reinterpret_cast<void *>(block_));
-}
-
-bool HwasanChunkView::FromSmallHeap() const {
- return allocator.FromPrimary(reinterpret_cast<void *>(block_));
-}
-
-void GetAllocatorStats(AllocatorStatCounters s) {
- allocator.GetStats(s);
-}
-
-void HwasanAllocatorInit() {
- atomic_store_relaxed(&hwasan_allocator_tagging_enabled,
- !flags()->disable_allocator_tagging);
- SetAllocatorMayReturnNull(common_flags()->allocator_may_return_null);
- allocator.Init(common_flags()->allocator_release_to_os_interval_ms);
- switch (flags()->malloc_align_right) {
- case 0: break;
- case 1:
- right_align_mode = kRightAlignSometimes;
- right_align_8 = false;
- break;
- case 2:
- right_align_mode = kRightAlignAlways;
- right_align_8 = false;
- break;
- case 8:
- right_align_mode = kRightAlignSometimes;
- right_align_8 = true;
- break;
- case 9:
- right_align_mode = kRightAlignAlways;
- right_align_8 = true;
- break;
- default:
- Report("ERROR: unsupported value of malloc_align_right flag: %d\n",
- flags()->malloc_align_right);
- Die();
- }
- for (uptr i = 0; i < kShadowAlignment; i++)
- tail_magic[i] = GetCurrentThread()->GenerateRandomTag();
-}
-
-void AllocatorSwallowThreadLocalCache(AllocatorCache *cache) {
- allocator.SwallowCache(cache);
-}
-
-static uptr TaggedSize(uptr size) {
- if (!size) size = 1;
- uptr new_size = RoundUpTo(size, kShadowAlignment);
- CHECK_GE(new_size, size);
- return new_size;
-}
-
-static void *HwasanAllocate(StackTrace *stack, uptr orig_size, uptr alignment,
- bool zeroise) {
- if (orig_size > kMaxAllowedMallocSize) {
- if (AllocatorMayReturnNull()) {
- Report("WARNING: HWAddressSanitizer failed to allocate 0x%zx bytes\n",
- orig_size);
- return nullptr;
- }
- ReportAllocationSizeTooBig(orig_size, kMaxAllowedMallocSize, stack);
- }
-
- alignment = Max(alignment, kShadowAlignment);
- uptr size = TaggedSize(orig_size);
- Thread *t = GetCurrentThread();
- void *allocated;
- if (t) {
- allocated = allocator.Allocate(t->allocator_cache(), size, alignment);
- } else {
- SpinMutexLock l(&fallback_mutex);
- AllocatorCache *cache = &fallback_allocator_cache;
- allocated = allocator.Allocate(cache, size, alignment);
- }
- if (UNLIKELY(!allocated)) {
- SetAllocatorOutOfMemory();
- if (AllocatorMayReturnNull())
- return nullptr;
- ReportOutOfMemory(size, stack);
- }
- Metadata *meta =
- reinterpret_cast<Metadata *>(allocator.GetMetaData(allocated));
- meta->requested_size = static_cast<u32>(orig_size);
- meta->alloc_context_id = StackDepotPut(*stack);
- meta->right_aligned = false;
- if (zeroise) {
- internal_memset(allocated, 0, size);
- } else if (flags()->max_malloc_fill_size > 0) {
- uptr fill_size = Min(size, (uptr)flags()->max_malloc_fill_size);
- internal_memset(allocated, flags()->malloc_fill_byte, fill_size);
- }
- if (!right_align_mode)
- internal_memcpy(reinterpret_cast<u8 *>(allocated) + orig_size, tail_magic,
- size - orig_size);
-
- void *user_ptr = allocated;
- // Tagging can only be skipped when both tag_in_malloc and tag_in_free are
- // false. When tag_in_malloc = false and tag_in_free = true malloc needs to
- // retag to 0.
- if ((flags()->tag_in_malloc || flags()->tag_in_free) &&
- atomic_load_relaxed(&hwasan_allocator_tagging_enabled)) {
- tag_t tag = flags()->tag_in_malloc && malloc_bisect(stack, orig_size)
- ? (t ? t->GenerateRandomTag() : kFallbackAllocTag)
- : 0;
- user_ptr = (void *)TagMemoryAligned((uptr)user_ptr, size, tag);
- }
-
- if ((orig_size % kShadowAlignment) && (alignment <= kShadowAlignment) &&
- right_align_mode) {
- uptr as_uptr = reinterpret_cast<uptr>(user_ptr);
- if (right_align_mode == kRightAlignAlways ||
- GetTagFromPointer(as_uptr) & 1) { // use a tag bit as a random bit.
- user_ptr = reinterpret_cast<void *>(AlignRight(as_uptr, orig_size));
- meta->right_aligned = 1;
- }
- }
-
- HWASAN_MALLOC_HOOK(user_ptr, size);
- return user_ptr;
-}
-
-static bool PointerAndMemoryTagsMatch(void *tagged_ptr) {
- CHECK(tagged_ptr);
- tag_t ptr_tag = GetTagFromPointer(reinterpret_cast<uptr>(tagged_ptr));
- tag_t mem_tag = *reinterpret_cast<tag_t *>(
- MemToShadow(reinterpret_cast<uptr>(UntagPtr(tagged_ptr))));
- return ptr_tag == mem_tag;
-}
-
-static void HwasanDeallocate(StackTrace *stack, void *tagged_ptr) {
- CHECK(tagged_ptr);
- HWASAN_FREE_HOOK(tagged_ptr);
-
- if (!PointerAndMemoryTagsMatch(tagged_ptr))
- ReportInvalidFree(stack, reinterpret_cast<uptr>(tagged_ptr));
-
- void *untagged_ptr = UntagPtr(tagged_ptr);
- void *aligned_ptr = reinterpret_cast<void *>(
- RoundDownTo(reinterpret_cast<uptr>(untagged_ptr), kShadowAlignment));
- Metadata *meta =
- reinterpret_cast<Metadata *>(allocator.GetMetaData(aligned_ptr));
- uptr orig_size = meta->requested_size;
- u32 free_context_id = StackDepotPut(*stack);
- u32 alloc_context_id = meta->alloc_context_id;
-
- // Check tail magic.
- uptr tagged_size = TaggedSize(orig_size);
- if (flags()->free_checks_tail_magic && !right_align_mode && orig_size) {
- uptr tail_size = tagged_size - orig_size;
- CHECK_LT(tail_size, kShadowAlignment);
- void *tail_beg = reinterpret_cast<void *>(
- reinterpret_cast<uptr>(aligned_ptr) + orig_size);
- if (tail_size && internal_memcmp(tail_beg, tail_magic, tail_size))
- ReportTailOverwritten(stack, reinterpret_cast<uptr>(tagged_ptr),
- orig_size, tail_size, tail_magic);
- }
-
- meta->requested_size = 0;
- meta->alloc_context_id = 0;
- // This memory will not be reused by anyone else, so we are free to keep it
- // poisoned.
- Thread *t = GetCurrentThread();
- if (flags()->max_free_fill_size > 0) {
- uptr fill_size =
- Min(TaggedSize(orig_size), (uptr)flags()->max_free_fill_size);
- internal_memset(aligned_ptr, flags()->free_fill_byte, fill_size);
- }
- if (flags()->tag_in_free && malloc_bisect(stack, 0) &&
- atomic_load_relaxed(&hwasan_allocator_tagging_enabled))
- TagMemoryAligned(reinterpret_cast<uptr>(aligned_ptr), TaggedSize(orig_size),
- t ? t->GenerateRandomTag() : kFallbackFreeTag);
- if (t) {
- allocator.Deallocate(t->allocator_cache(), aligned_ptr);
- if (auto *ha = t->heap_allocations())
- ha->push({reinterpret_cast<uptr>(tagged_ptr), alloc_context_id,
- free_context_id, static_cast<u32>(orig_size)});
- } else {
- SpinMutexLock l(&fallback_mutex);
- AllocatorCache *cache = &fallback_allocator_cache;
- allocator.Deallocate(cache, aligned_ptr);
- }
-}
-
-static void *HwasanReallocate(StackTrace *stack, void *tagged_ptr_old,
- uptr new_size, uptr alignment) {
- if (!PointerAndMemoryTagsMatch(tagged_ptr_old))
- ReportInvalidFree(stack, reinterpret_cast<uptr>(tagged_ptr_old));
-
- void *tagged_ptr_new =
- HwasanAllocate(stack, new_size, alignment, false /*zeroise*/);
- if (tagged_ptr_old && tagged_ptr_new) {
- void *untagged_ptr_old = UntagPtr(tagged_ptr_old);
- Metadata *meta =
- reinterpret_cast<Metadata *>(allocator.GetMetaData(untagged_ptr_old));
- internal_memcpy(UntagPtr(tagged_ptr_new), untagged_ptr_old,
- Min(new_size, static_cast<uptr>(meta->requested_size)));
- HwasanDeallocate(stack, tagged_ptr_old);
- }
- return tagged_ptr_new;
-}
-
-static void *HwasanCalloc(StackTrace *stack, uptr nmemb, uptr size) {
- if (UNLIKELY(CheckForCallocOverflow(size, nmemb))) {
- if (AllocatorMayReturnNull())
- return nullptr;
- ReportCallocOverflow(nmemb, size, stack);
- }
- return HwasanAllocate(stack, nmemb * size, sizeof(u64), true);
-}
-
-HwasanChunkView FindHeapChunkByAddress(uptr address) {
- void *block = allocator.GetBlockBegin(reinterpret_cast<void*>(address));
- if (!block)
- return HwasanChunkView();
- Metadata *metadata =
- reinterpret_cast<Metadata*>(allocator.GetMetaData(block));
- return HwasanChunkView(reinterpret_cast<uptr>(block), metadata);
-}
-
-static uptr AllocationSize(const void *tagged_ptr) {
- const void *untagged_ptr = UntagPtr(tagged_ptr);
- if (!untagged_ptr) return 0;
- const void *beg = allocator.GetBlockBegin(untagged_ptr);
- Metadata *b = (Metadata *)allocator.GetMetaData(untagged_ptr);
- if (b->right_aligned) {
- if (beg != reinterpret_cast<void *>(RoundDownTo(
- reinterpret_cast<uptr>(untagged_ptr), kShadowAlignment)))
- return 0;
- } else {
- if (beg != untagged_ptr) return 0;
- }
- return b->requested_size;
-}
-
-void *hwasan_malloc(uptr size, StackTrace *stack) {
- return SetErrnoOnNull(HwasanAllocate(stack, size, sizeof(u64), false));
-}
-
-void *hwasan_calloc(uptr nmemb, uptr size, StackTrace *stack) {
- return SetErrnoOnNull(HwasanCalloc(stack, nmemb, size));
-}
-
-void *hwasan_realloc(void *ptr, uptr size, StackTrace *stack) {
- if (!ptr)
- return SetErrnoOnNull(HwasanAllocate(stack, size, sizeof(u64), false));
-
-#if HWASAN_WITH_INTERCEPTORS
- // A tag of 0 means that this is a system allocator allocation, so we must use
- // the system allocator to realloc it.
- if (!flags()->disable_allocator_tagging && GetTagFromPointer((uptr)ptr) == 0)
- return REAL(realloc)(ptr, size);
-#endif
-
- if (size == 0) {
- HwasanDeallocate(stack, ptr);
- return nullptr;
- }
- return SetErrnoOnNull(HwasanReallocate(stack, ptr, size, sizeof(u64)));
-}
-
-void *hwasan_valloc(uptr size, StackTrace *stack) {
- return SetErrnoOnNull(
- HwasanAllocate(stack, size, GetPageSizeCached(), false));
-}
-
-void *hwasan_pvalloc(uptr size, StackTrace *stack) {
- uptr PageSize = GetPageSizeCached();
- if (UNLIKELY(CheckForPvallocOverflow(size, PageSize))) {
- errno = errno_ENOMEM;
- if (AllocatorMayReturnNull())
- return nullptr;
- ReportPvallocOverflow(size, stack);
- }
- // pvalloc(0) should allocate one page.
- size = size ? RoundUpTo(size, PageSize) : PageSize;
- return SetErrnoOnNull(HwasanAllocate(stack, size, PageSize, false));
-}
-
-void *hwasan_aligned_alloc(uptr alignment, uptr size, StackTrace *stack) {
- if (UNLIKELY(!CheckAlignedAllocAlignmentAndSize(alignment, size))) {
- errno = errno_EINVAL;
- if (AllocatorMayReturnNull())
- return nullptr;
- ReportInvalidAlignedAllocAlignment(size, alignment, stack);
- }
- return SetErrnoOnNull(HwasanAllocate(stack, size, alignment, false));
-}
-
-void *hwasan_memalign(uptr alignment, uptr size, StackTrace *stack) {
- if (UNLIKELY(!IsPowerOfTwo(alignment))) {
- errno = errno_EINVAL;
- if (AllocatorMayReturnNull())
- return nullptr;
- ReportInvalidAllocationAlignment(alignment, stack);
- }
- return SetErrnoOnNull(HwasanAllocate(stack, size, alignment, false));
-}
-
-int hwasan_posix_memalign(void **memptr, uptr alignment, uptr size,
- StackTrace *stack) {
- if (UNLIKELY(!CheckPosixMemalignAlignment(alignment))) {
- if (AllocatorMayReturnNull())
- return errno_EINVAL;
- ReportInvalidPosixMemalignAlignment(alignment, stack);
- }
- void *ptr = HwasanAllocate(stack, size, alignment, false);
- if (UNLIKELY(!ptr))
- // OOM error is already taken care of by HwasanAllocate.
- return errno_ENOMEM;
- CHECK(IsAligned((uptr)ptr, alignment));
- *memptr = ptr;
- return 0;
-}
-
-void hwasan_free(void *ptr, StackTrace *stack) {
-#if HWASAN_WITH_INTERCEPTORS
- // A tag of 0 means that this is a system allocator allocation, so we must use
- // the system allocator to free it.
- if (!flags()->disable_allocator_tagging && GetTagFromPointer((uptr)ptr) == 0)
- return REAL(free)(ptr);
-#endif
-
- return HwasanDeallocate(stack, ptr);
-}
-
-} // namespace __hwasan
-
-using namespace __hwasan;
-
-void __hwasan_enable_allocator_tagging() {
- atomic_store_relaxed(&hwasan_allocator_tagging_enabled, 1);
-}
-
-void __hwasan_disable_allocator_tagging() {
-#if HWASAN_WITH_INTERCEPTORS
- // Allocator tagging must be enabled for the system allocator fallback to work
- // correctly. This means that we can't disable it at runtime if it was enabled
- // at startup since that might result in our deallocations going to the system
- // allocator. If tagging was disabled at startup we avoid this problem by
- // disabling the fallback altogether.
- CHECK(flags()->disable_allocator_tagging);
-#endif
-
- atomic_store_relaxed(&hwasan_allocator_tagging_enabled, 0);
-}
-
-uptr __sanitizer_get_current_allocated_bytes() {
- uptr stats[AllocatorStatCount];
- allocator.GetStats(stats);
- return stats[AllocatorStatAllocated];
-}
-
-uptr __sanitizer_get_heap_size() {
- uptr stats[AllocatorStatCount];
- allocator.GetStats(stats);
- return stats[AllocatorStatMapped];
-}
-
-uptr __sanitizer_get_free_bytes() { return 1; }
-
-uptr __sanitizer_get_unmapped_bytes() { return 1; }
-
-uptr __sanitizer_get_estimated_allocated_size(uptr size) { return size; }
-
-int __sanitizer_get_ownership(const void *p) { return AllocationSize(p) != 0; }
-
-uptr __sanitizer_get_allocated_size(const void *p) { return AllocationSize(p); }
Copied: compiler-rt/trunk/lib/hwasan/hwasan_allocator.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_allocator.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_allocator.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_allocator.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_allocator.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_allocator.cc ------------------------- ---------------------===//
+//===-- hwasan_allocator.cpp ------------------------ ---------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc (removed)
@@ -1,164 +0,0 @@
-//===-- hwasan_dynamic_shadow.cc --------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file is a part of HWAddressSanitizer. It reserves dynamic shadow memory
-/// region and handles ifunc resolver case, when necessary.
-///
-//===----------------------------------------------------------------------===//
-
-#include "hwasan.h"
-#include "hwasan_dynamic_shadow.h"
-#include "hwasan_mapping.h"
-#include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_posix.h"
-
-#include <elf.h>
-#include <link.h>
-
-// The code in this file needs to run in an unrelocated binary. It should not
-// access any external symbol, including its own non-hidden globals.
-
-namespace __hwasan {
-
-static void UnmapFromTo(uptr from, uptr to) {
- if (to == from)
- return;
- CHECK(to >= from);
- uptr res = internal_munmap(reinterpret_cast<void *>(from), to - from);
- if (UNLIKELY(internal_iserror(res))) {
- Report("ERROR: %s failed to unmap 0x%zx (%zd) bytes at address %p\n",
- SanitizerToolName, to - from, to - from, from);
- CHECK("unable to unmap" && 0);
- }
-}
-
-// Returns an address aligned to kShadowBaseAlignment, such that
-// 2**kShadowBaseAlingment on the left and shadow_size_bytes bytes on the right
-// of it are mapped no access.
-static uptr MapDynamicShadow(uptr shadow_size_bytes) {
- const uptr granularity = GetMmapGranularity();
- const uptr min_alignment = granularity << kShadowScale;
- const uptr alignment = 1ULL << kShadowBaseAlignment;
- CHECK_GE(alignment, min_alignment);
-
- const uptr left_padding = 1ULL << kShadowBaseAlignment;
- const uptr shadow_size =
- RoundUpTo(shadow_size_bytes, granularity);
- const uptr map_size = shadow_size + left_padding + alignment;
-
- const uptr map_start = (uptr)MmapNoAccess(map_size);
- CHECK_NE(map_start, ~(uptr)0);
-
- const uptr shadow_start = RoundUpTo(map_start + left_padding, alignment);
-
- UnmapFromTo(map_start, shadow_start - left_padding);
- UnmapFromTo(shadow_start + shadow_size, map_start + map_size);
-
- return shadow_start;
-}
-
-} // namespace __hwasan
-
-#if SANITIZER_ANDROID
-extern "C" {
-
-INTERFACE_ATTRIBUTE void __hwasan_shadow();
-decltype(__hwasan_shadow)* __hwasan_premap_shadow();
-
-} // extern "C"
-
-namespace __hwasan {
-
-// Conservative upper limit.
-static uptr PremapShadowSize() {
- return RoundUpTo(GetMaxVirtualAddress() >> kShadowScale,
- GetMmapGranularity());
-}
-
-static uptr PremapShadow() {
- return MapDynamicShadow(PremapShadowSize());
-}
-
-static bool IsPremapShadowAvailable() {
- const uptr shadow = reinterpret_cast<uptr>(&__hwasan_shadow);
- const uptr resolver = reinterpret_cast<uptr>(&__hwasan_premap_shadow);
- // shadow == resolver is how Android KitKat and older handles ifunc.
- // shadow == 0 just in case.
- return shadow != 0 && shadow != resolver;
-}
-
-static uptr FindPremappedShadowStart(uptr shadow_size_bytes) {
- const uptr granularity = GetMmapGranularity();
- const uptr shadow_start = reinterpret_cast<uptr>(&__hwasan_shadow);
- const uptr premap_shadow_size = PremapShadowSize();
- const uptr shadow_size = RoundUpTo(shadow_size_bytes, granularity);
-
- // We may have mapped too much. Release extra memory.
- UnmapFromTo(shadow_start + shadow_size, shadow_start + premap_shadow_size);
- return shadow_start;
-}
-
-} // namespace __hwasan
-
-extern "C" {
-
-decltype(__hwasan_shadow)* __hwasan_premap_shadow() {
- // The resolver might be called multiple times. Map the shadow just once.
- static __sanitizer::uptr shadow = 0;
- if (!shadow)
- shadow = __hwasan::PremapShadow();
- return reinterpret_cast<decltype(__hwasan_shadow)*>(shadow);
-}
-
-// __hwasan_shadow is a "function" that has the same address as the first byte
-// of the shadow mapping.
-INTERFACE_ATTRIBUTE __attribute__((ifunc("__hwasan_premap_shadow")))
-void __hwasan_shadow();
-
-extern __attribute((weak, visibility("hidden"))) ElfW(Rela) __rela_iplt_start[],
- __rela_iplt_end[];
-
-} // extern "C"
-
-namespace __hwasan {
-
-void InitShadowGOT() {
- // Call the ifunc resolver for __hwasan_shadow and fill in its GOT entry. This
- // needs to be done before other ifunc resolvers (which are handled by libc)
- // because a resolver might read __hwasan_shadow.
- typedef ElfW(Addr) (*ifunc_resolver_t)(void);
- for (ElfW(Rela) *r = __rela_iplt_start; r != __rela_iplt_end; ++r) {
- ElfW(Addr)* offset = reinterpret_cast<ElfW(Addr)*>(r->r_offset);
- ElfW(Addr) resolver = r->r_addend;
- if (resolver == reinterpret_cast<ElfW(Addr)>(&__hwasan_premap_shadow)) {
- *offset = reinterpret_cast<ifunc_resolver_t>(resolver)();
- break;
- }
- }
-}
-
-uptr FindDynamicShadowStart(uptr shadow_size_bytes) {
- if (IsPremapShadowAvailable())
- return FindPremappedShadowStart(shadow_size_bytes);
- return MapDynamicShadow(shadow_size_bytes);
-}
-
-} // namespace __hwasan
-#else
-namespace __hwasan {
-
-void InitShadowGOT() {}
-
-uptr FindDynamicShadowStart(uptr shadow_size_bytes) {
- return MapDynamicShadow(shadow_size_bytes);
-}
-
-} // namespace __hwasan
-
-#endif // SANITIZER_ANDROID
Copied: compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_dynamic_shadow.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_dynamic_shadow.cc --------------------------------*- C++ -*-===//
+//===-- hwasan_dynamic_shadow.cpp -------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc (removed)
@@ -1,278 +0,0 @@
-//===-- hwasan_interceptors.cc --------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of HWAddressSanitizer.
-//
-// Interceptors for standard library functions.
-//
-// FIXME: move as many interceptors as possible into
-// sanitizer_common/sanitizer_common_interceptors.h
-//===----------------------------------------------------------------------===//
-
-#include "interception/interception.h"
-#include "hwasan.h"
-#include "hwasan_allocator.h"
-#include "hwasan_mapping.h"
-#include "hwasan_thread.h"
-#include "hwasan_poisoning.h"
-#include "hwasan_report.h"
-#include "sanitizer_common/sanitizer_platform_limits_posix.h"
-#include "sanitizer_common/sanitizer_allocator.h"
-#include "sanitizer_common/sanitizer_allocator_interface.h"
-#include "sanitizer_common/sanitizer_allocator_internal.h"
-#include "sanitizer_common/sanitizer_atomic.h"
-#include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_errno.h"
-#include "sanitizer_common/sanitizer_stackdepot.h"
-#include "sanitizer_common/sanitizer_libc.h"
-#include "sanitizer_common/sanitizer_linux.h"
-#include "sanitizer_common/sanitizer_tls_get_addr.h"
-
-#include <stdarg.h>
-// ACHTUNG! No other system header includes in this file.
-// Ideally, we should get rid of stdarg.h as well.
-
-using namespace __hwasan;
-
-using __sanitizer::memory_order;
-using __sanitizer::atomic_load;
-using __sanitizer::atomic_store;
-using __sanitizer::atomic_uintptr_t;
-
-bool IsInInterceptorScope() {
- Thread *t = GetCurrentThread();
- return t && t->InInterceptorScope();
-}
-
-struct InterceptorScope {
- InterceptorScope() {
- Thread *t = GetCurrentThread();
- if (t)
- t->EnterInterceptorScope();
- }
- ~InterceptorScope() {
- Thread *t = GetCurrentThread();
- if (t)
- t->LeaveInterceptorScope();
- }
-};
-
-static uptr allocated_for_dlsym;
-static const uptr kDlsymAllocPoolSize = 1024;
-static uptr alloc_memory_for_dlsym[kDlsymAllocPoolSize];
-
-static bool IsInDlsymAllocPool(const void *ptr) {
- uptr off = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
- return off < sizeof(alloc_memory_for_dlsym);
-}
-
-static void *AllocateFromLocalPool(uptr size_in_bytes) {
- uptr size_in_words = RoundUpTo(size_in_bytes, kWordSize) / kWordSize;
- void *mem = (void *)&alloc_memory_for_dlsym[allocated_for_dlsym];
- allocated_for_dlsym += size_in_words;
- CHECK_LT(allocated_for_dlsym, kDlsymAllocPoolSize);
- return mem;
-}
-
-#define ENSURE_HWASAN_INITED() do { \
- CHECK(!hwasan_init_is_running); \
- if (!hwasan_inited) { \
- __hwasan_init(); \
- } \
-} while (0)
-
-
-int __sanitizer_posix_memalign(void **memptr, uptr alignment, uptr size) {
- GET_MALLOC_STACK_TRACE;
- CHECK_NE(memptr, 0);
- int res = hwasan_posix_memalign(memptr, alignment, size, &stack);
- return res;
-}
-
-void * __sanitizer_memalign(uptr alignment, uptr size) {
- GET_MALLOC_STACK_TRACE;
- return hwasan_memalign(alignment, size, &stack);
-}
-
-void * __sanitizer_aligned_alloc(uptr alignment, uptr size) {
- GET_MALLOC_STACK_TRACE;
- return hwasan_aligned_alloc(alignment, size, &stack);
-}
-
-void * __sanitizer___libc_memalign(uptr alignment, uptr size) {
- GET_MALLOC_STACK_TRACE;
- void *ptr = hwasan_memalign(alignment, size, &stack);
- if (ptr)
- DTLS_on_libc_memalign(ptr, size);
- return ptr;
-}
-
-void * __sanitizer_valloc(uptr size) {
- GET_MALLOC_STACK_TRACE;
- return hwasan_valloc(size, &stack);
-}
-
-void * __sanitizer_pvalloc(uptr size) {
- GET_MALLOC_STACK_TRACE;
- return hwasan_pvalloc(size, &stack);
-}
-
-void __sanitizer_free(void *ptr) {
- GET_MALLOC_STACK_TRACE;
- if (!ptr || UNLIKELY(IsInDlsymAllocPool(ptr))) return;
- hwasan_free(ptr, &stack);
-}
-
-void __sanitizer_cfree(void *ptr) {
- GET_MALLOC_STACK_TRACE;
- if (!ptr || UNLIKELY(IsInDlsymAllocPool(ptr))) return;
- hwasan_free(ptr, &stack);
-}
-
-uptr __sanitizer_malloc_usable_size(const void *ptr) {
- return __sanitizer_get_allocated_size(ptr);
-}
-
-struct __sanitizer_struct_mallinfo __sanitizer_mallinfo() {
- __sanitizer_struct_mallinfo sret;
- internal_memset(&sret, 0, sizeof(sret));
- return sret;
-}
-
-int __sanitizer_mallopt(int cmd, int value) {
- return 0;
-}
-
-void __sanitizer_malloc_stats(void) {
- // FIXME: implement, but don't call REAL(malloc_stats)!
-}
-
-void * __sanitizer_calloc(uptr nmemb, uptr size) {
- GET_MALLOC_STACK_TRACE;
- if (UNLIKELY(!hwasan_inited))
- // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym.
- return AllocateFromLocalPool(nmemb * size);
- return hwasan_calloc(nmemb, size, &stack);
-}
-
-void * __sanitizer_realloc(void *ptr, uptr size) {
- GET_MALLOC_STACK_TRACE;
- if (UNLIKELY(IsInDlsymAllocPool(ptr))) {
- uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
- uptr copy_size = Min(size, kDlsymAllocPoolSize - offset);
- void *new_ptr;
- if (UNLIKELY(!hwasan_inited)) {
- new_ptr = AllocateFromLocalPool(copy_size);
- } else {
- copy_size = size;
- new_ptr = hwasan_malloc(copy_size, &stack);
- }
- internal_memcpy(new_ptr, ptr, copy_size);
- return new_ptr;
- }
- return hwasan_realloc(ptr, size, &stack);
-}
-
-void * __sanitizer_malloc(uptr size) {
- GET_MALLOC_STACK_TRACE;
- if (UNLIKELY(!hwasan_init_is_running))
- ENSURE_HWASAN_INITED();
- if (UNLIKELY(!hwasan_inited))
- // Hack: dlsym calls malloc before REAL(malloc) is retrieved from dlsym.
- return AllocateFromLocalPool(size);
- return hwasan_malloc(size, &stack);
-}
-
-#if HWASAN_WITH_INTERCEPTORS
-#define INTERCEPTOR_ALIAS(RET, FN, ARGS...) \
- extern "C" SANITIZER_INTERFACE_ATTRIBUTE RET WRAP(FN)(ARGS) \
- ALIAS("__sanitizer_" #FN); \
- extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE RET FN( \
- ARGS) ALIAS("__sanitizer_" #FN)
-
-INTERCEPTOR_ALIAS(int, posix_memalign, void **memptr, SIZE_T alignment,
- SIZE_T size);
-INTERCEPTOR_ALIAS(void *, aligned_alloc, SIZE_T alignment, SIZE_T size);
-INTERCEPTOR_ALIAS(void *, __libc_memalign, SIZE_T alignment, SIZE_T size);
-INTERCEPTOR_ALIAS(void *, valloc, SIZE_T size);
-INTERCEPTOR_ALIAS(void, free, void *ptr);
-INTERCEPTOR_ALIAS(uptr, malloc_usable_size, const void *ptr);
-INTERCEPTOR_ALIAS(void *, calloc, SIZE_T nmemb, SIZE_T size);
-INTERCEPTOR_ALIAS(void *, realloc, void *ptr, SIZE_T size);
-INTERCEPTOR_ALIAS(void *, malloc, SIZE_T size);
-
-#if !SANITIZER_FREEBSD && !SANITIZER_NETBSD
-INTERCEPTOR_ALIAS(void *, memalign, SIZE_T alignment, SIZE_T size);
-INTERCEPTOR_ALIAS(void *, pvalloc, SIZE_T size);
-INTERCEPTOR_ALIAS(void, cfree, void *ptr);
-INTERCEPTOR_ALIAS(__sanitizer_struct_mallinfo, mallinfo);
-INTERCEPTOR_ALIAS(int, mallopt, int cmd, int value);
-INTERCEPTOR_ALIAS(void, malloc_stats, void);
-#endif
-#endif // HWASAN_WITH_INTERCEPTORS
-
-
-#if HWASAN_WITH_INTERCEPTORS && !defined(__aarch64__)
-INTERCEPTOR(int, pthread_create, void *th, void *attr,
- void *(*callback)(void *), void *param) {
- ScopedTaggingDisabler disabler;
- int res = REAL(pthread_create)(UntagPtr(th), UntagPtr(attr),
- callback, param);
- return res;
-}
-#endif
-
-static void BeforeFork() {
- StackDepotLockAll();
-}
-
-static void AfterFork() {
- StackDepotUnlockAll();
-}
-
-INTERCEPTOR(int, fork, void) {
- ENSURE_HWASAN_INITED();
- BeforeFork();
- int pid = REAL(fork)();
- AfterFork();
- return pid;
-}
-
-
-struct HwasanInterceptorContext {
- bool in_interceptor_scope;
-};
-
-namespace __hwasan {
-
-int OnExit() {
- // FIXME: ask frontend whether we need to return failure.
- return 0;
-}
-
-} // namespace __hwasan
-
-namespace __hwasan {
-
-void InitializeInterceptors() {
- static int inited = 0;
- CHECK_EQ(inited, 0);
-
- INTERCEPT_FUNCTION(fork);
-
-#if HWASAN_WITH_INTERCEPTORS
-#if !defined(__aarch64__)
- INTERCEPT_FUNCTION(pthread_create);
-#endif
- INTERCEPT_FUNCTION(realloc);
- INTERCEPT_FUNCTION(free);
-#endif
-
- inited = 1;
-}
-} // namespace __hwasan
Copied: compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_interceptors.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_interceptors.cc --------------------------------------------===//
+//===-- hwasan_interceptors.cpp -------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_linux.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_linux.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_linux.cc (removed)
@@ -1,436 +0,0 @@
-//===-- hwasan_linux.cc -----------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file is a part of HWAddressSanitizer and contains Linux-, NetBSD- and
-/// FreeBSD-specific code.
-///
-//===----------------------------------------------------------------------===//
-
-#include "sanitizer_common/sanitizer_platform.h"
-#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD
-
-#include "hwasan.h"
-#include "hwasan_dynamic_shadow.h"
-#include "hwasan_interface_internal.h"
-#include "hwasan_mapping.h"
-#include "hwasan_report.h"
-#include "hwasan_thread.h"
-#include "hwasan_thread_list.h"
-
-#include <dlfcn.h>
-#include <elf.h>
-#include <link.h>
-#include <pthread.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/resource.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <unwind.h>
-
-#include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_procmaps.h"
-
-#if HWASAN_WITH_INTERCEPTORS && !SANITIZER_ANDROID
-SANITIZER_INTERFACE_ATTRIBUTE
-THREADLOCAL uptr __hwasan_tls;
-#endif
-
-namespace __hwasan {
-
-static void ReserveShadowMemoryRange(uptr beg, uptr end, const char *name) {
- CHECK_EQ((beg % GetMmapGranularity()), 0);
- CHECK_EQ(((end + 1) % GetMmapGranularity()), 0);
- uptr size = end - beg + 1;
- DecreaseTotalMmap(size); // Don't count the shadow against mmap_limit_mb.
- if (!MmapFixedNoReserve(beg, size, name)) {
- Report(
- "ReserveShadowMemoryRange failed while trying to map 0x%zx bytes. "
- "Perhaps you're using ulimit -v\n",
- size);
- Abort();
- }
-}
-
-static void ProtectGap(uptr addr, uptr size) {
- if (!size)
- return;
- void *res = MmapFixedNoAccess(addr, size, "shadow gap");
- if (addr == (uptr)res)
- return;
- // A few pages at the start of the address space can not be protected.
- // But we really want to protect as much as possible, to prevent this memory
- // being returned as a result of a non-FIXED mmap().
- if (addr == 0) {
- uptr step = GetMmapGranularity();
- while (size > step) {
- addr += step;
- size -= step;
- void *res = MmapFixedNoAccess(addr, size, "shadow gap");
- if (addr == (uptr)res)
- return;
- }
- }
-
- Report(
- "ERROR: Failed to protect shadow gap [%p, %p]. "
- "HWASan cannot proceed correctly. ABORTING.\n", (void *)addr,
- (void *)(addr + size));
- DumpProcessMap();
- Die();
-}
-
-static uptr kLowMemStart;
-static uptr kLowMemEnd;
-static uptr kLowShadowEnd;
-static uptr kLowShadowStart;
-static uptr kHighShadowStart;
-static uptr kHighShadowEnd;
-static uptr kHighMemStart;
-static uptr kHighMemEnd;
-
-static void PrintRange(uptr start, uptr end, const char *name) {
- Printf("|| [%p, %p] || %.*s ||\n", (void *)start, (void *)end, 10, name);
-}
-
-static void PrintAddressSpaceLayout() {
- PrintRange(kHighMemStart, kHighMemEnd, "HighMem");
- if (kHighShadowEnd + 1 < kHighMemStart)
- PrintRange(kHighShadowEnd + 1, kHighMemStart - 1, "ShadowGap");
- else
- CHECK_EQ(kHighShadowEnd + 1, kHighMemStart);
- PrintRange(kHighShadowStart, kHighShadowEnd, "HighShadow");
- if (kLowShadowEnd + 1 < kHighShadowStart)
- PrintRange(kLowShadowEnd + 1, kHighShadowStart - 1, "ShadowGap");
- else
- CHECK_EQ(kLowMemEnd + 1, kHighShadowStart);
- PrintRange(kLowShadowStart, kLowShadowEnd, "LowShadow");
- if (kLowMemEnd + 1 < kLowShadowStart)
- PrintRange(kLowMemEnd + 1, kLowShadowStart - 1, "ShadowGap");
- else
- CHECK_EQ(kLowMemEnd + 1, kLowShadowStart);
- PrintRange(kLowMemStart, kLowMemEnd, "LowMem");
- CHECK_EQ(0, kLowMemStart);
-}
-
-static uptr GetHighMemEnd() {
- // HighMem covers the upper part of the address space.
- uptr max_address = GetMaxUserVirtualAddress();
- // Adjust max address to make sure that kHighMemEnd and kHighMemStart are
- // properly aligned:
- max_address |= (GetMmapGranularity() << kShadowScale) - 1;
- return max_address;
-}
-
-static void InitializeShadowBaseAddress(uptr shadow_size_bytes) {
- __hwasan_shadow_memory_dynamic_address =
- FindDynamicShadowStart(shadow_size_bytes);
-}
-
-bool InitShadow() {
- // Define the entire memory range.
- kHighMemEnd = GetHighMemEnd();
-
- // Determine shadow memory base offset.
- InitializeShadowBaseAddress(MemToShadowSize(kHighMemEnd));
-
- // Place the low memory first.
- kLowMemEnd = __hwasan_shadow_memory_dynamic_address - 1;
- kLowMemStart = 0;
-
- // Define the low shadow based on the already placed low memory.
- kLowShadowEnd = MemToShadow(kLowMemEnd);
- kLowShadowStart = __hwasan_shadow_memory_dynamic_address;
-
- // High shadow takes whatever memory is left up there (making sure it is not
- // interfering with low memory in the fixed case).
- kHighShadowEnd = MemToShadow(kHighMemEnd);
- kHighShadowStart = Max(kLowMemEnd, MemToShadow(kHighShadowEnd)) + 1;
-
- // High memory starts where allocated shadow allows.
- kHighMemStart = ShadowToMem(kHighShadowStart);
-
- // Check the sanity of the defined memory ranges (there might be gaps).
- CHECK_EQ(kHighMemStart % GetMmapGranularity(), 0);
- CHECK_GT(kHighMemStart, kHighShadowEnd);
- CHECK_GT(kHighShadowEnd, kHighShadowStart);
- CHECK_GT(kHighShadowStart, kLowMemEnd);
- CHECK_GT(kLowMemEnd, kLowMemStart);
- CHECK_GT(kLowShadowEnd, kLowShadowStart);
- CHECK_GT(kLowShadowStart, kLowMemEnd);
-
- if (Verbosity())
- PrintAddressSpaceLayout();
-
- // Reserve shadow memory.
- ReserveShadowMemoryRange(kLowShadowStart, kLowShadowEnd, "low shadow");
- ReserveShadowMemoryRange(kHighShadowStart, kHighShadowEnd, "high shadow");
-
- // Protect all the gaps.
- ProtectGap(0, Min(kLowMemStart, kLowShadowStart));
- if (kLowMemEnd + 1 < kLowShadowStart)
- ProtectGap(kLowMemEnd + 1, kLowShadowStart - kLowMemEnd - 1);
- if (kLowShadowEnd + 1 < kHighShadowStart)
- ProtectGap(kLowShadowEnd + 1, kHighShadowStart - kLowShadowEnd - 1);
- if (kHighShadowEnd + 1 < kHighMemStart)
- ProtectGap(kHighShadowEnd + 1, kHighMemStart - kHighShadowEnd - 1);
-
- return true;
-}
-
-void InitThreads() {
- CHECK(__hwasan_shadow_memory_dynamic_address);
- uptr guard_page_size = GetMmapGranularity();
- uptr thread_space_start =
- __hwasan_shadow_memory_dynamic_address - (1ULL << kShadowBaseAlignment);
- uptr thread_space_end =
- __hwasan_shadow_memory_dynamic_address - guard_page_size;
- ReserveShadowMemoryRange(thread_space_start, thread_space_end - 1,
- "hwasan threads");
- ProtectGap(thread_space_end,
- __hwasan_shadow_memory_dynamic_address - thread_space_end);
- InitThreadList(thread_space_start, thread_space_end - thread_space_start);
-}
-
-static void MadviseShadowRegion(uptr beg, uptr end) {
- uptr size = end - beg + 1;
- if (common_flags()->no_huge_pages_for_shadow)
- NoHugePagesInRegion(beg, size);
- if (common_flags()->use_madv_dontdump)
- DontDumpShadowMemory(beg, size);
-}
-
-void MadviseShadow() {
- MadviseShadowRegion(kLowShadowStart, kLowShadowEnd);
- MadviseShadowRegion(kHighShadowStart, kHighShadowEnd);
-}
-
-bool MemIsApp(uptr p) {
- CHECK(GetTagFromPointer(p) == 0);
- return p >= kHighMemStart || (p >= kLowMemStart && p <= kLowMemEnd);
-}
-
-static void HwasanAtExit(void) {
- if (common_flags()->print_module_map)
- DumpProcessMap();
- if (flags()->print_stats && (flags()->atexit || hwasan_report_count > 0))
- ReportStats();
- if (hwasan_report_count > 0) {
- // ReportAtExitStatistics();
- if (common_flags()->exitcode)
- internal__exit(common_flags()->exitcode);
- }
-}
-
-void InstallAtExitHandler() {
- atexit(HwasanAtExit);
-}
-
-// ---------------------- TSD ---------------- {{{1
-
-extern "C" void __hwasan_thread_enter() {
- hwasanThreadList().CreateCurrentThread()->InitRandomState();
-}
-
-extern "C" void __hwasan_thread_exit() {
- Thread *t = GetCurrentThread();
- // Make sure that signal handler can not see a stale current thread pointer.
- atomic_signal_fence(memory_order_seq_cst);
- if (t)
- hwasanThreadList().ReleaseThread(t);
-}
-
-#if HWASAN_WITH_INTERCEPTORS
-static pthread_key_t tsd_key;
-static bool tsd_key_inited = false;
-
-void HwasanTSDThreadInit() {
- if (tsd_key_inited)
- CHECK_EQ(0, pthread_setspecific(tsd_key,
- (void *)GetPthreadDestructorIterations()));
-}
-
-void HwasanTSDDtor(void *tsd) {
- uptr iterations = (uptr)tsd;
- if (iterations > 1) {
- CHECK_EQ(0, pthread_setspecific(tsd_key, (void *)(iterations - 1)));
- return;
- }
- __hwasan_thread_exit();
-}
-
-void HwasanTSDInit() {
- CHECK(!tsd_key_inited);
- tsd_key_inited = true;
- CHECK_EQ(0, pthread_key_create(&tsd_key, HwasanTSDDtor));
-}
-#else
-void HwasanTSDInit() {}
-void HwasanTSDThreadInit() {}
-#endif
-
-#if SANITIZER_ANDROID
-uptr *GetCurrentThreadLongPtr() {
- return (uptr *)get_android_tls_ptr();
-}
-#else
-uptr *GetCurrentThreadLongPtr() {
- return &__hwasan_tls;
-}
-#endif
-
-#if SANITIZER_ANDROID
-void AndroidTestTlsSlot() {
- uptr kMagicValue = 0x010203040A0B0C0D;
- uptr *tls_ptr = GetCurrentThreadLongPtr();
- uptr old_value = *tls_ptr;
- *tls_ptr = kMagicValue;
- dlerror();
- if (*(uptr *)get_android_tls_ptr() != kMagicValue) {
- Printf(
- "ERROR: Incompatible version of Android: TLS_SLOT_SANITIZER(6) is used "
- "for dlerror().\n");
- Die();
- }
- *tls_ptr = old_value;
-}
-#else
-void AndroidTestTlsSlot() {}
-#endif
-
-Thread *GetCurrentThread() {
- uptr *ThreadLong = GetCurrentThreadLongPtr();
-#if HWASAN_WITH_INTERCEPTORS
- if (!*ThreadLong)
- __hwasan_thread_enter();
-#endif
- auto *R = (StackAllocationsRingBuffer *)ThreadLong;
- return hwasanThreadList().GetThreadByBufferAddress((uptr)(R->Next()));
-}
-
-struct AccessInfo {
- uptr addr;
- uptr size;
- bool is_store;
- bool is_load;
- bool recover;
-};
-
-static AccessInfo GetAccessInfo(siginfo_t *info, ucontext_t *uc) {
- // Access type is passed in a platform dependent way (see below) and encoded
- // as 0xXY, 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 passed via
- // platform dependent register (see below).
-#if defined(__aarch64__)
- // Access type is encoded in BRK immediate as 0x900 + 0xXY. For Y == 0xF,
- // access size is stored in X1 register. Access address is always in X0
- // register.
- uptr pc = (uptr)info->si_addr;
- const unsigned code = ((*(u32 *)pc) >> 5) & 0xffff;
- if ((code & 0xff00) != 0x900)
- return AccessInfo{}; // Not ours.
-
- const bool is_store = code & 0x10;
- const bool recover = code & 0x20;
- const uptr addr = uc->uc_mcontext.regs[0];
- const unsigned size_log = code & 0xf;
- if (size_log > 4 && size_log != 0xf)
- return AccessInfo{}; // Not ours.
- const uptr size = size_log == 0xf ? uc->uc_mcontext.regs[1] : 1U << size_log;
-
-#elif defined(__x86_64__)
- // Access type is encoded in the instruction following INT3 as
- // NOP DWORD ptr [EAX + 0x40 + 0xXY]. For Y == 0xF, access size is stored in
- // RSI register. Access address is always in RDI register.
- uptr pc = (uptr)uc->uc_mcontext.gregs[REG_RIP];
- uint8_t *nop = (uint8_t*)pc;
- if (*nop != 0x0f || *(nop + 1) != 0x1f || *(nop + 2) != 0x40 ||
- *(nop + 3) < 0x40)
- return AccessInfo{}; // Not ours.
- const unsigned code = *(nop + 3);
-
- const bool is_store = code & 0x10;
- const bool recover = code & 0x20;
- const uptr addr = uc->uc_mcontext.gregs[REG_RDI];
- const unsigned size_log = code & 0xf;
- if (size_log > 4 && size_log != 0xf)
- return AccessInfo{}; // Not ours.
- const uptr size =
- size_log == 0xf ? uc->uc_mcontext.gregs[REG_RSI] : 1U << size_log;
-
-#else
-# error Unsupported architecture
-#endif
-
- return AccessInfo{addr, size, is_store, !is_store, recover};
-}
-
-static void HandleTagMismatch(AccessInfo ai, uptr pc, uptr frame,
- ucontext_t *uc) {
- InternalMmapVector<BufferedStackTrace> stack_buffer(1);
- BufferedStackTrace *stack = stack_buffer.data();
- stack->Reset();
- GetStackTrace(stack, kStackTraceMax, pc, frame, uc,
- common_flags()->fast_unwind_on_fatal);
-
- bool fatal = flags()->halt_on_error || !ai.recover;
- ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store, fatal);
-}
-
-static bool HwasanOnSIGTRAP(int signo, siginfo_t *info, ucontext_t *uc) {
- AccessInfo ai = GetAccessInfo(info, uc);
- if (!ai.is_store && !ai.is_load)
- return false;
-
- SignalContext sig{info, uc};
- HandleTagMismatch(ai, StackTrace::GetNextInstructionPc(sig.pc), sig.bp, uc);
-
-#if defined(__aarch64__)
- uc->uc_mcontext.pc += 4;
-#elif defined(__x86_64__)
-#else
-# error Unsupported architecture
-#endif
- return true;
-}
-
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __hwasan_tag_mismatch(
- uptr addr, uptr access_info) {
- AccessInfo ai;
- ai.is_store = access_info & 0x10;
- ai.recover = false;
- ai.addr = addr;
- ai.size = 1 << (access_info & 0xf);
-
- HandleTagMismatch(ai, (uptr)__builtin_return_address(0),
- (uptr)__builtin_frame_address(0), nullptr);
- __builtin_unreachable();
-}
-
-static void OnStackUnwind(const SignalContext &sig, const void *,
- BufferedStackTrace *stack) {
- GetStackTrace(stack, kStackTraceMax, StackTrace::GetNextInstructionPc(sig.pc),
- sig.bp, sig.context, common_flags()->fast_unwind_on_fatal);
-}
-
-void HwasanOnDeadlySignal(int signo, void *info, void *context) {
- // Probably a tag mismatch.
- if (signo == SIGTRAP)
- if (HwasanOnSIGTRAP(signo, (siginfo_t *)info, (ucontext_t*)context))
- return;
-
- HandleDeadlySignal(info, context, GetTid(), &OnStackUnwind, nullptr);
-}
-
-
-} // namespace __hwasan
-
-#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD
Copied: compiler-rt/trunk/lib/hwasan/hwasan_linux.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_linux.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_linux.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_linux.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_linux.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_linux.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_linux.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_linux.cc -----------------------------------------*- C++ -*-===//
+//===-- hwasan_linux.cpp ----------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc (removed)
@@ -1,44 +0,0 @@
-//===-- hwasan_memintrinsics.cc ---------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file is a part of HWAddressSanitizer and contains HWASAN versions of
-/// memset, memcpy and memmove
-///
-//===----------------------------------------------------------------------===//
-
-#include <string.h>
-#include "hwasan.h"
-#include "hwasan_checks.h"
-#include "hwasan_flags.h"
-#include "hwasan_interface_internal.h"
-#include "sanitizer_common/sanitizer_libc.h"
-
-using namespace __hwasan;
-
-void *__hwasan_memset(void *block, int c, uptr size) {
- CheckAddressSized<ErrorAction::Recover, AccessType::Store>(
- reinterpret_cast<uptr>(block), size);
- return memset(UntagPtr(block), c, size);
-}
-
-void *__hwasan_memcpy(void *to, const void *from, uptr size) {
- CheckAddressSized<ErrorAction::Recover, AccessType::Store>(
- reinterpret_cast<uptr>(to), size);
- CheckAddressSized<ErrorAction::Recover, AccessType::Load>(
- reinterpret_cast<uptr>(from), size);
- return memcpy(UntagPtr(to), UntagPtr(from), size);
-}
-
-void *__hwasan_memmove(void *to, const void *from, uptr size) {
- CheckAddressSized<ErrorAction::Recover, AccessType::Store>(
- reinterpret_cast<uptr>(to), size);
- CheckAddressSized<ErrorAction::Recover, AccessType::Load>(
- reinterpret_cast<uptr>(from), size);
- return memmove(UntagPtr(to), UntagPtr(from), size);
-}
Copied: compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_memintrinsics.cc ---------------------------------*- C++ -*-===//
+//===-- hwasan_memintrinsics.cpp --------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc (removed)
@@ -1,66 +0,0 @@
-//===-- hwasan_new_delete.cc ----------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of HWAddressSanitizer.
-//
-// Interceptors for operators new and delete.
-//===----------------------------------------------------------------------===//
-
-#include "hwasan.h"
-#include "interception/interception.h"
-#include "sanitizer_common/sanitizer_allocator.h"
-#include "sanitizer_common/sanitizer_allocator_report.h"
-
-#if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
-
-#include <stddef.h>
-
-using namespace __hwasan; // NOLINT
-
-// Fake std::nothrow_t to avoid including <new>.
-namespace std {
- struct nothrow_t {};
-} // namespace std
-
-
-// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
-#define OPERATOR_NEW_BODY(nothrow) \
- GET_MALLOC_STACK_TRACE; \
- void *res = hwasan_malloc(size, &stack);\
- if (!nothrow && UNLIKELY(!res)) ReportOutOfMemory(size, &stack);\
- return res
-
-INTERCEPTOR_ATTRIBUTE
-void *operator new(size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); }
-INTERCEPTOR_ATTRIBUTE
-void *operator new[](size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); }
-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::nothrow_t const&) {
- OPERATOR_NEW_BODY(true /*nothrow*/);
-}
-
-#define OPERATOR_DELETE_BODY \
- GET_MALLOC_STACK_TRACE; \
- if (ptr) hwasan_free(ptr, &stack)
-
-INTERCEPTOR_ATTRIBUTE
-void operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
-INTERCEPTOR_ATTRIBUTE
-void operator delete[](void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
-INTERCEPTOR_ATTRIBUTE
-void operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; }
-INTERCEPTOR_ATTRIBUTE
-void operator delete[](void *ptr, std::nothrow_t const&) {
- OPERATOR_DELETE_BODY;
-}
-
-#endif // HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
Copied: compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_new_delete.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_new_delete.cc ----------------------------------------------===//
+//===-- hwasan_new_delete.cpp ---------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc (removed)
@@ -1,52 +0,0 @@
-//===-- hwasan_poisoning.cc -------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of HWAddressSanitizer.
-//
-//===----------------------------------------------------------------------===//
-
-#include "hwasan_poisoning.h"
-
-#include "hwasan_mapping.h"
-#include "interception/interception.h"
-#include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_linux.h"
-
-namespace __hwasan {
-
-uptr TagMemoryAligned(uptr p, uptr size, tag_t tag) {
- CHECK(IsAligned(p, kShadowAlignment));
- CHECK(IsAligned(size, kShadowAlignment));
- uptr shadow_start = MemToShadow(p);
- uptr shadow_size = MemToShadowSize(size);
-
- uptr page_size = GetPageSizeCached();
- uptr page_start = RoundUpTo(shadow_start, page_size);
- uptr page_end = RoundDownTo(shadow_start + shadow_size, page_size);
- uptr threshold = common_flags()->clear_shadow_mmap_threshold;
- if (SANITIZER_LINUX &&
- UNLIKELY(page_end >= page_start + threshold && tag == 0)) {
- internal_memset((void *)shadow_start, tag, page_start - shadow_start);
- internal_memset((void *)page_end, tag,
- shadow_start + shadow_size - page_end);
- // For an anonymous private mapping MADV_DONTNEED will return a zero page on
- // Linux.
- ReleaseMemoryPagesToOSAndZeroFill(page_start, page_end);
- } else {
- internal_memset((void *)shadow_start, tag, shadow_size);
- }
- return AddTagToPointer(p, tag);
-}
-
-uptr TagMemory(uptr p, uptr size, tag_t tag) {
- uptr start = RoundDownTo(p, kShadowAlignment);
- uptr end = RoundUpTo(p + size, kShadowAlignment);
- return TagMemoryAligned(start, end - start, tag);
-}
-
-} // namespace __hwasan
Copied: compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_poisoning.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_poisoning.cc -------------------------------------*- C++ -*-===//
+//===-- hwasan_poisoning.cpp ------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_report.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_report.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_report.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_report.cc (removed)
@@ -1,436 +0,0 @@
-//===-- hwasan_report.cc --------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of HWAddressSanitizer.
-//
-// Error reporting.
-//===----------------------------------------------------------------------===//
-
-#include "hwasan.h"
-#include "hwasan_allocator.h"
-#include "hwasan_mapping.h"
-#include "hwasan_thread.h"
-#include "hwasan_thread_list.h"
-#include "sanitizer_common/sanitizer_allocator_internal.h"
-#include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_flags.h"
-#include "sanitizer_common/sanitizer_mutex.h"
-#include "sanitizer_common/sanitizer_report_decorator.h"
-#include "sanitizer_common/sanitizer_stackdepot.h"
-#include "sanitizer_common/sanitizer_stacktrace_printer.h"
-#include "sanitizer_common/sanitizer_symbolizer.h"
-
-using namespace __sanitizer;
-
-namespace __hwasan {
-
-class ScopedReport {
- public:
- ScopedReport(bool fatal = false) : error_message_(1), fatal(fatal) {
- BlockingMutexLock lock(&error_message_lock_);
- error_message_ptr_ = fatal ? &error_message_ : nullptr;
- ++hwasan_report_count;
- }
-
- ~ScopedReport() {
- {
- BlockingMutexLock lock(&error_message_lock_);
- if (fatal)
- SetAbortMessage(error_message_.data());
- error_message_ptr_ = nullptr;
- }
- if (common_flags()->print_module_map >= 2 ||
- (fatal && common_flags()->print_module_map))
- DumpProcessMap();
- if (fatal)
- Die();
- }
-
- static void MaybeAppendToErrorMessage(const char *msg) {
- BlockingMutexLock lock(&error_message_lock_);
- if (!error_message_ptr_)
- return;
- uptr len = internal_strlen(msg);
- uptr old_size = error_message_ptr_->size();
- error_message_ptr_->resize(old_size + len);
- // overwrite old trailing '\0', keep new trailing '\0' untouched.
- internal_memcpy(&(*error_message_ptr_)[old_size - 1], msg, len);
- }
- private:
- ScopedErrorReportLock error_report_lock_;
- InternalMmapVector<char> error_message_;
- bool fatal;
-
- static InternalMmapVector<char> *error_message_ptr_;
- static BlockingMutex error_message_lock_;
-};
-
-InternalMmapVector<char> *ScopedReport::error_message_ptr_;
-BlockingMutex ScopedReport::error_message_lock_;
-
-// If there is an active ScopedReport, append to its error message.
-void AppendToErrorMessageBuffer(const char *buffer) {
- ScopedReport::MaybeAppendToErrorMessage(buffer);
-}
-
-static StackTrace GetStackTraceFromId(u32 id) {
- CHECK(id);
- StackTrace res = StackDepotGet(id);
- CHECK(res.trace);
- return res;
-}
-
-// A RAII object that holds a copy of the current thread stack ring buffer.
-// The actual stack buffer may change while we are iterating over it (for
-// example, Printf may call syslog() which can itself be built with hwasan).
-class SavedStackAllocations {
- public:
- SavedStackAllocations(StackAllocationsRingBuffer *rb) {
- uptr size = rb->size() * sizeof(uptr);
- void *storage =
- MmapAlignedOrDieOnFatalError(size, size * 2, "saved stack allocations");
- new (&rb_) StackAllocationsRingBuffer(*rb, storage);
- }
-
- ~SavedStackAllocations() {
- StackAllocationsRingBuffer *rb = get();
- UnmapOrDie(rb->StartOfStorage(), rb->size() * sizeof(uptr));
- }
-
- StackAllocationsRingBuffer *get() {
- return (StackAllocationsRingBuffer *)&rb_;
- }
-
- private:
- uptr rb_;
-};
-
-class Decorator: public __sanitizer::SanitizerCommonDecorator {
- public:
- Decorator() : SanitizerCommonDecorator() { }
- const char *Access() { return Blue(); }
- const char *Allocation() const { return Magenta(); }
- const char *Origin() const { return Magenta(); }
- const char *Name() const { return Green(); }
- const char *Location() { return Green(); }
- const char *Thread() { return Green(); }
-};
-
-// Returns the index of the rb element that matches tagged_addr (plus one),
-// or zero if found nothing.
-uptr FindHeapAllocation(HeapAllocationsRingBuffer *rb,
- uptr tagged_addr,
- HeapAllocationRecord *har) {
- if (!rb) return 0;
- for (uptr i = 0, size = rb->size(); i < size; i++) {
- auto h = (*rb)[i];
- if (h.tagged_addr <= tagged_addr &&
- h.tagged_addr + h.requested_size > tagged_addr) {
- *har = h;
- return i + 1;
- }
- }
- return 0;
-}
-
-void PrintAddressDescription(
- uptr tagged_addr, uptr access_size,
- StackAllocationsRingBuffer *current_stack_allocations) {
- Decorator d;
- int num_descriptions_printed = 0;
- uptr untagged_addr = UntagAddr(tagged_addr);
-
- // Print some very basic information about the address, if it's a heap.
- HwasanChunkView chunk = FindHeapChunkByAddress(untagged_addr);
- if (uptr beg = chunk.Beg()) {
- uptr size = chunk.ActualSize();
- Printf("%s[%p,%p) is a %s %s heap chunk; "
- "size: %zd offset: %zd\n%s",
- d.Location(),
- beg, beg + size,
- chunk.FromSmallHeap() ? "small" : "large",
- chunk.IsAllocated() ? "allocated" : "unallocated",
- size, untagged_addr - beg,
- d.Default());
- }
-
- // Check if this looks like a heap buffer overflow by scanning
- // the shadow left and right and looking for the first adjacent
- // object with a different memory tag. If that tag matches addr_tag,
- // check the allocator if it has a live chunk there.
- tag_t addr_tag = GetTagFromPointer(tagged_addr);
- tag_t *tag_ptr = reinterpret_cast<tag_t*>(MemToShadow(untagged_addr));
- if (*tag_ptr != addr_tag) { // should be true usually.
- tag_t *left = tag_ptr, *right = tag_ptr;
- // scan left.
- for (int i = 0; i < 1000 && *left == *tag_ptr; i++, left--){}
- // scan right.
- for (int i = 0; i < 1000 && *right == *tag_ptr; i++, right++){}
- // Chose the object that has addr_tag and that is closer to addr.
- tag_t *candidate = nullptr;
- if (*right == addr_tag && *left == addr_tag)
- candidate = right - tag_ptr < tag_ptr - left ? right : left;
- else if (*right == addr_tag)
- candidate = right;
- else if (*left == addr_tag)
- candidate = left;
-
- if (candidate) {
- uptr mem = ShadowToMem(reinterpret_cast<uptr>(candidate));
- HwasanChunkView chunk = FindHeapChunkByAddress(mem);
- if (chunk.IsAllocated()) {
- Printf("%s", d.Location());
- Printf(
- "%p is located %zd bytes to the %s of %zd-byte region [%p,%p)\n",
- untagged_addr,
- candidate == left ? untagged_addr - chunk.End()
- : chunk.Beg() - untagged_addr,
- candidate == right ? "left" : "right", chunk.UsedSize(),
- chunk.Beg(), chunk.End());
- Printf("%s", d.Allocation());
- Printf("allocated here:\n");
- Printf("%s", d.Default());
- GetStackTraceFromId(chunk.GetAllocStackId()).Print();
- num_descriptions_printed++;
- }
- }
- }
-
- hwasanThreadList().VisitAllLiveThreads([&](Thread *t) {
- // Scan all threads' ring buffers to find if it's a heap-use-after-free.
- HeapAllocationRecord har;
- if (uptr D = FindHeapAllocation(t->heap_allocations(), tagged_addr, &har)) {
- Printf("%s", d.Location());
- Printf("%p is located %zd bytes inside of %zd-byte region [%p,%p)\n",
- untagged_addr, untagged_addr - UntagAddr(har.tagged_addr),
- har.requested_size, UntagAddr(har.tagged_addr),
- UntagAddr(har.tagged_addr) + har.requested_size);
- Printf("%s", d.Allocation());
- Printf("freed by thread T%zd here:\n", t->unique_id());
- Printf("%s", d.Default());
- GetStackTraceFromId(har.free_context_id).Print();
-
- Printf("%s", d.Allocation());
- Printf("previously allocated here:\n", t);
- Printf("%s", d.Default());
- GetStackTraceFromId(har.alloc_context_id).Print();
-
- // Print a developer note: the index of this heap object
- // in the thread's deallocation ring buffer.
- Printf("hwasan_dev_note_heap_rb_distance: %zd %zd\n", D,
- flags()->heap_history_size);
-
- t->Announce();
- num_descriptions_printed++;
- }
-
- // Very basic check for stack memory.
- if (t->AddrIsInStack(untagged_addr)) {
- Printf("%s", d.Location());
- Printf("Address %p is located in stack of thread T%zd\n", untagged_addr,
- t->unique_id());
- Printf("%s", d.Default());
- t->Announce();
-
- // Temporary report section, needs to be improved.
- Printf("Previously allocated frames:\n");
- auto *sa = (t == GetCurrentThread() && current_stack_allocations)
- ? current_stack_allocations
- : t->stack_allocations();
- uptr frames = Min((uptr)flags()->stack_history_size, sa->size());
- InternalScopedString frame_desc(GetPageSizeCached() * 2);
- for (uptr i = 0; i < frames; i++) {
- uptr record = (*sa)[i];
- if (!record)
- break;
- uptr sp = (record >> 48) << 4;
- uptr pc_mask = (1ULL << 48) - 1;
- uptr pc = record & pc_mask;
- if (SymbolizedStack *frame = Symbolizer::GetOrInit()->SymbolizePC(pc)) {
- frame_desc.append(" sp: 0x%zx ", sp);
- RenderFrame(&frame_desc, "#%n %p %F %L\n", 0, frame->info,
- common_flags()->symbolize_vs_style,
- common_flags()->strip_path_prefix);
- frame->ClearAll();
- if (auto Descr = GetStackFrameDescr(pc))
- frame_desc.append(" %s\n", Descr);
- }
- Printf("%s", frame_desc.data());
- frame_desc.clear();
- }
-
- num_descriptions_printed++;
- }
- });
-
- // Print the remaining threads, as an extra information, 1 line per thread.
- hwasanThreadList().VisitAllLiveThreads([&](Thread *t) { t->Announce(); });
-
- if (!num_descriptions_printed)
- // We exhausted our possibilities. Bail out.
- Printf("HWAddressSanitizer can not describe address in more detail.\n");
-}
-
-void ReportStats() {}
-
-static void PrintTagsAroundAddr(tag_t *tag_ptr) {
- Printf(
- "Memory tags around the buggy address (one tag corresponds to %zd "
- "bytes):\n", kShadowAlignment);
-
- const uptr row_len = 16; // better be power of two.
- const uptr num_rows = 17;
- tag_t *center_row_beg = reinterpret_cast<tag_t *>(
- RoundDownTo(reinterpret_cast<uptr>(tag_ptr), row_len));
- tag_t *beg_row = center_row_beg - row_len * (num_rows / 2);
- tag_t *end_row = center_row_beg + row_len * (num_rows / 2);
- InternalScopedString s(GetPageSizeCached() * 8);
- for (tag_t *row = beg_row; row < end_row; row += row_len) {
- s.append("%s", row == center_row_beg ? "=>" : " ");
- for (uptr i = 0; i < row_len; i++) {
- s.append("%s", row + i == tag_ptr ? "[" : " ");
- s.append("%02x", row[i]);
- s.append("%s", row + i == tag_ptr ? "]" : " ");
- }
- s.append("%s\n", row == center_row_beg ? "<=" : " ");
- }
- Printf("%s", s.data());
-}
-
-void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) {
- ScopedReport R(flags()->halt_on_error);
-
- uptr untagged_addr = UntagAddr(tagged_addr);
- tag_t ptr_tag = GetTagFromPointer(tagged_addr);
- tag_t *tag_ptr = reinterpret_cast<tag_t*>(MemToShadow(untagged_addr));
- tag_t mem_tag = *tag_ptr;
- Decorator d;
- Printf("%s", d.Error());
- uptr pc = stack->size ? stack->trace[0] : 0;
- const char *bug_type = "invalid-free";
- Report("ERROR: %s: %s on address %p at pc %p\n", SanitizerToolName, bug_type,
- untagged_addr, pc);
- Printf("%s", d.Access());
- Printf("tags: %02x/%02x (ptr/mem)\n", ptr_tag, mem_tag);
- Printf("%s", d.Default());
-
- stack->Print();
-
- PrintAddressDescription(tagged_addr, 0, nullptr);
-
- PrintTagsAroundAddr(tag_ptr);
-
- ReportErrorSummary(bug_type, stack);
-}
-
-void ReportTailOverwritten(StackTrace *stack, uptr tagged_addr, uptr orig_size,
- uptr tail_size, const u8 *expected) {
- ScopedReport R(flags()->halt_on_error);
- Decorator d;
- uptr untagged_addr = UntagAddr(tagged_addr);
- Printf("%s", d.Error());
- const char *bug_type = "alocation-tail-overwritten";
- Report("ERROR: %s: %s; heap object [%p,%p) of size %zd\n", SanitizerToolName,
- bug_type, untagged_addr, untagged_addr + orig_size, orig_size);
- Printf("\n%s", d.Default());
- stack->Print();
- HwasanChunkView chunk = FindHeapChunkByAddress(untagged_addr);
- if (chunk.Beg()) {
- Printf("%s", d.Allocation());
- Printf("allocated here:\n");
- Printf("%s", d.Default());
- GetStackTraceFromId(chunk.GetAllocStackId()).Print();
- }
-
- InternalScopedString s(GetPageSizeCached() * 8);
- CHECK_GT(tail_size, 0U);
- CHECK_LT(tail_size, kShadowAlignment);
- u8 *tail = reinterpret_cast<u8*>(untagged_addr + orig_size);
- s.append("Tail contains: ");
- for (uptr i = 0; i < kShadowAlignment - tail_size; i++)
- s.append(".. ");
- for (uptr i = 0; i < tail_size; i++)
- s.append("%02x ", tail[i]);
- s.append("\n");
- s.append("Expected: ");
- for (uptr i = 0; i < kShadowAlignment - tail_size; i++)
- s.append(".. ");
- for (uptr i = 0; i < tail_size; i++)
- s.append("%02x ", expected[i]);
- s.append("\n");
- s.append(" ");
- for (uptr i = 0; i < kShadowAlignment - tail_size; i++)
- s.append(" ");
- for (uptr i = 0; i < tail_size; i++)
- s.append("%s ", expected[i] != tail[i] ? "^^" : " ");
-
- s.append("\nThis error occurs when a buffer overflow overwrites memory\n"
- "to the right of a heap object, but within the %zd-byte granule, e.g.\n"
- " char *x = new char[20];\n"
- " x[25] = 42;\n"
- "By default %s does not detect such bugs at the time of write,\n"
- "but can detect them at the time of free/delete.\n"
- "To disable this feature set HWASAN_OPTIONS=free_checks_tail_magic=0;\n"
- "To enable checking at the time of access, set "
- "HWASAN_OPTIONS=malloc_align_right to non-zero\n\n",
- kShadowAlignment, SanitizerToolName);
- Printf("%s", s.data());
- GetCurrentThread()->Announce();
-
- tag_t *tag_ptr = reinterpret_cast<tag_t*>(MemToShadow(untagged_addr));
- PrintTagsAroundAddr(tag_ptr);
-
- ReportErrorSummary(bug_type, stack);
-}
-
-void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size,
- bool is_store, bool fatal) {
- ScopedReport R(fatal);
- SavedStackAllocations current_stack_allocations(
- GetCurrentThread()->stack_allocations());
-
- Decorator d;
- Printf("%s", d.Error());
- uptr untagged_addr = UntagAddr(tagged_addr);
- // TODO: when possible, try to print heap-use-after-free, etc.
- const char *bug_type = "tag-mismatch";
- uptr pc = stack->size ? stack->trace[0] : 0;
- Report("ERROR: %s: %s on address %p at pc %p\n", SanitizerToolName, bug_type,
- untagged_addr, pc);
-
- Thread *t = GetCurrentThread();
-
- sptr offset =
- __hwasan_test_shadow(reinterpret_cast<void *>(tagged_addr), access_size);
- CHECK(offset >= 0 && offset < static_cast<sptr>(access_size));
- tag_t ptr_tag = GetTagFromPointer(tagged_addr);
- tag_t *tag_ptr =
- reinterpret_cast<tag_t *>(MemToShadow(untagged_addr + offset));
- tag_t mem_tag = *tag_ptr;
-
- Printf("%s", d.Access());
- Printf("%s of size %zu at %p tags: %02x/%02x (ptr/mem) in thread T%zd\n",
- is_store ? "WRITE" : "READ", access_size, untagged_addr, ptr_tag,
- mem_tag, t->unique_id());
- if (offset != 0)
- Printf("Invalid access starting at offset [%zu, %zu)\n", offset,
- Min(access_size, static_cast<uptr>(offset) + (1 << kShadowScale)));
- Printf("%s", d.Default());
-
- stack->Print();
-
- PrintAddressDescription(tagged_addr, access_size,
- current_stack_allocations.get());
- t->Announce();
-
- PrintTagsAroundAddr(tag_ptr);
-
- ReportErrorSummary(bug_type, stack);
-}
-
-} // namespace __hwasan
Copied: compiler-rt/trunk/lib/hwasan/hwasan_report.cpp (from r354988, compiler-rt/trunk/lib/hwasan/hwasan_report.cc)
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_report.cpp?p2=compiler-rt/trunk/lib/hwasan/hwasan_report.cpp&p1=compiler-rt/trunk/lib/hwasan/hwasan_report.cc&r1=354988&r2=354989&rev=354989&view=diff
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_report.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_report.cpp Wed Feb 27 07:44:03 2019
@@ -1,4 +1,4 @@
-//===-- hwasan_report.cc --------------------------------------------------===//
+//===-- hwasan_report.cpp -------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
Removed: compiler-rt/trunk/lib/hwasan/hwasan_thread.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_thread.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_thread.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_thread.cc (removed)
@@ -1,122 +0,0 @@
-
-#include "hwasan.h"
-#include "hwasan_mapping.h"
-#include "hwasan_thread.h"
-#include "hwasan_poisoning.h"
-#include "hwasan_interface_internal.h"
-
-#include "sanitizer_common/sanitizer_file.h"
-#include "sanitizer_common/sanitizer_placement_new.h"
-#include "sanitizer_common/sanitizer_tls_get_addr.h"
-
-
-namespace __hwasan {
-
-static u32 RandomSeed() {
- u32 seed;
- do {
- if (UNLIKELY(!GetRandom(reinterpret_cast<void *>(&seed), sizeof(seed),
- /*blocking=*/false))) {
- seed = static_cast<u32>(
- (NanoTime() >> 12) ^
- (reinterpret_cast<uptr>(__builtin_frame_address(0)) >> 4));
- }
- } while (!seed);
- return seed;
-}
-
-void Thread::InitRandomState() {
- random_state_ = flags()->random_tags ? RandomSeed() : unique_id_;
-}
-
-void Thread::Init(uptr stack_buffer_start, uptr stack_buffer_size) {
- static u64 unique_id;
- unique_id_ = unique_id++;
- if (auto sz = flags()->heap_history_size)
- heap_allocations_ = HeapAllocationsRingBuffer::New(sz);
-
- HwasanTSDThreadInit(); // Only needed with interceptors.
- uptr *ThreadLong = GetCurrentThreadLongPtr();
- // The following implicitly sets (this) as the current thread.
- stack_allocations_ = new (ThreadLong)
- StackAllocationsRingBuffer((void *)stack_buffer_start, stack_buffer_size);
- // Check that it worked.
- CHECK_EQ(GetCurrentThread(), this);
-
- // ScopedTaggingDisable needs GetCurrentThread to be set up.
- ScopedTaggingDisabler disabler;
-
- uptr tls_size;
- uptr stack_size;
- GetThreadStackAndTls(IsMainThread(), &stack_bottom_, &stack_size, &tls_begin_,
- &tls_size);
- stack_top_ = stack_bottom_ + stack_size;
- tls_end_ = tls_begin_ + tls_size;
-
- if (stack_bottom_) {
- int local;
- CHECK(AddrIsInStack((uptr)&local));
- CHECK(MemIsApp(stack_bottom_));
- CHECK(MemIsApp(stack_top_ - 1));
- }
-
- if (flags()->verbose_threads) {
- if (IsMainThread()) {
- Printf("sizeof(Thread): %zd sizeof(HeapRB): %zd sizeof(StackRB): %zd\n",
- sizeof(Thread), heap_allocations_->SizeInBytes(),
- stack_allocations_->size() * sizeof(uptr));
- }
- Print("Creating : ");
- }
-}
-
-void Thread::ClearShadowForThreadStackAndTLS() {
- if (stack_top_ != stack_bottom_)
- TagMemory(stack_bottom_, stack_top_ - stack_bottom_, 0);
- if (tls_begin_ != tls_end_)
- TagMemory(tls_begin_, tls_end_ - tls_begin_, 0);
-}
-
-void Thread::Destroy() {
- if (flags()->verbose_threads)
- Print("Destroying: ");
- AllocatorSwallowThreadLocalCache(allocator_cache());
- ClearShadowForThreadStackAndTLS();
- if (heap_allocations_)
- heap_allocations_->Delete();
- DTLS_Destroy();
-}
-
-void Thread::Print(const char *Prefix) {
- Printf("%sT%zd %p stack: [%p,%p) sz: %zd tls: [%p,%p)\n", Prefix,
- unique_id_, this, stack_bottom(), stack_top(),
- stack_top() - stack_bottom(),
- tls_begin(), tls_end());
-}
-
-static u32 xorshift(u32 state) {
- state ^= state << 13;
- state ^= state >> 17;
- state ^= state << 5;
- return state;
-}
-
-// Generate a (pseudo-)random non-zero tag.
-tag_t Thread::GenerateRandomTag() {
- if (tagging_disabled_) return 0;
- tag_t tag;
- do {
- if (flags()->random_tags) {
- if (!random_buffer_)
- random_buffer_ = random_state_ = xorshift(random_state_);
- CHECK(random_buffer_);
- tag = random_buffer_ & 0xFF;
- random_buffer_ >>= 8;
- } else {
- tag = random_state_ = (random_state_ + 1) & 0xFF;
- }
- } while (!tag);
- return tag;
-}
-
-} // namespace __hwasan
Removed: compiler-rt/trunk/lib/hwasan/hwasan_thread_list.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_thread_list.cc?rev=354988&view=auto
==============================================================================
--- compiler-rt/trunk/lib/hwasan/hwasan_thread_list.cc (original)
+++ compiler-rt/trunk/lib/hwasan/hwasan_thread_list.cc (removed)
@@ -1,15 +0,0 @@
-#include "hwasan_thread_list.h"
-
-namespace __hwasan {
-static ALIGNED(16) char thread_list_placeholder[sizeof(HwasanThreadList)];
-static HwasanThreadList *hwasan_thread_list;
-
-HwasanThreadList &hwasanThreadList() { return *hwasan_thread_list; }
-
-void InitThreadList(uptr storage, uptr size) {
- CHECK(hwasan_thread_list == nullptr);
- hwasan_thread_list =
- new (thread_list_placeholder) HwasanThreadList(storage, size);
-}
-
-} // namespace
More information about the llvm-commits
mailing list