]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Support %f in pp_format
authordmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Nov 2018 15:31:13 +0000 (15:31 +0000)
committerdmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Nov 2018 15:31:13 +0000 (15:31 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@265919 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-format.c
gcc/pretty-print.c
gcc/pretty-print.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/format/gcc_diag-10.c

index 0ebab865cee11b47f7440623d1eb1390be26730c..bc91ee298d856ac903ec09900ad60f8b177ea034 100644 (file)
@@ -1,3 +1,9 @@
+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.
index 11978713ee26ecb1a87d73feff2c4a27f3149552..ac2353978b111a6d719fbb67c5e289fc94f6880a 100644 (file)
@@ -1,3 +1,7 @@
+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.
index c8ae6c40275bad3ce2fbccb30850cf8333a47bae..6613092c6fdcab61403b87fc9085ec28556e6e35 100644 (file)
@@ -810,6 +810,9 @@ static const format_char_info gcc_dump_printf_char_table[] =
   /* T requires a "tree" at runtime.  */
   { "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 }
 };
 
index 7dd900b3bbf6028b6a01a4722e4fd171fd2d11ac..19ef75bdfcf6ddf59b67f927917f225d762f2311 100644 (file)
@@ -977,6 +977,7 @@ pp_indent (pretty_printer *pp)
    %ld, %li, %lo, %lu, %lx: long versions of the above.
    %lld, %lli, %llo, %llu, %llx: long long versions.
    %wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions.
+   %f: double
    %c: character.
    %s: string.
    %p: pointer (printed in a host-dependent manner).
@@ -1307,6 +1308,10 @@ pp_format (pretty_printer *pp, text_info *text)
              (pp, *text->args_ptr, precision, unsigned, "u");
          break;
 
+       case 'f':
+         pp_double (pp, va_arg (*text->args_ptr, double));
+         break;
+
        case 'Z':
          {
            int *v = va_arg (*text->args_ptr, int *);
@@ -2160,6 +2165,7 @@ test_pp_format ()
   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,
                      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 ("hello world 12345678", "%s %x", "hello world",
                      0x12345678);
index 2decc516b1f08790598913b92e7eb75cc73dd536..a6e60f110f07c097616f539ca23220c806d31aa8 100644 (file)
@@ -330,6 +330,7 @@ pp_get_prefix (const pretty_printer *pp) { return pp->prefix; }
       pp_string (PP, pp_buffer (PP)->digit_buffer);            \
     }                                                          \
   while (0)
+#define pp_double(PP, F)       pp_scalar (PP, "%f", F)
 #define pp_pointer(PP, P)      pp_scalar (PP, "%p", P)
 
 #define pp_identifier(PP, ID)  pp_string (PP, (pp_translate_identifiers (PP) \
index 1799cb58ffb8db364daa13b45df7df31da28a819..f4fd981d98caa1a7b56167a474fa95528189685f 100644 (file)
@@ -1,3 +1,7 @@
+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.
index 97a1993dc8fad453944cc92c75f11bfa74590952..ba2629b3ecbae24905ebb604030fc66bf2daacb3 100644 (file)
@@ -183,4 +183,6 @@ void test_dump (tree t, gimple *stmt, cgraph_node *node)
   dump ("%T", t);
   dump ("%G", stmt);
   dump ("%C", node);
+  dump ("%f", 1.0);
+  dump ("%4.2f", 1.0); /* { dg-warning "format" } */
 }