2018-06-27 18:01:01 +00:00
|
|
|
#!/bin/sh
|
|
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
# Copyright(c) 2018 Neil Horman <nhorman@tuxdriver.com>
|
|
|
|
|
|
|
|
build_map_changes()
|
|
|
|
{
|
2018-08-05 09:38:47 +00:00
|
|
|
local fname="$1"
|
|
|
|
local mapdb="$2"
|
2018-06-27 18:01:01 +00:00
|
|
|
|
2018-07-18 21:26:58 +00:00
|
|
|
cat "$fname" | awk '
|
2018-06-27 18:01:01 +00:00
|
|
|
# Initialize our variables
|
|
|
|
BEGIN {map="";sym="";ar="";sec=""; in_sec=0; in_map=0}
|
|
|
|
|
|
|
|
# Anything that starts with + or -, followed by an a
|
|
|
|
# and ends in the string .map is the name of our map file
|
|
|
|
# This may appear multiple times in a patch if multiple
|
|
|
|
# map files are altered, and all section/symbol names
|
|
|
|
# appearing between a triggering of this rule and the
|
|
|
|
# next trigger of this rule are associated with this file
|
2020-03-23 11:56:13 +00:00
|
|
|
/[-+] [ab]\/.*\.map/ {map=$2; in_map=1; next}
|
2018-06-27 18:01:01 +00:00
|
|
|
|
2020-03-23 11:56:13 +00:00
|
|
|
# The previous rule catches all .map files, anything else
|
|
|
|
# indicates we left the map chunk.
|
|
|
|
/[-+] [ab]\// {in_map=0}
|
2018-06-27 18:01:01 +00:00
|
|
|
|
2018-08-16 11:08:01 +00:00
|
|
|
# Triggering this rule, which starts a line and ends it
|
2018-06-27 18:01:01 +00:00
|
|
|
# with a { identifies a versioned section. The section name is
|
|
|
|
# the rest of the line with the + and { symbols remvoed.
|
|
|
|
# Triggering this rule sets in_sec to 1, which actives the
|
|
|
|
# symbol rule below
|
2018-08-16 11:08:01 +00:00
|
|
|
/^.*{/ {
|
2018-11-30 12:32:02 +00:00
|
|
|
gsub("+", "");
|
2018-06-27 18:01:01 +00:00
|
|
|
if (in_map == 1) {
|
2018-08-16 11:08:01 +00:00
|
|
|
sec=$(NF-1); in_sec=1;
|
2018-06-27 18:01:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# This rule idenfies the end of a section, and disables the
|
|
|
|
# symbol rule
|
|
|
|
/.*}/ {in_sec=0}
|
|
|
|
|
|
|
|
# This rule matches on a + followed by any characters except a :
|
|
|
|
# (which denotes a global vs local segment), and ends with a ;.
|
|
|
|
# The semicolon is removed and the symbol is printed with its
|
|
|
|
# association file name and version section, along with an
|
|
|
|
# indicator that the symbol is a new addition. Note this rule
|
|
|
|
# only works if we have found a version section in the rule
|
|
|
|
# above (hence the in_sec check) And found a map file (the
|
|
|
|
# in_map check). If we are not in a map chunk, do nothing. If
|
|
|
|
# we are in a map chunk but not a section chunk, record it as
|
|
|
|
# unknown.
|
|
|
|
/^+[^}].*[^:*];/ {gsub(";","");sym=$2;
|
|
|
|
if (in_map == 1) {
|
|
|
|
if (in_sec == 1) {
|
|
|
|
print map " " sym " " sec " add"
|
|
|
|
} else {
|
|
|
|
print map " " sym " unknown add"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# This is the same rule as above, but the rule matches on a
|
|
|
|
# leading - rather than a +, denoting that the symbol is being
|
|
|
|
# removed.
|
|
|
|
/^-[^}].*[^:*];/ {gsub(";","");sym=$2;
|
|
|
|
if (in_map == 1) {
|
|
|
|
if (in_sec == 1) {
|
|
|
|
print map " " sym " " sec " del"
|
|
|
|
} else {
|
|
|
|
print map " " sym " unknown del"
|
|
|
|
}
|
|
|
|
}
|
2018-07-18 21:26:58 +00:00
|
|
|
}' > "$mapdb"
|
2018-06-27 18:01:01 +00:00
|
|
|
|
2018-07-18 21:26:58 +00:00
|
|
|
sort -u "$mapdb" > "$mapdb.2"
|
|
|
|
mv -f "$mapdb.2" "$mapdb"
|
2018-06-27 18:01:01 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-04-25 10:56:18 +00:00
|
|
|
is_stable_section() {
|
|
|
|
[ "$1" != 'EXPERIMENTAL' ] && [ "$1" != 'INTERNAL' ]
|
|
|
|
}
|
|
|
|
|
2018-06-27 18:01:01 +00:00
|
|
|
check_for_rule_violations()
|
|
|
|
{
|
2018-08-05 09:38:47 +00:00
|
|
|
local mapdb="$1"
|
2018-06-27 18:01:01 +00:00
|
|
|
local mname
|
|
|
|
local symname
|
|
|
|
local secname
|
|
|
|
local ar
|
|
|
|
local ret=0
|
|
|
|
|
|
|
|
while read mname symname secname ar
|
|
|
|
do
|
2018-08-05 09:38:47 +00:00
|
|
|
if [ "$ar" = "add" ]
|
2018-06-27 18:01:01 +00:00
|
|
|
then
|
|
|
|
|
2018-08-05 09:38:47 +00:00
|
|
|
if [ "$secname" = "unknown" ]
|
2018-06-27 18:01:01 +00:00
|
|
|
then
|
|
|
|
# Just inform the user of this occurrence, but
|
|
|
|
# don't flag it as an error
|
2019-05-03 14:34:19 +00:00
|
|
|
echo -n "INFO: symbol $symname is added but "
|
2018-06-27 18:01:01 +00:00
|
|
|
echo -n "patch has insuficient context "
|
|
|
|
echo -n "to determine the section name "
|
|
|
|
echo -n "please ensure the version is "
|
|
|
|
echo "EXPERIMENTAL"
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
2019-04-05 08:17:47 +00:00
|
|
|
oldsecname=$(sed -n \
|
|
|
|
"s#$mname $symname \(.*\) del#\1#p" "$mapdb")
|
|
|
|
|
2020-04-25 10:56:18 +00:00
|
|
|
# A symbol can not enter a stable section directly
|
2019-05-03 14:34:20 +00:00
|
|
|
if [ -z "$oldsecname" ]
|
2018-06-27 18:01:01 +00:00
|
|
|
then
|
2020-04-25 10:56:18 +00:00
|
|
|
if ! is_stable_section $secname
|
2019-05-03 14:34:20 +00:00
|
|
|
then
|
|
|
|
echo -n "INFO: symbol $symname has "
|
|
|
|
echo -n "been added to the "
|
2020-04-25 10:56:18 +00:00
|
|
|
echo -n "$secname section of the "
|
2019-05-03 14:34:20 +00:00
|
|
|
echo "version map"
|
|
|
|
continue
|
|
|
|
else
|
|
|
|
echo -n "ERROR: symbol $symname "
|
|
|
|
echo -n "is added in the $secname "
|
|
|
|
echo -n "section, but is expected to "
|
|
|
|
echo -n "be added in the EXPERIMENTAL "
|
|
|
|
echo "section of the version map"
|
|
|
|
ret=1
|
|
|
|
continue
|
|
|
|
fi
|
2019-04-05 08:17:47 +00:00
|
|
|
fi
|
|
|
|
|
2019-05-03 14:34:17 +00:00
|
|
|
# This symbol is moving inside a section, nothing to do
|
|
|
|
if [ "$oldsecname" = "$secname" ]
|
|
|
|
then
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
2019-04-05 08:17:47 +00:00
|
|
|
# This symbol is moving between two sections (the
|
2020-04-25 10:56:18 +00:00
|
|
|
# original section is a stable section).
|
2019-04-05 08:17:47 +00:00
|
|
|
# This can be legit, just warn.
|
2020-04-25 10:56:18 +00:00
|
|
|
if is_stable_section $oldsecname
|
2019-04-05 08:17:47 +00:00
|
|
|
then
|
|
|
|
echo -n "INFO: symbol $symname is being "
|
|
|
|
echo -n "moved from $oldsecname to $secname. "
|
|
|
|
echo -n "Ensure that it has gone through the "
|
|
|
|
echo "deprecation process"
|
|
|
|
continue
|
2018-06-27 18:01:01 +00:00
|
|
|
fi
|
|
|
|
else
|
|
|
|
|
2019-04-05 08:17:47 +00:00
|
|
|
if ! grep -q "$mname $symname .* add" "$mapdb" && \
|
2020-04-25 10:56:18 +00:00
|
|
|
is_stable_section $secname
|
2018-06-27 18:01:01 +00:00
|
|
|
then
|
2020-04-25 10:56:18 +00:00
|
|
|
# Just inform users that stable
|
2018-06-27 18:01:01 +00:00
|
|
|
# symbols need to go through a deprecation
|
|
|
|
# process
|
|
|
|
echo -n "INFO: symbol $symname is being "
|
|
|
|
echo -n "removed, ensure that it has "
|
|
|
|
echo "gone through the deprecation process"
|
|
|
|
fi
|
|
|
|
fi
|
2018-07-18 21:26:58 +00:00
|
|
|
done < "$mapdb"
|
2018-06-27 18:01:01 +00:00
|
|
|
|
|
|
|
return $ret
|
|
|
|
}
|
|
|
|
|
|
|
|
trap clean_and_exit_on_sig EXIT
|
|
|
|
|
2018-09-19 17:16:29 +00:00
|
|
|
mapfile=`mktemp -t dpdk.mapdb.XXXXXX`
|
2018-06-27 18:01:01 +00:00
|
|
|
patch=$1
|
|
|
|
exit_code=1
|
|
|
|
|
|
|
|
clean_and_exit_on_sig()
|
|
|
|
{
|
2018-07-18 21:26:58 +00:00
|
|
|
rm -f "$mapfile"
|
2018-06-27 18:01:01 +00:00
|
|
|
exit $exit_code
|
|
|
|
}
|
|
|
|
|
2018-07-18 21:26:58 +00:00
|
|
|
build_map_changes "$patch" "$mapfile"
|
|
|
|
check_for_rule_violations "$mapfile"
|
2018-06-27 18:01:01 +00:00
|
|
|
exit_code=$?
|
2018-07-18 21:26:58 +00:00
|
|
|
rm -f "$mapfile"
|
2018-06-27 18:01:01 +00:00
|
|
|
|
|
|
|
exit $exit_code
|