Revert to r305632

Change-Id: Id37311f3600464ef66b47096503b3aab2e9a336f
diff --git a/include/sanitizer/coverage_interface.h b/include/sanitizer/coverage_interface.h
index 081033c..637379d 100644
--- a/include/sanitizer/coverage_interface.h
+++ b/include/sanitizer/coverage_interface.h
@@ -22,11 +22,8 @@
   // Record and dump coverage info.
   void __sanitizer_cov_dump();
 
-  // Clear collected coverage info.
-  void __sanitizer_cov_reset();
-
-  // Dump collected coverage info. Sorts pcs by module into individual .sancov
-  // files.
+  //  Dump collected coverage info. Sorts pcs by module into individual
+  //  .sancov files.
   void __sanitizer_dump_coverage(const uintptr_t *pcs, uintptr_t len);
 
 #ifdef __cplusplus
diff --git a/lib/asan/scripts/asan_device_setup b/lib/asan/scripts/asan_device_setup
index 369f387..c807df3 100755
--- a/lib/asan/scripts/asan_device_setup
+++ b/lib/asan/scripts/asan_device_setup
@@ -52,7 +52,7 @@
     local STORAGE=`$ADB shell mount | grep /system | cut -d ' ' -f1`
     if [ "$STORAGE" != "" ]; then
       echo Remounting $STORAGE at /system
-      $ADB shell su -c "mount -o rw,remount $STORAGE /system"
+      $ADB shell su -c "mount -o remount,rw $STORAGE /system"
     else
       echo Failed to get storage device name for "/system" mount point
     fi
diff --git a/lib/builtins/clear_cache.c b/lib/builtins/clear_cache.c
index 7a51c23..25570fc 100644
--- a/lib/builtins/clear_cache.c
+++ b/lib/builtins/clear_cache.c
@@ -41,7 +41,7 @@
      * clear_mips_cache - Invalidates instruction cache for Mips.
      */
     static void clear_mips_cache(const void* Addr, size_t Size) {
-      __asm__ volatile (
+      asm volatile (
         ".set push\n"
         ".set noreorder\n"
         ".set noat\n"
diff --git a/lib/sanitizer_common/sanitizer_coverage_interface.inc b/lib/sanitizer_common/sanitizer_coverage_interface.inc
index 87ae9c0..d474900 100644
--- a/lib/sanitizer_common/sanitizer_coverage_interface.inc
+++ b/lib/sanitizer_common/sanitizer_coverage_interface.inc
@@ -9,7 +9,6 @@
 // Sanitizer Coverage interface list.
 //===----------------------------------------------------------------------===//
 INTERFACE_FUNCTION(__sanitizer_cov_dump)
-INTERFACE_FUNCTION(__sanitizer_cov_reset)
 INTERFACE_FUNCTION(__sanitizer_dump_coverage)
 INTERFACE_FUNCTION(__sanitizer_dump_trace_pc_guard_coverage)
 INTERFACE_WEAK_FUNCTION(__sancov_default_options)
diff --git a/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cc b/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cc
index ee3af49..2443335 100644
--- a/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cc
+++ b/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cc
@@ -124,17 +124,11 @@
   }
 
   void TracePcGuard(u32* guard, uptr pc) {
-    u32 idx = *guard;
+    atomic_uint32_t* guard_ptr = reinterpret_cast<atomic_uint32_t*>(guard);
+    u32 idx = atomic_exchange(guard_ptr, 0, memory_order_relaxed);
     if (!idx) return;
     // we start indices from 1.
-    atomic_uintptr_t* pc_ptr =
-        reinterpret_cast<atomic_uintptr_t*>(&pc_vector[idx - 1]);
-    if (atomic_load(pc_ptr, memory_order_relaxed) == 0)
-      atomic_store(pc_ptr, pc, memory_order_relaxed);
-  }
-
-  void Reset() {
-    internal_memset(&pc_vector[0], 0, sizeof(pc_vector[0]) * pc_vector.size());
+    pc_vector[idx - 1] = pc;
   }
 
   void Dump() {
@@ -186,9 +180,6 @@
 SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_dump() {
   __sanitizer_dump_trace_pc_guard_coverage();
 }
-SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_reset() {
-  __sancov::pc_guard_controller.Reset();
-}
 // Default empty implementations (weak). Users should redefine them.
 SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_cmp, void) {}
 SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_cmp1, void) {}
diff --git a/lib/sanitizer_common/sanitizer_linux.cc b/lib/sanitizer_common/sanitizer_linux.cc
index b269308..d31c49d 100644
--- a/lib/sanitizer_common/sanitizer_linux.cc
+++ b/lib/sanitizer_common/sanitizer_linux.cc
@@ -226,8 +226,10 @@
   out->st_size = in->st_size;
   out->st_blksize = in->st_blksize;
   out->st_blocks = in->st_blocks;
+  out->st_atime = in->st_atime_nsec;
+  out->st_mtime = in->st_mtime_nsec;
+  out->st_ctime = in->st_ctime_nsec;
   out->st_ino = in->st_ino;
-// TODO: Fix to work with bionic's macros for the time values.
 }
 #endif
 
