[compiler-rt] r243051 - [sanitizer] Implement logging to syslog.
Alexey Samsonov
vonosmas at gmail.com
Mon Jul 27 17:13:39 PDT 2015
Have you seen this build failure?
http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/5766/steps/compile/logs/stdio
On Thu, Jul 23, 2015 at 3:05 PM, Evgeniy Stepanov <eugeni.stepanov at gmail.com
> wrote:
> Author: eugenis
> Date: Thu Jul 23 17:05:20 2015
> New Revision: 243051
>
> URL: http://llvm.org/viewvc/llvm-project?rev=243051&view=rev
> Log:
> [sanitizer] Implement logging to syslog.
>
> Previously, Android target had a logic of duplicating all sanitizer
> output to logcat. This change extends it to all posix platforms via
> the use of syslog, controlled by log_to_syslog flag. Enabled by
> default on Android, off everywhere else.
>
> A bit of cmake magic is required to allow Printf() to call a libc
> function. I'm adding a stub implementation to support no-libc builds
> like dfsan and safestack.
>
> This is a second attempt. I believe I've fixed all the issues that
> prompted the revert: Mac build, and all kinds of non-CMake builds
> (there are 3 of those).
>
> Added:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc
> Modified:
> compiler-rt/trunk/lib/dfsan/CMakeLists.txt
> compiler-rt/trunk/lib/safestack/CMakeLists.txt
> compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt
> compiler-rt/trunk/lib/sanitizer_common/Makefile.mk
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix_libcdep.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc
> compiler-rt/trunk/lib/sanitizer_common/tests/CMakeLists.txt
> compiler-rt/trunk/lib/tsan/go/buildgo.sh
> compiler-rt/trunk/lib/tsan/rtl/Makefile.old
>
> Modified: compiler-rt/trunk/lib/dfsan/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/CMakeLists.txt?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/dfsan/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/dfsan/CMakeLists.txt Thu Jul 23 17:05:20 2015
> @@ -25,6 +25,7 @@ foreach(arch ${DFSAN_SUPPORTED_ARCH})
> add_compiler_rt_runtime(clang_rt.dfsan-libc-${arch} ${arch} STATIC
> SOURCES ${DFSAN_RTL_SOURCES}
> $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
> + $<TARGET_OBJECTS:RTSanitizerCommonNoLibc.${arch}>
> CFLAGS ${DFSAN_NOLIBC_CFLAGS})
> add_sanitizer_rt_symbols(clang_rt.dfsan-${arch} dfsan.syms.extra)
> add_dependencies(dfsan
>
> Modified: compiler-rt/trunk/lib/safestack/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/safestack/CMakeLists.txt?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/safestack/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/safestack/CMakeLists.txt Thu Jul 23 17:05:20 2015
> @@ -22,6 +22,7 @@ else()
> SOURCES ${SAFESTACK_SOURCES}
> $<TARGET_OBJECTS:RTInterception.${arch}>
> $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
> + $<TARGET_OBJECTS:RTSanitizerCommonNoLibc.${arch}>
> CFLAGS ${SAFESTACK_CFLAGS})
> add_dependencies(safestack clang_rt.safestack-${arch})
> endforeach()
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt Thu Jul 23
> 17:05:20 2015
> @@ -33,6 +33,12 @@ set(SANITIZER_SOURCES
> sanitizer_thread_registry.cc
> sanitizer_win.cc)
>
> +# Libc functions stubs. These sources should be linked instead of
> +# SANITIZER_LIBCDEP_SOURCES when sanitizer_common library must not depend
> on
> +# libc.
> +set(SANITIZER_NOLIBC_SOURCES
> + sanitizer_common_nolibc.cc)
> +
> set(SANITIZER_LIBCDEP_SOURCES
> sanitizer_common_libcdep.cc
> sanitizer_coverage_libcdep.cc
> @@ -145,6 +151,10 @@ else()
> ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
> SOURCES ${SANITIZER_SOURCES} CFLAGS ${SANITIZER_CFLAGS}
> DEFS ${SANITIZER_COMMON_DEFINITIONS})
> + add_compiler_rt_object_libraries(RTSanitizerCommonNoLibc
> + ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
> + SOURCES ${SANITIZER_NOLIBC_SOURCES} CFLAGS ${SANITIZER_CFLAGS}
> + DEFS ${SANITIZER_COMMON_DEFINITIONS})
> add_compiler_rt_object_libraries(RTSanitizerCommonLibc
> ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
> SOURCES ${SANITIZER_LIBCDEP_SOURCES} CFLAGS ${SANITIZER_CFLAGS}
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/Makefile.mk
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/Makefile.mk?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/Makefile.mk (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/Makefile.mk Thu Jul 23 17:05:20
> 2015
> @@ -11,6 +11,7 @@ ModuleName := sanitizer_common
> SubDirs :=
>
> Sources := $(foreach file,$(wildcard $(Dir)/*.cc),$(notdir $(file)))
> +Sources := $(filter-out $(wildcard $(Dir)/*_nolibc.cc),$(Sources))
> ObjNames := $(Sources:%.cc=%.o)
>
> Implementation := Generic
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Thu Jul 23
> 17:05:20 2015
> @@ -628,15 +628,20 @@ enum AndroidApiLevel {
> ANDROID_POST_LOLLIPOP = 23
> };
>
> -#if SANITIZER_ANDROID
> +#if SANITIZER_LINUX
> // Initialize Android logging. Any writes before this are silently lost.
> void AndroidLogInit();
> -void AndroidLogWrite(const char *buffer);
> +void WriteToSyslog(const char *buffer);
> +#else
> +INLINE void AndroidLogInit() {}
> +INLINE void WriteToSyslog(const char *buffer) {}
> +#endif
> +
> +#if SANITIZER_ANDROID
> void GetExtraActivationFlags(char *buf, uptr size);
> void SanitizerInitializeUnwinder();
> AndroidApiLevel AndroidGetApiLevel();
> #else
> -INLINE void AndroidLogInit() {}
> INLINE void AndroidLogWrite(const char *buffer_unused) {}
> INLINE void GetExtraActivationFlags(char *buf, uptr size) { *buf = '\0'; }
> INLINE void SanitizerInitializeUnwinder() {}
>
> Added: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc?rev=243051&view=auto
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc
> (added)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc Thu
> Jul 23 17:05:20 2015
> @@ -0,0 +1,21 @@
> +//===-- sanitizer_common_nolibc.cc
> ----------------------------------------===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file contains stubs for libc function to facilitate optional use
> of
> +// libc in no-libcdep sources.
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "sanitizer_platform.h"
> +#include "sanitizer_common.h"
> +
> +namespace __sanitizer {
> +
> +void WriteToSyslog(const char *buffer) {}
> +
> +}
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc Thu Jul 23
> 17:05:20 2015
> @@ -55,6 +55,10 @@ COMMON_FLAG(
> "Mention name of executable when reporting error and "
> "append executable name to logs (as in \"log_path.exe_name.pid\").")
> COMMON_FLAG(
> + bool, log_to_syslog, SANITIZER_ANDROID,
> + "Write all sanitizer output to syslog in addition to other means of "
> + "logging.")
> +COMMON_FLAG(
> int, verbosity, 0,
> "Verbosity level (0 - silent, 1 - a bit of output, 2+ - more
> output).")
> COMMON_FLAG(bool, detect_leaks, true, "Enable memory leak detection.")
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Thu Jul 23
> 17:05:20 2015
> @@ -15,7 +15,6 @@
> #include "sanitizer_platform.h"
> #if SANITIZER_FREEBSD || SANITIZER_LINUX
>
> -#include "sanitizer_allocator_internal.h"
> #include "sanitizer_common.h"
> #include "sanitizer_flags.h"
> #include "sanitizer_internal_defs.h"
> @@ -75,7 +74,6 @@ extern char **environ; // provided by c
> #endif
>
> #if SANITIZER_ANDROID
> -#include <android/log.h>
> #include <sys/system_properties.h>
> #endif
>
> @@ -920,33 +918,6 @@ uptr internal_clone(int (*fn)(void *), v
> #endif // defined(__x86_64__) && SANITIZER_LINUX
>
> #if SANITIZER_ANDROID
> -static atomic_uint8_t android_log_initialized;
> -
> -void AndroidLogInit() {
> - atomic_store(&android_log_initialized, 1, memory_order_release);
> -}
> -// 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) {
> - if (!atomic_load(&android_log_initialized, memory_order_acquire))
> - return;
> -
> - char *copy = internal_strdup(buffer);
> - char *p = copy;
> - char *q;
> - // __android_log_write has an implicit message length limit.
> - // Print one line at a time.
> - do {
> - q = internal_strchr(p, '\n');
> - if (q) *q = '\0';
> - __android_log_write(ANDROID_LOG_INFO, NULL, p);
> - if (q) p = q + 1;
> - } while (q);
> - InternalFree(copy);
> -}
> -
> void GetExtraActivationFlags(char *buf, uptr size) {
> CHECK(size > PROP_VALUE_MAX);
> __system_property_get("asan.options", buf);
>
> 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=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc Thu
> Jul 23 17:05:20 2015
> @@ -15,6 +15,7 @@
> #include "sanitizer_platform.h"
> #if SANITIZER_FREEBSD || SANITIZER_LINUX
>
> +#include "sanitizer_allocator_internal.h"
> #include "sanitizer_atomic.h"
> #include "sanitizer_common.h"
> #include "sanitizer_flags.h"
> @@ -47,6 +48,12 @@
> #include <android/api-level.h>
> #endif
>
> +#if SANITIZER_ANDROID && __ANDROID_API__ < 21
> +#include <android/log.h>
> +#else
> +#include <syslog.h>
> +#endif
> +
> #if !SANITIZER_ANDROID
> #include <elf.h>
> #include <unistd.h>
> @@ -161,7 +168,7 @@ bool SanitizerGetThreadName(char *name,
> #endif
> }
>
> -#if !SANITIZER_FREEBSD
> +#if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
> static uptr g_tls_size;
> #endif
>
> @@ -198,7 +205,7 @@ void InitTlsSize() {
> size_t tls_align = 0;
> get_tls(&tls_size, &tls_align);
> g_tls_size = tls_size;
> -#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID
> +#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
> }
>
> #if (defined(__x86_64__) || defined(__i386__) || defined(__mips__)) \
> @@ -341,7 +348,7 @@ static void GetTls(uptr *addr, uptr *siz
>
> #if !SANITIZER_GO
> uptr GetTlsSize() {
> -#if SANITIZER_FREEBSD
> +#if SANITIZER_FREEBSD || SANITIZER_ANDROID
> uptr addr, size;
> GetTls(&addr, &size);
> return size;
> @@ -376,6 +383,7 @@ void GetThreadStackAndTls(bool main, upt
> #endif
> }
>
> +#if !SANITIZER_GO
> void AdjustStackSize(void *attr_) {
> pthread_attr_t *attr = (pthread_attr_t *)attr_;
> uptr stackaddr = 0;
> @@ -400,6 +408,7 @@ void AdjustStackSize(void *attr_) {
> }
> }
> }
> +#endif // !SANITIZER_GO
>
> # if !SANITIZER_FREEBSD
> typedef ElfW(Phdr) Elf_Phdr;
> @@ -510,6 +519,50 @@ 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_ANDROID && __ANDROID_API__ < 21
> +static atomic_uint8_t android_log_initialized;
> +
> +void AndroidLogInit() {
> + atomic_store(&android_log_initialized, 1, memory_order_release);
> +}
> +
> +static bool IsSyslogAvailable() {
> + return atomic_load(&android_log_initialized, memory_order_acquire);
> +}
> +
> +static void WriteOneLineToSyslog(const char *s) {
> + __android_log_write(ANDROID_LOG_INFO, NULL, s);
> +}
> +#else
> +void AndroidLogInit() {}
> +
> +static bool IsSyslogAvailable() { return true; }
> +
> +static void WriteOneLineToSyslog(const char *s) { syslog(LOG_INFO, "%s",
> s); }
> +#endif
> +
> +void WriteToSyslog(const char *buffer) {
> + if (!IsSyslogAvailable())
> + return;
> + char *copy = internal_strdup(buffer);
> + char *p = copy;
> + char *q;
> + // syslog, at least on Android, has an implicit message length limit.
> + // Print one line at a time.
> + do {
> + q = internal_strchr(p, '\n');
> + if (q)
> + *q = '\0';
> + WriteOneLineToSyslog(p);
> + if (q)
> + p = q + 1;
> + } while (q);
> + InternalFree(copy);
> +}
> +
> } // namespace __sanitizer
>
> #endif // SANITIZER_FREEBSD || SANITIZER_LINUX
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix_libcdep.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix_libcdep.cc?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix_libcdep.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix_libcdep.cc Thu
> Jul 23 17:05:20 2015
> @@ -30,9 +30,9 @@
> #include <stdlib.h>
> #include <sys/mman.h>
> #include <sys/resource.h>
> +#include <sys/stat.h>
> #include <sys/time.h>
> #include <sys/types.h>
> -#include <sys/stat.h>
> #include <unistd.h>
>
> #if SANITIZER_FREEBSD
> @@ -274,7 +274,6 @@ void *MmapNoAccess(uptr fixed_addr, uptr
> return (void *)internal_mmap((void *)fixed_addr, size, PROT_NONE,
> flags, fd,
> 0);
> }
> -
> -} // namespace __sanitizer
> +} // namespace __sanitizer
>
> #endif // SANITIZER_POSIX
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc Thu Jul 23
> 17:05:20 2015
> @@ -279,7 +279,8 @@ static void SharedPrintfCode(bool append
> # undef CHECK_NEEDED_LENGTH
> }
> RawWrite(buffer);
> - AndroidLogWrite(buffer);
> + if (common_flags()->log_to_syslog)
> + WriteToSyslog(buffer);
> CallPrintfAndReportCallback(buffer);
> // If we had mapped any memory, clean up.
> if (buffer != local_buffer)
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/tests/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/CMakeLists.txt?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/tests/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/tests/CMakeLists.txt Thu Jul 23
> 17:05:20 2015
> @@ -172,7 +172,8 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT
> else()
> if(CAN_TARGET_x86_64)
> add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64"
> - $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>)
> + $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>
> +
> $<TARGET_OBJECTS:RTSanitizerCommonNoLibc.x86_64>)
> endif()
> foreach(arch ${SANITIZER_UNITTEST_SUPPORTED_ARCH})
> add_sanitizer_common_lib("RTSanitizerCommon.test.${arch}"
>
> Modified: compiler-rt/trunk/lib/tsan/go/buildgo.sh
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/go/buildgo.sh?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/go/buildgo.sh (original)
> +++ compiler-rt/trunk/lib/tsan/go/buildgo.sh Thu Jul 23 17:05:20 2015
> @@ -45,6 +45,7 @@ if [ "`uname -a | grep Linux`" != "" ];
> ../../sanitizer_common/sanitizer_procmaps_common.cc
> ../../sanitizer_common/sanitizer_procmaps_linux.cc
> ../../sanitizer_common/sanitizer_linux.cc
> + ../../sanitizer_common/sanitizer_linux_libcdep.cc
>
> ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
> "
> elif [ "`uname -a | grep FreeBSD`" != "" ]; then
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/Makefile.old
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/Makefile.old?rev=243051&r1=243050&r2=243051&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/Makefile.old (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/Makefile.old Thu Jul 23 17:05:20 2015
> @@ -35,7 +35,7 @@ LIBTSAN_HEADERS=$(wildcard *.h) \
> LIBTSAN_SRC=$(wildcard *.cc)
> LIBTSAN_ASM_SRC=$(wildcard *.S)
> INTERCEPTION_SRC=$(wildcard $(INTERCEPTION)/*.cc)
> -COMMON_SRC=$(wildcard $(COMMON)/*.cc)
> +COMMON_SRC=$(filter-out $(wildcard $(COMMON)/*_nolibc.cc),$(wildcard
> $(COMMON)/*.cc))
>
> LIBTSAN_OBJ=$(patsubst %.cc,%.o,$(LIBTSAN_SRC)) \
> $(patsubst %.S,%.o,$(LIBTSAN_ASM_SRC)) \
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150727/9e350c7e/attachment.html>
More information about the llvm-commits
mailing list