Index: llvm/lib/DebugInfo/Symbolize/CMakeLists.txt =================================================================== --- llvm/lib/DebugInfo/Symbolize/CMakeLists.txt +++ llvm/lib/DebugInfo/Symbolize/CMakeLists.txt @@ -9,6 +9,7 @@ LINK_COMPONENTS DebugInfoDWARF DebugInfoPDB + Debuginfod Object Support Demangle Index: llvm/lib/DebugInfo/Symbolize/Symbolize.cpp =================================================================== --- llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -20,6 +20,7 @@ #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/DebugInfo/PDB/PDB.h" #include "llvm/DebugInfo/PDB/PDBContext.h" +#include "llvm/Debuginfod/Debuginfod.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Object/COFF.h" #include "llvm/Object/MachO.h" @@ -384,7 +385,14 @@ } } } - return false; + // Try debuginfod client cache and known servers. + Expected PathOrErr = getCachedOrDownloadDebuginfo(BuildID); + if (!PathOrErr) { + consumeError(PathOrErr.takeError()); + return false; + } + Result = *PathOrErr; + return true; } } // end anonymous namespace Index: llvm/test/tools/llvm-symbolizer/debuginfod.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-symbolizer/debuginfod.test @@ -0,0 +1,27 @@ +# This test uses the local debuginfod cache to test the symbolizer integration +# with the debuginfod client. +RUN: rm -rf %t +RUN: mkdir %t + +# Produce a stripped copy of the input binary addr.exe +RUN: llvm-objcopy --strip-debug %p/Inputs/addr.exe %t/addr.exe + +# Symbolizing the stripped binary should fail. +RUN: env DEBUGINFOD_CACHE_PATH=%t llvm-symbolizer --print-address \ +RUN: --obj=%t/addr.exe 0x40054d | FileCheck %s --check-prefix=NOTFOUND +NOTFOUND: 0x40054d +NOTFOUND-NEXT: main +NOTFOUND-NEXT: ??:0:0 + +# Use llvm-objcopy to write the debuginfo of the addr.exe binary to an +# appropriately-named file in the llvm debuginfod cache. The filename is +# determined by the debuginfod client's caching scheme, so it is manually +# specified here as llvmcache-98...19 +RUN: llvm-objcopy --keep-section=.debug_info %p/Inputs/addr.exe \ +RUN: %t/llvmcache-9800707741016212219 + +# The symbolizer should call the debuginfod client library, which finds the +# debuginfo placed in the cache, enabling symbolization of the address. +RUN: env DEBUGINFOD_CACHE_PATH=%t llvm-symbolizer \ +RUN: --obj=%t/addr.exe 0x40054d | FileCheck %s --check-prefix=FOUND +FOUND: {{[/\]+}}tmp{{[/\]+}}x.c:14:0