]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scripts/decode_stacktrace.sh: optionally use LLVM utilities
authorCarlos Llamas <cmllamas@google.com>
Fri, 29 Sep 2023 03:48:17 +0000 (03:48 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Feb 2024 07:42:31 +0000 (08:42 +0100)
[ Upstream commit efbd6398353315b7018e6943e41fee9ec35e875f ]

GNU's addr2line can have problems parsing a vmlinux built with LLVM,
particularly when LTO was used.  In order to decode the traces correctly
this patch adds the ability to switch to LLVM's utilities readelf and
addr2line.  The same approach is followed by Will in [1].

Before:
  $ scripts/decode_stacktrace.sh vmlinux < kernel.log
  [17716.240635] Call trace:
  [17716.240646] skb_cow_data (??:?)
  [17716.240654] esp6_input (ld-temp.o:?)
  [17716.240666] xfrm_input (ld-temp.o:?)
  [17716.240674] xfrm6_rcv (??:?)
  [...]

After:
  $ LLVM=1 scripts/decode_stacktrace.sh vmlinux < kernel.log
  [17716.240635] Call trace:
  [17716.240646] skb_cow_data (include/linux/skbuff.h:2172 net/core/skbuff.c:4503)
  [17716.240654] esp6_input (net/ipv6/esp6.c:977)
  [17716.240666] xfrm_input (net/xfrm/xfrm_input.c:659)
  [17716.240674] xfrm6_rcv (net/ipv6/xfrm6_input.c:172)
  [...]

Note that one could set CROSS_COMPILE=llvm- instead to hack around this
issue.  However, doing so can break the decodecode routine as it will
force the selection of other LLVM utilities down the line e.g.  llvm-as.

[1] https://lore.kernel.org/all/20230914131225.13415-3-will@kernel.org/

Link: https://lkml.kernel.org/r/20230929034836.403735-1-cmllamas@google.com
Signed-off-by: Carlos Llamas <cmllamas@google.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Elliot Berman <quic_eberman@quicinc.com>
Tested-by: Justin Stitt <justinstitt@google.com>
Cc: Will Deacon <will@kernel.org>
Cc: John Stultz <jstultz@google.com>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Tom Rix <trix@redhat.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
scripts/decode_stacktrace.sh

index 2157332750d5b17f97be8e9c34679d0203d45d8e..3463f0f6c3f4f13704445188d5a005be640056e4 100755 (executable)
@@ -17,6 +17,21 @@ elif type c++filt >/dev/null 2>&1 ; then
        cppfilt_opts=-i
 fi
 
+UTIL_SUFFIX=
+if [[ -z ${LLVM:-} ]]; then
+       UTIL_PREFIX=${CROSS_COMPILE:-}
+else
+       UTIL_PREFIX=llvm-
+       if [[ ${LLVM} == */ ]]; then
+               UTIL_PREFIX=${LLVM}${UTIL_PREFIX}
+       elif [[ ${LLVM} == -* ]]; then
+               UTIL_SUFFIX=${LLVM}
+       fi
+fi
+
+READELF=${UTIL_PREFIX}readelf${UTIL_SUFFIX}
+ADDR2LINE=${UTIL_PREFIX}addr2line${UTIL_SUFFIX}
+
 if [[ $1 == "-r" ]] ; then
        vmlinux=""
        basepath="auto"
@@ -52,7 +67,7 @@ fi
 find_module() {
        if [[ "$modpath" != "" ]] ; then
                for fn in $(find "$modpath" -name "${module//_/[-_]}.ko*") ; do
-                       if readelf -WS "$fn" | grep -qwF .debug_line ; then
+                       if ${READELF} -WS "$fn" | grep -qwF .debug_line ; then
                                echo $fn
                                return
                        fi
@@ -146,7 +161,7 @@ parse_symbol() {
        if [[ $aarray_support == true && "${cache[$module,$address]+isset}" == "isset" ]]; then
                local code=${cache[$module,$address]}
        else
-               local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address" 2>/dev/null)
+               local code=$(${ADDR2LINE} -i -e "$objfile" "$address" 2>/dev/null)
                if [[ $aarray_support == true ]]; then
                        cache[$module,$address]=$code
                fi