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 /[-+] a\/.*\.map/ {map=$2; in_map=1}
22 # Same pattern as above, only it matches on anything that
23 # does not end in 'map', indicating we have left the map chunk.
24 # When we hit this, turn off the in_map variable, which
25 # supresses the subordonate rules below
26 /[-+] a\/.*\.^(map)/ {in_map=0}
28 # Triggering this rule, which starts a line and ends it
29 # with a { identifies a versioned section. The section name is
30 # the rest of the line with the + and { symbols remvoed.
31 # Triggering this rule sets in_sec to 1, which actives the
35 sec=$(NF-1); in_sec=1;
39 # This rule idenfies the end of a section, and disables the
43 # This rule matches on a + followed by any characters except a :
44 # (which denotes a global vs local segment), and ends with a ;.
45 # The semicolon is removed and the symbol is printed with its
46 # association file name and version section, along with an
47 # indicator that the symbol is a new addition. Note this rule
48 # only works if we have found a version section in the rule
49 # above (hence the in_sec check) And found a map file (the
50 # in_map check). If we are not in a map chunk, do nothing. If
51 # we are in a map chunk but not a section chunk, record it as
53 /^+[^}].*[^:*];/ {gsub(";","");sym=$2;
56 print map " " sym " " sec " add"
58 print map " " sym " unknown add"
63 # This is the same rule as above, but the rule matches on a
64 # leading - rather than a +, denoting that the symbol is being
66 /^-[^}].*[^:*];/ {gsub(";","");sym=$2;
69 print map " " sym " " sec " del"
71 print map " " sym " unknown del"
76 sort -u "$mapdb" > "$mapdb.2"
77 mv -f "$mapdb.2" "$mapdb"
81 check_for_rule_violations()
90 while read mname symname secname ar
95 if [ "$secname" = "unknown" ]
97 # Just inform the user of this occurrence, but
98 # don't flag it as an error
99 echo -n "INFO: symbol $syname is added but "
100 echo -n "patch has insuficient context "
101 echo -n "to determine the section name "
102 echo -n "please ensure the version is "
107 if [ "$secname" != "EXPERIMENTAL" ]
109 # Symbols that are getting added in a section
110 # other than the experimental section
111 # to be moving from an already supported
112 # section or its a violation
114 "$mname $symname [^EXPERIMENTAL] del" "$mapdb"
117 echo -n "ERROR: symbol $symname "
118 echo -n "is added in a section "
119 echo -n "other than the EXPERIMENTAL "
120 echo "section of the version map"
126 if [ "$secname" != "EXPERIMENTAL" ]
128 # Just inform users that non-experimenal
129 # symbols need to go through a deprecation
131 echo -n "INFO: symbol $symname is being "
132 echo -n "removed, ensure that it has "
133 echo "gone through the deprecation process"
141 trap clean_and_exit_on_sig EXIT
143 mapfile=`mktemp -t dpdk.mapdb.XXXXXX`
147 clean_and_exit_on_sig()
153 build_map_changes "$patch" "$mapfile"
154 check_for_rule_violations "$mapfile"