summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/sanitizer_common
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-09-26 23:48:13 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-09-26 23:48:13 +0000
commitf42aa29b68ae1bdf22549efde2844a070e82b4ec (patch)
tree12dceb071df0855c601eedc47d10d7ee3deb0108 /compiler-rt/lib/sanitizer_common
parent0dae6369883ac99e8c2a0344cf3d9276e0cdd181 (diff)
downloadbcm5719-llvm-f42aa29b68ae1bdf22549efde2844a070e82b4ec.tar.gz
bcm5719-llvm-f42aa29b68ae1bdf22549efde2844a070e82b4ec.zip
[sanitizer] AndroidGetApiLevel for static executables.
A version of AndroidGetApiLevel for static executables that is completely compile-time. The generic version uses dl_iterate_phdr which, even though it works in static executables, crashes if called before libc is initialized. llvm-svn: 343153
Diffstat (limited to 'compiler-rt/lib/sanitizer_common')
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_linux.cc15
1 files changed, 14 insertions, 1 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
index ca8138b7ee8..a2aa77869a7 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
@@ -1671,6 +1671,16 @@ static int dl_iterate_phdr_test_cb(struct dl_phdr_info *info, size_t size,
static atomic_uint32_t android_api_level;
+static AndroidApiLevel AndroidDetectApiLevelStatic() {
+#if __ANDROID_API__ <= 19
+ return ANDROID_KITKAT;
+#elif __ANDROID_API__ <= 22
+ return ANDROID_LOLLIPOP_MR1;
+#else
+ return ANDROID_POST_LOLLIPOP;
+#endif
+}
+
static AndroidApiLevel AndroidDetectApiLevel() {
if (!&dl_iterate_phdr)
return ANDROID_KITKAT; // K or lower
@@ -1683,11 +1693,14 @@ static AndroidApiLevel AndroidDetectApiLevel() {
// interesting to detect.
}
+extern "C" __attribute__((weak)) void* _DYNAMIC;
+
AndroidApiLevel AndroidGetApiLevel() {
AndroidApiLevel level =
(AndroidApiLevel)atomic_load(&android_api_level, memory_order_relaxed);
if (level) return level;
- level = AndroidDetectApiLevel();
+ level = &_DYNAMIC == nullptr ? AndroidDetectApiLevelStatic()
+ : AndroidDetectApiLevel();
atomic_store(&android_api_level, level, memory_order_relaxed);
return level;
}
OpenPOWER on IntegriCloud