2023-12-15 18:27:15

by Elliot Berman

[permalink] [raw]
Subject: [PATCH] scripts/decode_stacktrace.sh: Use LLVM environment variable

When using LLVM as the compiler, decode_stacktrace should also use
llvm-addr2line. Check if LLVM is set and add the appropriate
suffix/prefix.

Signed-off-by: Elliot Berman <[email protected]>
---
scripts/decode_stacktrace.sh | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
index 564c5632e1a2..189b00f4e120 100755
--- a/scripts/decode_stacktrace.sh
+++ b/scripts/decode_stacktrace.sh
@@ -16,6 +16,16 @@ elif type c++filt >/dev/null 2>&1 ; then
cppfilt_opts=-i
fi

+if [[ "${LLVM}" == "1" ]] ; then
+ addr2line="llvm-addr2line"
+elif [[ "${LLVM}" == */ ]] ; then
+ addr2line="${LLVM}llvm-addr2line"
+elif [[ "${LLVM}" == -* ]] ; then
+ addr2line="llvm-addr2line${LLVM}"
+else
+ addr2line="${CROSS_COMPILE}addr2line"
+fi
+
if [[ $1 == "-r" ]] ; then
vmlinux=""
basepath="auto"
@@ -169,7 +179,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

---
base-commit: 3f7168591ebf7bbdb91797d02b1afaf00a4289b1
change-id: 20231214-llvm-decode-stacktrace-09538979006d

Best regards,
--
Elliot Berman <[email protected]>



2023-12-15 21:19:42

by Justin Stitt

[permalink] [raw]
Subject: Re: [PATCH] scripts/decode_stacktrace.sh: Use LLVM environment variable

Hi,

On Fri, Dec 15, 2023 at 10:27 AM Elliot Berman <[email protected]> wrote:
>
> When using LLVM as the compiler, decode_stacktrace should also use
> llvm-addr2line. Check if LLVM is set and add the appropriate
> suffix/prefix.
>
> Signed-off-by: Elliot Berman <[email protected]>
> ---

I tried it out by dropping a random dump_stack() call into the init
phase of the kernel and redirecting the serial console output to a log
file. Using the pre-(this patch) and post-(this patch) script yields
good stack trace results. It seems llvm-addr2line is a drop-in
replacement.

Tested-by: Justin Stitt <[email protected]>

> scripts/decode_stacktrace.sh | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
> index 564c5632e1a2..189b00f4e120 100755
> --- a/scripts/decode_stacktrace.sh
> +++ b/scripts/decode_stacktrace.sh
> @@ -16,6 +16,16 @@ elif type c++filt >/dev/null 2>&1 ; then
> cppfilt_opts=-i
> fi
>
> +if [[ "${LLVM}" == "1" ]] ; then
> + addr2line="llvm-addr2line"
> +elif [[ "${LLVM}" == */ ]] ; then
> + addr2line="${LLVM}llvm-addr2line"
> +elif [[ "${LLVM}" == -* ]] ; then
> + addr2line="llvm-addr2line${LLVM}"
> +else
> + addr2line="${CROSS_COMPILE}addr2line"
> +fi
> +
> if [[ $1 == "-r" ]] ; then
> vmlinux=""
> basepath="auto"
> @@ -169,7 +179,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
>
> ---
> base-commit: 3f7168591ebf7bbdb91797d02b1afaf00a4289b1
> change-id: 20231214-llvm-decode-stacktrace-09538979006d
>
> Best regards,
> --
> Elliot Berman <[email protected]>
>

Thanks
Justin

2023-12-18 16:44:25

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH] scripts/decode_stacktrace.sh: Use LLVM environment variable

On Fri, Dec 15, 2023 at 10:27 AM Elliot Berman <[email protected]> wrote:

This patch looks familiar...
https://lore.kernel.org/lkml/[email protected]/

Masahiro, can you please pick up that patch?

Elliot, Justin, can you help test/review that patch?

