<div dir="ltr"><div dir="ltr">This seems to have broken our macOS builders with the following error:<div><br></div><div><div>FAILED: /b/s/w/ir/kitchen-workdir/recipe_cleanup/clangpTi8IB/llvm_build_dir/lib/clang/8.0.0/lib/darwin/libclang_rt.stats_osx_dynamic.dylib </div><div>: && /b/s/w/ir/kitchen-workdir/recipe_cleanup/clangpTi8IB/llvm_build_dir/./bin/clang++ --target=x86_64-apple-darwin17.7.0 -stdlib=libc++ -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fdiagnostics-color -Wall -std=c++11 -Wno-unused-parameter -O3 -arch i386 -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk -dynamiclib -Wl,-headerpad_max_install_names -stdlib=libc++   -stdlib=libc++ -lc++ -lc++abi -fapplication-extension -mmacosx-version-min=10.9 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk -nodefaultlibs -Wl,-U,___asan_default_options -Wl,-U,___asan_default_suppressions -Wl,-U,___asan_on_error -Wl,-U,___asan_set_shadow_00 -Wl,-U,___asan_set_shadow_f1 -Wl,-U,___asan_set_shadow_f2 -Wl,-U,___asan_set_shadow_f3 -Wl,-U,___asan_set_shadow_f4 -Wl,-U,___asan_set_shadow_f5 -Wl,-U,___asan_set_shadow_f6 -Wl,-U,___asan_set_shadow_f7 -Wl,-U,___asan_set_shadow_f8 -Wl,-U,___ubsan_default_options -Wl,-U,___sanitizer_free_hook -Wl,-U,___sanitizer_malloc_hook -Wl,-U,___sanitizer_report_error_summary -Wl,-U,___sanitizer_sandbox_on_notify -Wl,-U,___sanitizer_symbolize_code -Wl,-U,___sanitizer_symbolize_data -Wl,-U,___sanitizer_symbolize_demangle -Wl,-U,___sanitizer_symbolize_flush -o /b/s/w/ir/kitchen-workdir/recipe_cleanup/clangpTi8IB/llvm_build_dir/lib/clang/8.0.0/lib/darwin/libclang_rt.stats_osx_dynamic.dylib -install_name @rpath/libclang_rt.stats_osx_dynamic.dylib compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_allocator.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_common.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_deadlock_detector1.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_deadlock_detector2.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_errno.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_file.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_flags.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_flag_parser.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_fuchsia.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_libc.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_libignore.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_linux.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_linux_s390.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_netbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_openbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_persistent_allocator.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_platform_limits_freebsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_platform_limits_linux.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_platform_limits_netbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_platform_limits_openbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_platform_limits_posix.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_platform_limits_solaris.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_posix.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_printf.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_procmaps_common.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_procmaps_bsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_procmaps_linux.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_procmaps_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_procmaps_solaris.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_rtems.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_solaris.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_stoptheworld_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_suppressions.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_tls_get_addr.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_thread_registry.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_win.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.osx.dir/sanitizer_termination.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.osx.dir/sanitizer_common_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.osx.dir/sanitizer_allocator_checks.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.osx.dir/sanitizer_linux_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.osx.dir/sanitizer_mac_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.osx.dir/sanitizer_posix_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.osx.dir/sanitizer_stoptheworld_linux_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_allocator_report.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_stackdepot.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_stacktrace.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_stacktrace_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_stacktrace_printer.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_stacktrace_sparc.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer_libbacktrace.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer_markup.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer_posix_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer_report.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_symbolizer_win.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_unwind_linux_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.osx.dir/sanitizer_unwind_win.cc.o compiler-rt/lib/stats/CMakeFiles/clang_rt.stats_osx_dynamic.dir/stats.cc.o  -Wl,-rpath,@loader_path/../lib -Wl,-rpath,/b/s/w/ir/kitchen-workdir/recipe_cleanup/clangpTi8IB/llvm_build_dir/./lib -lc && cd /b/s/w/ir/kitchen-workdir/recipe_cleanup/clangpTi8IB/llvm_build_dir/lib/clang/8.0.0/lib/darwin && codesign --sign - /b/s/w/ir/kitchen-workdir/recipe_cleanup/clangpTi8IB/llvm_build_dir/lib/clang/8.0.0/lib/darwin/libclang_rt.stats_osx_dynamic.dylib</div><div>Undefined symbols for architecture i386:</div><div>  "__sanitizer::MemoryMappingLayout::IsAvailable()", referenced from:</div><div>      __sanitizer::MemoryRangeIsAvailable(unsigned long, unsigned long) in sanitizer_posix.cc.o</div><div>ld: symbol(s) not found for architecture i386</div><div>clang-8: error: linker command failed with exit code 1 (use -v to see invocation)</div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 27, 2018 at 1:35 PM Evgeniy Stepanov via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: eugenis<br>
Date: Thu Dec 27 13:31:52 2018<br>
New Revision: 350101<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=350101&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=350101&view=rev</a><br>
Log:<br>
[asan] Support running without /proc.<br>
<br>
Summary:<br>
This patch lets ASan run when /proc is not accessible (ex. not mounted<br>
yet). It includes a special test-only flag that emulates this condition<br>
in an unpriviledged process.<br>
<br>
This only matters on Linux, where /proc is necessary to enumerate<br>
virtual memory mappings.<br>
<br>
Reviewers: pcc, vitalybuka<br>
<br>
Subscribers: kubamracek, llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D55874" rel="noreferrer" target="_blank">https://reviews.llvm.org/D55874</a><br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_linux.cc<br>
    compiler-rt/trunk/lib/asan/asan_thread.cc<br>
    compiler-rt/trunk/lib/hwasan/hwasan_thread.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_bsd.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_linux.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_solaris.cc<br>
    compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_linux.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_linux.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_linux.cc Thu Dec 27 13:31:52 2018<br>
