diff options
author | Kostya Serebryany <kcc@google.com> | 2014-04-21 07:09:01 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2014-04-21 07:09:01 +0000 |
commit | 3d2629c5142f5659d9c1bdbb1948fc78c5afb61c (patch) | |
tree | 93a890bd839295ae499c869ad89a9e1a6d6dc0f0 /compiler-rt | |
parent | 137a84616c961011ea55aa36bd181b025acc7c98 (diff) | |
download | bcm5719-llvm-3d2629c5142f5659d9c1bdbb1948fc78c5afb61c.tar.gz bcm5719-llvm-3d2629c5142f5659d9c1bdbb1948fc78c5afb61c.zip |
[asan] implement __asan_loadN/__asan_storeN for out-lined asan checks
llvm-svn: 206733
Diffstat (limited to 'compiler-rt')
-rw-r--r-- | compiler-rt/lib/asan/asan_interface_internal.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/asan/asan_rtl.cc | 23 |
2 files changed, 22 insertions, 3 deletions
diff --git a/compiler-rt/lib/asan/asan_interface_internal.h b/compiler-rt/lib/asan/asan_interface_internal.h index 6a6ab002e82..99aaa9f6b28 100644 --- a/compiler-rt/lib/asan/asan_interface_internal.h +++ b/compiler-rt/lib/asan/asan_interface_internal.h @@ -135,6 +135,8 @@ extern "C" { SANITIZER_INTERFACE_ATTRIBUTE void __asan_store4(uptr p); SANITIZER_INTERFACE_ATTRIBUTE void __asan_store8(uptr p); SANITIZER_INTERFACE_ATTRIBUTE void __asan_store16(uptr p); + SANITIZER_INTERFACE_ATTRIBUTE void __asan_loadN(uptr p, uptr size); + SANITIZER_INTERFACE_ATTRIBUTE void __asan_storeN(uptr p, uptr size); } // extern "C" #endif // ASAN_INTERFACE_INTERNAL_H diff --git a/compiler-rt/lib/asan/asan_rtl.cc b/compiler-rt/lib/asan/asan_rtl.cc index 8ac373ed3c2..d608dd71172 100644 --- a/compiler-rt/lib/asan/asan_rtl.cc +++ b/compiler-rt/lib/asan/asan_rtl.cc @@ -381,9 +381,10 @@ ASAN_REPORT_ERROR_N(store, true) uptr sp = MEM_TO_SHADOW(addr); \ uptr s = size <= SHADOW_GRANULARITY ? *reinterpret_cast<u8 *>(sp) \ : *reinterpret_cast<u16 *>(sp); \ - if (s) { \ - if (size >= SHADOW_GRANULARITY || \ - ((s8)((addr & (SHADOW_GRANULARITY - 1)) + size - 1)) >= (s8)s) { \ + if (UNLIKELY(s)) { \ + if (UNLIKELY(size >= SHADOW_GRANULARITY || \ + ((s8)((addr & (SHADOW_GRANULARITY - 1)) + size - 1)) >= \ + (s8)s)) { \ if (__asan_test_only_reported_buggy_pointer) { \ *__asan_test_only_reported_buggy_pointer = addr; \ } else { \ @@ -405,6 +406,22 @@ ASAN_MEMORY_ACCESS_CALLBACK(store, true, 4) ASAN_MEMORY_ACCESS_CALLBACK(store, true, 8) ASAN_MEMORY_ACCESS_CALLBACK(store, true, 16) +extern "C" +NOINLINE INTERFACE_ATTRIBUTE void __asan_loadN(uptr addr, uptr size) { + if (__asan_region_is_poisoned(addr, size)) { + GET_CALLER_PC_BP_SP; + __asan_report_error(pc, bp, sp, addr, false, size); + } +} + +extern "C" +NOINLINE INTERFACE_ATTRIBUTE void __asan_storeN(uptr addr, uptr size) { + if (__asan_region_is_poisoned(addr, size)) { + GET_CALLER_PC_BP_SP; + __asan_report_error(pc, bp, sp, addr, true, size); + } +} + // Force the linker to keep the symbols for various ASan interface functions. // We want to keep those in the executable in order to let the instrumented // dynamic libraries access the symbol even if it is not used by the executable |