>
> When using LLVM as the compiler, decode_stacktrace should also use
> llvm-addr2line. Check if LLVM is set and add the appropriate
> suffix/prefix.
>
> Signed-off-by: Elliot Berman <[email protected]>
> ---
> scripts/decode_stacktrace.sh | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
> index 564c5632e1a2..189b00f4e120 100755
> --- a/scripts/decode_stacktrace.sh
> +++ b/scripts/decode_stacktrace.sh
> @@ -16,6 +16,16 @@ elif type c++filt >/dev/null 2>&1 ; then
> cppfilt_opts=-i
> fi
>
> +if [[ "${LLVM}" == "1" ]] ; then
> + addr2line="llvm-addr2line"
> +elif [[ "${LLVM}" == */ ]] ; then
> + addr2line="${LLVM}llvm-addr2line"
> +elif [[ "${LLVM}" == -* ]] ; then
> + addr2line="llvm-addr2line${LLVM}"
> +else
> + addr2line="${CROSS_COMPILE}addr2line"
> +fi
> +
> if [[ $1 == "-r" ]] ; then
> vmlinux=""
> basepath="auto"
> @@ -169,7 +179,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
>
> ---
> base-commit: 3f7168591ebf7bbdb91797d02b1afaf00a4289b1
> change-id: 20231214-llvm-decode-stacktrace-09538979006d
>
> Best regards,
> --
> Elliot Berman <[email protected]>
>


--
Thanks,
~Nick Desaulniers

2023-12-19 00:17:21

by Justin Stitt

[permalink] [raw]
Subject: Re: [PATCH] scripts/decode_stacktrace.sh: Use LLVM environment variable

Hi,

On Mon, Dec 18, 2023 at 8:37 AM Nick Desaulniers
<[email protected]> wrote:
>
> On Fri, Dec 15, 2023 at 10:27 AM Elliot Berman <[email protected]> wrote:
>
> This patch looks familiar...
> https://lore.kernel.org/lkml/[email protected]/
>
> Masahiro, can you please pick up that patch?
>
> Elliot, Justin, can you help test/review that patch?
>

Interestingly, I am getting good stack traces on mainline with a
LLVM-built kernel -- both with and without that patch.

It may help others, so I'll go to that patch and add my tested-by.

> >
> > When using LLVM as the compiler, decode_stacktrace should also use
> > llvm-addr2line. Check if LLVM is set and add the appropriate
> > suffix/prefix.
> >
> > Signed-off-by: Elliot Berman <[email protected]>
> > ---
> > scripts/decode_stacktrace.sh | 12 +++++++++++-
> > 1 file changed, 11 insertions(+), 1 deletion(-)
> >
> > diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
> > index 564c5632e1a2..189b00f4e120 100755
> > --- a/scripts/decode_stacktrace.sh
> > +++ b/scripts/decode_stacktrace.sh
> > @@ -16,6 +16,16 @@ elif type c++filt >/dev/null 2>&1 ; then
> > cppfilt_opts=-i
> > fi
> >
> > +if [[ "${LLVM}" == "1" ]] ; then
> > + addr2line="llvm-addr2line"
> > +elif [[ "${LLVM}" == */ ]] ; then
> > + addr2line="${LLVM}llvm-addr2line"
> > +elif [[ "${LLVM}" == -* ]] ; then
> > + addr2line="llvm-addr2line${LLVM}"
> > +else
> > + addr2line="${CROSS_COMPILE}addr2line"
> > +fi
> > +
> > if [[ $1 == "-r" ]] ; then
> > vmlinux=""
> > basepath="auto"
> > @@ -169,7 +179,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
> >
> > ---
> > base-commit: 3f7168591ebf7bbdb91797d02b1afaf00a4289b1
> > change-id: 20231214-llvm-decode-stacktrace-09538979006d
> >
> > Best regards,
> > --
> > Elliot Berman <[email protected]>
> >
>
>
> --
> Thanks,
> ~Nick Desaulniers

Thanks
Justin

2023-12-19 16:50:18

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH] scripts/decode_stacktrace.sh: Use LLVM environment variable

On Mon, Dec 18, 2023 at 4:17 PM Justin Stitt <[email protected]> wrote:
>
> Interestingly, I am getting good stack traces on mainline with a
> LLVM-built kernel -- both with and without that patch.

Probably because:
1. you have GNU binutils installed.
2. you're not testing .o files from an LTO build (which GNU binutils
cannot decode).

--
Thanks,
~Nick Desaulniers

2023-12-19 21:12:59

by Justin Stitt

[permalink] [raw]
Subject: Re: [PATCH] scripts/decode_stacktrace.sh: Use LLVM environment variable

On Tue, Dec 19, 2023 at 8:49 AM Nick Desaulniers
<[email protected]> wrote:
>
> On Mon, Dec 18, 2023 at 4:17 PM Justin Stitt <[email protected]> wrote:
> >
> > Interestingly, I am getting good stack traces on mainline with a
> > LLVM-built kernel -- both with and without that patch.
>
> Probably because:
> 1. you have GNU binutils installed.
> 2. you're not testing .o files from an LTO build (which GNU binutils
> cannot decode).
>

Yes, and yes. Makes sense.

> --
> Thanks,
> ~Nick Desaulniers

Cheers