@@ -210,6 +210,8 @@ void AsanCheckIncompatibleRT() {<br>
     }<br>
   } else {<br>
     if (__asan_rt_version == ASAN_RT_VERSION_UNDEFINED) {<br>
+      if (!MemoryMappingLayout::IsAvailable())<br>
+        return;<br>
       // Ensure that dynamic runtime is not present. We should detect it<br>
       // as early as possible, otherwise ASan interceptors could bind to<br>
       // the functions in dynamic ASan runtime instead of the functions in<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_thread.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_thread.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_thread.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_thread.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_thread.cc Thu Dec 27 13:31:52 2018<br>
@@ -18,6 +18,7 @@<br>
 #include "asan_thread.h"<br>
 #include "asan_mapping.h"<br>
 #include "sanitizer_common/sanitizer_common.h"<br>
+#include "sanitizer_common/sanitizer_file.h"<br>
 #include "sanitizer_common/sanitizer_placement_new.h"<br>
 #include "sanitizer_common/sanitizer_stackdepot.h"<br>
 #include "sanitizer_common/sanitizer_tls_get_addr.h"<br>
@@ -223,9 +224,11 @@ void AsanThread::Init(const InitOptions<br>
   atomic_store(&stack_switching_, false, memory_order_release);<br>
   CHECK_EQ(this->stack_size(), 0U);<br>
   SetThreadStackAndTls(options);<br>
-  CHECK_GT(this->stack_size(), 0U);<br>
-  CHECK(AddrIsInMem(stack_bottom_));<br>
-  CHECK(AddrIsInMem(stack_top_ - 1));<br>
+  if (stack_top_ != stack_bottom_) {<br>
+    CHECK_GT(this->stack_size(), 0U);<br>
+    CHECK(AddrIsInMem(stack_bottom_));<br>
+    CHECK(AddrIsInMem(stack_top_ - 1));<br>
+  }<br>
   ClearShadowForThreadStackAndTLS();<br>
   fake_stack_ = nullptr;<br>
   if (__asan_option_detect_stack_use_after_return)<br>
@@ -287,22 +290,29 @@ AsanThread *CreateMainThread() {<br>
 // OS-specific implementations that need more information passed through.<br>
 void AsanThread::SetThreadStackAndTls(const InitOptions *options) {<br>
   DCHECK_EQ(options, nullptr);<br>
-  uptr tls_size = 0;<br>
-  uptr stack_size = 0;<br>
-  GetThreadStackAndTls(tid() == 0, &stack_bottom_, &stack_size, &tls_begin_,<br>
-                       &tls_size);<br>
-  stack_top_ = stack_bottom_ + stack_size;<br>
-  tls_end_ = tls_begin_ + tls_size;<br>
-  dtls_ = DTLS_Get();<br>
+  // If this process is "init" (pid 1), /proc may not be mounted yet.<br>
+  if (!start_routine_ && !MemoryMappingLayout::IsAvailable()) {<br>
+    stack_top_ = stack_bottom_ = 0;<br>
+    tls_begin_ = tls_end_ = 0;<br>
+  } else {<br>
+    uptr tls_size = 0;<br>
+    uptr stack_size = 0;<br>
+    GetThreadStackAndTls(tid() == 0, &stack_bottom_, &stack_size, &tls_begin_,<br>
+                         &tls_size);<br>
+    stack_top_ = stack_bottom_ + stack_size;<br>
+    tls_end_ = tls_begin_ + tls_size;<br>
+    dtls_ = DTLS_Get();<br>
<br>
-  int local;<br>
-  CHECK(AddrIsInStack((uptr)&local));<br>
+    int local;<br>
+    CHECK(AddrIsInStack((uptr)&local));<br>
+  }<br>
 }<br>
<br>
 #endif  // !SANITIZER_FUCHSIA && !SANITIZER_RTEMS<br>
<br>
 void AsanThread::ClearShadowForThreadStackAndTLS() {<br>
-  PoisonShadow(stack_bottom_, stack_top_ - stack_bottom_, 0);<br>
+  if (stack_top_ != stack_bottom_)<br>
+    PoisonShadow(stack_bottom_, stack_top_ - stack_bottom_, 0);<br>
   if (tls_begin_ != tls_end_) {<br>
     uptr tls_begin_aligned = RoundDownTo(tls_begin_, SHADOW_GRANULARITY);<br>
     uptr tls_end_aligned = RoundUpTo(tls_end_, SHADOW_GRANULARITY);<br>
@@ -314,6 +324,9 @@ void AsanThread::ClearShadowForThreadSta<br>
<br>
 bool AsanThread::GetStackFrameAccessByAddr(uptr addr,<br>
                                            StackFrameAccess *access) {<br>
+  if (stack_top_ == stack_bottom_)<br>
+    return false;<br>
+<br>
   uptr bottom = 0;<br>
   if (AddrIsInStack(addr)) {<br>
     bottom = stack_bottom();<br>
<br>
Modified: compiler-rt/trunk/lib/hwasan/hwasan_thread.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_thread.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_thread.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/hwasan/hwasan_thread.cc (original)<br>
+++ compiler-rt/trunk/lib/hwasan/hwasan_thread.cc Thu Dec 27 13:31:52 2018<br>
@@ -44,7 +44,7 @@ void Thread::Init(uptr stack_buffer_star<br>
   ScopedTaggingDisabler disabler;<br>
<br>
   // If this process is "init" (pid 1), /proc may not be mounted yet.<br>
-  if (IsMainThread() && !FileExists("/proc/self/maps")) {<br>
+  if (IsMainThread() && !MemoryMappingLayout::IsAvailable()) {<br>
     stack_top_ = stack_bottom_ = 0;<br>
     tls_begin_ = tls_end_ = 0;<br>
   } else {<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc Thu Dec 27 13:31:52 2018<br>
@@ -243,3 +243,6 @@ COMMON_FLAG(bool, dump_registers, true,<br>
 COMMON_FLAG(bool, detect_write_exec, false,<br>
           "If true, triggers warning when writable-executable pages requests "<br>
           "are being made")<br>
+COMMON_FLAG(bool, test_only_emulate_no_procfs, false,<br>
+            "TEST ONLY fail to open any files under /proc to emulate sanitized "<br>
+            "\"init\"")<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Thu Dec 27 13:31:52 2018<br>
@@ -453,6 +453,8 @@ uptr internal_execve(const char *filenam<br>
<br>
 // ----------------- sanitizer_common.h<br>
 bool FileExists(const char *filename) {<br>
+  if (ShouldMockFailureToOpen(filename))<br>
+    return false;<br>
   struct stat st;<br>
 #if SANITIZER_USES_CANONICAL_LINUX_SYSCALLS<br>
   if (internal_syscall(SYSCALL(newfstatat), AT_FDCWD, filename, &st, 0))<br>
@@ -1003,6 +1005,8 @@ ThreadLister::~ThreadLister() {<br>
 // Take care of unusable kernel area in top gigabyte.<br>
 static uptr GetKernelAreaSize() {<br>
 #if SANITIZER_LINUX && !SANITIZER_X32<br>
+  if (!MemoryMappingLayout::IsAvailable())<br>
+    return 0;<br>
   const uptr gbyte = 1UL << 30;<br>
<br>
   // Firstly check if there are writable segments<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h Thu Dec 27 13:31:52 2018<br>
@@ -44,6 +44,7 @@ struct MemoryMappingLayoutData {<br>
 };<br>
<br>
 void ReadProcMaps(ProcSelfMapsBuff *proc_maps);<br>
+bool IsProcMapsAvailable();<br>
<br>
 // Syscall wrappers.<br>
 uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc Thu Dec 27 13:31:52 2018<br>
@@ -282,6 +282,8 @@ uptr internal_waitpid(int pid, int *stat<br>
<br>
 // ----------------- sanitizer_common.h<br>
 bool FileExists(const char *filename) {<br>
+  if (ShouldMockFailureToOpen(filename))<br>
+    return false;<br>
   struct stat st;<br>
   if (stat(filename, &st))<br>
     return false;<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc Thu Dec 27 13:31:52 2018<br>
@@ -18,6 +18,7 @@<br>
<br>
 #include "sanitizer_common.h"<br>
 #include "sanitizer_file.h"<br>
+#include "sanitizer_flags.h"<br>
 #include "sanitizer_libc.h"<br>
 #include "sanitizer_posix.h"<br>
 #include "sanitizer_procmaps.h"<br>
@@ -157,6 +158,8 @@ void MprotectMallocZones(void *addr, int<br>
 #endif<br>
<br>
 fd_t OpenFile(const char *filename, FileAccessMode mode, error_t *errno_p) {<br>
+  if (ShouldMockFailureToOpen(filename))<br>
+    return kInvalidFd;<br>
   int flags;<br>
   switch (mode) {<br>
     case RdOnly: flags = O_RDONLY; break;<br>
@@ -229,6 +232,8 @@ static inline bool IntervalsAreSeparate(<br>
 // several worker threads on Mac, which aren't expected to map big chunks of<br>
 // memory).<br>
 bool MemoryRangeIsAvailable(uptr range_start, uptr range_end) {<br>
+  if (!MemoryMappingLayout::IsAvailable())<br>
+    return true; // hope for the best<br>
   MemoryMappingLayout proc_maps(/*cache_enabled*/true);<br>
   MemoryMappedSegment segment;<br>
   while (proc_maps.Next(&segment)) {<br>
@@ -334,6 +339,11 @@ fd_t ReserveStandardFds(fd_t fd) {<br>
   return fd;<br>
 }<br>
<br>
+bool ShouldMockFailureToOpen(const char *path) {<br>
+  return common_flags()->test_only_emulate_no_procfs &&<br>
+         internal_strncmp(path, "/proc/", 6) == 0;<br>
+}<br>
+<br>
 } // namespace __sanitizer<br>
<br>
 #endif // SANITIZER_POSIX<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.h Thu Dec 27 13:31:52 2018<br>
@@ -103,6 +103,8 @@ bool IsStateDetached(int state);<br>
 // Move the fd out of {0, 1, 2} range.<br>
 fd_t ReserveStandardFds(fd_t fd);<br>
<br>
+bool ShouldMockFailureToOpen(const char *path);<br>
+<br>
 }  // namespace __sanitizer<br>
<br>
 #endif  // SANITIZER_POSIX_H<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h Thu Dec 27 13:31:52 2018<br>
@@ -75,6 +75,7 @@ class MemoryMappingLayout {<br>
   // to obtain the memory mappings. It should fall back to pre-cached data<br>
   // instead of aborting.<br>
   static void CacheMemoryMappings();<br>
+  static bool IsAvailable();<br>
<br>
   // Adds all mapped objects into a vector.<br>
   void DumpListOfModules(InternalMmapVectorNoCtor<LoadedModule> *modules);<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_bsd.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_bsd.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_bsd.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_bsd.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_bsd.cc Thu Dec 27 13:31:52 2018<br>
@@ -45,6 +45,10 @@<br>
<br>
 namespace __sanitizer {<br>
<br>
+bool IsProcMapsAvailable() {<br>
+  return true;<br>
+}<br>
+<br>
 void ReadProcMaps(ProcSelfMapsBuff *proc_maps) {<br>
   const int Mib[] = {<br>
 #if SANITIZER_FREEBSD<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc Thu Dec 27 13:31:52 2018<br>
@@ -144,6 +144,12 @@ void MemoryMappingLayout::DumpListOfModu<br>
   }<br>
 }<br>
<br>
+bool MemoryMappingLayout::IsAvailable() {<br>
+  if (cached_proc_self_maps.data)<br>
+    return true;<br>
+  return IsProcMapsAvailable();<br>
+}<br>
+<br>
 void GetMemoryProfile(fill_profile_f cb, uptr *stats, uptr stats_size) {<br>
   char *smaps = nullptr;<br>
   uptr smaps_cap = 0;<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_linux.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_linux.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_linux.cc Thu Dec 27 13:31:52 2018<br>
@@ -13,10 +13,15 @@<br>
 #include "sanitizer_platform.h"<br>
 #if SANITIZER_LINUX<br>
 #include "sanitizer_common.h"<br>
+#include "sanitizer_file.h"<br>
 #include "sanitizer_procmaps.h"<br>
<br>
 namespace __sanitizer {<br>
<br>
+bool IsProcMapsAvailable() {<br>
+  return FileExists("/proc/self/maps");<br>
+}<br>
+<br>
 void ReadProcMaps(ProcSelfMapsBuff *proc_maps) {<br>
   if (!ReadFileToBuffer("/proc/self/maps", &proc_maps->data,<br>
                         &proc_maps->mmaped_size, &proc_maps->len)) {<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_solaris.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_solaris.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_solaris.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_solaris.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_solaris.cc Thu Dec 27 13:31:52 2018<br>
@@ -20,6 +20,10 @@<br>
<br>
 namespace __sanitizer {<br>
<br>
+bool IsProcMapsAvailable() {<br>
+  return FileExists("/proc/self/xmap");<br>
+}<br>
+<br>
 void ReadProcMaps(ProcSelfMapsBuff *proc_maps) {<br>
   ReadFileToBuffer("/proc/self/xmap", &proc_maps->data, &proc_maps->mmaped_size,<br>
                    &proc_maps->len);<br>
<br>
Modified: compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc?rev=350101&r1=350100&r2=350101&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc?rev=350101&r1=350100&r2=350101&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc (original)<br>
+++ compiler-rt/trunk/test/asan/TestCases/Posix/no-fd.cc Thu Dec 27 13:31:52 2018<br>
@@ -9,6 +9,10 @@<br>
 #include <stdlib.h><br>
 #include <unistd.h><br>
<br>
+extern "C" const char *__asan_default_options() {<br>
+  return "test_only_emulate_no_procfs=1";<br>
+}<br>
+<br>
 void parent(int argc, char **argv) {<br>
   fprintf(stderr, "hello\n");<br>
   // CHECK: hello<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>