diff --git a/llvm/lib/Support/Signals.cpp b/llvm/lib/Support/Signals.cpp --- a/llvm/lib/Support/Signals.cpp +++ b/llvm/lib/Support/Signals.cpp @@ -136,6 +136,20 @@ return format_hex((uint64_t)PC, PtrWidth); } +/// Resolve \param File to its real path if it is a symlink +/// and return its parent path. +static StringRef resolveSymlinkParent(StringRef File) { + StringRef ResolvedParent; + if (!llvm::sys::fs::is_symlink_file(File)) + return ResolvedParent; + + llvm::SmallString<128> Resolved; + if (llvm::sys::fs::real_path(File, Resolved)) + return ResolvedParent; + + return llvm::sys::path::parent_path(Resolved); +} + /// Helper that launches llvm-symbolizer and symbolizes a backtrace. LLVM_ATTRIBUTE_USED static bool printSymbolizedStackTrace(StringRef Argv0, void **StackTrace, @@ -156,7 +170,13 @@ LLVMSymbolizerPathOrErr = sys::findProgramByName(Path); } else if (!Argv0.empty()) { StringRef Parent = llvm::sys::path::parent_path(Argv0); + std::vector paths; + if (!Parent.empty()) + paths.push_back(Parent); + Parent = resolveSymlinkParent(Argv0); if (!Parent.empty()) + paths.push_back(Parent); + if (!paths.empty()) LLVMSymbolizerPathOrErr = sys::findProgramByName("llvm-symbolizer", Parent); } if (!LLVMSymbolizerPathOrErr)