| Server IP : 82.208.35.60 / Your IP : 216.73.216.89 Web Server : Apache/2.4.55 (FreeBSD) OpenSSL/1.1.1q-freebsd PHP/7.3.31 System : FreeBSD server7.d2m.cz 12.4-RELEASE-p9 FreeBSD 12.4-RELEASE-p9 GENERIC amd64 User : studiokobylisy_cz ( 1008) PHP Version : 7.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /usr/ports/devel/freebsd-gcc12/files/ |
Upload File : |
--- gcc/c-family/c-format.cc.orig 2022-05-06 00:30:56.000000000 -0700
+++ gcc/c-family/c-format.cc 2022-05-20 13:56:43.632917000 -0700
@@ -721,6 +721,26 @@ static const format_char_info print_char_table[] =
{ NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
};
+static const format_char_info fbsd_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 fbsd_print_char_table[] =
+{
+ /* BSD conversion specifiers. */
+ /* FreeBSD 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", &fbsd_ext_char_info },
+ { "b", 0, STD_EXT, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "", &fbsd_ext_char_info },
+ { "ry", 0, STD_EXT, { T89_I, BADLEN, BADLEN, T89_L, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "i", NULL },
+ { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
+};
+
static const format_char_info asm_fprintf_char_table[] =
{
/* C89 conversion specifiers. */
@@ -991,6 +1011,12 @@ static const format_kind_info format_types_orig[] =
strfmon_flag_specs, strfmon_flag_pairs,
FMT_FLAG_ARG_CONVERT, 'w', '#', 'p', 0, 'L', 0,
NULL, NULL
+ },
+ { "printf0", printf_length_specs, print_char_table, " +#0-'I", NULL,
+ printf_flag_specs, printf_flag_pairs,
+ FMT_FLAG_ARG_CONVERT|FMT_FLAG_DOLLAR_MULTIPLE|FMT_FLAG_USE_DOLLAR|FMT_FLAG_EMPTY_PREC_OK|FMT_FLAG_NULL_FORMAT_OK,
+ 'w', 0, 'p', 0, 'L', 0,
+ &integer_type_node, &integer_type_node
}
};
@@ -1635,6 +1661,9 @@ check_format_arg (void *ctx, tree format_tree,
if (integer_zerop (format_tree))
{
+ if (!(format_types[info->format_type].flags & FMT_FLAG_NULL_FORMAT_OK))
+ warning (OPT_Wformat_, "null format string");
+
/* Skip to first argument to check, so we can see if this format
has any arguments (it shouldn't). */
while (arg_num + 1 < info->first_arg_num)
@@ -2465,6 +2494,13 @@ argument_parser::read_any_length_modifier ()
while (fli->name != 0
&& strncmp (fli->name, format_chars, strlen (fli->name)))
fli++;
+
+ /* Make sure FreeBSD's D format char takes preference over new DD
+ length specifier if FreeBSD format extensions are requested. */
+ if (fli->index == FMT_LEN_D && flag_format_extensions
+ && fki->conversion_specs == print_char_table)
+ while (fli->name != 0)
+ fli++;
if (fli->name != 0)
{
format_chars += strlen (fli->name);
@@ -2537,6 +2573,14 @@ argument_parser::find_format_char_info (char format_ch
while (fci->format_chars != 0
&& strchr (fci->format_chars, format_char) == 0)
++fci;
+ if (fci->format_chars == 0 && flag_format_extensions
+ && fki->conversion_specs == print_char_table)
+ {
+ fci = fbsd_print_char_table;
+ while (fci->format_chars != 0
+ && strchr (fci->format_chars, format_char) == 0)
+ ++fci;
+ }
if (fci->format_chars == 0)
{
format_warning_at_char (format_string_loc, format_string_cst,
--- gcc/c-family/c-format.h.orig 2022-05-06 00:30:56.000000000 -0700
+++ gcc/c-family/c-format.h 2022-05-20 13:56:43.633782000 -0700
@@ -77,11 +77,12 @@ enum
FMT_FLAG_DOLLAR_GAP_POINTER_OK = 128,
/* The format arg is an opaque object that will be parsed by an external
facility. */
- FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL = 256
+ FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL = 256,
/* Not included here: details of whether width or precision may occur
(controlled by width_char and precision_char); details of whether
'*' can be used for these (width_type and precision_type); details
of whether length modifiers can occur (length_char_specs). */
+ FMT_FLAG_NULL_FORMAT_OK = 512
};
/* Structure describing a length modifier supported in format checking, and
--- gcc/config/freebsd.opt.orig 2022-05-06 00:30:56.000000000 -0700
+++ gcc/config/freebsd.opt 2022-05-20 13:56:43.634497000 -0700
@@ -34,6 +34,10 @@ Driver JoinedOrMissing
defsym=
Driver JoinedOrMissing
+fformat-extensions
+Common Var(flag_format_extensions) Init(0)
+Allow FreeBSD kernel-specific printf format specifiers.
+
posix
Driver