summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-01-23 11:34:41 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-01-23 11:34:41 +0000
commitb49ac03ebd0f1ae292e591726176d18a8725a193 (patch)
tree6a735b0c4d66165028061064bb6e110bbe000781
parenta278e2737c7e492d3f125fe9e10ca934f0b80bad (diff)
[asan] Android logging.
This change duplicates all ASan output to system log on Android. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@199887 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/asan/CMakeLists.txt2
-rw-r--r--lib/asan/tests/CMakeLists.txt1
-rw-r--r--lib/sanitizer_common/sanitizer_common.h6
-rw-r--r--lib/sanitizer_common/sanitizer_linux.cc15
-rw-r--r--lib/sanitizer_common/sanitizer_printf.cc1
-rw-r--r--lib/sanitizer_common/tests/CMakeLists.txt1
-rw-r--r--make/platform/clang_linux.mk2
7 files changed, 26 insertions, 2 deletions
diff --git a/lib/asan/CMakeLists.txt b/lib/asan/CMakeLists.txt
index 29e80324b..b3808a541 100644
--- a/lib/asan/CMakeLists.txt
+++ b/lib/asan/CMakeLists.txt
@@ -104,7 +104,7 @@ elseif(ANDROID)
${ASAN_CFLAGS})
set_property(TARGET clang_rt.asan-arm-android APPEND PROPERTY
COMPILE_DEFINITIONS ${ASAN_COMMON_DEFINITIONS})
- target_link_libraries(clang_rt.asan-arm-android dl)
+ target_link_libraries(clang_rt.asan-arm-android dl log)
list(APPEND ASAN_RUNTIME_LIBRARIES clang_rt.asan-arm-android)
else()
# Build separate libraries for each target.
diff --git a/lib/asan/tests/CMakeLists.txt b/lib/asan/tests/CMakeLists.txt
index ecf2f0a6d..0c890f9de 100644
--- a/lib/asan/tests/CMakeLists.txt
+++ b/lib/asan/tests/CMakeLists.txt
@@ -223,6 +223,7 @@ if(ANDROID)
${ASAN_NOINST_TEST_SOURCES})
set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS})
set_target_link_flags(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LINKFLAGS})
+ target_link_libraries(AsanNoinstTest log)
# Test with ASan instrumentation. Link with ASan dynamic runtime.
add_executable(AsanTest
diff --git a/lib/sanitizer_common/sanitizer_common.h b/lib/sanitizer_common/sanitizer_common.h
index 587cb4c01..2080214cf 100644
--- a/lib/sanitizer_common/sanitizer_common.h
+++ b/lib/sanitizer_common/sanitizer_common.h
@@ -495,6 +495,12 @@ F IndirectExternCall(F f) {
return f;
}
#endif
+
+#if SANITIZER_ANDROID
+void AndroidLogWrite(const char *buffer);
+#else
+INLINE void AndroidLogWrite(const char *buffer_unused) {}
+#endif
} // namespace __sanitizer
inline void *operator new(__sanitizer::operator_new_size_type size,
diff --git a/lib/sanitizer_common/sanitizer_linux.cc b/lib/sanitizer_common/sanitizer_linux.cc
index 6f5a7e0ec..257cd0131 100644
--- a/lib/sanitizer_common/sanitizer_linux.cc
+++ b/lib/sanitizer_common/sanitizer_linux.cc
@@ -48,6 +48,10 @@
#include <sys/signal.h>
#endif
+#if SANITIZER_ANDROID
+#include <android/log.h>
+#endif
+
// <linux/time.h>
struct kernel_timeval {
long tv_sec;
@@ -646,6 +650,17 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
return res;
}
#endif // defined(__x86_64__)
+
+#if SANITIZER_ANDROID
+// This thing is not, strictly speaking, async signal safe, but it does not seem
+// to cause any issues. Alternative is writing to log devices directly, but
+// their location and message format might change in the future, so we'd really
+// like to avoid that.
+void AndroidLogWrite(const char *buffer) {
+ __android_log_write(ANDROID_LOG_INFO, NULL, buffer);
+}
+#endif
+
} // namespace __sanitizer
#endif // SANITIZER_LINUX
diff --git a/lib/sanitizer_common/sanitizer_printf.cc b/lib/sanitizer_common/sanitizer_printf.cc
index 43bdf2c36..801813124 100644
--- a/lib/sanitizer_common/sanitizer_printf.cc
+++ b/lib/sanitizer_common/sanitizer_printf.cc
@@ -272,6 +272,7 @@ static void SharedPrintfCode(bool append_pid, const char *format,
break;
}
RawWrite(buffer);
+ AndroidLogWrite(buffer);
CallPrintfAndReportCallback(buffer);
// If we had mapped any memory, clean up.
if (buffer != local_buffer)
diff --git a/lib/sanitizer_common/tests/CMakeLists.txt b/lib/sanitizer_common/tests/CMakeLists.txt
index 5b48b6b61..b6667438b 100644
--- a/lib/sanitizer_common/tests/CMakeLists.txt
+++ b/lib/sanitizer_common/tests/CMakeLists.txt
@@ -165,6 +165,7 @@ if(ANDROID)
set_target_properties(SanitizerTest PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON})
+ target_link_libraries(SanitizerTest log)
# Add unit test to test suite.
add_dependencies(SanitizerUnitTests SanitizerTest)
endif()
diff --git a/make/platform/clang_linux.mk b/make/platform/clang_linux.mk
index d0962c931..e80c5b1c7 100644
--- a/make/platform/clang_linux.mk
+++ b/make/platform/clang_linux.mk
@@ -111,7 +111,7 @@ ANDROID_COMMON_FLAGS := -target arm-linux-androideabi \
-B$(LLVM_ANDROID_TOOLCHAIN_DIR)
CFLAGS.asan-arm-android := $(CFLAGS) -fPIC -fno-builtin \
$(ANDROID_COMMON_FLAGS) -mllvm -arm-enable-ehabi -fno-rtti
-LDFLAGS.asan-arm-android := $(LDFLAGS) $(ANDROID_COMMON_FLAGS) -ldl -lm \
+LDFLAGS.asan-arm-android := $(LDFLAGS) $(ANDROID_COMMON_FLAGS) -ldl -lm -llog \
-Wl,-soname=libclang_rt.asan-arm-android.so -Wl,-z,defs
# Use our stub SDK as the sysroot to support more portable building. For now we