diff --git a/lib/sanitizer_common/sanitizer_posix_libcdep.cc b/lib/sanitizer_common/sanitizer_posix_libcdep.cc
index e113fb1..5b1d536 100644
--- a/lib/sanitizer_common/sanitizer_posix_libcdep.cc
+++ b/lib/sanitizer_common/sanitizer_posix_libcdep.cc
@@ -189,7 +189,25 @@
 
 static void MaybeInstallSigaction(int signum,
                                   SignalHandlerType handler) {
-  if (GetHandleSignalMode(signum) == kHandleSignalNo) return;
+  switch (GetHandleSignalMode(signum)) {
+    case kHandleSignalNo:
+      return;
+    case kHandleSignalYes: {
+      struct sigaction sigact;
+      internal_memset(&sigact, 0, sizeof(sigact));
+      CHECK_EQ(0, internal_sigaction(signum, nullptr, &sigact));
+      if (sigact.sa_flags & SA_SIGINFO) {
+        if (sigact.sa_sigaction) return;
+      } else {
+        if (sigact.sa_handler != SIG_DFL && sigact.sa_handler != SIG_IGN &&
+            sigact.sa_handler != SIG_ERR)
+          return;
+      }
+      break;
+    }
+    case kHandleSignalExclusive:
+      break;
+  }
 
   struct sigaction sigact;
   internal_memset(&sigact, 0, sizeof(sigact));
diff --git a/lib/ubsan/CMakeLists.txt b/lib/ubsan/CMakeLists.txt
index 98a8bb2..457a6b4 100644
--- a/lib/ubsan/CMakeLists.txt
+++ b/lib/ubsan/CMakeLists.txt
@@ -35,7 +35,6 @@
 append_list_if(SANITIZER_CAN_USE_CXXABI -DUBSAN_CAN_USE_CXXABI UBSAN_CXXFLAGS)
 
 append_list_if(COMPILER_RT_HAS_LIBDL dl UBSAN_DYNAMIC_LIBS)
-append_list_if(COMPILER_RT_HAS_LIBLOG log UBSAN_DYNAMIC_LIBS)
 append_list_if(COMPILER_RT_HAS_LIBRT rt UBSAN_DYNAMIC_LIBS)
 append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread UBSAN_DYNAMIC_LIBS)
 
@@ -130,7 +129,7 @@
     add_compiler_rt_object_libraries(RTUbsan_standalone
       ARCHS ${UBSAN_SUPPORTED_ARCH}
       SOURCES ${UBSAN_STANDALONE_SOURCES} CFLAGS ${UBSAN_STANDALONE_CFLAGS})
-
+    
     # Standalone UBSan runtimes.
     add_compiler_rt_runtime(clang_rt.ubsan_standalone
       STATIC
@@ -141,7 +140,7 @@
               RTUbsan_standalone
       CFLAGS ${UBSAN_CFLAGS}
       PARENT_TARGET ubsan)
