summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/asan/asan_linux.cc
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-11-10 22:27:48 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-11-10 22:27:48 +0000
commit989299c42b00d2cfedd1c65f663b51ee45d84f69 (patch)
treea62ab30ce0c82302d55b360b375f9eee99928ec8 /compiler-rt/lib/asan/asan_linux.cc
parentba664c1d047a7ec1ac86adaf178bf829cdfd5961 (diff)
downloadbcm5719-llvm-989299c42b00d2cfedd1c65f663b51ee45d84f69.tar.gz
bcm5719-llvm-989299c42b00d2cfedd1c65f663b51ee45d84f69.zip
[asan] Use dynamic shadow on 32-bit Android.
Summary: The following kernel change has moved ET_DYN base to 0x4000000 on arm32: https://marc.info/?l=linux-kernel&m=149825162606848&w=2 Switch to dynamic shadow base to avoid such conflicts in the future. Reserve shadow memory in an ifunc resolver, but don't use it in the instrumentation until PR35221 is fixed. This will eventually let use save one load per function. Reviewers: kcc Subscribers: aemerson, srhines, kubamracek, kristof.beyls, hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D39393 llvm-svn: 317943
Diffstat (limited to 'compiler-rt/lib/asan/asan_linux.cc')
-rw-r--r--compiler-rt/lib/asan/asan_linux.cc32
1 files changed, 30 insertions, 2 deletions
diff --git a/compiler-rt/lib/asan/asan_linux.cc b/compiler-rt/lib/asan/asan_linux.cc
index a949a9888e2..902c64cc4e0 100644
--- a/compiler-rt/lib/asan/asan_linux.cc
+++ b/compiler-rt/lib/asan/asan_linux.cc
@@ -17,6 +17,7 @@
#include "asan_interceptors.h"
#include "asan_internal.h"
+#include "asan_premap_shadow.h"
#include "asan_thread.h"
#include "sanitizer_common/sanitizer_flags.h"
#include "sanitizer_common/sanitizer_freebsd.h"
@@ -81,10 +82,37 @@ void *AsanDoesNotSupportStaticLinkage() {
return &_DYNAMIC; // defined in link.h
}
+#if ASAN_PREMAP_SHADOW
uptr FindDynamicShadowStart() {
- UNREACHABLE("FindDynamicShadowStart is not available");
- return 0;
+ uptr granularity = GetMmapGranularity();
+ uptr shadow_start = reinterpret_cast<uptr>(&__asan_shadow);
+ uptr shadow_size = PremapShadowSize();
+ UnmapOrDie((void *)(shadow_start - granularity), shadow_size + granularity);
+ // MmapNoAccess does not touch TotalMmap, but UnmapOrDie decreases it.
+ // Compensate.
+ IncreaseTotalMmap(shadow_size + granularity);
+ return shadow_start;
}
+#else
+uptr FindDynamicShadowStart() {
+ uptr granularity = GetMmapGranularity();
+ uptr alignment = granularity * 8;
+ uptr left_padding = granularity;
+ uptr shadow_size = kHighShadowEnd + left_padding;
+ uptr map_size = shadow_size + alignment;
+
+ uptr map_start = (uptr)MmapNoAccess(map_size);
+ CHECK_NE(map_start, ~(uptr)0);
+
+ uptr shadow_start = RoundUpTo(map_start, alignment);
+ UnmapOrDie((void *)map_start, map_size);
+ // MmapNoAccess does not touch TotalMmap, but UnmapOrDie decreases it.
+ // Compensate.
+ IncreaseTotalMmap(map_size);
+
+ return shadow_start;
+}
+#endif
void AsanApplyToGlobals(globals_op_fptr op, const void *needle) {
UNIMPLEMENTED();
OpenPOWER on IntegriCloud