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 @@ -157,7 +157,20 @@ } else if (!Argv0.empty()) { StringRef Parent = llvm::sys::path::parent_path(Argv0); if (!Parent.empty()) - LLVMSymbolizerPathOrErr = sys::findProgramByName("llvm-symbolizer", Parent); + LLVMSymbolizerPathOrErr = + sys::findProgramByName("llvm-symbolizer", Parent); + + // If we fail to find llvm-symbolizer and Argv0 is symlink we should resolve + // the symlink and retry real path's parent directory. + if (!LLVMSymbolizerPathOrErr && llvm::sys::fs::is_symlink_file(Argv0)) { + llvm::SmallString<128> Resolved; + if (!llvm::sys::fs::real_path(Argv0, Resolved)) { + Parent = llvm::sys::path::parent_path(Resolved); + if (!Parent.empty()) + LLVMSymbolizerPathOrErr = + sys::findProgramByName("llvm-symbolizer", Parent); + } + } } if (!LLVMSymbolizerPathOrErr) LLVMSymbolizerPathOrErr = sys::findProgramByName("llvm-symbolizer");