aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbapt <bapt@FreeBSD.org>2014-10-09 18:39:02 +0800
committerbapt <bapt@FreeBSD.org>2014-10-09 18:39:02 +0800
commit52bf83b5d6c483bcd8f0507390eaf5824deb59c8 (patch)
tree9fc863474e2f639d66d815ade0f6e663b891dcaf
parentb2bfa7359d09e8cf95c1a676b372bec239e65cb7 (diff)
downloadfreebsd-ports-gnome-52bf83b5d6c483bcd8f0507390eaf5824deb59c8.tar.gz
freebsd-ports-gnome-52bf83b5d6c483bcd8f0507390eaf5824deb59c8.tar.zst
freebsd-ports-gnome-52bf83b5d6c483bcd8f0507390eaf5824deb59c8.zip
Add support for -fformat-extensions meaning we can now build the kernel
Submitted by: kan
-rw-r--r--devel/powerpc64-gcc/Makefile1
-rw-r--r--devel/powerpc64-gcc/files/patch-format-extensions117
2 files changed, 118 insertions, 0 deletions
diff --git a/devel/powerpc64-gcc/Makefile b/devel/powerpc64-gcc/Makefile
index cd040e6a1063..8cfa321bd8ce 100644
--- a/devel/powerpc64-gcc/Makefile
+++ b/devel/powerpc64-gcc/Makefile
@@ -23,6 +23,7 @@ LIB_DEPENDS= libgmp.so:${PORTSDIR}/math/gmp \
BUILD_DEPENDS= ${PKGNAMEPREFIX}${OPSYS:tl}-as:${PORTSDIR}/devel/${PKGNAMEPREFIX}binutils
RUN_DEPENDS= ${PKGNAMEPREFIX}${OPSYS:tl}-as:${PORTSDIR}/devel/${PKGNAMEPREFIX}binutils
+PATCH_WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION}
WRKSRC= ${WRKDIR}/build-gcc
GNU_CONFIGURE= yes
diff --git a/devel/powerpc64-gcc/files/patch-format-extensions b/devel/powerpc64-gcc/files/patch-format-extensions
new file mode 100644
index 000000000000..ed211f8e2070
--- /dev/null
+++ b/devel/powerpc64-gcc/files/patch-format-extensions
@@ -0,0 +1,117 @@
+Index: gcc/c-family/c-format.c
+===================================================================
+--- gcc/c-family/c-format.c (revision 216017)
++++ gcc/c-family/c-format.c (working copy)
+@@ -622,6 +622,26 @@
+ { 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. */
+@@ -872,6 +892,12 @@
+ 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
+ }
+ };
+
+@@ -1426,6 +1452,9 @@
+
+ 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)
+@@ -1926,6 +1955,14 @@
+ 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);
+@@ -1993,6 +2030,14 @@
+ 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)
+ {
+ if (ISGRAPH (format_char))
+Index: gcc/c-family/c-format.h
+===================================================================
+--- gcc/c-family/c-format.h (revision 216017)
++++ gcc/c-family/c-format.h (working copy)
+@@ -75,11 +75,12 @@
+ 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
+Index: gcc/config/freebsd.opt
+===================================================================
+--- gcc/config/freebsd.opt (revision 216017)
++++ gcc/config/freebsd.opt (working copy)
+@@ -34,6 +34,10 @@
+ defsym=
+ Driver JoinedOrMissing
+
++fformat-extensions
++Common Report Var(flag_format_extensions) Init(0)
++Allow FreeBSD kernel-specific printf format specifiers.
++
+ posix
+ Driver
+