diff options
author | Chris Bieneman <beanz@apple.com> | 2016-05-20 20:15:17 +0000 |
---|---|---|
committer | Chris Bieneman <beanz@apple.com> | 2016-05-20 20:15:17 +0000 |
commit | 6b58c4723a94c8e89cb91e8e83d9fb8047fee329 (patch) | |
tree | 1d7a9be0f053e7cfb2e79b09ec89ca7d3de84a95 /llvm/lib/Support/Unix/Signals.inc | |
parent | 74f3dbe438d322a15657e56c99f33ee67c38d68c (diff) | |
download | bcm5719-llvm-6b58c4723a94c8e89cb91e8e83d9fb8047fee329.tar.gz bcm5719-llvm-6b58c4723a94c8e89cb91e8e83d9fb8047fee329.zip |
Revert "Work around a glibc bug: backtrace() spuriously fails if..."
This commit has been breaking the FreeBSD bots:
http://lab.llvm.org:8011/builders/lld-x86_64-freebsd
This reverts commit r269992.
llvm-svn: 270267
Diffstat (limited to 'llvm/lib/Support/Unix/Signals.inc')
-rw-r--r-- | llvm/lib/Support/Unix/Signals.inc | 55 |
1 files changed, 4 insertions, 51 deletions
diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc index 27f3414ce57..061cdb3da21 100644 --- a/llvm/lib/Support/Unix/Signals.inc +++ b/llvm/lib/Support/Unix/Signals.inc @@ -45,9 +45,6 @@ #if HAVE_LINK_H #include <link.h> #endif -#if HAVE_UNWIND_BACKTRACE -#include <unwind.h> -#endif using namespace llvm; @@ -312,61 +309,17 @@ static bool findModulesAndOffsets(void **StackTrace, int Depth, } #endif // defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES) && ... -#if defined(ENABLE_BACKTRACES) && defined(HAVE_UNWIND_BACKTRACE) -static int unwindBacktrace(void **StackTrace, int MaxEntries) { - if (MaxEntries < 0) - return 0; - - // Skip the first frame ('unwindBacktrace' itself). - int Entries = -1; - - auto HandleFrame = [&](_Unwind_Context *Context) -> _Unwind_Reason_Code { - // Apparently we need to detect reaching the end of the stack ourselves. - void *IP = (void *)_Unwind_GetIP(Context); - if (!IP) - return _URC_END_OF_STACK; - - assert(Entries < MaxEntries && "recursively called after END_OF_STACK?"); - if (Entries >= 0) - StackTrace[Entries] = IP; - - if (++Entries == MaxEntries) - return _URC_END_OF_STACK; - return _URC_NO_REASON; - }; - - _Unwind_Backtrace( - [](_Unwind_Context *Context, void *Handler) { - return (*static_cast<decltype(HandleFrame) *>(Handler))(Context); - }, - static_cast<void *>(&HandleFrame)); - return std::max(Entries, 0); -} -#endif - // PrintStackTrace - In the case of a program crash or fault, print out a stack // trace so that the user has an indication of why and where we died. // // On glibc systems we have the 'backtrace' function, which works nicely, but // doesn't demangle symbols. void llvm::sys::PrintStackTrace(raw_ostream &OS) { -#if defined(ENABLE_BACKTRACES) - static void *StackTrace[256]; - int depth = 0; -#if defined(HAVE_BACKTRACE) +#if defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES) + static void* StackTrace[256]; // Use backtrace() to output a backtrace on Linux systems with glibc. - if (!depth) - depth = backtrace(StackTrace, static_cast<int>(array_lengthof(StackTrace))); -#endif -#if defined(HAVE_UNWIND_BACKTRACE) - // Try _Unwind_Backtrace() if backtrace() failed. - if (!depth) - depth = unwindBacktrace(StackTrace, + int depth = backtrace(StackTrace, static_cast<int>(array_lengthof(StackTrace))); -#endif - if (!depth) - return; - if (printSymbolizedStackTrace(StackTrace, depth, OS)) return; #if HAVE_DLFCN_H && __GNUG__ @@ -416,7 +369,7 @@ void llvm::sys::PrintStackTrace(raw_ostream &OS) { } OS << '\n'; } -#elif defined(HAVE_BACKTRACE) +#else backtrace_symbols_fd(StackTrace, depth, STDERR_FILENO); #endif #endif |