gcc44: Teach gcc44 about our special conversions, such as %b and %D.
authorSascha Wildner <saw@online.de>
Tue, 5 Oct 2010 07:26:41 +0000 (09:26 +0200)
committerSascha Wildner <saw@online.de>
Tue, 5 Oct 2010 07:27:40 +0000 (09:27 +0200)
Some special code is necessary to have %D take precedence over the DD
length specifier (which is not present in gcc41). Eventually, we will
probably have to get rid of all these local conversions entirely.

This commit gets rid of a large bunch of warnings when compiling the
kernel with gcc44.

contrib/gcc-4.4/gcc/c-format.c

index 24a292f..0273d99 100644 (file)
@@ -505,6 +505,8 @@ static const format_flag_pair strfmon_flag_pairs[] =
   { 0, 0, 0, 0 }
 };
 
+static const format_char_info dfly_ext_char_info =
+{ NULL,  1, STD_EXT, { T89_C,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "",      "cR", NULL };
 
 static const format_char_info print_char_table[] =
 {
@@ -526,6 +528,19 @@ static const format_char_info print_char_table[] =
   { "S",   1, STD_EXT, { TEX_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp",       "R",  NULL },
   /* GNU conversion specifiers.  */
   { "m",   0, STD_EXT, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp",       "",   NULL },
+  /* BSD conversion specifiers.  */
+  /* DragonFly kernel extensions (src/sys/kern/subr_prf.c).
+     The format %b is supported to decode error registers.
+     Its usage is:     printf("reg=%b\n", regval, "<base><arg>*");
+     which produces:   reg=3<BITTWO,BITONE>
+     The format %D provides a hexdump given a pointer and separator string:
+     ("%6D", ptr, ":")         -> XX:XX:XX:XX:XX:XX
+     ("%*D", len, ptr, " ")    -> XX XX XX XX ...
+   */
+  { "D",   1, STD_EXT, { T89_V,  BADLEN,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp",       "cR", &dfly_ext_char_info },
+  { "b",   0, STD_EXT, { T89_I,  BADLEN,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp",       "",   &dfly_ext_char_info },
+  { "ry",  0, STD_EXT, { T89_I,  BADLEN,   BADLEN,   T89_L,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp0 +#",   "i",  NULL },
+  { "z",   0, STD_EXT, { T89_UI, T99_UC,   T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM, BADLEN,  BADLEN,  BADLEN }, "-wp0#",     "i",  NULL },
   { NULL,  0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
 };
 
@@ -1784,6 +1799,14 @@ check_format_info_main (format_check_results *res,
          while (fli->name != 0 
                 && strncmp (fli->name, format_chars, strlen (fli->name)))
              fli++;
+         /*
+          * DragonFly's D conversion needs to have precedence
+          * over the DD length modifier
+          */
+         if (fli->index == FMT_LEN_D
+             && fki->conversion_specs == print_char_table)
+           while (fli->name != 0)
+             fli++;
          if (fli->name != 0)
            {
              format_chars += strlen (fli->name);