xref: /dpdk/devtools/check-symbol-maps.sh (revision 1fbb3977cb4cc95a88a383825b188398659883ea)
1#! /bin/sh -e
2# SPDX-License-Identifier: BSD-3-Clause
3# Copyright 2018 Mellanox Technologies, Ltd
4
5cd $(dirname $0)/..
6
7# speed up by ignoring Unicode details
8export LC_ALL=C
9
10if [ $# = 0 ] ; then
11    set -- $(find lib drivers -name '*.map' -a ! -path drivers/version.map)
12fi
13
14ret=0
15
16find_orphan_symbols ()
17{
18    for map in $@ ; do
19        for sym in $(sed -rn 's,^([^}]*_.*);.*$,\1,p' $map) ; do
20            if echo $sym | grep -q '^per_lcore_' ; then
21                symsrc=${sym#per_lcore_}
22            elif echo $sym | grep -q '^__rte_.*_trace_' ; then
23                symsrc=${sym#__}
24            else
25                symsrc=$sym
26            fi
27            if [ -z "$(grep -rlw $symsrc $(dirname $map) | grep -v $map)" ] ; then
28                echo "$map: $sym"
29            fi
30        done
31    done
32}
33
34orphan_symbols=$(find_orphan_symbols $@)
35if [ -n "$orphan_symbols" ] ; then
36    echo "Found only in symbol map file:"
37    echo "$orphan_symbols" | sed 's,^,\t,'
38    ret=1
39fi
40
41find_duplicate_symbols ()
42{
43    for map in $@ ; do
44        buildtools/map-list-symbol.sh $map | \
45            sort | uniq -c | grep -v " 1 $map" || true
46    done
47}
48
49duplicate_symbols=$(find_duplicate_symbols $@)
50if [ -n "$duplicate_symbols" ] ; then
51    echo "Found duplicates in symbol map file:"
52    echo "$duplicate_symbols"
53    ret=1
54fi
55
56local_miss_maps=$(grep -L 'local: \*;' $@ || true)
57if [ -n "$local_miss_maps" ] ; then
58    echo "Found maps without local catch-all:"
59    echo "$local_miss_maps"
60    ret=1
61fi
62
63find_empty_maps ()
64{
65    for map in $@ ; do
66        [ $(buildtools/map-list-symbol.sh $map | wc -l) != '0' ] || echo $map
67    done
68}
69
70empty_maps=$(find_empty_maps $@)
71if [ -n "$empty_maps" ] ; then
72    echo "Found empty maps:"
73    echo "$empty_maps"
74    ret=1
75fi
76
77find_bad_format_maps ()
78{
79    abi_version=$(cut -d'.' -f 1 ABI_VERSION)
80    next_abi_version=$((abi_version + 1))
81    for map in $@ ; do
82        cat $map | awk '
83            /^(DPDK_('$abi_version'|'$next_abi_version')|EXPERIMENTAL|INTERNAL) \{$/ { next; } # start of a section
84            /^}( DPDK_'$abi_version')?;$/ { next; } # end of a section
85            /^$/ { next; } # empty line
86            /^\t(global:|local: \*;)$/ { next; } # qualifiers
87            /^\t[a-zA-Z_0-9]*;( # WINDOWS_NO_EXPORT)?$/ { next; } # symbols
88            /^\t# added in [0-9]*\.[0-9]*$/ { next; } # version comments
89            { print $0; }' || echo $map
90    done
91}
92
93bad_format_maps=$(find_bad_format_maps $@)
94if [ -n "$bad_format_maps" ] ; then
95    echo "Found badly formatted maps:"
96    echo "$bad_format_maps"
97    ret=1
98fi
99
100find_non_versioned_maps ()
101{
102    for map in $@ ; do
103        [ $(buildtools/map-list-symbol.sh -S EXPERIMENTAL -V unset $map | wc -l) = '0' ] ||
104            echo $map
105    done
106}
107
108non_versioned_maps=$(find_non_versioned_maps $@)
109if [ -n "$non_versioned_maps" ] ; then
110    echo "Found non versioned maps:"
111    echo "$non_versioned_maps"
112    ret=1
113fi
114
115exit $ret
116