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