--- config/i386/freebsd.h.orig Fri Dec 5 04:15:34 1997 +++ config/i386/freebsd.h Sun Mar 21 17:59:06 1999 @@ -26,8 +26,18 @@ /* The svr4 ABI for the i386 says that records and unions are returned in memory. */ +/* On FreeBSD, we do not. */ #undef DEFAULT_PCC_STRUCT_RETURN -#define DEFAULT_PCC_STRUCT_RETURN 1 +#define DEFAULT_PCC_STRUCT_RETURN 0 + +/* This gets defined in tm.h->linux.h->svr4.h, and keeps us from using + libraries compiled with the native cc, so undef it. */ +#undef NO_DOLLAR_IN_LABEL + +/* FreeBSD using ELF does not support DWARF2 unwinding mechanisms. + Thus, need the equivalent of "-fsjlj-exceptions" (use setjmp/longjmp + for exceptions). */ +#define DWARF2_UNWIND_INFO 0 /* This is how to output an element of a case-vector that is relative. This is only used for PIC code. See comments by the `casesi' insn in @@ -140,7 +150,7 @@ #define WCHAR_TYPE_SIZE BITS_PER_WORD #undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Dunix -D__ELF__ -D__FreeBSD__=2 -Asystem(FreeBSD)" +#define CPP_PREDEFINES "-Di386 -Dunix -D__ELF__ -D__FreeBSD__=3 -Asystem(FreeBSD) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)" #undef CPP_SPEC #define CPP_SPEC "%(cpp_cpu) %[cpp_cpu] %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE}" --- configure.orig Sat Feb 28 18:02:02 1998 +++ configure Mon Feb 8 11:51:44 1999 @@ -677,9 +677,9 @@ if test -z "$ac_aux_dir"; then { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. +ac_config_guess="/bin/sh $ac_aux_dir/config.guess" +ac_config_sub="/bin/sh $ac_aux_dir/config.sub" +ac_configure="/bin/sh $ac_aux_dir/configure" # This should be Cygnus configure. # Do some error checking and defaulting for the host and target type. @@ -2797,6 +2797,20 @@ a29k-*-*) # Default a29k environment. use_collect2=yes ;; + alpha*-*-freebsd*) + tm_file=alpha/freebsd.h + # On FreeBSD, the headers are already ok, except for math.h. (??right??) + fixincludes=fixinc.math + fixincludes=fixinc.math + tmake_file=t-libc-ok + ;; + alpha-*-openbsd*) + tm_file=alpha/openbsd.h + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + tmake_file=t-libc-ok + xmake_file=x-openbsd + ;; alpha*-*-linux-gnuecoff*) tm_file="${tm_file} alpha/linux.h" xm_file="${xm_file} alpha/xm-linux.h" @@ -3158,6 +3172,14 @@ use_collect2=yes fixincludes=Makefile.in ;; + hppa*-*-openbsd*) + target_cpu_default=1 + tm_file="pa/pa-openbsd.h" + xm_file=pa/xm-openbsd.h + xmake_file=x-openbsd + use_collect2=yes + fixincludes=Makefile.in + ;; i370-*-mvs*) ;; i[34567]86-ibm-aix*) # IBM PS/2 running AIX @@ -3256,20 +3278,20 @@ # Next line turned off because both 386BSD and BSD/386 use GNU ld. # use_collect2=yes ;; - i[34567]86-*-freebsdelf*) - tm_file="i386/i386.h i386/att.h linux.h i386/freebsd-elf.h i386/perform.h" + i[34567]86-*-freebsdaout*) + tm_file=i386/freebsd-aout.h # On FreeBSD, the headers are already ok, except for math.h. fixincludes=fixinc.math tmake_file=i386/t-freebsd - gas=yes - gnu_ld=yes - stabs=yes ;; i[34567]86-*-freebsd*) - tm_file=i386/freebsd.h + tm_file="i386/i386.h i386/att.h linux.h i386/freebsd.h i386/perform.h" # On FreeBSD, the headers are already ok, except for math.h. fixincludes=fixinc.math tmake_file=i386/t-freebsd + gas=yes + gnu_ld=yes + stabs=yes ;; i[34567]86-*-netbsd*) tm_file=i386/netbsd.h @@ -3277,6 +3299,13 @@ fixincludes=fixinc.math tmake_file=t-netbsd ;; + i[34567]86-*-openbsd*) + tm_file=i386/openbsd.h + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + tmake_file=t-libc-ok + xmake_file=x-openbsd + ;; i[34567]86-*-coff*) tm_file=i386/i386-coff.h tmake_file=i386/t-i386bare @@ -3964,6 +3993,13 @@ fixincludes=fixinc.math tmake_file=t-netbsd ;; + m68k-*-openbsd*) + tm_file=m68k/openbsd.h + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + tmake_file=t-libc-ok + xmake_file=x-openbsd + ;; m68k-*-sysv3*) # Motorola m68k's running system V.3 xm_file=m68k/xm-m68kv.h xmake_file=m68k/x-m68kv @@ -4273,6 +4309,20 @@ prefix=$native_prefix fi ;; + mips*el-*-openbsd*) # MIPS running OpenBSD + tm_file=mips/openbsd-le.h + xmake_file=x-openbsd + tmake_file=t-libc-ok + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + ;; + mips*-*-openbsd*) # MIPS big-endian running OpenBSD + tm_file=mips/openbsd-be.h + xmake_file=x-openbsd + tmake_file=t-libc-ok + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + ;; mips-sony-bsd* | mips-sony-newsos*) # Sony NEWS 3600 or risc/news. tm_file=mips/news4.h if [ x$stabs = xyes ]; then @@ -4612,6 +4662,13 @@ fixincludes=fixinc.math tmake_file=t-netbsd ;; + ns32k-*-openbsd*) + tm_file=ns32k/openbsd.h + tmake_file=t-libc-ok + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + xmake_file=x-openbsd + ;; pdp11-*-bsd) tm_file="${tm_file} pdp11/2bsd.h" ;; @@ -4625,10 +4682,23 @@ romp-*-aos*) use_collect2=yes ;; + romp-*-openbsd*) + tm_file=romp/openbsd.h + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + xmake_file=romp/x-openbsd + ;; romp-*-mach*) xmake_file=romp/x-mach use_collect2=yes ;; + powerpc-*-*bsd*) + tm_file=rs6000/openbsd.h + tmake_file=rs6000/t-openbsd + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + xmake_file=rs6000/x-openbsd + ;; powerpc-*-sysv* | powerpc-*-elf*) tm_file=rs6000/sysv4.h xm_file=rs6000/xm-sysv4.h @@ -4841,6 +4911,13 @@ fixincludes=fixinc.math tmake_file=t-netbsd ;; + sparc-*-openbsd*) + tm_file=sparc/openbsd.h + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + tmake_file=t-libc-ok + xmake_file=x-openbsd + ;; sparc-*-bsd*) tm_file=sparc/bsd.h ;; @@ -5009,6 +5086,14 @@ # On NetBSD, the headers are already okay, except for math.h. fixincludes=fixinc.math tmake_file=t-netbsd + float_format=vax + ;; + vax-*-openbsd*) + tm_file=vax/openbsd.h + tmake_file="t-libc-ok vax/t-openbsd" + # On OpenBSD, the headers are already okay. + fixincludes=Makefile.in + xmake_file=x-openbsd float_format=vax ;; vax-*-ultrix*) # vaxen running ultrix --- choose-temp.c.orig Thu Dec 4 06:17:56 1997 +++ choose-temp.c Tue Aug 11 04:05:05 1998 @@ -107,12 +107,17 @@ base = try (getenv ("TMP"), base); base = try (getenv ("TEMP"), base); +#ifdef COMMENT_OUT /* XXX - P_tmpdir is not /tmp in 4.4BSD */ #ifdef P_tmpdir base = try (P_tmpdir, base); #endif +#endif /* XXX */ /* Try /usr/tmp, then /tmp. */ +#ifdef COMMENT_OUT /* XXX - want /tmp used, peroid. Sometimes pkg_add can + create a /usr/tmp, so beware. */ base = try (usrtmp, base); +#endif /* XXX */ base = try (tmp, base); /* If all else fails, use the current directory! */ --- flags.h.orig Wed Dec 31 05:02:33 1997 +++ flags.h Wed Mar 31 00:08:39 1999 @@ -125,6 +125,10 @@ extern int warn_aggregate_return; +/* Nonzero means that -Wformat accepts certain non-ANSI formats. */ + +extern int flag_format_extensions; + /* Nonzero if generating code to do profiling. */ extern int profile_flag; @@ -215,6 +219,20 @@ This is generally not a win. */ extern int flag_unroll_all_loops; + +/* Nonzero forces all invariant computations in loops to be moved + outside the loop. */ + +extern int flag_move_all_movables; + +/* Nonzero forces all general induction variables in loops to be + strength reduced. */ + +extern int flag_reduce_all_givs; + +/* Nonzero gets another run of loop_optimize performed. */ + +extern int flag_rerun_loop_opt; /* Nonzero for -fcse-follow-jumps: have cse follow jumps to do a more extensive job. */ --- toplev.c.orig Wed Feb 25 18:04:46 1998 +++ toplev.c Wed Mar 31 00:15:41 1999 @@ -463,6 +463,20 @@ int flag_unroll_all_loops; +/* Nonzero forces all invariant computations in loops to be moved + outside the loop. */ + +int flag_move_all_movables = 0; + +/* Nonzero forces all general induction variables in loops to be + strength reduced. */ + +int flag_reduce_all_givs = 0; + +/* Nonzero gets another run of loop_optimize performed. */ + +int flag_rerun_loop_opt = 0; + /* Nonzero for -fwritable-strings: store string constants in data segment and don't uniquize them. */ @@ -691,6 +705,7 @@ {"stack-check", &flag_stack_check, 1}, {"bytecode", &output_bytecode, 1}, {"check-memory-usage", &flag_check_memory_usage, 1}, + {"format-extensions", &flag_format_extensions, 1}, {"prefix-function-name", &flag_prefix_function_name, 1} }; @@ -880,6 +895,10 @@ {"uninitialized", &warn_uninitialized, 1}, {"inline", &warn_inline, 1} }; + +/* Nonzero means that -Wformat accepts certain system-dependent formats. */ + +int flag_format_extensions = 0; /* Output files for assembler code (real compiler output) and debugging dumps. */ --- loop.c.orig Fri Feb 6 11:23:34 1998 +++ loop.c Tue Aug 11 16:57:35 1998 @@ -1637,6 +1637,7 @@ extra cost because something else was already moved. */ if (already_moved[regno] + || flag_move_all_movables || (threshold * savings * m->lifetime) >= insn_count || (m->forces && m->forces->done && n_times_used[m->forces->regno] == 1)) @@ -3911,7 +3912,7 @@ of such giv's whether or not we know they are used after the loop exit. */ - if (v->lifetime * threshold * benefit < insn_count + if (!flag_reduce_all_givs && v->lifetime * threshold * benefit < insn_count && ! bl->reversed) { if (loop_dump_stream) --- cp/lex.c.orig Wed Nov 26 12:13:20 1997 +++ cp/lex.c Tue Aug 11 13:37:17 1998 @@ -3329,6 +3329,14 @@ token_buffer[0] = '^'; token_buffer[1] = 0; } + else if (ptr->token == NAMESPACE) + { + static int warned; + if (! warned) + warning ("namespaces are mostly broken in this version of g++"); + + warned = 1; + } value = (int) ptr->token; } --- gcc.1.orig Tue Feb 17 10:44:00 1998 +++ gcc.1 Tue Aug 11 13:30:01 1998 @@ -182,7 +182,7 @@ \-Waggregate\-return \-Wcast\-align \-Wcast\-qual -\-Wchar\-subscript +\-Wchar\-subscripts \-Wcomment \-Wconversion \-Wenum\-clash --- invoke.texi.orig Tue Feb 17 10:54:05 1998 +++ invoke.texi Tue Aug 11 13:29:38 1998 @@ -115,7 +115,7 @@ @smallexample -fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wbad-function-cast --Wcast-align -Wcast-qual -Wchar-subscript -Wcomment +-Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment -Wconversion -Werror -Wformat -Wid-clash-@var{len} -Wimplicit -Wimplicit-int -Wimplicit-function-declarations -Wimport -Winline @@ -153,6 +153,7 @@ -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops +-fmove-all-movables -freduce-all-givs -frerun-loop-opt -O -O0 -O1 -O2 -O3 @end smallexample @@ -2284,6 +2285,47 @@ Perform the optimization of loop unrolling. This is done for all loops and usually makes programs run more slowly. @samp{-funroll-all-loops} implies @samp{-fstrength-reduce} as well as @samp{-frerun-cse-after-loop}. + +@item -fmove-all-movables +Forces all invariant computations in loops to be moved +outside the loop. +This option is provided primarily to improve performance +for some Fortran code, though it might improve code written +in other languages. + +@emph{Note:} When compiling programs written in Fortran, +this option is enabled by default. + +Analysis of Fortran code optimization and the resulting +optimizations triggered by this option, and the +@samp{-freduce-all-givs} and @samp{-frerun-loop-opt} +options as well, were +contributed by Toon Moene (@code{toon@@moene.indiv.nluug.nl}). + +Please let us (@code{fortran@@gnu.ai.mit.edu}) +know how use of these options affects +the performance of your production code. +We're very interested in code that runs @emph{slower} +when these options are @emph{enabled}. + +@item -freduce-all-givs +Forces all general-induction variables in loops to be +strength-reduced. +This option is provided primarily to improve performance +for some Fortran code, though it might improve code written +in other languages. + +@emph{Note:} When compiling programs written in Fortran, +this option is enabled by default. + +@item -frerun-loop-opt +Runs loop optimizations a second time. +This option is provided primarily to improve performance +for some Fortran code, though it might improve code written +in other languages. + +@emph{Note:} When compiling programs written in Fortran, +this option is enabled by default. @item -fno-peephole Disable any machine-specific peephole optimizations. --- expmed.c.dist Sat Nov 8 14:11:58 1997 +++ expmed.c Thu Aug 13 11:18:13 1998 @@ -2249,7 +2249,8 @@ rtx shift_subtarget = preserve ? 0 : accum; rtx add_target = (opno == alg.ops - 1 && target != 0 && variant != add_variant - ? target : 0); + && ! preserve) + ? target : 0; rtx accum_target = preserve ? 0 : accum; switch (alg.op[opno]) @@ -2716,6 +2717,7 @@ optab optab1, optab2; int op1_is_constant, op1_is_pow2; int max_cost, extra_cost; + static HOST_WIDE_INT last_div_const = 0; op1_is_constant = GET_CODE (op1) == CONST_INT; op1_is_pow2 = (op1_is_constant @@ -2825,8 +2827,15 @@ size = GET_MODE_BITSIZE (mode); #endif + /* Only deduct something for a REM if the last divide done was + for a different constant. Then set the constant of the last + divide. */ max_cost = div_cost[(int) compute_mode] - - (rem_flag ? mul_cost[(int) compute_mode] + add_cost : 0); + - (rem_flag && ! (last_div_const != 0 && op1_is_constant + && INTVAL (op1) == last_div_const) + ? mul_cost[(int) compute_mode] + add_cost : 0); + + last_div_const = ! rem_flag && op1_is_constant ? INTVAL (op1) : 0; /* Now convert to the best mode to use. */ if (compute_mode != mode) --- configure.in.orig Sat Feb 28 12:58:12 1998 +++ configure.in Tue Feb 9 02:24:34 1999 @@ -303,6 +303,13 @@ a29k-*-*) # Default a29k environment. use_collect2=yes ;; + alpha*-*-freebsd*) + tm_file=alpha/freebsd.h + # On FreeBSD, the headers are already ok, except for math.h. (??right??) + fixincludes=fixinc.math + fixincludes=fixinc.math + tmake_file=t-libc-ok + ;; alpha*-*-linux-gnuecoff*) tm_file="${tm_file} alpha/linux.h" xm_file="${xm_file} alpha/xm-linux.h" @@ -762,20 +769,20 @@ # Next line turned off because both 386BSD and BSD/386 use GNU ld. # use_collect2=yes ;; - i[[34567]]86-*-freebsdelf*) - tm_file="i386/i386.h i386/att.h linux.h i386/freebsd-elf.h i386/perform.h" + i[[34567]]86-*-freebsdaout*) + tm_file=i386/freebsd.h # On FreeBSD, the headers are already ok, except for math.h. fixincludes=fixinc.math tmake_file=i386/t-freebsd - gas=yes - gnu_ld=yes - stabs=yes ;; i[[34567]]86-*-freebsd*) - tm_file=i386/freebsd.h + tm_file="i386/i386.h i386/att.h linux.h i386/freebsd.h i386/perform.h" # On FreeBSD, the headers are already ok, except for math.h. fixincludes=fixinc.math tmake_file=i386/t-freebsd + gas=yes + gnu_ld=yes + stabs=yes ;; i[[34567]]86-*-netbsd*) tm_file=i386/netbsd.h --- c-common.c.orig Wed Feb 18 19:16:13 1998 +++ c-common.c Tue Mar 30 14:42:30 1999 @@ -623,6 +623,7 @@ int format_num; int first_arg_num; int is_scan; + int null_format_ok; tree argument; int arg_num; @@ -637,12 +638,26 @@ && (!strcmp (IDENTIFIER_POINTER (format_type), "printf") || !strcmp (IDENTIFIER_POINTER (format_type), "__printf__"))) - is_scan = 0; + { + is_scan = 0; + null_format_ok = 0; + } + else if (TREE_CODE (format_type) == IDENTIFIER_NODE + && (!strcmp (IDENTIFIER_POINTER (format_type), "printf0") + || !strcmp (IDENTIFIER_POINTER (format_type), + "__printf0__"))) + { + is_scan = 0; + null_format_ok = 1; + } else if (TREE_CODE (format_type) == IDENTIFIER_NODE && (!strcmp (IDENTIFIER_POINTER (format_type), "scanf") || !strcmp (IDENTIFIER_POINTER (format_type), "__scanf__"))) - is_scan = 1; + { + is_scan = 1; + null_format_ok = 0; + } else if (TREE_CODE (format_type) == IDENTIFIER_NODE) { error ("`%s' is an unrecognized format function type", @@ -651,7 +666,7 @@ } else { - error ("unrecognized format specifier"); + error_with_decl (decl, "unrecognized format specifier"); continue; } @@ -718,7 +733,8 @@ record_function_format (DECL_NAME (decl), DECL_ASSEMBLER_NAME (decl), - is_scan, format_num, first_arg_num); + is_scan, null_format_ok, format_num, + first_arg_num); break; } @@ -906,6 +922,7 @@ int pointer_count; /* Type of argument if no length modifier is used. */ tree *nolen; + /* EGCS has tree *hhlen -- length modifier for shortening to byte */ /* Type of argument if length modifier for shortening is used. If NULL, then this modifier is not allowed. */ tree *hlen; @@ -926,6 +943,11 @@ } format_char_info; static format_char_info print_char_table[] = { +/* FreeBSD kernel extensions. */ + { "D", 1, T_C, NULL, NULL, NULL, NULL, NULL, "-wp" }, + { "b", 1, T_C, NULL, NULL, NULL, NULL, NULL, "-wp" }, + { "rz", 0, NULL, T_I, T_L, NULL, NULL, NULL, "-wp0 +#" }, +#define unextended_print_char_table (print_char_table + 3) { "di", 0, T_I, T_I, T_L, T_LL, T_LL, T_ST, "-wp0 +" }, { "oxX", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0#" }, { "u", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0" }, @@ -960,6 +982,7 @@ tree name; /* identifier such as "printf" */ tree assembler_name; /* optional mangled identifier (for C++) */ int is_scan; /* TRUE if *scanf */ + int null_format_ok; /* TRUE if the format string may be NULL */ int format_num; /* number of format argument */ int first_arg_num; /* number of first arg (zero for varargs) */ } function_format_info; @@ -991,15 +1014,15 @@ void init_function_format_info () { - record_function_format (get_identifier ("printf"), NULL_TREE, 0, 1, 2); - record_function_format (get_identifier ("fprintf"), NULL_TREE, 0, 2, 3); - record_function_format (get_identifier ("sprintf"), NULL_TREE, 0, 2, 3); - record_function_format (get_identifier ("scanf"), NULL_TREE, 1, 1, 2); - record_function_format (get_identifier ("fscanf"), NULL_TREE, 1, 2, 3); - record_function_format (get_identifier ("sscanf"), NULL_TREE, 1, 2, 3); - record_function_format (get_identifier ("vprintf"), NULL_TREE, 0, 1, 0); - record_function_format (get_identifier ("vfprintf"), NULL_TREE, 0, 2, 0); - record_function_format (get_identifier ("vsprintf"), NULL_TREE, 0, 2, 0); + record_function_format (get_identifier ("printf"), NULL_TREE, 0, 0, 1, 2); + record_function_format (get_identifier ("fprintf"), NULL_TREE, 0, 0, 2, 3); + record_function_format (get_identifier ("sprintf"), NULL_TREE, 0, 0, 2, 3); + record_function_format (get_identifier ("scanf"), NULL_TREE, 1, 0, 1, 2); + record_function_format (get_identifier ("fscanf"), NULL_TREE, 1, 0, 2, 3); + record_function_format (get_identifier ("sscanf"), NULL_TREE, 1, 0, 2, 3); + record_function_format (get_identifier ("vprintf"), NULL_TREE, 0, 0, 1, 0); + record_function_format (get_identifier ("vfprintf"), NULL_TREE, 0, 0, 2, 0); + record_function_format (get_identifier ("vsprintf"), NULL_TREE, 0, 0, 2, 0); record_international_format (get_identifier ("gettext"), NULL_TREE, 1); record_international_format (get_identifier ("dgettext"), NULL_TREE, 2); @@ -1016,11 +1039,12 @@ (e.g. for varargs such as vfprintf). */ void -record_function_format (name, assembler_name, is_scan, +record_function_format (name, assembler_name, is_scan, null_format_ok, format_num, first_arg_num) tree name; tree assembler_name; int is_scan; + int null_format_ok; int format_num; int first_arg_num; { @@ -1044,6 +1068,7 @@ } info->is_scan = is_scan; + info->null_format_ok = null_format_ok; info->format_num = format_num; info->first_arg_num = first_arg_num; } @@ -1194,7 +1219,8 @@ if (integer_zerop (format_tree)) { - warning ("null format string"); + if (!info->null_format_ok) + warning ("null format string"); return; } if (TREE_CODE (format_tree) != ADDR_EXPR) @@ -1329,6 +1355,7 @@ It will work on most machines, because size_t and int have the same mode. But might as well warn anyway, since it will fail on other machines. */ + /* XXX should we allow unsigned ints here? */ if ((TYPE_MAIN_VARIANT (TREE_TYPE (cur_param)) != integer_type_node) && @@ -1336,7 +1363,7 @@ != unsigned_type_node)) { sprintf (message, - "field width is not type int (arg %d)", + "precision is not type int (arg %d)", arg_num); warning (message); } @@ -1371,6 +1398,7 @@ cur_param = TREE_VALUE (params); params = TREE_CHAIN (params); ++arg_num; + /* XXX should we allow unsigned ints here? */ if (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param)) != integer_type_node) { @@ -1388,6 +1416,56 @@ } } } + if (*format_chars == 'b') + { + /* There should be an int arg to control the string arg. */ + if (params == 0) + { + warning (tfaff); + return; + } + if (info->first_arg_num != 0) + { + cur_param = TREE_VALUE (params); + params = TREE_CHAIN (params); + ++arg_num; + if ((TYPE_MAIN_VARIANT (TREE_TYPE (cur_param)) + != integer_type_node) + && + (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param)) + != unsigned_type_node)) + { + sprintf (message, "bitmap is not type int (arg %d)", + arg_num); + warning (message); + } + } + } + if (*format_chars == 'D') + { + /* There should be an unsigned char * arg before the string arg. */ + if (params == 0) + { + warning (tfaff); + return; + } + if (info->first_arg_num != 0) + { + cur_param = TREE_VALUE (params); + params = TREE_CHAIN (params); + ++arg_num; + cur_type = TREE_TYPE (cur_param); + if (TREE_CODE (cur_type) != POINTER_TYPE + || TYPE_MAIN_VARIANT (TREE_TYPE (cur_type)) + != unsigned_char_type_node) + { + sprintf (message, + "ethernet address is not type unsigned char * (arg %d)", + arg_num); + warning (message); + } + } + } if (*format_chars == 'h' || *format_chars == 'l') length_char = *format_chars++; else if (*format_chars == 'q' || *format_chars == 'L') @@ -1436,7 +1514,9 @@ continue; } format_chars++; - fci = info->is_scan ? scan_char_table : print_char_table; + fci = info->is_scan ? scan_char_table + : flag_format_extensions ? print_char_table + : unextended_print_char_table; while (fci->format_chars != 0 && index (fci->format_chars, format_char) == 0) ++fci; --- c-tree.h.orig Fri Aug 8 13:09:02 1997 +++ c-tree.h Tue Mar 30 14:14:51 1999 @@ -162,7 +162,7 @@ extern void declare_function_name PROTO((void)); extern void decl_attributes PROTO((tree, tree, tree)); extern void init_function_format_info PROTO((void)); -extern void record_function_format PROTO((tree, tree, int, int, int)); +extern void record_function_format PROTO((tree, tree, int, int, int, int)); extern void check_function_format PROTO((tree, tree, tree)); /* Print an error message for invalid operands to arith operation CODE. NOP_EXPR is used as a special case (see truthvalue_conversion). */ --- config/alpha/alpha.c.orig Fri Feb 6 17:23:50 1998 +++ config/alpha/alpha.c Tue Aug 11 04:06:42 1998 @@ -1843,7 +1843,7 @@ /* Write a version stamp. Don't write anything if we are running as a cross-compiler. Otherwise, use the versions in /usr/include/stamp.h. */ -#if !defined(CROSS_COMPILE) && !defined(_WIN32) && !defined(__linux__) && !defined(VMS) +#if !defined(CROSS_COMPILE) && !defined(_WIN32) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__linux__) && !defined(VMS) #include #endif --- ginclude/stdarg.h.orig Sat Oct 18 10:26:07 1997 +++ ginclude/stdarg.h Tue Aug 11 13:27:03 1998 @@ -64,7 +64,7 @@ #ifndef __GNUC_VA_LIST #define __GNUC_VA_LIST -#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) || defined(__NetBSD__) +#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) || defined(__NetBSD__) || defined(__OpenBSD__) typedef char *__gnuc_va_list; #else typedef void *__gnuc_va_list; --- ginclude/stddef.h.orig Mon Oct 28 04:35:28 1996 +++ ginclude/stddef.h Tue Aug 11 13:26:05 1998 @@ -24,7 +24,7 @@ /* On 4.3bsd-net2, make sure ansi.h is included, so we have one less case to deal with in the following. */ -#if defined (__BSD_NET2__) || defined (____386BSD____) || defined (__FreeBSD__) || defined(__NetBSD__) +#if defined (__BSD_NET2__) || defined (____386BSD____) || defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) #include #endif