]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scripts/faddr2line: Check vmlinux only once
authorBrian Johannesmeyer <bjohannesmeyer@gmail.com>
Mon, 15 Apr 2024 14:55:34 +0000 (16:55 +0200)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Wed, 3 Jul 2024 06:38:36 +0000 (23:38 -0700)
Rather than checking whether the object file is vmlinux for each invocation
of __faddr2line, check it only once beforehand.

Signed-off-by: Brian Johannesmeyer <bjohannesmeyer@gmail.com>
Link: https://lore.kernel.org/r/20240415145538.1938745-4-bjohannesmeyer@gmail.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
scripts/faddr2line

index f011bda4ed258f7f399f92cdf96fe92cae62718a..bb3b5f03f4ea756abd219175f138f8adb144888a 100755 (executable)
@@ -115,6 +115,17 @@ run_readelf() {
        ELF_SYMS=$(echo "${out}" | sed -n '/Symbol table .* contains [0-9]* entries:/,$p')
 }
 
+check_vmlinux() {
+       # vmlinux uses absolute addresses in the section table rather than
+       # section offsets.
+       IS_VMLINUX=0
+       local file_type=$(echo "${ELF_FILEHEADER}" |
+               ${AWK} '$1 == "Type:" { print $2; exit }')
+       if [[ $file_type = "EXEC" ]] || [[ $file_type == "DYN" ]]; then
+               IS_VMLINUX=1
+       fi
+}
+
 __faddr2line() {
        local objfile=$1
        local func_addr=$2
@@ -125,8 +136,6 @@ __faddr2line() {
        local func_offset=${func_addr#*+}
        func_offset=${func_offset%/*}
        local user_size=
-       local file_type
-       local is_vmlinux=0
        [[ $func_addr =~ "/" ]] && user_size=${func_addr#*/}
 
        if [[ -z $sym_name ]] || [[ -z $func_offset ]] || [[ $sym_name = $func_addr ]]; then
@@ -135,14 +144,6 @@ __faddr2line() {
                return
        fi
 
-       # vmlinux uses absolute addresses in the section table rather than
-       # section offsets.
-       local file_type=$(echo "${ELF_FILEHEADER}" |
-               ${AWK} '$1 == "Type:" { print $2; exit }')
-       if [[ $file_type = "EXEC" ]] || [[ $file_type == "DYN" ]]; then
-               is_vmlinux=1
-       fi
-
        # Go through each of the object's symbols which match the func name.
        # In rare cases there might be duplicates, in which case we print all
        # matches.
@@ -260,7 +261,7 @@ __faddr2line() {
                # Pass section address to addr2line and strip absolute paths
                # from the output:
                local args="--functions --pretty-print --inlines --exe=$objfile"
-               [[ $is_vmlinux = 0 ]] && args="$args --section=$sec_name"
+               [[ $IS_VMLINUX = 0 ]] && args="$args --section=$sec_name"
                local output=$(${ADDR2LINE} $args $addr | sed "s; $dir_prefix\(\./\)*; ;")
                [[ -z $output ]] && continue
 
@@ -305,6 +306,8 @@ run_readelf $objfile
 
 echo "${ELF_SECHEADERS}" | ${GREP} -q '\.debug_info' || die "CONFIG_DEBUG_INFO not enabled"
 
+check_vmlinux
+
 DIR_PREFIX=supercalifragilisticexpialidocious
 find_dir_prefix $objfile