2 # SPDX-License-Identifier: BSD-3-Clause
3 # Copyright(c) 2018 Neil Horman <nhorman@tuxdriver.com>
11 # Initialize our variables
12 BEGIN {map="";sym="";ar="";sec=""; in_sec=0; in_map=0}
14 # Anything that starts with + or -, followed by an a
15 # and ends in the string .map is the name of our map file
16 # This may appear multiple times in a patch if multiple
17 # map files are altered, and all section/symbol names
18 # appearing between a triggering of this rule and the
19 # next trigger of this rule are associated with this file
20 /[-+] [ab]\/.*\.map/ {map=$2; in_map=1; next}
22 # The previous rule catches all .map files, anything else
23 # indicates we left the map chunk.
24 /[-+] [ab]\// {in_map=0}
26 # Triggering this rule, which starts a line and ends it
27 # with a { identifies a versioned section. The section name is
28 # the rest of the line with the + and { symbols remvoed.
29 # Triggering this rule sets in_sec to 1, which actives the
34 sec=$(NF-1); in_sec=1;
38 # This rule idenfies the end of a section, and disables the
42 # This rule matches on a + followed by any characters except a :
43 # (which denotes a global vs local segment), and ends with a ;.
44 # The semicolon is removed and the symbol is printed with its
45 # association file name and version section, along with an
46 # indicator that the symbol is a new addition. Note this rule
47 # only works if we have found a version section in the rule
48 # above (hence the in_sec check) And found a map file (the
49 # in_map check). If we are not in a map chunk, do nothing. If
50 # we are in a map chunk but not a section chunk, record it as
52 /^+[^}].*[^:*];/ {gsub(";","");sym=$2;
55 print map " " sym " " sec " add"
57 print map " " sym " unknown add"
62 # This is the same rule as above, but the rule matches on a
63 # leading - rather than a +, denoting that the symbol is being
65 /^-[^}].*[^:*];/ {gsub(";","");sym=$2;
68 print map " " sym " " sec " del"
70 print map " " sym " unknown del"
75 sort -u "$mapdb" > "$mapdb.2"
76 mv -f "$mapdb.2" "$mapdb"
81 [ "$1" != 'EXPERIMENTAL' ] && [ "$1" != 'INTERNAL' ]
84 check_for_rule_violations()
93 while read mname symname secname ar
98 if [ "$secname" = "unknown" ]
100 # Just inform the user of this occurrence, but
101 # don't flag it as an error
102 echo -n "INFO: symbol $symname is added but "
103 echo -n "patch has insuficient context "
104 echo -n "to determine the section name "
105 echo -n "please ensure the version is "
110 oldsecname=$(sed -n \
111 "s#$mname $symname \(.*\) del#\1#p" "$mapdb")
113 # A symbol can not enter a stable section directly
114 if [ -z "$oldsecname" ]
116 if ! is_stable_section $secname
118 echo -n "INFO: symbol $symname has "
119 echo -n "been added to the "
120 echo -n "$secname section of the "
124 echo -n "ERROR: symbol $symname "
125 echo -n "is added in the $secname "
126 echo -n "section, but is expected to "
127 echo -n "be added in the EXPERIMENTAL "
128 echo "section of the version map"
134 # This symbol is moving inside a section, nothing to do
135 if [ "$oldsecname" = "$secname" ]
140 # This symbol is moving between two sections (the
141 # original section is a stable section).
142 # This can be legit, just warn.
143 if is_stable_section $oldsecname
145 echo -n "INFO: symbol $symname is being "
146 echo -n "moved from $oldsecname to $secname. "
147 echo -n "Ensure that it has gone through the "
148 echo "deprecation process"
153 if ! grep -q "$mname $symname .* add" "$mapdb" && \
154 is_stable_section $secname
156 # Just inform users that stable
157 # symbols need to go through a deprecation
159 echo -n "INFO: symbol $symname is being "
160 echo -n "removed, ensure that it has "
161 echo "gone through the deprecation process"
169 trap clean_and_exit_on_sig EXIT
171 mapfile=`mktemp -t dpdk.mapdb.XXXXXX`
175 clean_and_exit_on_sig()
181 build_map_changes "$patch" "$mapfile"
182 check_for_rule_violations "$mapfile"