-
+    
     add_compiler_rt_runtime(clang_rt.ubsan_standalone_cxx
       STATIC
       ARCHS ${UBSAN_SUPPORTED_ARCH}
@@ -155,11 +154,21 @@
       OBJECT_LIBS RTSanitizerCommon
               RTSanitizerCommonLibc
               RTUbsan
-              RTUbsan_cxx
       CFLAGS ${UBSAN_CFLAGS}
       LINK_LIBS ${UBSAN_DYNAMIC_LIBS}
       PARENT_TARGET ubsan)
 
+    add_compiler_rt_runtime(clang_rt.ubsan_standalone_cxx
+      SHARED
+      ARCHS ${UBSAN_SUPPORTED_ARCH}
+      OBJECT_LIBS RTSanitizerCommon
+              RTSanitizerCommonLibc
+              RTUbsan
+              RTUbsan_cxx
+      CFLAGS ${UBSAN_CXXFLAGS}
+      LINK_LIBS ${UBSAN_DYNAMIC_LIBS}
+      PARENT_TARGET ubsan)
+
     if (UNIX)
       set(ARCHS_FOR_SYMBOLS ${UBSAN_SUPPORTED_ARCH})
       list(REMOVE_ITEM ARCHS_FOR_SYMBOLS i386 i686)
diff --git a/test/asan/TestCases/Linux/preinstalled_signal.cc b/test/asan/TestCases/Linux/preinstalled_signal.cc
index 4d466c2..40dadf4 100644
--- a/test/asan/TestCases/Linux/preinstalled_signal.cc
+++ b/test/asan/TestCases/Linux/preinstalled_signal.cc
@@ -4,13 +4,11 @@
 // RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=2 not %run %t 2>&1 | FileCheck %s
 
 // RUN: %clangxx -std=c++11 -DTEST_INSTALL_SIG_HANDLER %s -o %t
-// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-HANDLER
-// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck %s
+// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK-HANDLER %s
 // RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=2 not %run %t 2>&1 | FileCheck %s
 
 // RUN: %clangxx -std=c++11 -DTEST_INSTALL_SIG_ACTION %s -o %t
-// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-ACTION
-// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck %s
+// RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK-ACTION %s
 // RUN: env LD_PRELOAD=%shared_libasan %env_asan_opts=handle_segv=2 not %run %t 2>&1 | FileCheck %s
 
 // REQUIRES: asan-dynamic-runtime
@@ -53,22 +51,22 @@
   return syscall(__NR_rt_sigaction, sig, act, oact, NSIG / 8);
 }
 
-struct KernelSigaction pre_asan = {};
+struct KernelSigaction sigact = {};
 
 static void Init() {
-  int res = InternalSigaction(SIGSEGV, nullptr, &pre_asan);
+  int res = InternalSigaction(SIGSEGV, nullptr, &sigact);
   assert(res >= 0);
-  assert(pre_asan.handler == SIG_DFL || pre_asan.handler == SIG_IGN);
+  assert(sigact.handler == SIG_DFL || sigact.handler == SIG_IGN);
 #if defined(TEST_INSTALL_SIG_HANDLER)
-  pre_asan = {};
-  pre_asan.handler = &SigHandler;
-  res = InternalSigaction(SIGSEGV, &pre_asan, nullptr);
+  sigact = {};
+  sigact.handler = &SigHandler;
+  res = InternalSigaction(SIGSEGV, &sigact, nullptr);
   assert(res >= 0);
 #elif defined(TEST_INSTALL_SIG_ACTION)
-  pre_asan = {};
-  pre_asan.flags = SA_SIGINFO | SA_NODEFER;
-  pre_asan.handler = (__sighandler_t)&SigAction;
-  res = InternalSigaction(SIGSEGV, &pre_asan, nullptr);
+  sigact = {};
+  sigact.flags = SA_SIGINFO | SA_NODEFER;
+  sigact.handler = (__sighandler_t)&SigAction;
+  res = InternalSigaction(SIGSEGV, &sigact, nullptr);
   assert(res >= 0);
 #endif
 }
