On Fri, Aug 9, 2019 at 8:42 AM Richard Henderson <richard.hender...@linaro.org> wrote: > > We can tell that a decodetree input file is "secondary" when it > uses an argument set marked "!extern". This indicates that at > least one of the insn translation functions will have already > been declared by the "primary" input file, but given only the > secondary we cannot tell which. > > Avoid redundant declaration warnings by suppressing them with pragmas. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > scripts/decodetree.py | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/scripts/decodetree.py b/scripts/decodetree.py > index a2490aeb74..f02c8acca1 100755 > --- a/scripts/decodetree.py > +++ b/scripts/decodetree.py > @@ -33,6 +33,7 @@ arguments = {} > formats = {} > patterns = [] > allpatterns = [] > +anyextern = False > > translate_prefix = 'trans' > translate_scope = 'static ' > @@ -485,12 +486,14 @@ def parse_arguments(lineno, name, toks): > """Parse one argument set from TOKS at LINENO""" > global arguments > global re_ident > + global anyextern > > flds = [] > extern = False > for t in toks: > if re_fullmatch('!extern', t): > extern = True > + anyextern = True > continue > if not re_fullmatch(re_ident, t): > error(lineno, 'invalid argument set token "{0}"'.format(t)) > @@ -1191,6 +1194,7 @@ def main(): > global insnmask > global decode_function > global variablewidth > + global anyextern > > decode_scope = 'static ' > > @@ -1251,6 +1255,19 @@ def main(): > # A single translate function can be invoked for different patterns. > # Make sure that the argument sets are the same, and declare the > # function only once. > + # > + # If we're sharing formats, we're likely also sharing trans_* functions, > + # but we can't tell which ones. Prevent issues from the compiler by > + # suppressing redundant declaration warnings. > + if anyextern: > + output("#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE\n", > + "# pragma GCC diagnostic push\n", > + "# pragma GCC diagnostic ignored \"-Wredundant-decls\"\n", > + "# ifdef __clang__\n" > + "# pragma GCC diagnostic ignored > \"-Wtypedef-redefinition\"\n", > + "# endif\n", > + "#endif\n\n") > + > out_pats = {} > for i in allpatterns: > if i.name in out_pats: > @@ -1262,6 +1279,11 @@ def main(): > out_pats[i.name] = i > output('\n') > > + if anyextern: > + output("#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE\n", > + "# pragma GCC diagnostic pop\n", > + "#endif\n\n") > + > for n in sorted(formats.keys()): > f = formats[n] > f.output_extract() > -- > 2.17.1 > >