[compiler-rt] r318410 - [sanitizer] Use runtime checks instead of API level for Android logging
Kostya Kortchinsky via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 16 08:19:44 PST 2017
Author: cryptoad
Date: Thu Nov 16 08:19:44 2017
New Revision: 318410
URL: http://llvm.org/viewvc/llvm-project?rev=318410&view=rev
Log:
[sanitizer] Use runtime checks instead of API level for Android logging
Summary:
Recent Bionic have a slew of `async_safe_*` logging functions that are
basically the liblog ones but included within the libc. They have the advantage
of not allocating memory. `async_safe_write_log` does no formatting and is
likely the best candidate for logging.
Use a weak definition to try and use it. Also, avoid API level checks (as
the toolchain is compiled at a rather low API level) for `__android_log_write`
in favor of a weak definition as well.
Keep the fallback to `syslog` if nothing else was found.
I tried to overhaul the code block to only have a single #if SANITIZER_ANDROID
but I am not particularly attached to the form. LMKWYT.
Reviewers: eugenis
Reviewed By: eugenis
Subscribers: srhines, kubamracek, llvm-commits
Differential Revision: https://reviews.llvm.org/D40100
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc?rev=318410&r1=318409&r2=318410&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc Thu Nov 16 08:19:44 2017
@@ -48,10 +48,6 @@
#include <android/api-level.h>
#endif
-#if SANITIZER_ANDROID && __ANDROID_API__ < 21
-#include <android/log.h>
-#endif
-
#if !SANITIZER_ANDROID
#include <elf.h>
#include <unistd.h>
@@ -538,12 +534,9 @@ uptr GetRSS() {
return rss * GetPageSizeCached();
}
-// 64-bit Android targets don't provide the deprecated __android_log_write.
-// Starting with the L release, syslog() works and is preferable to
-// __android_log_write.
#if SANITIZER_LINUX
-#if SANITIZER_ANDROID
+# if SANITIZER_ANDROID
static atomic_uint8_t android_log_initialized;
void AndroidLogInit() {
@@ -554,35 +547,53 @@ void AndroidLogInit() {
static bool ShouldLogAfterPrintf() {
return atomic_load(&android_log_initialized, memory_order_acquire);
}
-#else
+
+extern "C" SANITIZER_WEAK_ATTRIBUTE
+int async_safe_write_log(int pri, const char* tag, const char* msg);
+extern "C" SANITIZER_WEAK_ATTRIBUTE
+int __android_log_write(int prio, const char* tag, const char* msg);
+
+// ANDROID_LOG_INFO is 4, but can't be resolved at runtime.
+#define SANITIZER_ANDROID_LOG_INFO 4
+
+// async_safe_write_log is basically __android_log_write but is only available
+// in recent versions of Bionic. __android_log_write was deprecated along the
+// way, so fallback to syslog if neither exists. The non-syslog alternatives
+// do not allocate memory and are preferable. Also syslog is broken pre-L, this
+// is another reason why we prefer __android_log_write if available.
+void WriteOneLineToSyslog(const char *s) {
+ if (&async_safe_write_log) {
+ async_safe_write_log(SANITIZER_ANDROID_LOG_INFO, GetProcessName(), s);
+ } else if (&__android_log_write) {
+ __android_log_write(SANITIZER_ANDROID_LOG_INFO, nullptr, s);
+ } else {
+ syslog(LOG_INFO, "%s", s);
+ }
+}
+
+extern "C" SANITIZER_WEAK_ATTRIBUTE
+void android_set_abort_message(const char *);
+
+void SetAbortMessage(const char *str) {
+ if (&android_set_abort_message)
+ android_set_abort_message(str);
+}
+# else
void AndroidLogInit() {}
static bool ShouldLogAfterPrintf() { return true; }
-#endif // SANITIZER_ANDROID
-void WriteOneLineToSyslog(const char *s) {
-#if SANITIZER_ANDROID &&__ANDROID_API__ < 21
- __android_log_write(ANDROID_LOG_INFO, NULL, s);
-#else
- syslog(LOG_INFO, "%s", s);
-#endif
-}
+void WriteOneLineToSyslog(const char *s) { syslog(LOG_INFO, "%s", s); }
+
+void SetAbortMessage(const char *str) {}
+# endif // SANITIZER_ANDROID
void LogMessageOnPrintf(const char *str) {
if (common_flags()->log_to_syslog && ShouldLogAfterPrintf())
WriteToSyslog(str);
}
-#if SANITIZER_ANDROID
-extern "C" __attribute__((weak)) void android_set_abort_message(const char *);
-void SetAbortMessage(const char *str) {
- if (&android_set_abort_message) android_set_abort_message(str);
-}
-#else
-void SetAbortMessage(const char *str) {}
-#endif
-
-#endif // SANITIZER_LINUX
+#endif // SANITIZER_LINUX
} // namespace __sanitizer
More information about the llvm-commits
mailing list