summaryrefslogtreecommitdiff
path: root/tools/gcc-plugins
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gcc-plugins')
-rw-r--r--tools/gcc-plugins/frr-format.c19
-rw-r--r--tools/gcc-plugins/frr-format.h2
2 files changed, 18 insertions, 3 deletions
diff --git a/tools/gcc-plugins/frr-format.c b/tools/gcc-plugins/frr-format.c
index 6d91d2cdcd..e9f397f225 100644
--- a/tools/gcc-plugins/frr-format.c
+++ b/tools/gcc-plugins/frr-format.c
@@ -2343,7 +2343,7 @@ check_argument_type (const format_char_info *fci,
/* note printf extension type checks are *additional* - %p must always
* be pointer compatible, %d always int compatible.
*/
- if (!kef)
+ if (first_wanted_type->kind != CF_KIND_FORMAT || !kef)
return true;
const struct kernel_ext_fmt *kef_now;
@@ -4241,6 +4241,11 @@ handle_finish_parse (void *event_data, void *data)
continue;
}
node = TREE_TYPE (node);
+
+ if (etab->t_unsigned)
+ node = c_common_unsigned_type (node);
+ else if (etab->t_signed)
+ node = c_common_signed_type (node);
}
etab->type = node;
@@ -4357,9 +4362,17 @@ handle_pragma_printfrr_ext (cpp_reader *dummy)
ttype = pragma_lex (&token, &loc);
/* qualifiers */
- if (ttype == CPP_NAME && !strcmp (IDENTIFIER_POINTER (token), "const"))
+ while (ttype == CPP_NAME)
{
- etab->t_const = true;
+ if (!strcmp (IDENTIFIER_POINTER (token), "const"))
+ etab->t_const = true;
+ else if (!strcmp (IDENTIFIER_POINTER (token), "signed"))
+ etab->t_signed = true;
+ else if (!strcmp (IDENTIFIER_POINTER (token), "unsigned"))
+ etab->t_unsigned = true;
+ else
+ break;
+
ttype = pragma_lex (&token, &loc);
}
diff --git a/tools/gcc-plugins/frr-format.h b/tools/gcc-plugins/frr-format.h
index 87d2049ed4..599dbc56f9 100644
--- a/tools/gcc-plugins/frr-format.h
+++ b/tools/gcc-plugins/frr-format.h
@@ -113,6 +113,8 @@ struct kernel_ext_fmt
tree_code type_code;
int ptrlevel;
bool t_const;
+ bool t_unsigned;
+ bool t_signed;
bool warned;
const char *type_str;