Commit 204839e7 by David Malcolm Committed by David Malcolm

Support %f in pp_format

Numerous formatted messages from the inliner use %f, mostly as %f, but
occasionally with length modifiers.

This patch implements the simplest case of "%f" for pp_format (with no
modifier support) to make it easier to port these messages from fprintf
to dump_printf_loc.

The selftest has an assertion that %f on 1.0 is printed as "1.000000".
This comes from the host's sprintf, and I believe this is guaranteed by
POSIX: "If the precision is missing, it shall be taken as 6".  If this is
an issue I can drop the selftest.

gcc/c-family/ChangeLog:
	* c-format.c (gcc_dump_printf_char_table): Add entry for %f.

gcc/ChangeLog:
	* pretty-print.c (pp_format): Handle %f.
	(selftest::test_pp_format): Add test of %f.
	* pretty-print.h (pp_double): New macro.

gcc/testsuite/ChangeLog:
	* gcc.dg/format/gcc_diag-10.c: Add coverage for %f.

From-SVN: r265919
parent d8010ee4
2018-11-08 David Malcolm <dmalcolm@redhat.com> 2018-11-08 David Malcolm <dmalcolm@redhat.com>
* pretty-print.c (pp_format): Handle %f.
(selftest::test_pp_format): Add test of %f.
* pretty-print.h (pp_double): New macro.
2018-11-08 David Malcolm <dmalcolm@redhat.com>
* dump-context.h (ASSERT_IS_CGRAPH_NODE): New macro. * dump-context.h (ASSERT_IS_CGRAPH_NODE): New macro.
* dumpfile.c (make_item_for_dump_cgraph_node): Move to before... * dumpfile.c (make_item_for_dump_cgraph_node): Move to before...
(dump_pretty_printer::decode_format): Implement "%C" for (dump_pretty_printer::decode_format): Implement "%C" for
2018-11-08 David Malcolm <dmalcolm@redhat.com> 2018-11-08 David Malcolm <dmalcolm@redhat.com>
* c-format.c (gcc_dump_printf_char_table): Add entry for %f.
2018-11-08 David Malcolm <dmalcolm@redhat.com>
* c-format.c (local_cgraph_node_ptr_node): New variable. * c-format.c (local_cgraph_node_ptr_node): New variable.
(gcc_dump_printf_char_table): Add entry for %C. (gcc_dump_printf_char_table): Add entry for %C.
(get_pointer_to_named_type): New function, taken from the handling (get_pointer_to_named_type): New function, taken from the handling
......
...@@ -810,6 +810,9 @@ static const format_char_info gcc_dump_printf_char_table[] = ...@@ -810,6 +810,9 @@ static const format_char_info gcc_dump_printf_char_table[] =
/* T requires a "tree" at runtime. */ /* T requires a "tree" at runtime. */
{ "T", 1, STD_C89, { T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL }, { "T", 1, STD_C89, { T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL },
/* %f requires a "double"; it doesn't support modifiers. */
{ "f", 0, STD_C89, { T89_D, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL },
{ NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL } { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
}; };
......
...@@ -977,6 +977,7 @@ pp_indent (pretty_printer *pp) ...@@ -977,6 +977,7 @@ pp_indent (pretty_printer *pp)
%ld, %li, %lo, %lu, %lx: long versions of the above. %ld, %li, %lo, %lu, %lx: long versions of the above.
%lld, %lli, %llo, %llu, %llx: long long versions. %lld, %lli, %llo, %llu, %llx: long long versions.
%wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions. %wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions.
%f: double
%c: character. %c: character.
%s: string. %s: string.
%p: pointer (printed in a host-dependent manner). %p: pointer (printed in a host-dependent manner).
...@@ -1307,6 +1308,10 @@ pp_format (pretty_printer *pp, text_info *text) ...@@ -1307,6 +1308,10 @@ pp_format (pretty_printer *pp, text_info *text)
(pp, *text->args_ptr, precision, unsigned, "u"); (pp, *text->args_ptr, precision, unsigned, "u");
break; break;
case 'f':
pp_double (pp, va_arg (*text->args_ptr, double));
break;
case 'Z': case 'Z':
{ {
int *v = va_arg (*text->args_ptr, int *); int *v = va_arg (*text->args_ptr, int *);
...@@ -2160,6 +2165,7 @@ test_pp_format () ...@@ -2160,6 +2165,7 @@ test_pp_format ()
ASSERT_PP_FORMAT_2 ("17 12345678", "%wo %x", (HOST_WIDE_INT)15, 0x12345678); ASSERT_PP_FORMAT_2 ("17 12345678", "%wo %x", (HOST_WIDE_INT)15, 0x12345678);
ASSERT_PP_FORMAT_2 ("0xcafebabe 12345678", "%wx %x", (HOST_WIDE_INT)0xcafebabe, ASSERT_PP_FORMAT_2 ("0xcafebabe 12345678", "%wx %x", (HOST_WIDE_INT)0xcafebabe,
0x12345678); 0x12345678);
ASSERT_PP_FORMAT_2 ("1.000000 12345678", "%f %x", 1.0, 0x12345678);
ASSERT_PP_FORMAT_2 ("A 12345678", "%c %x", 'A', 0x12345678); ASSERT_PP_FORMAT_2 ("A 12345678", "%c %x", 'A', 0x12345678);
ASSERT_PP_FORMAT_2 ("hello world 12345678", "%s %x", "hello world", ASSERT_PP_FORMAT_2 ("hello world 12345678", "%s %x", "hello world",
0x12345678); 0x12345678);
......
...@@ -330,6 +330,7 @@ pp_get_prefix (const pretty_printer *pp) { return pp->prefix; } ...@@ -330,6 +330,7 @@ pp_get_prefix (const pretty_printer *pp) { return pp->prefix; }
pp_string (PP, pp_buffer (PP)->digit_buffer); \ pp_string (PP, pp_buffer (PP)->digit_buffer); \
} \ } \
while (0) while (0)
#define pp_double(PP, F) pp_scalar (PP, "%f", F)
#define pp_pointer(PP, P) pp_scalar (PP, "%p", P) #define pp_pointer(PP, P) pp_scalar (PP, "%p", P)
#define pp_identifier(PP, ID) pp_string (PP, (pp_translate_identifiers (PP) \ #define pp_identifier(PP, ID) pp_string (PP, (pp_translate_identifiers (PP) \
......
2018-11-08 David Malcolm <dmalcolm@redhat.com> 2018-11-08 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/format/gcc_diag-10.c: Add coverage for %f.
2018-11-08 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/format/gcc_diag-10.c (cgraph_node): New typedef. * gcc.dg/format/gcc_diag-10.c (cgraph_node): New typedef.
(test_dump): Add testing of %C. (test_dump): Add testing of %C.
......
...@@ -183,4 +183,6 @@ void test_dump (tree t, gimple *stmt, cgraph_node *node) ...@@ -183,4 +183,6 @@ void test_dump (tree t, gimple *stmt, cgraph_node *node)
dump ("%T", t); dump ("%T", t);
dump ("%G", stmt); dump ("%G", stmt);
dump ("%C", node); dump ("%C", node);
dump ("%f", 1.0);
dump ("%4.2f", 1.0); /* { dg-warning "format" } */
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment