From 4eec5d8b8725612fc4ab7936a1e18ad343c9ff1c Mon Sep 17 00:00:00 2001 From: Ebuka Ezike Date: Tue, 15 Apr 2025 16:52:24 +0100 Subject: [PATCH] [symbolizer] Address starting with a plus sign is valid. this is also the same behaviour in gnu addr2line. Signed-off-by: Ebuka Ezike --- llvm/test/tools/llvm-symbolizer/symbol-search.test | 5 +++-- llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/llvm/test/tools/llvm-symbolizer/symbol-search.test b/llvm/test/tools/llvm-symbolizer/symbol-search.test index 6729c4b01bfef..fe9a61bd8ef6c 100644 --- a/llvm/test/tools/llvm-symbolizer/symbol-search.test +++ b/llvm/test/tools/llvm-symbolizer/symbol-search.test @@ -65,8 +65,9 @@ RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+0A | FileCheck --check-p RUN: llvm-addr2line --obj=%p/Inputs/symbols.so func_01+0A | FileCheck --check-prefix=NONEXISTENT %s # If '+' is not preceded by a symbol, it is part of a symbol name, not an offset separator. -RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so +0x1138 | FileCheck --check-prefix=NONEXISTENT %s -RUN: llvm-addr2line --obj=%p/Inputs/symbols.so +0x1138 | FileCheck --check-prefix=NONEXISTENT %s +# address starting with a `+` sign is a valid address +RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so +0x1138 | FileCheck --check-prefix=CODE-CMD %s +RUN: llvm-addr2line --obj=%p/Inputs/symbols.so +0x1138 | FileCheck --check-prefix=CODE-CMD %s # Show that C++ mangled names may be specified. RUN: llvm-addr2line --obj=%p/Inputs/symbols.so _ZL14static_func_01i | FileCheck --check-prefix=MULTI-CXX %s diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index 3ba7f59d5b847..c8abddbbab5dd 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -238,9 +238,12 @@ static Error parseCommand(StringRef BinaryName, bool IsAddr2Line, bool StartsWithDigit = std::isdigit(AddrSpec.front()); // GNU addr2line assumes the address is hexadecimal and allows a redundant - // "0x" or "0X" prefix; do the same for compatibility. - if (IsAddr2Line) - AddrSpec.consume_front("0x") || AddrSpec.consume_front("0X"); + // "0x" or "0X" prefix or with an optional `+` sign; do the same for + // compatibility. + if (IsAddr2Line) { + AddrSpec.consume_front_insensitive("0x") || + AddrSpec.consume_front_insensitive("+0x"); + } // If address specification is a number, treat it as a module offset. if (!AddrSpec.getAsInteger(IsAddr2Line ? 16 : 0, Offset)) {