diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc index 691e1014f18e8..6668a2953b3b2 100644 --- a/llvm/lib/Support/Unix/Signals.inc +++ b/llvm/lib/Support/Unix/Signals.inc @@ -826,14 +826,17 @@ void llvm::sys::PrintStackTrace(raw_ostream &OS, int Depth) { int width = 0; for (int i = 0; i < depth; ++i) { Dl_info dlinfo; - dladdr(StackTrace[i], &dlinfo); - const char *name = strrchr(dlinfo.dli_fname, '/'); - int nwidth; - if (!name) - nwidth = strlen(dlinfo.dli_fname); - else - nwidth = strlen(name) - 1; + if (dladdr(StackTrace[i], &dlinfo) == 0) { + nwidth = 7; // "(error)" + } else { + const char *name = strrchr(dlinfo.dli_fname, '/'); + + if (!name) + nwidth = strlen(dlinfo.dli_fname); + else + nwidth = strlen(name) - 1; + } if (nwidth > width) width = nwidth; @@ -841,15 +844,20 @@ void llvm::sys::PrintStackTrace(raw_ostream &OS, int Depth) { for (int i = 0; i < depth; ++i) { Dl_info dlinfo; - dladdr(StackTrace[i], &dlinfo); OS << format("%-2d", i); - const char *name = strrchr(dlinfo.dli_fname, '/'); - if (!name) - OS << format(" %-*s", width, static_cast(dlinfo.dli_fname)); - else - OS << format(" %-*s", width, name + 1); + if (dladdr(StackTrace[i], &dlinfo) == 0) { + OS << format(" %-*s", width, static_cast("(error)")); + dlinfo.dli_sname = nullptr; + } else { + const char *name = strrchr(dlinfo.dli_fname, '/'); + if (!name) + OS << format(" %-*s", width, + static_cast(dlinfo.dli_fname)); + else + OS << format(" %-*s", width, name + 1); + } OS << format(" %#0*lx", (int)(sizeof(void *) * 2) + 2, (unsigned long)StackTrace[i]);