xref: /dpdk/devtools/check-symbol-maps.sh (revision 1fbb3977cb4cc95a88a383825b188398659883ea)
1f8ad40dcSThomas Monjalon#! /bin/sh -e
2f8ad40dcSThomas Monjalon# SPDX-License-Identifier: BSD-3-Clause
3f8ad40dcSThomas Monjalon# Copyright 2018 Mellanox Technologies, Ltd
4f8ad40dcSThomas Monjalon
5f8ad40dcSThomas Monjaloncd $(dirname $0)/..
6f8ad40dcSThomas Monjalon
7f8ad40dcSThomas Monjalon# speed up by ignoring Unicode details
8f8ad40dcSThomas Monjalonexport LC_ALL=C
9f8ad40dcSThomas Monjalon
10cf8a9e93SDavid Marchandif [ $# = 0 ] ; then
11bfc43a0fSDavid Marchand    set -- $(find lib drivers -name '*.map' -a ! -path drivers/version.map)
12cf8a9e93SDavid Marchandfi
13cf8a9e93SDavid Marchand
1429416001SDavid Marchandret=0
1529416001SDavid Marchand
16f8ad40dcSThomas Monjalonfind_orphan_symbols ()
17f8ad40dcSThomas Monjalon{
18cf8a9e93SDavid Marchand    for map in $@ ; do
1956ea803eSDavid Marchand        for sym in $(sed -rn 's,^([^}]*_.*);.*$,\1,p' $map) ; do
20f8ad40dcSThomas Monjalon            if echo $sym | grep -q '^per_lcore_' ; then
217b63fb3bSThomas Monjalon                symsrc=${sym#per_lcore_}
227b63fb3bSThomas Monjalon            elif echo $sym | grep -q '^__rte_.*_trace_' ; then
237b63fb3bSThomas Monjalon                symsrc=${sym#__}
247b63fb3bSThomas Monjalon            else
257b63fb3bSThomas Monjalon                symsrc=$sym
26f8ad40dcSThomas Monjalon            fi
2771459555SDavid Marchand            if [ -z "$(grep -rlw $symsrc $(dirname $map) | grep -v $map)" ] ; then
28f8ad40dcSThomas Monjalon                echo "$map: $sym"
29f8ad40dcSThomas Monjalon            fi
30f8ad40dcSThomas Monjalon        done
31f8ad40dcSThomas Monjalon    done
32f8ad40dcSThomas Monjalon}
33f8ad40dcSThomas Monjalon
34cf8a9e93SDavid Marchandorphan_symbols=$(find_orphan_symbols $@)
35f8ad40dcSThomas Monjalonif [ -n "$orphan_symbols" ] ; then
36f8ad40dcSThomas Monjalon    echo "Found only in symbol map file:"
37f8ad40dcSThomas Monjalon    echo "$orphan_symbols" | sed 's,^,\t,'
3829416001SDavid Marchand    ret=1
39f8ad40dcSThomas Monjalonfi
4029416001SDavid Marchand
41760a67e9SDavid Marchandfind_duplicate_symbols ()
42760a67e9SDavid Marchand{
43cf8a9e93SDavid Marchand    for map in $@ ; do
44760a67e9SDavid Marchand        buildtools/map-list-symbol.sh $map | \
45760a67e9SDavid Marchand            sort | uniq -c | grep -v " 1 $map" || true
46760a67e9SDavid Marchand    done
47760a67e9SDavid Marchand}
48760a67e9SDavid Marchand
49cf8a9e93SDavid Marchandduplicate_symbols=$(find_duplicate_symbols $@)
50760a67e9SDavid Marchandif [ -n "$duplicate_symbols" ] ; then
51760a67e9SDavid Marchand    echo "Found duplicates in symbol map file:"
52760a67e9SDavid Marchand    echo "$duplicate_symbols"
53760a67e9SDavid Marchand    ret=1
54760a67e9SDavid Marchandfi
55760a67e9SDavid Marchand
56272f94e5SThomas Monjalonlocal_miss_maps=$(grep -L 'local: \*;' $@ || true)
57b403498eSThomas Monjalonif [ -n "$local_miss_maps" ] ; then
58b403498eSThomas Monjalon    echo "Found maps without local catch-all:"
59b403498eSThomas Monjalon    echo "$local_miss_maps"
60b403498eSThomas Monjalon    ret=1
61b403498eSThomas Monjalonfi
62b403498eSThomas Monjalon
63b67bdda8SDavid Marchandfind_empty_maps ()
64b67bdda8SDavid Marchand{
65b67bdda8SDavid Marchand    for map in $@ ; do
66b67bdda8SDavid Marchand        [ $(buildtools/map-list-symbol.sh $map | wc -l) != '0' ] || echo $map
67b67bdda8SDavid Marchand    done
68b67bdda8SDavid Marchand}
69b67bdda8SDavid Marchand
70b67bdda8SDavid Marchandempty_maps=$(find_empty_maps $@)
71b67bdda8SDavid Marchandif [ -n "$empty_maps" ] ; then
72b67bdda8SDavid Marchand    echo "Found empty maps:"
73b67bdda8SDavid Marchand    echo "$empty_maps"
74b67bdda8SDavid Marchand    ret=1
75b67bdda8SDavid Marchandfi
76b67bdda8SDavid Marchand
77af59c9c1SDavid Marchandfind_bad_format_maps ()
78af59c9c1SDavid Marchand{
79af59c9c1SDavid Marchand    abi_version=$(cut -d'.' -f 1 ABI_VERSION)
80af59c9c1SDavid Marchand    next_abi_version=$((abi_version + 1))
81af59c9c1SDavid Marchand    for map in $@ ; do
82af59c9c1SDavid Marchand        cat $map | awk '
83af59c9c1SDavid Marchand            /^(DPDK_('$abi_version'|'$next_abi_version')|EXPERIMENTAL|INTERNAL) \{$/ { next; } # start of a section
84af59c9c1SDavid Marchand            /^}( DPDK_'$abi_version')?;$/ { next; } # end of a section
85af59c9c1SDavid Marchand            /^$/ { next; } # empty line
86af59c9c1SDavid Marchand            /^\t(global:|local: \*;)$/ { next; } # qualifiers
87af59c9c1SDavid Marchand            /^\t[a-zA-Z_0-9]*;( # WINDOWS_NO_EXPORT)?$/ { next; } # symbols
88af59c9c1SDavid Marchand            /^\t# added in [0-9]*\.[0-9]*$/ { next; } # version comments
89af59c9c1SDavid Marchand            { print $0; }' || echo $map
90af59c9c1SDavid Marchand    done
91af59c9c1SDavid Marchand}
92af59c9c1SDavid Marchand
93af59c9c1SDavid Marchandbad_format_maps=$(find_bad_format_maps $@)
94af59c9c1SDavid Marchandif [ -n "$bad_format_maps" ] ; then
95af59c9c1SDavid Marchand    echo "Found badly formatted maps:"
96af59c9c1SDavid Marchand    echo "$bad_format_maps"
97af59c9c1SDavid Marchand    ret=1
98af59c9c1SDavid Marchandfi
99af59c9c1SDavid Marchand
100*1fbb3977SDavid Marchandfind_non_versioned_maps ()
101*1fbb3977SDavid Marchand{
102*1fbb3977SDavid Marchand    for map in $@ ; do
103*1fbb3977SDavid Marchand        [ $(buildtools/map-list-symbol.sh -S EXPERIMENTAL -V unset $map | wc -l) = '0' ] ||
104*1fbb3977SDavid Marchand            echo $map
105*1fbb3977SDavid Marchand    done
106*1fbb3977SDavid Marchand}
107*1fbb3977SDavid Marchand
108*1fbb3977SDavid Marchandnon_versioned_maps=$(find_non_versioned_maps $@)
109*1fbb3977SDavid Marchandif [ -n "$non_versioned_maps" ] ; then
110*1fbb3977SDavid Marchand    echo "Found non versioned maps:"
111*1fbb3977SDavid Marchand    echo "$non_versioned_maps"
112*1fbb3977SDavid Marchand    ret=1
113*1fbb3977SDavid Marchandfi
114*1fbb3977SDavid Marchand
11529416001SDavid Marchandexit $ret
116