aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
diff options
context:
space:
mode:
authorSerge Pavlov <sepavloff@gmail.com>2023-12-15 17:35:33 +0700
committerGitHub <noreply@github.com>2023-12-15 17:35:33 +0700
commitcb1a7d28e608a107d001e11e0e0baa8b4fea97b5 (patch)
tree5090e6c3f0b305f03d9ba5ad79898d4efc20aa08 /llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
parent229273f538967a3b096b70acb52e046a715ab358 (diff)
downloadllvm-cb1a7d28e608a107d001e11e0e0baa8b4fea97b5.zip
llvm-cb1a7d28e608a107d001e11e0e0baa8b4fea97b5.tar.gz
llvm-cb1a7d28e608a107d001e11e0e0baa8b4fea97b5.tar.bz2
[symbolizer] Support symbol+offset lookup (#75067)
GNU addr2line supports lookup by symbol name in addition to the existing address lookup. llvm-symbolizer starting from e144ae54dcb96838a6176fd9eef21028935ccd4f supports lookup by symbol name. This change extends this lookup with possibility to specify optional offset. Now the address for which source information is searched for can be specified with offset: llvm-symbolize --obj=abc.so "SYMBOL func_22+0x12" It decreases the gap in features of llvm-symbolizer and GNU addr2line. This lookup now is supported for code only. Migrated from: https://reviews.llvm.org/D139859 Pull request: https://github.com/llvm/llvm-project/pull/75067
Diffstat (limited to 'llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp')
-rw-r--r--llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
index 6973030..0c40432 100644
--- a/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
+++ b/llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
@@ -352,12 +352,14 @@ std::vector<DILocal> SymbolizableObjectFile::symbolizeFrame(
}
std::vector<object::SectionedAddress>
-SymbolizableObjectFile::findSymbol(StringRef Symbol) const {
+SymbolizableObjectFile::findSymbol(StringRef Symbol, uint64_t Offset) const {
std::vector<object::SectionedAddress> Result;
for (const SymbolDesc &Sym : Symbols) {
if (Sym.Name.equals(Symbol)) {
- object::SectionedAddress A{Sym.Addr,
- getModuleSectionIndexForAddress(Sym.Addr)};
+ uint64_t Addr = Sym.Addr;
+ if (Offset < Sym.Size)
+ Addr += Offset;
+ object::SectionedAddress A{Addr, getModuleSectionIndexForAddress(Addr)};
Result.push_back(A);
}
}