aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2019-08-09 08:12:50 -0700
committerRichard Henderson <richard.henderson@linaro.org>2019-08-19 08:13:14 -0700
commitc692079597d98337b6f25deff7599afe39b2a468 (patch)
tree2842f6e568161578a96b43b5cbc518ebdf07b010
parent94597b6146f30f949f2c454f424082a2b0f55a0e (diff)
decodetree: Suppress redundant declaration warnings
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. Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Suggested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
-rwxr-xr-xscripts/decodetree.py22
1 files changed, 22 insertions, 0 deletions
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
index f6f7368774..d8c59cab60 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 '
@@ -482,12 +483,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))
@@ -1188,6 +1191,7 @@ def main():
global insnmask
global decode_function
global variablewidth
+ global anyextern
decode_scope = 'static '
@@ -1248,6 +1252,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:
@@ -1259,6 +1276,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()