<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I reverted this commit in r<font face="Helvetica Neue" class="">270267 because it has been breaking the FreeBSD bots:</font><div class=""><font face="Helvetica Neue" class=""><br class=""></font></div><div class=""><font face="Helvetica Neue" class=""><a href="http://lab.llvm.org:8011/builders/lld-x86_64-freebsd" class="">http://lab.llvm.org:8011/builders/lld-x86_64-freebsd</a></font></div><div class=""><font face="Helvetica Neue" class=""><br class=""></font></div><div class=""><font face="Helvetica Neue" class="">-Chris</font></div><div class=""><font face="Helvetica Neue" class=""><br class=""></font><div><blockquote type="cite" class=""><div class="">On May 18, 2016, at 3:26 PM, Richard Smith via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Author: rsmith<br class="">Date: Wed May 18 17:26:36 2016<br class="">New Revision: 269992<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=269992&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=269992&view=rev</a><br class="">Log:<br class="">Work around a glibc bug: backtrace() spuriously fails if<br class=""> - glibc is dynamically linked, and<br class=""> - libgcc_s is unavailable (for instance, another library is being used to<br class="">   provide the compiler runtime or libgcc is statically linked), and<br class=""> - the target is x86_64.<br class=""><br class="">If we run backtrace() and it fails to find any stack frames, try using<br class="">_Unwind_Backtrace instead if available.<br class=""><br class="">Modified:<br class="">    llvm/trunk/cmake/config-ix.cmake<br class="">    llvm/trunk/lib/Support/Unix/Signals.inc<br class=""><br class="">Modified: llvm/trunk/cmake/config-ix.cmake<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=269992&r1=269991&r2=269992&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=269992&r1=269991&r2=269992&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/cmake/config-ix.cmake (original)<br class="">+++ llvm/trunk/cmake/config-ix.cmake Wed May 18 17:26:36 2016<br class="">@@ -144,6 +144,7 @@ endif()<br class=""> # function checks<br class=""> check_symbol_exists(arc4random "stdlib.h" HAVE_DECL_ARC4RANDOM)<br class=""> check_symbol_exists(backtrace "execinfo.h" HAVE_BACKTRACE)<br class="">+check_symbol_exists(_Unwind_Backtrace "unwind.h" HAVE_UNWIND_BACKTRACE)<br class=""> check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE)<br class=""> check_symbol_exists(getrusage sys/resource.h HAVE_GETRUSAGE)<br class=""> check_symbol_exists(setrlimit sys/resource.h HAVE_SETRLIMIT)<br class=""><br class="">Modified: llvm/trunk/lib/Support/Unix/Signals.inc<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Signals.inc?rev=269992&r1=269991&r2=269992&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Signals.inc?rev=269992&r1=269991&r2=269992&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Support/Unix/Signals.inc (original)<br class="">+++ llvm/trunk/lib/Support/Unix/Signals.inc Wed May 18 17:26:36 2016<br class="">@@ -45,6 +45,9 @@<br class=""> #if HAVE_LINK_H<br class=""> #include <link.h><br class=""> #endif<br class="">+#if HAVE_UNWIND_BACKTRACE<br class="">+#include <unwind.h><br class="">+#endif<br class=""><br class=""> using namespace llvm;<br class=""><br class="">@@ -309,17 +312,61 @@ static bool findModulesAndOffsets(void *<br class=""> }<br class=""> #endif // defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES) && ...<br class=""><br class="">+#if defined(ENABLE_BACKTRACES) && defined(HAVE_UNWIND_BACKTRACE)<br class="">+static int unwindBacktrace(void **StackTrace, int MaxEntries) {<br class="">+  if (MaxEntries < 0)<br class="">+    return 0;<br class="">+<br class="">+  // Skip the first frame ('unwindBacktrace' itself).<br class="">+  int Entries = -1;<br class="">+<br class="">+  auto HandleFrame = [&](_Unwind_Context *Context) -> _Unwind_Reason_Code {<br class="">+    // Apparently we need to detect reaching the end of the stack ourselves.<br class="">+    void *IP = (void *)_Unwind_GetIP(Context);<br class="">+    if (!IP)<br class="">+      return _URC_END_OF_STACK;<br class="">+<br class="">+    assert(Entries < MaxEntries && "recursively called after END_OF_STACK?");<br class="">+    if (Entries >= 0)<br class="">+      StackTrace[Entries] = IP;<br class="">+<br class="">+    if (++Entries == MaxEntries)<br class="">+      return _URC_END_OF_STACK;<br class="">+    return _URC_NO_REASON;<br class="">+  };<br class="">+<br class="">+  _Unwind_Backtrace(<br class="">+      [](_Unwind_Context *Context, void *Handler) {<br class="">+        return (*static_cast<decltype(HandleFrame) *>(Handler))(Context);<br class="">+      },<br class="">+      static_cast<void *>(&HandleFrame));<br class="">+  return std::max(Entries, 0);<br class="">+}<br class="">+#endif<br class="">+<br class=""> // PrintStackTrace - In the case of a program crash or fault, print out a stack<br class=""> // trace so that the user has an indication of why and where we died.<br class=""> //<br class=""> // On glibc systems we have the 'backtrace' function, which works nicely, but<br class=""> // doesn't demangle symbols.<br class=""> void llvm::sys::PrintStackTrace(raw_ostream &OS) {<br class="">-#if defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES)<br class="">-  static void* StackTrace[256];<br class="">+#if defined(ENABLE_BACKTRACES)<br class="">+  static void *StackTrace[256];<br class="">+  int depth = 0;<br class="">+#if defined(HAVE_BACKTRACE)<br class="">   // Use backtrace() to output a backtrace on Linux systems with glibc.<br class="">-  int depth = backtrace(StackTrace,<br class="">+  if (!depth)<br class="">+    depth = backtrace(StackTrace, static_cast<int>(array_lengthof(StackTrace)));<br class="">+#endif<br class="">+#if defined(HAVE_UNWIND_BACKTRACE)<br class="">+  // Try _Unwind_Backtrace() if backtrace() failed.<br class="">+  if (!depth)<br class="">+    depth = unwindBacktrace(StackTrace,<br class="">                         static_cast<int>(array_lengthof(StackTrace)));<br class="">+#endif<br class="">+  if (!depth)<br class="">+    return;<br class="">+<br class="">   if (printSymbolizedStackTrace(StackTrace, depth, OS))<br class="">     return;<br class=""> #if HAVE_DLFCN_H && __GNUG__<br class="">@@ -369,7 +416,7 @@ void llvm::sys::PrintStackTrace(raw_ostr<br class="">     }<br class="">     OS << '\n';<br class="">   }<br class="">-#else<br class="">+#elif defined(HAVE_BACKTRACE)<br class="">   backtrace_symbols_fd(StackTrace, depth, STDERR_FILENO);<br class=""> #endif<br class=""> #endif<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></div></div></blockquote></div><br class=""></div></body></html>