@@ -76,21 +74,21 @@
 __attribute__((section(".preinit_array"), used))
 void (*__local_test_preinit)(void) = Init;
 
-bool ExpectUserHandler() {
+bool ShouldAsanInstallHandlers() {
 #if defined(TEST_INSTALL_SIG_HANDLER) || defined(TEST_INSTALL_SIG_ACTION)
-  return !strcmp(getenv("ASAN_OPTIONS"), "handle_segv=0");
+  return !strcmp(getenv("ASAN_OPTIONS"), "handle_segv=2");
 #endif
-  return false;
+  return true;
 }
 
 int main(int argc, char *argv[]) {
-  KernelSigaction post_asan = {};
-  InternalSigaction(SIGSEGV, nullptr, &post_asan);
+  KernelSigaction sigact_asan = {};
+  InternalSigaction(SIGSEGV, nullptr, &sigact_asan);
 
-  assert(post_asan.handler != SIG_DFL);
-  assert(post_asan.handler != SIG_IGN);
-  assert(ExpectUserHandler() ==
-         (post_asan.handler == pre_asan.handler));
+  assert(sigact_asan.handler != SIG_DFL);
+  assert(sigact_asan.handler != SIG_IGN);
+  assert(ShouldAsanInstallHandlers() ==
+         (sigact_asan.handler != sigact.handler));
 
   raise(SIGSEGV);
   printf("%s\n", handler);
diff --git a/test/asan/TestCases/Posix/coverage-reset.cc b/test/asan/TestCases/Posix/coverage-reset.cc
deleted file mode 100644
index e9639b3..0000000
--- a/test/asan/TestCases/Posix/coverage-reset.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard -DSHARED %s -shared -o %dynamiclib -fPIC %ld_flags_rpath_so
-// RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s %ld_flags_rpath_exe -o %t
-// RUN: rm -rf %T/coverage-reset && mkdir -p %T/coverage-reset && cd %T/coverage-reset
-// RUN: %env_asan_opts=coverage=1:verbosity=1 %run %t 2>&1 | FileCheck %s
-//
-// UNSUPPORTED: ios
-
-#include <stdio.h>
-
-#include <sanitizer/coverage_interface.h>
-
-#ifdef SHARED
-void bar1() { printf("bar1\n"); }
-void bar2() { printf("bar2\n"); }
-#else
-__attribute__((noinline)) void foo1() { printf("foo1\n"); }
-__attribute__((noinline)) void foo2() { printf("foo2\n"); }
-void bar1();
-void bar2();
-
-int main(int argc, char **argv) {
-  fprintf(stderr, "RESET");
-  __sanitizer_cov_reset();
-  foo1();
-  foo2();
-  bar1();
-  bar2();
-  __sanitizer_cov_dump();
-// CHECK: RESET
-// CHECK: SanitizerCoverage: ./coverage-reset.cc{{.*}}.sancov: 2 PCs written
-// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 2 PCs written
-
-  fprintf(stderr, "RESET");
-  __sanitizer_cov_reset();
-  foo1();
-  bar1();
-  __sanitizer_cov_dump();
-// CHECK: RESET
-// CHECK: SanitizerCoverage: ./coverage-reset.cc{{.*}}.sancov: 1 PCs written
-// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 1 PCs written
-
-  fprintf(stderr, "RESET");
-  __sanitizer_cov_reset();
-  foo1();
-  foo2();
-  __sanitizer_cov_dump();
-// CHECK: RESET
-// CHECK: SanitizerCoverage: ./coverage-reset.cc{{.*}}.sancov: 2 PCs written
-
-  fprintf(stderr, "RESET");
-  __sanitizer_cov_reset();
-  bar1();
-  bar2();
-  __sanitizer_cov_dump();
-// CHECK: RESET
-// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 2 PCs written
-
-  fprintf(stderr, "RESET");
-  __sanitizer_cov_reset();
-// CHECK: RESET
-
-  bar2();
-// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 1 PCs written
-}
-#endif